Kasino game access control (#25)

* Blackjack

* sync

* Kasino game enable/disable control
This commit is contained in:
CrackmaticSoftware
2026-01-07 23:09:56 +01:00
committed by GitHub
parent 47771a0f4c
commit 7e3ba4e641
11 changed files with 294 additions and 9 deletions

View File

@@ -41,8 +41,23 @@ public class BlackjackCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var cleanupDelay = TimeSpan.FromMilliseconds(
(await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoBlackjackCleanupDelay)).ToType<int>());
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoBlackjackCleanupDelay,
BuiltIn.Keys.KasinoBlackjackEnabled
]);
// Check if blackjack is enabled
var blackjackEnabled = (settings[BuiltIn.Keys.KasinoBlackjackEnabled]).ToBoolean();
if (!blackjackEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, blackjack is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoBlackjackCleanupDelay].ToType<int>());
// Check if this is a new game or continuing existing game
if (arguments.TryGetValue("amount", out var amountGroup))

View File

@@ -30,7 +30,24 @@ public class DiceCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel messagen, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoDiceCleanupDelay)).ToType<int>());
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoDiceCleanupDelay,
BuiltIn.Keys.KasinoDiceEnabled
]);
// Check if dice is enabled
var diceEnabled = (settings[BuiltIn.Keys.KasinoDiceEnabled]).ToBoolean();
if (!diceEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, dice is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoDiceCleanupDelay].ToType<int>());
if (!arguments.TryGetValue("amount", out var amount))
{
await botInstance.SendChatMessageAsync(

View File

@@ -24,7 +24,24 @@ public class GuessWhatNumberCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoGuessWhatNumberCleanupDelay)).ToType<int>());
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoGuessWhatNumberCleanupDelay,
BuiltIn.Keys.KasinoGuessWhatNumberEnabled
]);
// Check if guesswhatnumber is enabled
var guessWhatNumberEnabled = (settings[BuiltIn.Keys.KasinoGuessWhatNumberEnabled]).ToBoolean();
if (!guessWhatNumberEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, guess what number is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGuessWhatNumberCleanupDelay].ToType<int>());
if (!arguments.TryGetValue("amount", out var amount))
{
await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !guess <wager> <number between 1 and 10>", true, autoDeleteAfter: cleanupDelay);

View File

@@ -4,6 +4,7 @@ using KfChatDotNetBot.Extensions;
using KfChatDotNetBot.Models;
using KfChatDotNetBot.Models.DbModels;
using KfChatDotNetBot.Services;
using KfChatDotNetBot.Settings;
using KfChatDotNetWsClient.Models.Events;
using Microsoft.EntityFrameworkCore;
@@ -74,3 +75,120 @@ public class TempExcludeCommand : ICommand
await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, excluded {targetUser.KfUsername} for {exclusionTime.Humanize()}", true);
}
}
internal record KasinoGameSetting(WagerGame Game, string SettingKey, string Alias);
internal static class KasinoGameSettingMap
{
internal static readonly IReadOnlyList<KasinoGameSetting> All = new List<KasinoGameSetting>
{
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")
};
internal static KasinoGameSetting? FindByAlias(string alias) =>
All.FirstOrDefault(g =>
g.Alias.Equals(alias, StringComparison.OrdinalIgnoreCase));
}
public class KasinoGameToggleCommand : ICommand
{
public List<Regex> Patterns => [
new Regex(@"^admin kasino (?<game>\w+) (?<action>enable|disable)$", RegexOptions.IgnoreCase)
];
public string? HelpText => "Enable or disable a Kasino game (use 'all' to toggle all games)";
public UserRight RequiredRight => UserRight.TrueAndHonest;
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public RateLimitOptionsModel? RateLimitOptions => null;
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
if (!arguments.TryGetValue("game", out var gameArg) || !arguments.TryGetValue("action", out var actionArg))
{
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, usage: !admin kasino <game|all> enable|disable", true);
return;
}
var gameName = gameArg.Value.ToLower();
var action = actionArg.Value.ToLower();
var shouldEnable = action == "enable";
var status = shouldEnable ? "enabled" : "disabled";
// Handle "all" games
if (gameName == "all")
{
foreach (var gameInfo in KasinoGameSettingMap.All)
{
await SettingsProvider.SetValueAsBooleanAsync(gameInfo.SettingKey, shouldEnable);
}
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, all {KasinoGameSettingMap.All.Count} Kasino games have been {status}.", true);
return;
}
// Handle individual game
var gameInfoMap = KasinoGameSettingMap.FindByAlias(gameName);
if (gameInfoMap 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.",
true);
return;
}
await SettingsProvider.SetValueAsBooleanAsync(gameInfoMap.SettingKey, shouldEnable);
var gameDisplayName = gameInfoMap.Game.Humanize();
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, {gameDisplayName} has been {status}.", true);
}
}
public class KasinoGameListCommand : ICommand
{
public List<Regex> Patterns => [
new Regex(@"^admin kasino games$", RegexOptions.IgnoreCase)
];
public string? HelpText => "List all kasino games and their status";
public UserRight RequiredRight => UserRight.TrueAndHonest;
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public RateLimitOptionsModel? RateLimitOptions => null;
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var response = $"{user.FormatUsername()}, Kasino games:[br]";
foreach (var game in KasinoGameSettingMap.All
.OrderBy(g => g.Game.ToString()))
{
var isEnabled = (await SettingsProvider
.GetValueAsync(game.SettingKey))
.ToBoolean();
var status = isEnabled
? $"[B][COLOR={BuiltIn.Keys.KiwiFarmsGreenColor}]ENABLED[/COLOR][/B]"
: $"[B][COLOR={BuiltIn.Keys.KiwiFarmsRedColor}]DISABLED[/COLOR][/B]";
response += $"{game.Game.Humanize()}: {status}[br]";
}
await botInstance.SendChatMessageAsync(response,true);
}
}

