From 08ae95d55de79bb0267d26eefe60e30b70c961bb Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Wed, 9 Mar 2016 13:48:46 +0100 Subject: [PATCH] added ;cfi and ;sfi, prepared for ;cw and ;sw --- .../Classes/Permissions/PermissionsHandler.cs | 49 ++++++++++ NadekoBot/Commands/FilterInvitesCommand.cs | 92 +++++++++++++++++++ NadekoBot/Modules/Permissions.cs | 4 +- NadekoBot/NadekoBot.cs | 2 +- NadekoBot/NadekoBot.csproj | 1 + 5 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 NadekoBot/Commands/FilterInvitesCommand.cs diff --git a/NadekoBot/Classes/Permissions/PermissionsHandler.cs b/NadekoBot/Classes/Permissions/PermissionsHandler.cs index 04afac85..05561e39 100644 --- a/NadekoBot/Classes/Permissions/PermissionsHandler.cs +++ b/NadekoBot/Classes/Permissions/PermissionsHandler.cs @@ -300,6 +300,46 @@ namespace NadekoBot.Classes.Permissions { commands.Add(commandName, value); Task.Run(() => WriteServerToJson(serverPerms)); } + + public static void SetServerWordPermission(Server server, string word, bool value) { + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + serverPerms.Permissions.Words.Add(word); + Task.Run(() => WriteServerToJson(serverPerms)); + } + + public static void SetChannelWordPermission(Channel channel, string word, bool value) { + var server = channel.Server; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + if (!serverPerms.ChannelPermissions.ContainsKey(channel.Id)) + serverPerms.ChannelPermissions.Add(channel.Id, new Permissions(channel.Name)); + + serverPerms.ChannelPermissions[channel.Id].Words.Add(word); + Task.Run(() => WriteServerToJson(serverPerms)); + } + + public static void SetServerFilterInvitesPermission(Server server, bool value) { + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + serverPerms.Permissions.FilterInvites = value; + Task.Run(() => WriteServerToJson(serverPerms)); + } + + public static void SetChannelFilterInvitesPermission(Channel channel, bool value) { + var server = channel.Server; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + if (!serverPerms.ChannelPermissions.ContainsKey(channel.Id)) + serverPerms.ChannelPermissions.Add(channel.Id, new Permissions(channel.Name)); + + serverPerms.ChannelPermissions[channel.Id].FilterInvites = value; + Task.Run(() => WriteServerToJson(serverPerms)); + } } /// /// Holds a permission list @@ -317,11 +357,20 @@ namespace NadekoBot.Classes.Permissions { /// Command name with allowed/disallowed /// public Dictionary Commands { get; set; } + /// + /// Banned words, usually profanities, like word "java" + /// + public HashSet Words { get; set; } + /// + /// Should the bot filter invites to other discord servers (and ref links in the future) + /// + public bool FilterInvites { get; set; } public Permissions(string name) { Name = name; Modules = new Dictionary(); Commands = new Dictionary(); + Words = new HashSet(); } public override string ToString() { diff --git a/NadekoBot/Commands/FilterInvitesCommand.cs b/NadekoBot/Commands/FilterInvitesCommand.cs new file mode 100644 index 00000000..6c8d6488 --- /dev/null +++ b/NadekoBot/Commands/FilterInvitesCommand.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using NadekoBot.Classes.Permissions; +using ServerPermissions = NadekoBot.Classes.Permissions.ServerPermissions; + +namespace NadekoBot.Commands { + internal class FilterInvitesCommand : IDiscordCommand { + private readonly Regex filterRegex = new Regex(@"(?:discord(?:\.gg|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3})))"); + + + public FilterInvitesCommand() { + NadekoBot.Client.MessageReceived += async (sender, args) => { + try { + ServerPermissions serverPerms; + if (!IsChannelOrServerFiltering(args.Channel, out serverPerms)) return; + + if (filterRegex.IsMatch(args.Message.RawText)) { + await args.Message.Delete(); + if (serverPerms.Verbose) + await args.Channel.SendMessage($"{args.User.Mention} Invite links are not allowed on this channel."); + } + } catch { } + }; + } + + private static bool IsChannelOrServerFiltering(Channel channel, out ServerPermissions serverPerms) { + if (!PermissionsHandler.PermissionsDict.TryGetValue(channel.Server.Id, out serverPerms)) return false; + + if (serverPerms.Permissions.FilterInvites) + return true; + + Permissions perms; + return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterInvites; + } + + public void Init(CommandGroupBuilder cgb) { + cgb.CreateCommand(";cfi") + .Alias(";channelfilterinvites") + .Description("Enables or disables automatic deleting of invites on the channel." + + "If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once." + + "\n**Usage**: ;cfi enable #general-chat") + .Parameter("bool") + .Parameter("channel", ParameterType.Optional) + .Do(async e => { + try { + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var chanStr = e.GetArg("channel"); + + if (chanStr?.ToLowerInvariant().Trim() != "all") { + + var chan = string.IsNullOrWhiteSpace(chanStr) + ? e.Channel + : PermissionHelper.ValidateChannel(e.Server, chanStr); + PermissionsHandler.SetChannelFilterInvitesPermission(chan, state); + await e.Channel.SendMessage($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel."); + return; + } + //all channels + + foreach (var curChannel in e.Server.TextChannels) { + PermissionsHandler.SetChannelFilterInvitesPermission(curChannel, state); + } + await e.Channel.SendMessage($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **ALL** channels."); + + } catch (Exception ex) { + await e.Channel.SendMessage($"💢 Error: {ex.Message}"); + } + }); + + cgb.CreateCommand(";sfi") + .Alias(";serverfilterinvites") + .Description("Enables or disables automatic deleting of invites on the server.\n**Usage**: ;sfi disable") + .Parameter("bool") + .Do(async e => { + try { + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + PermissionsHandler.SetServerFilterInvitesPermission(e.Server, state); + await e.Channel.SendMessage($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for this server."); + + } catch (Exception ex) { + await e.Channel.SendMessage($"💢 Error: {ex.Message}"); + } + }); + } + } +} diff --git a/NadekoBot/Modules/Permissions.cs b/NadekoBot/Modules/Permissions.cs index f4dcfb0b..33c0f08a 100644 --- a/NadekoBot/Modules/Permissions.cs +++ b/NadekoBot/Modules/Permissions.cs @@ -5,6 +5,7 @@ using PermsHandler = NadekoBot.Classes.Permissions.PermissionsHandler; using System.Linq; using System.Threading.Tasks; using NadekoBot.Classes.Permissions; +using NadekoBot.Commands; using NadekoBot.Extensions; namespace NadekoBot.Modules { @@ -12,9 +13,8 @@ namespace NadekoBot.Modules { public override string Prefix { get; } = ";"; public PermissionModule() { - //Empty for now + commands.Add(new FilterInvitesCommand()); } - //todo word filtering/invite bans (?:discord(?:\.gg|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3}))) public override void Install(ModuleManager manager) { manager.CreateCommands("", cgb => { diff --git a/NadekoBot/NadekoBot.cs b/NadekoBot/NadekoBot.cs index 3210915f..52959f2a 100644 --- a/NadekoBot/NadekoBot.cs +++ b/NadekoBot/NadekoBot.cs @@ -121,7 +121,7 @@ namespace NadekoBot { modules.Add(new Conversations(), "Conversations", ModuleFilter.None); modules.Add(new Gambling(), "Gambling", ModuleFilter.None); modules.Add(new Games(), "Games", ModuleFilter.None); - //modules.Add(new Music(), "Music", ModuleFilter.None); + modules.Add(new Music(), "Music", ModuleFilter.None); modules.Add(new Searches(), "Searches", ModuleFilter.None); modules.Add(new NSFW(), "NSFW", ModuleFilter.None); if (!string.IsNullOrWhiteSpace(Creds.TrelloAppKey)) diff --git a/NadekoBot/NadekoBot.csproj b/NadekoBot/NadekoBot.csproj index a3115583..a4c2c959 100644 --- a/NadekoBot/NadekoBot.csproj +++ b/NadekoBot/NadekoBot.csproj @@ -142,6 +142,7 @@ +