Files
EndlessHostRoles/Modules/SpamManager.cs
T
TommyXL 7929a4b83e Optimization (Part 1?) (#589)
* Well lets try check this

* Some changes

* Change

* Well

* Change ControllerManager.Update

* Nothing

* Optimaze more?

* Fix error build

* Fix win check

* Change

* Fix

* Optimaze some roles in OnCheckPlayerPosition

* More optimaze

* Full optimaze roles in OnGlobalFixedUpdate

* Optimaze some add-ons

* ProgressText

* Change

* Optimaze NameNotifyManager

* Optimaze NotifyRoles and some roles

* Move the displayed version

* Some changes

* Optimaze OnFixedUpdate in some roles

* Fix bugs

* Optimaze IsActive & V4 version

* Optimaze MapRoom.DoorsUpdate

* Cache TryCatch in IsActive

* Change

* Fix

* More optimze TaskPanelBehaviour

* Cache GetRoleColor & ColorString & AllStringNames & Change RemoveHtmlTags

* Cache TryCast VentilationSystem & ICriticalSabotage & IUsable and more optimaze

* Fix CountAlivePlayers

* Fix exceptios

* Replace some CachedAllPlayerControls to EnumeratePlayerControls

* Replace some CachedAlivePlayerControls to EnumerateAlivePlayerControls

* Fixes

* Fix modded clients

* Fix errors

* Fix again

* Optimaze & add null check

* Fix crash in Starlight

* Use only Main.PluginVersion in LobbySharingAPI

* Optimaze code in FixedUpdate

* Fix

* Optimize GetProgressText for Roles

* Some changes in Translations

* Cache Enum.GetValues and StringBuilder

* Changes

* CustomRole.ColoredTextByRole()

* Optimaze Lobby & Meeting

* ColorStringPrefix => ColorPrefix

* Add null check

* Remove

* Fixes & optimaze

* Fixes

* Changes

* Fix

* Fix

* Fix

* Remove

* Fix

* Change

* Revert
2026-05-15 20:01:54 +02:00

297 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using Hazel;
using static EHR.Translator;
namespace EHR;
public static class SpamManager
{
private static readonly string BannedWordsFilePath = $"{Main.DataPath}/EHR_DATA/BanWords.txt";
private static List<string> BanWords = [];
public static void Init()
{
CreateIfNotExists();
BanWords = ReturnAllNewLinesInFile(BannedWordsFilePath);
}
private static void CreateIfNotExists()
{
if (!File.Exists(BannedWordsFilePath))
{
try
{
if (!Directory.Exists($"{Main.DataPath}/EHR_DATA")) Directory.CreateDirectory($"{Main.DataPath}/EHR_DATA");
if (File.Exists($"{Main.DataPath}/BanWords.txt"))
File.Move($"{Main.DataPath}/BanWords.txt", BannedWordsFilePath);
else
{
string fileName;
string[] name = CultureInfo.CurrentCulture.Name.Split("-");
if (name.Length >= 2)
{
fileName = name[0] switch
{
"zh" => "SChinese",
"ru" => "Russian",
_ => "English"
};
}
else
fileName = "English";
Logger.Warn($"Creating new BanWords file: {fileName}", "SpamManager");
File.WriteAllText(BannedWordsFilePath, GetResourcesTxt($"EHR.Resources.Config.BanWords.{fileName}.txt"));
}
}
catch (Exception ex) { Logger.Exception(ex, "SpamManager"); }
}
}
private static string GetResourcesTxt(string path)
{
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
stream!.Position = 0;
using StreamReader reader = new(stream, Encoding.UTF8);
return reader.ReadToEnd();
}
private static List<string> ReturnAllNewLinesInFile(string filename)
{
if (!File.Exists(filename)) return [];
using StreamReader sr = new(filename, Encoding.GetEncoding("UTF-8"));
List<string> sendList = [];
while (sr.ReadLine() is { } text)
{
if (text.Length > 1 && text != "")
sendList.Add(text.Replace("\\n", "\n").ToLower());
}
return sendList;
}
public static bool CheckSpam(PlayerControl player, string text)
{
if (player.AmOwner) return false;
string name = player.GetRealName();
var kick = false;
var msg = string.Empty;
if (Options.AutoKickStart.GetBool())
{
if (ContainsStart(text) && GameStates.IsLobby && !ChatCommands.IsPlayerVIP(player.FriendCode))
{
Main.SayStartTimes.TryAdd(player.OwnerId, 0);
Main.SayStartTimes[player.OwnerId]++;
msg = string.Format(GetString("Message.WarnWhoSayStart"), name, Main.SayStartTimes[player.OwnerId]);
if (Main.SayStartTimes[player.OwnerId] > Options.AutoKickStartTimes.GetInt())
{
msg = string.Format(GetString("Message.KickStartAfterWarn"), name, Main.SayStartTimes[player.OwnerId]);
kick = true;
}
if (msg != string.Empty && msg != "") Utils.SendMessage(msg, importance: MessageImportance.Low);
if (kick) AmongUsClient.Instance.KickPlayer(player.OwnerId, Options.AutoKickStartAsBan.GetBool());
return true;
}
}
bool banned = BanWords.Any(x => text.Contains(x, StringComparison.OrdinalIgnoreCase));
if (!banned) return false;
if (Options.AutoWarnStopWords.GetBool()) msg = string.Format(GetString("Message.WarnWhoSayBanWord"), name);
if (Options.AutoKickStopWords.GetBool())
{
Main.SayBanwordsTimes.TryAdd(player.OwnerId, 0);
Main.SayBanwordsTimes[player.OwnerId]++;
msg = string.Format(GetString("Message.WarnWhoSayBanWordTimes"), name, Main.SayBanwordsTimes[player.OwnerId]);
if (Main.SayBanwordsTimes[player.OwnerId] > Options.AutoKickStopWordsTimes.GetInt())
{
msg = string.Format(GetString("Message.KickWhoSayBanWordAfterWarn"), name, Main.SayBanwordsTimes[player.OwnerId]);
kick = true;
}
}
if (msg != string.Empty && msg != "")
{
if (kick || !GameStates.IsInGame)
Utils.SendMessage(msg, importance: MessageImportance.Low);
else
{
foreach (PlayerControl pc in Main.CachedAllPlayerControls())
if (pc.IsAlive() == player.IsAlive())
Utils.SendMessage(msg, pc.PlayerId, importance: MessageImportance.Low);
}
}
if (kick) AmongUsClient.Instance.KickPlayer(player.OwnerId, Options.AutoKickStopWordsAsBan.GetBool());
return true;
}
private static bool ContainsStart(string text)
{
text = text.Trim().ToLower();
var stNum = 0;
for (var i = 0; i < text.Length; i++)
{
if (text[i..].Equals("k")) stNum++;
if (text[i..].Equals("开")) stNum++;
}
if (stNum >= 3) return true;
switch (text)
{
case "Start":
case "start":
case "/Start":
case "/Start/":
case "Start/":
case "/start":
case "/start/":
case "start/":
case "plsstart":
case "pls start":
case "please start":
case "pleasestart":
case "Plsstart":
case "Pls start":
case "Please start":
case "Pleasestart":
case "plsStart":
case "pls Start":
case "please Start":
case "pleaseStart":
case "PlsStart":
case "Pls Start":
case "Please Start":
case "PleaseStart":
case "sTart":
case "stArt":
case "staRt":
case "starT":
case "s t a r t":
case "S t a r t":
case "started":
case "Started":
case "s t a r t e d":
case "S t a r t e d":
case "Го":
case "гО":
case "го":
case "Гоу":
case "гоу":
case "Старт":
case "старт":
case "/Старт":
case "/Старт/":
case "Старт/":
case "/старт":
case "/старт/":
case "старт/":
case "пжстарт":
case "пж старт":
case "пжСтарт":
case "пж Старт":
case "Пжстарт":
case "Пж старт":
case "ПжСтарт":
case "Пж Старт":
case "сТарт":
case "стАрт":
case "стаРт":
case "старТ":
case "с т а р т":
case "С т а р т":
case "начни":
case "Начни":
case "начинай":
case "начинай уже":
case "Начинай":
case "Начинай уже":
case "Начинай Уже":
case "н а ч и н а й":
case "Н а ч и н а й":
case "пж го":
case "пжго":
case "Пж Го":
case "Пж го":
case "пж Го":
case "ПжГо":
case "Пжго":
case "пжГо":
case "ГоПж":
case "гоПж":
case "Гопж":
case "开":
case "快开":
case "开始":
case "开啊":
case "开阿":
case "kai":
case "kaishi":
return true;
}
if (text.Length > 30) return false;
if (text.Contains("start")) return true;
if (text.Contains("Start")) return true;
if (text.Contains("STart")) return true;
if (text.Contains("s t a r t")) return true;
if (text.Contains("begin")) return true;
if (text.Contains("commence")) return true;
if (text.Contains('了')) return false;
if (text.Contains('没')) return false;
if (text.Contains('吗')) return false;
if (text.Contains('哈')) return false;
if (text.Contains('还')) return false;
if (text.Contains('现')) return false;
if (text.Contains('不')) return false;
if (text.Contains('可')) return false;
if (text.Contains('刚')) return false;
if (text.Contains('的')) return false;
if (text.Contains('打')) return false;
if (text.Contains('门')) return false;
if (text.Contains('关')) return false;
if (text.Contains('怎')) return false;
if (text.Contains('要')) return false;
if (text.Contains('摆')) return false;
if (text.Contains('啦')) return false;
if (text.Contains('咯')) return false;
if (text.Contains('嘞')) return false;
if (text.Contains('勒')) return false;
if (text.Contains('心')) return false;
if (text.Contains('呢')) return false;
if (text.Contains('门')) return false;
if (text.Contains('总')) return false;
if (text.Contains('哥')) return false;
if (text.Contains('姐')) return false;
if (text.Contains('《')) return false;
if (text.Contains('?')) return false;
if (text.Contains('?')) return false;
return text.Contains('开') || text.Contains("kai");
}
}