From 2179d59edd4dc335c05d18b2ded993507f3b4b8b Mon Sep 17 00:00:00 2001 From: CrackmaticSoftware <248342529+CrackmaticSoftware@users.noreply.github.com> Date: Wed, 28 Jan 2026 04:28:49 +0100 Subject: [PATCH] Enabling/disabling gamba games with dynamic settting lookup. (#53) --- .../Commands/Kasino/KasinoAdminCommands.cs | 91 +++++++++---------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/KfChatDotNetBot/Commands/Kasino/KasinoAdminCommands.cs b/KfChatDotNetBot/Commands/Kasino/KasinoAdminCommands.cs index f16b6e0..f93b2c6 100644 --- a/KfChatDotNetBot/Commands/Kasino/KasinoAdminCommands.cs +++ b/KfChatDotNetBot/Commands/Kasino/KasinoAdminCommands.cs @@ -76,30 +76,6 @@ public class TempExcludeCommand : ICommand } } -internal record KasinoGameSetting(WagerGame Game, string SettingKey, string Alias); - -internal static class KasinoGameSettingMap -{ - internal static readonly IReadOnlyList All = new List - { - new(WagerGame.GuessWhatNumber, BuiltIn.Keys.KasinoGuessWhatNumberEnabled, "guesswhatnumber"), - new(WagerGame.Dice, BuiltIn.Keys.KasinoDiceEnabled, "dice"), - new(WagerGame.Limbo, BuiltIn.Keys.KasinoLimboEnabled, "limbo"), - new(WagerGame.Mines, BuiltIn.Keys.KasinoMinesEnabled, "mines"), - new(WagerGame.Wheel, BuiltIn.Keys.KasinoWheelEnabled, "wheel"), - new(WagerGame.Blackjack, BuiltIn.Keys.KasinoBlackjackEnabled, "blackjack"), - new(WagerGame.Planes, BuiltIn.Keys.KasinoPlanesEnabled, "planes"), - new(WagerGame.LambChop, BuiltIn.Keys.KasinoLambchopEnabled, "lambchop"), - new(WagerGame.Keno, BuiltIn.Keys.KasinoKenoEnabled, "keno"), - new(WagerGame.CoinFlip, BuiltIn.Keys.KasinoCoinflipEnabled, "coinflip"), - new(WagerGame.Slots, BuiltIn.Keys.KasinoSlotsEnabled, "slots"), - new(WagerGame.Plinko, BuiltIn.Keys.KasinoPlinkoEnabled, "plinko") - }; - - internal static KasinoGameSetting? FindByAlias(string alias) => - All.FirstOrDefault(g => - g.Alias.Equals(alias, StringComparison.OrdinalIgnoreCase)); -} public class KasinoGameToggleCommand : ICommand { public List Patterns => [ @@ -121,29 +97,39 @@ public class KasinoGameToggleCommand : ICommand return; } - var gameName = gameArg.Value.ToLower(); + var gameName = gameArg.Value; var action = actionArg.Value.ToLower(); var shouldEnable = action == "enable"; - var status = shouldEnable ? "enabled" : "disabled"; + await using var db = new ApplicationDbContext(); + var gameSettingPattern = new Regex(@"^Kasino\.(?\w+)\.Enabled$", RegexOptions.IgnoreCase); + + var allGameSettings = await db.Settings + .Where(s => s.Key.StartsWith("Kasino.") && s.Key.EndsWith(".Enabled")) + .ToListAsync(ctx); + // Handle "all" games - if (gameName == "all") + if (gameName.Equals("all", StringComparison.OrdinalIgnoreCase)) { - foreach (var gameInfo in KasinoGameSettingMap.All) + foreach (var setting in allGameSettings) { - await SettingsProvider.SetValueAsBooleanAsync(gameInfo.SettingKey, shouldEnable); + await SettingsProvider.SetValueAsBooleanAsync(setting.Key, shouldEnable); } await botInstance.SendChatMessageAsync( - $"{user.FormatUsername()}, all {KasinoGameSettingMap.All.Count} Kasino games have been {status}.", true); + $"{user.FormatUsername()}, all {allGameSettings.Count} Kasino games have been {status}.", true); return; } - // Handle individual game - var gameInfoMap = KasinoGameSettingMap.FindByAlias(gameName); + // Handle individual game - find matching setting key + var matchedSetting = allGameSettings.FirstOrDefault(s => + { + var match = gameSettingPattern.Match(s.Key); + return match.Success && match.Groups["game"].Value.Equals(gameName, StringComparison.OrdinalIgnoreCase); + }); - if (gameInfoMap is null) + if (matchedSetting is null) { await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, unknown game '{gameName}'. Use '!admin kasino games' to see available games, or use 'all' to toggle all games.", @@ -151,9 +137,10 @@ public class KasinoGameToggleCommand : ICommand return; } - await SettingsProvider.SetValueAsBooleanAsync(gameInfoMap.SettingKey, shouldEnable); + await SettingsProvider.SetValueAsBooleanAsync(matchedSetting.Key, shouldEnable); - var gameDisplayName = gameInfoMap.Game.Humanize(); + var match = gameSettingPattern.Match(matchedSetting.Key); + var gameDisplayName = match.Groups["game"].Value.Humanize(); await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, {gameDisplayName} has been {status}.", true); @@ -175,25 +162,37 @@ public class KasinoGameListCommand : ICommand CancellationToken ctx) { var response = $"{user.FormatUsername()}, Kasino games:[br]"; - var colors = - await SettingsProvider.GetMultipleValuesAsync([ - BuiltIn.Keys.KiwiFarmsGreenColor, BuiltIn.Keys.KiwiFarmsRedColor - ]); + var colors = await SettingsProvider.GetMultipleValuesAsync([ + BuiltIn.Keys.KiwiFarmsGreenColor, + BuiltIn.Keys.KiwiFarmsRedColor + ]); - foreach (var game in KasinoGameSettingMap.All - .OrderBy(g => g.Game.ToString())) + await using var db = new ApplicationDbContext(); + var gameSettingPattern = new Regex(@"^Kasino\.(?\w+)\.Enabled$", RegexOptions.IgnoreCase); + + var allGameSettings = await db.Settings + .Where(s => s.Key.StartsWith("Kasino.") && s.Key.EndsWith(".Enabled")) + .ToListAsync(ctx); + + var orderedSettings = allGameSettings.OrderBy(s => { - var isEnabled = (await SettingsProvider - .GetValueAsync(game.SettingKey)) - .ToBoolean(); + var match = gameSettingPattern.Match(s.Key); + return match.Groups["game"].Value; + }); + + foreach (var setting in orderedSettings) + { + var isEnabled = setting.Value?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false; + var match = gameSettingPattern.Match(setting.Key); + var gameName = match.Groups["game"].Value.Humanize(); var status = isEnabled ? $"[B][COLOR={colors[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]ENABLED[/COLOR][/B]" : $"[B][COLOR={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]DISABLED[/COLOR][/B]"; - response += $"{game.Game.Humanize()}: {status}[br]"; + response += $"{gameName}: {status}[br]"; } - await botInstance.SendChatMessageAsync(response,true); + await botInstance.SendChatMessageAsync(response, true); } } \ No newline at end of file