diff --git a/KfChatDotNetBot/Commands/KasinoGambaCommands.cs b/KfChatDotNetBot/Commands/KasinoGambaCommands.cs new file mode 100644 index 0000000..6726f75 --- /dev/null +++ b/KfChatDotNetBot/Commands/KasinoGambaCommands.cs @@ -0,0 +1,61 @@ +using System.Text.RegularExpressions; +using KfChatDotNetBot.Extensions; +using KfChatDotNetBot.Models; +using KfChatDotNetBot.Models.DbModels; +using KfChatDotNetBot.Services; +using KfChatDotNetWsClient.Models.Events; + +namespace KfChatDotNetBot.Commands; + +[KasinoCommand] +[WagerCommand] +public class GuessWhatNumberCommand : ICommand +{ + public List Patterns => [ + new Regex(@"^guess (?\d+) (?\d+)$", RegexOptions.IgnoreCase), + new Regex(@"^guess (?\d+\.\d+) (?\d+)$", RegexOptions.IgnoreCase), + new Regex("^guess$") + ]; + public string? HelpText => "What number am I thinking of?"; + 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("amount", out var amount)) + { + await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !guess ", true); + return; + } + + var wager = Convert.ToDecimal(amount); + var guess = Convert.ToInt32(arguments["number"].Value); + var gambler = await Money.GetGamblerEntityAsync(user.Id, ct: ctx); + if (gambler == null) + throw new InvalidOperationException($"Caught a null when retrieving gambler for {user.KfUsername}"); + if (gambler.Balance < wager) + { + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, your balance of {await gambler.Balance.FormatKasinoCurrencyAsync()} isn't enough for this wager.", + true); + return; + } + + var answer = Money.GetRandomNumber(gambler, 1, 10); + if (guess == answer) + { + var effect = wager * 9; + await Money.NewWagerAsync(gambler.Id, wager, effect, WagerGame.GuessWhatNumber, ct: ctx); + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, correct! You won {await effect.FormatKasinoCurrencyAsync()} and your balance is now {await (gambler.Balance + effect).FormatKasinoCurrencyAsync()}", + true); + return; + } + + await Money.NewWagerAsync(gambler.Id, wager, -wager, WagerGame.GuessWhatNumber, ct: ctx); + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, wrong! I was thinking of {answer}. Your balance is now {await (gambler.Balance - wager).FormatKasinoCurrencyAsync()}", + true); + } +} \ No newline at end of file diff --git a/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs b/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs index c09965b..ed503f6 100644 --- a/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs +++ b/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs @@ -287,7 +287,9 @@ public enum WagerGame /// /// This is for betting pools based on some sort of event or outcome /// - Event + Event, + [Description("Guess what number I'm thinking of")] + GuessWhatNumber } public enum GamblerState