From 2e8e4daa25b81da7773ec788c0d9f41487c695a1 Mon Sep 17 00:00:00 2001
From: Toastie <toastie@toastiet0ast.com>
Date: Fri, 19 Jul 2024 15:29:31 +1200
Subject: [PATCH] 'cleverbot should be available on the public bot now

---
 .../Db/Extensions/GuildConfigExtensions.cs    | 10 -----
 .../Games/ChatterBot/ChatterBotCommands.cs    | 19 ++------
 .../Games/ChatterBot/ChatterbotService.cs     | 44 ++++++++++++++++++-
 .../data/strings/commands/commands.en-US.yml  |  6 +--
 4 files changed, 48 insertions(+), 31 deletions(-)

diff --git a/src/EllieBot/Db/Extensions/GuildConfigExtensions.cs b/src/EllieBot/Db/Extensions/GuildConfigExtensions.cs
index 7d16127..842fe4e 100644
--- a/src/EllieBot/Db/Extensions/GuildConfigExtensions.cs
+++ b/src/EllieBot/Db/Extensions/GuildConfigExtensions.cs
@@ -182,16 +182,6 @@ public static class GuildConfigExtensions
             .SelectMany(gc => gc.FollowedStreams)
             .ToList();
 
-    public static void SetCleverbotEnabled(this DbSet<GuildConfig> configs, ulong id, bool cleverbotEnabled)
-    {
-        var conf = configs.FirstOrDefault(gc => gc.GuildId == id);
-
-        if (conf is null)
-            return;
-
-        conf.CleverbotEnabled = cleverbotEnabled;
-    }
-
     public static XpSettings XpSettingsFor(this DbContext ctx, ulong guildId)
     {
         var gc = ctx.GuildConfigsForId(guildId,
diff --git a/src/EllieBot/Modules/Games/ChatterBot/ChatterBotCommands.cs b/src/EllieBot/Modules/Games/ChatterBot/ChatterBotCommands.cs
index 371c958..7f7f2cb 100644
--- a/src/EllieBot/Modules/Games/ChatterBot/ChatterBotCommands.cs
+++ b/src/EllieBot/Modules/Games/ChatterBot/ChatterBotCommands.cs
@@ -18,31 +18,18 @@ public partial class Games
         [Cmd]
         [RequireContext(ContextType.Guild)]
         [UserPerm(GuildPerm.ManageMessages)]
-        [NoPublicBot]
         public async Task CleverBot()
         {
             var channel = (ITextChannel)ctx.Channel;
 
-            if (_service.ChatterBotGuilds.TryRemove(channel.Guild.Id, out _))
-            {
-                await using (var uow = _db.GetDbContext())
-                {
-                    uow.Set<GuildConfig>().SetCleverbotEnabled(ctx.Guild.Id, false);
-                    await uow.SaveChangesAsync();
-                }
+            var newState = await _service.ToggleChatterBotAsync(ctx.Guild.Id);
 
+            if (!newState)
+            {
                 await Response().Confirm(strs.chatbot_disabled).SendAsync();
                 return;
             }
 
-            _service.ChatterBotGuilds.TryAdd(channel.Guild.Id, new(() => _service.CreateSession(), true));
-
-            await using (var uow = _db.GetDbContext())
-            {
-                uow.Set<GuildConfig>().SetCleverbotEnabled(ctx.Guild.Id, true);
-                await uow.SaveChangesAsync();
-            }
-
             await Response().Confirm(strs.chatbot_enabled).SendAsync();
         }
     }
diff --git a/src/EllieBot/Modules/Games/ChatterBot/ChatterbotService.cs b/src/EllieBot/Modules/Games/ChatterBot/ChatterbotService.cs
index 66decdc..e088319 100644
--- a/src/EllieBot/Modules/Games/ChatterBot/ChatterbotService.cs
+++ b/src/EllieBot/Modules/Games/ChatterBot/ChatterbotService.cs
@@ -1,5 +1,8 @@
 #nullable disable
+using LinqToDB;
+using LinqToDB.EntityFrameworkCore;
 using EllieBot.Common.ModuleBehaviors;
+using EllieBot.Db.Models;
 using EllieBot.Modules.Games.Common;
 using EllieBot.Modules.Games.Common.ChatterBot;
 using EllieBot.Modules.Patronage;
@@ -9,7 +12,7 @@ namespace EllieBot.Modules.Games.Services;
 
 public class ChatterBotService : IExecOnMessage
 {
-    public ConcurrentDictionary<ulong, Lazy<IChatterBotSession>> ChatterBotGuilds { get; }
+    private ConcurrentDictionary<ulong, Lazy<IChatterBotSession>> ChatterBotGuilds { get; }
 
     public int Priority
         => 1;
@@ -20,6 +23,7 @@ public class ChatterBotService : IExecOnMessage
     private readonly IHttpClientFactory _httpFactory;
     private readonly GamesConfigService _gcs;
     private readonly IMessageSenderService _sender;
+    private readonly DbService _db;
     public readonly IPatronageService _ps;
 
     public ChatterBotService(
@@ -30,12 +34,14 @@ public class ChatterBotService : IExecOnMessage
         IHttpClientFactory factory,
         IBotCredentials creds,
         GamesConfigService gcs,
-        IMessageSenderService sender)
+        IMessageSenderService sender,
+        DbService db)
     {
         _client = client;
         _perms = perms;
         _creds = creds;
         _sender = sender;
+        _db = db;
         _httpFactory = factory;
         _perms = perms;
         _gcs = gcs;
@@ -196,4 +202,38 @@ public class ChatterBotService : IExecOnMessage
 
         return false;
     }
+
+    public async Task<bool> ToggleChatterBotAsync(ulong guildId)
+    {
+        if (ChatterBotGuilds.TryRemove(guildId, out _))
+        {
+            await using var uow = _db.GetDbContext();
+            await uow.Set<GuildConfig>()
+                     .ToLinqToDBTable()
+                     .Where(x => x.GuildId == guildId)
+                     .UpdateAsync((gc) => new GuildConfig()
+                     {
+                         CleverbotEnabled = false
+                     });
+            await uow.SaveChangesAsync();
+            return false;
+        }
+
+        ChatterBotGuilds.TryAdd(guildId, new(() => CreateSession(), true));
+
+        await using (var uow = _db.GetDbContext())
+        {
+            await uow.Set<GuildConfig>()
+                     .ToLinqToDBTable()
+                     .Where(x => x.GuildId == guildId)
+                     .UpdateAsync((gc) => new GuildConfig()
+                     {
+                         CleverbotEnabled = true
+                     });
+
+            await uow.SaveChangesAsync();
+        }
+
+        return true;
+    }
 }
\ No newline at end of file
diff --git a/src/EllieBot/data/strings/commands/commands.en-US.yml b/src/EllieBot/data/strings/commands/commands.en-US.yml
index 2ce37fb..7ad0299 100644
--- a/src/EllieBot/data/strings/commands/commands.en-US.yml
+++ b/src/EllieBot/data/strings/commands/commands.en-US.yml
@@ -1361,10 +1361,10 @@ flip:
         desc: "The number of times the coin is flipped."
 betflip:
   desc: |-
-    Bet to guess will the result be heads or tails.
-    Guessing awards you 1.95x the currency you've bet (rounded up).
+    Bet on the coin flip.
+    The result can be heads or tails.
+    Guessing correctly rewards you with 1.95x of the currency you've bet (rounded up).
     Multiplier can be changed by the bot owner.
-    
   ex:
     - 5 heads
     - 3 t