View File

@@ -39,7 +39,24 @@ public class KenoCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoKenoCleanupDelay)).ToType<int>());
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoKenoCleanupDelay,
BuiltIn.Keys.KasinoKenoFrameDelay, BuiltIn.Keys.KasinoKenoEnabled
]);
// Check if keno is enabled
var kenoEnabled = (settings[BuiltIn.Keys.KasinoKenoEnabled]).ToBoolean();
if (!kenoEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, keno is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoKenoCleanupDelay].ToType<int>());
if (!arguments.TryGetValue("amount", out var amount)) //if user just enters !keno
{
await botInstance.SendChatMessageAsync(
@@ -145,7 +162,7 @@ public class KenoCommand : ICommand
throw new Exception($"_kenoTable chat message ID never got populated. Tracker status is: {_kenoTable?.Status}");
}
var frameDelay = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoKenoFrameDelay)).ToType<int>();
var frameDelay = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoKenoFrameDelay)).ToType<int>(); // this should be grabbed from the settings dict declared at the start but idk how to do it cleanly atm.
//FIRST FRAME 11111111111111111111111111111
for (var frame = 0; frame < 10; frame++) //1 frame per casino number
{

View File

@@ -61,7 +61,24 @@ public class LambchopCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoLambchopCleanupDelay)).ToType<int>());
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoLambchopCleanupDelay,
BuiltIn.Keys.KasinoLambchopEnabled
]);
// Check if lambchop is enabled
var lambchopEnabled = (settings[BuiltIn.Keys.KasinoLambchopEnabled]).ToBoolean();
if (!lambchopEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, lambchop is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoLambchopCleanupDelay].ToType<int>());
if (!arguments.TryGetValue("amount", out var amount))
{
await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !lambchop <wager> <number between 1 and {FIELD_LENGTH}>", true, autoDeleteAfter: cleanupDelay);

View File

@@ -40,9 +40,24 @@ public class LimboCommand : ICommand
{
decimal limboNumber; //user number
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoLimboCleanupDelay, BuiltIn.Keys.KiwiFarmsGreenColor, BuiltIn.Keys.KiwiFarmsRedColor
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay,
BuiltIn.Keys.KasinoLimboCleanupDelay, BuiltIn.Keys.KasinoLimboEnabled,
BuiltIn.Keys.KiwiFarmsGreenColor, BuiltIn.Keys.KiwiFarmsRedColor
]);
// Check if limbo is enabled
var limboEnabled = (settings[BuiltIn.Keys.KasinoLimboEnabled]).ToBoolean();
if (!limboEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, limbo is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoLimboCleanupDelay].ToType<int>());
if (!arguments.TryGetValue("amount", out var amount))
{
await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !limbo <wager>",

View File

@@ -45,10 +45,23 @@ public class Planes : ICommand
CancellationToken ctx)
{
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoPlanesEnabled,
BuiltIn.Keys.KasinoPlanesCleanupDelay, BuiltIn.Keys.KasinoPlanesRandomRiggeryEnabled,
BuiltIn.Keys.KasinoPlanesTargetedRiggeryEnabled, BuiltIn.Keys.KasinoPlanesTargetedRiggeryVictims
]);
// Check if planes is enabled
var planesEnabled = (settings[BuiltIn.Keys.KasinoPlanesEnabled]).ToBoolean();
if (!planesEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, planes is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoPlanesCleanupDelay].ToType<int>());
var logger = LogManager.GetCurrentClassLogger();
if (!arguments.TryGetValue("amount", out var amount))
{

View File

@@ -43,6 +43,21 @@ public class SlotsCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel messagen, UserDbModel user,
GroupCollection arguments, CancellationToken ctx)
{
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoSlotsEnabled
]);
// Check if slots is enabled
var slotsEnabled = (settings[BuiltIn.Keys.KasinoSlotsEnabled]).ToBoolean();
if (!slotsEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, planes is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
if (!arguments.TryGetValue("amount", out var amount)) //if user just enters !keno
{
await botInstance.SendChatMessageAsync(

View File

@@ -64,7 +64,23 @@ public class WheelCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoWheelCleanupDelay)).ToType<int>());
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay, BuiltIn.Keys.KasinoWheelCleanupDelay,
BuiltIn.Keys.KasinoWheelEnabled
]);
// Check if wheel is enabled
var wheelEnabled = (settings[BuiltIn.Keys.KasinoWheelEnabled]).ToBoolean();
if (!wheelEnabled)
{
var gameDisabledCleanupDelay= TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoGameDisabledMessageCleanupDelay].ToType<int>());
await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, wheel is currently disabled.",
true, autoDeleteAfter: gameDisabledCleanupDelay);
return;
}
var cleanupDelay = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.KasinoWheelCleanupDelay].ToType<int>());
if (!arguments.TryGetValue("amount", out var amount))
{
await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !wheel <wager> <difficulty: low, medium, high>", true, autoDeleteAfter: cleanupDelay);

View File

@@ -473,6 +473,31 @@ public static class BuiltIn
public static string KasinoDailyDollarEnabled = "Kasino.DailyDollar.Enabled";
[BuiltInSetting("Timezone to use for daily reloads etc.", SettingValueType.Text, "Eastern Standard Time")]
public static string KasinoTimezone = "Kasino.Timezone";
// kasino game controll
[BuiltInSetting("Delay in milliseconds before cleaning up message indicating a Kasino game is disabled", SettingValueType.Text, "15000", WholeNumberRegex)]
public static string KasinoGameDisabledMessageCleanupDelay = "Kasino.GameDisabledMessage.CleanupDelay";
[BuiltInSetting("Whether guess what number is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoGuessWhatNumberEnabled = "Kasino.GuessWhatNumber.Enabled";
[BuiltInSetting("Whether dice is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoDiceEnabled = "Kasino.Dice.Enabled";
[BuiltInSetting("Whether limbo is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoLimboEnabled = "Kasino.Limbo.Enabled";
[BuiltInSetting("Whether mines is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoMinesEnabled = "Kasino.Mines.Enabled";
[BuiltInSetting("Whether wheel is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoWheelEnabled = "Kasino.Wheel.Enabled";
[BuiltInSetting("Whether blackjack is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoBlackjackEnabled = "Kasino.Blackjack.Enabled";
[BuiltInSetting("Whether planes is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoPlanesEnabled = "Kasino.Planes.Enabled";
[BuiltInSetting("Whether lambchop is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoLambchopEnabled = "Kasino.Lambchop.Enabled";
[BuiltInSetting("Whether keno is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoKenoEnabled = "Kasino.Keno.Enabled";
[BuiltInSetting("Whether coinflip is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoCoinflipEnabled = "Kasino.Coinflip.Enabled";
[BuiltInSetting("Whether slots is enabled", SettingValueType.Boolean, "true", BooleanRegex)]
public static string KasinoSlotsEnabled = "Kasino.Slots.Enabled";
}
}