99390f1f35
view angle vector parse fail is now a handled exception change local host check to byte array to make it faster than comparing string kick command now requires moderator level or higher tempban now requires administrator level or higher hopefully fixed negative SPM bug pipelined the events and consolidated them to run through GameEventHandler uniform console colors
94 lines
3.3 KiB
C#
94 lines
3.3 KiB
C#
using System.Collections.Concurrent;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Threading.Tasks;
|
|
using SharedLibraryCore;
|
|
using SharedLibraryCore.Configuration;
|
|
using SharedLibraryCore.Interfaces;
|
|
using SharedLibraryCore.Objects;
|
|
|
|
namespace IW4MAdmin.Plugins.ProfanityDeterment
|
|
{
|
|
public class Plugin : IPlugin
|
|
{
|
|
public string Name => "ProfanityDeterment";
|
|
|
|
public float Version => Assembly.GetExecutingAssembly().GetName().Version.Major + Assembly.GetExecutingAssembly().GetName().Version.Minor / 10.0f;
|
|
|
|
public string Author => "RaidMax";
|
|
|
|
BaseConfigurationHandler<Configuration> Settings;
|
|
ConcurrentDictionary<int, Tracking> ProfanityCounts;
|
|
IManager Manager;
|
|
|
|
public async Task OnEventAsync(GameEvent E, Server S)
|
|
{
|
|
if (!Settings.Configuration().EnableProfanityDeterment)
|
|
return;
|
|
|
|
if (E.Type == GameEvent.EventType.Connect)
|
|
{
|
|
if (!ProfanityCounts.TryAdd(E.Origin.ClientId, new Tracking(E.Origin)))
|
|
{
|
|
S.Logger.WriteWarning("Could not add client to profanity tracking");
|
|
}
|
|
|
|
}
|
|
|
|
if (E.Type == GameEvent.EventType.Disconnect)
|
|
{
|
|
if (!ProfanityCounts.TryRemove(E.Origin.ClientId, out Tracking old))
|
|
{
|
|
S.Logger.WriteWarning("Could not remove client from profanity tracking");
|
|
}
|
|
}
|
|
|
|
if (E.Type == GameEvent.EventType.Say)
|
|
{
|
|
var objectionalWords = Settings.Configuration().OffensiveWords;
|
|
bool containsObjectionalWord = objectionalWords.FirstOrDefault(w => E.Data.ToLower().Contains(w)) != null;
|
|
|
|
if (containsObjectionalWord)
|
|
{
|
|
var clientProfanity = ProfanityCounts[E.Origin.ClientId];
|
|
if (clientProfanity.Infringements >= Settings.Configuration().KickAfterInfringementCount)
|
|
{
|
|
await clientProfanity.Client.Kick(Settings.Configuration().ProfanityKickMessage, new Player()
|
|
{
|
|
ClientId = 1
|
|
});
|
|
}
|
|
|
|
else if (clientProfanity.Infringements < Settings.Configuration().KickAfterInfringementCount)
|
|
{
|
|
clientProfanity.Infringements++;
|
|
|
|
await clientProfanity.Client.Warn(Settings.Configuration().ProfanityWarningMessage, new Player()
|
|
{
|
|
ClientId = 1
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public async Task OnLoadAsync(IManager manager)
|
|
{
|
|
// load custom configuration
|
|
Settings = new BaseConfigurationHandler<Configuration>("ProfanityDetermentSettings");
|
|
if (Settings.Configuration() == null)
|
|
{
|
|
Settings.Set((Configuration)new Configuration().Generate());
|
|
await Settings.Save();
|
|
}
|
|
|
|
ProfanityCounts = new ConcurrentDictionary<int, Tracking>();
|
|
Manager = manager;
|
|
}
|
|
|
|
public Task OnTickAsync(Server S) => Task.CompletedTask;
|
|
|
|
public Task OnUnloadAsync() => Task.CompletedTask;
|
|
}
|
|
}
|