From 771a825d9f43fd87d4a71cd9ed181947a908cec8 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 9 Oct 2018 17:18:19 +0200 Subject: [PATCH] Handling for per server toggleable jokes --- DeukBot4/Database/DatabaseInitializer.cs | 3 +- .../Database/ServerSettings/ServerSetting.cs | 23 ++++- .../ServerSettings/ServerSettingHandler.cs | 19 +++-- .../Commands/JokeControlCommands.cs | 83 +++++++++++++++++++ .../MessageHandlers/JokeHandling/DadJoke.cs | 2 +- .../JokeHandling/JokeHandler.cs | 14 +++- .../JokeHandling/ThanksJoke.cs | 10 +-- 7 files changed, 136 insertions(+), 18 deletions(-) create mode 100644 DeukBot4/MessageHandlers/CommandHandler/Commands/JokeControlCommands.cs diff --git a/DeukBot4/Database/DatabaseInitializer.cs b/DeukBot4/Database/DatabaseInitializer.cs index 482cb3d..4a0d072 100644 --- a/DeukBot4/Database/DatabaseInitializer.cs +++ b/DeukBot4/Database/DatabaseInitializer.cs @@ -21,7 +21,8 @@ namespace DeukBot4.Database cmd.CommandText = "CREATE TABLE IF NOT EXISTS server_settings (" + "server_id bigint NOT NULL," + - "muted_role bigint NOT NULL," + + "muted_role bigint NOT NULL," + + "enabled_jokes varchar(255)," + "PRIMARY KEY(server_id)" + ")"; cmd.ExecuteNonQuery(); diff --git a/DeukBot4/Database/ServerSettings/ServerSetting.cs b/DeukBot4/Database/ServerSettings/ServerSetting.cs index 82a2d6b..010d7ee 100644 --- a/DeukBot4/Database/ServerSettings/ServerSetting.cs +++ b/DeukBot4/Database/ServerSettings/ServerSetting.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Threading.Tasks; using DeukBot4.Utilities; using Npgsql; @@ -6,14 +7,16 @@ namespace DeukBot4.Database.ServerSettings { public class ServerSetting { - public ServerSetting(ulong serverId, ulong mutedRoleId = 0) + public ServerSetting(ulong serverId, ulong mutedRoleId = 0, List enabledJokes = null) { ServerId = serverId; MutedRoleId = mutedRoleId; + EnabledJokes = enabledJokes ?? new List(); } public ulong ServerId { get; } public ulong MutedRoleId { get; private set; } + public List EnabledJokes { get; private set; } public async Task SetMutedRoleId(ulong id) { @@ -30,5 +33,21 @@ namespace DeukBot4.Database.ServerSettings } } } + + public async Task SetEnabledJokes(List enabledJokes) + { + EnabledJokes = enabledJokes; + using (var conn = new DatabaseConnection()) + { + using (var cmd = new NpgsqlCommand()) + { + cmd.Connection = conn; + cmd.CommandText = "UPDATE server_settings SET enabled_jokes = @val WHERE server_id = @key"; + cmd.Parameters.AddWithValue("val", string.Join(",", enabledJokes)); + cmd.Parameters.AddWithValue("key", ServerId.ToLong()); + await cmd.ExecuteNonQueryAsync(); + } + } + } } } \ No newline at end of file diff --git a/DeukBot4/Database/ServerSettings/ServerSettingHandler.cs b/DeukBot4/Database/ServerSettings/ServerSettingHandler.cs index decee29..4b4427c 100644 --- a/DeukBot4/Database/ServerSettings/ServerSettingHandler.cs +++ b/DeukBot4/Database/ServerSettings/ServerSettingHandler.cs @@ -1,7 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using DeukBot4.Utilities; -using Discord; using Npgsql; namespace DeukBot4.Database.ServerSettings @@ -17,13 +16,19 @@ namespace DeukBot4.Database.ServerSettings using (var cmd = new NpgsqlCommand()) { cmd.Connection = conn; - cmd.CommandText = "SELECT server_id, muted_role FROM server_settings"; + cmd.CommandText = "SELECT server_id, muted_role, enabled_jokes FROM server_settings"; var reader = cmd.ExecuteReader(); while (reader.Read()) { var id = reader.GetInt64(0).ToUlong(); var mutedRole = reader.GetInt64(1).ToUlong(); - Settings.Add(id, new ServerSetting(id, mutedRole)); + string[] enabledJokes = null; + if (!reader.IsDBNull(2)) + { + enabledJokes = reader.GetString(2).Split(','); + } + + Settings.Add(id, new ServerSetting(id, mutedRole, enabledJokes?.ToList())); } } } @@ -36,9 +41,11 @@ namespace DeukBot4.Database.ServerSettings using (var cmd = new NpgsqlCommand()) { cmd.Connection = conn; - cmd.CommandText = "INSERT INTO server_settings (server_id, muted_role) VALUES (@id, @muted)"; + cmd.CommandText = + "INSERT INTO server_settings (server_id, muted_role, enabled_jokes) VALUES (@id, @muted, @jokes)"; cmd.Parameters.AddWithValue("id", setting.ServerId.ToLong()); cmd.Parameters.AddWithValue("muted", setting.MutedRoleId.ToLong()); + cmd.Parameters.AddWithValue("jokes", string.Join(",", setting.EnabledJokes)); cmd.ExecuteNonQuery(); } } diff --git a/DeukBot4/MessageHandlers/CommandHandler/Commands/JokeControlCommands.cs b/DeukBot4/MessageHandlers/CommandHandler/Commands/JokeControlCommands.cs new file mode 100644 index 0000000..701804f --- /dev/null +++ b/DeukBot4/MessageHandlers/CommandHandler/Commands/JokeControlCommands.cs @@ -0,0 +1,83 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using DeukBot4.Database.ServerSettings; +using DeukBot4.MessageHandlers.CommandHandler.RequestStructure; +using DeukBot4.MessageHandlers.JokeHandling; +using DeukBot4.MessageHandlers.Permissions; +using Discord; + +namespace DeukBot4.MessageHandlers.CommandHandler +{ + public class JokeControlCommands : CommandContainerBase + { + public override string Name => "Joke Control"; + + [Command("togglejoke", PermissionLevel.Admin)] + [CommandParameters(ParameterMatcher.ParameterType.Remainder)] + [CommandHelp("Toggle a joke on or off", "Toggle a joke, defined by id, on or off")] + [BlockUsageInPm, RequireParameterMatch] + public async Task ToggleJoke(CommandRequest request) + { + var jokeName = request.Parameters[0].AsString(); + if (!JokeHandler.Jokes.ContainsKey(jokeName)) + { + request.SendSimpleEmbed("Joke Toggle", $"Not a valid joke id: {jokeName}"); + return; + }; + if (request.OriginalMessage.Channel is IGuildChannel guildChannel) + { + var serverSettings = ServerSettingHandler.GetSettings(guildChannel.GuildId); + if (serverSettings.EnabledJokes.Contains(jokeName)) + { + serverSettings.EnabledJokes.Remove(jokeName); + serverSettings.SetEnabledJokes(serverSettings.EnabledJokes); + request.SendSimpleEmbed("Joke Toggle", $"Disabled Joke with id {jokeName}"); + } + else + { + serverSettings.EnabledJokes.Add(jokeName); + serverSettings.SetEnabledJokes(serverSettings.EnabledJokes); + request.SendSimpleEmbed("Joke Toggle", $"Enabled Joke with id {jokeName}"); + } + } + } + + [Command("jokes", PermissionLevel.Admin)] + [CommandHelp("Lists jokes per server", "Lists jokes per server")] + [BlockUsageInPm] + public async Task ListJokes(CommandRequest request) + { + if (request.OriginalMessage.Channel is IGuildChannel guildChannel) + { + var eb = EmbedFactory.GetStandardEmbedBuilder(); + var serverSettings = ServerSettingHandler.GetSettings(guildChannel.GuildId); + foreach (var jokesKey in JokeHandler.Jokes.Keys) + { + if (serverSettings.EnabledJokes.Contains(jokesKey)) + { + eb.AddField(jokesKey, "Enabled", true); + } + else + { + eb.AddField(jokesKey, "Disabled", true); + } + } + + request.SendMessageAsync("", embed: eb.Build()); + } + } + + [Command("nofunallowed", PermissionLevel.Admin)] + [CommandHelp("Disables all jokes", "Disables all jokes")] + [BlockUsageInPm] + public async Task DisableJokes(CommandRequest request) + { + if (request.OriginalMessage.Channel is IGuildChannel guildChannel) + { + var serverSettings = ServerSettingHandler.GetSettings(guildChannel.GuildId); + serverSettings.SetEnabledJokes(new List()); + request.SendSimpleEmbed("Joke Toggle", $"Disabled all jokes"); + } + } + } +} \ No newline at end of file diff --git a/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs b/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs index 2bdbf02..3eabeb7 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs @@ -10,7 +10,7 @@ namespace DeukBot4.MessageHandlers.JokeHandling public string Id => "dad"; public string Name => "Hi I'm dad"; - private Regex _regex = new Regex(@".*i['| a]*m ([\w\s]{3,15})$", + private readonly Regex _regex = new Regex(@".*i['| a]*m ([\w\s]{3,15})$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); public async Task Run(SocketMessage message) diff --git a/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs b/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs index 7cbc0a5..666fb5c 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs @@ -2,6 +2,8 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using DeukBot4.Database.ServerSettings; +using Discord; using Discord.WebSocket; namespace DeukBot4.MessageHandlers.JokeHandling @@ -17,15 +19,21 @@ namespace DeukBot4.MessageHandlers.JokeHandling foreach (var joke in jokes) { var c = (IJokeController)Activator.CreateInstance(joke); - Jokes.Add(c.Id, c); + Jokes.Add(c.Id.ToLowerInvariant(), c); } } public static async Task RunJokes(SocketMessage message) { - foreach (var jokeController in Jokes) + if (message.Channel is IGuildChannel guildChannel) { - jokeController.Value.Run(message); + var guildSettings = ServerSettingHandler.GetSettings(guildChannel.GuildId); + var jokes = guildSettings.EnabledJokes; + foreach (var enabledJoke in jokes) + { + var jokeController = Jokes[enabledJoke]; + jokeController.Run(message); + } } } } diff --git a/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs b/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs index ab0490b..b19cb9d 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs @@ -9,8 +9,8 @@ namespace DeukBot4.MessageHandlers.JokeHandling public string Id => "thanks"; public string Name => "Claim credit when people say thanks"; - private readonly Regex ThanksMatcher = new Regex(@"(?i)((\b)thanks*(\W|$)+)"); - private readonly string[] ThanksResponses = { + private readonly Regex _thanksMatcher = new Regex(@"(?i)((\b)thanks*(\W|$)+)"); + private readonly string[] _thanksResponses = { "You're welcome!", "No problem", "It was the least I could do, I always do the least I can do!", "Yes, well, we'd be absolutely nowhere without me.", @@ -22,10 +22,10 @@ namespace DeukBot4.MessageHandlers.JokeHandling public async Task Run(SocketMessage message) { var content = message.Content; - if (ThanksMatcher.IsMatch(content)) + if (_thanksMatcher.IsMatch(content)) { - var response = ThanksResponses[_pos]; - _pos = (_pos + 1) % ThanksResponses.Length; + var response = _thanksResponses[_pos]; + _pos = (_pos + 1) % _thanksResponses.Length; message.Channel.SendMessageAsync(response); } }