diff --git a/KfChatDotNetBot/Commands/KasinoGambaCommands.cs b/KfChatDotNetBot/Commands/KasinoGambaCommands.cs index 0e9a4d3..c275a17 100644 --- a/KfChatDotNetBot/Commands/KasinoGambaCommands.cs +++ b/KfChatDotNetBot/Commands/KasinoGambaCommands.cs @@ -27,14 +27,20 @@ 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()); if (!arguments.TryGetValue("amount", out var amount)) { - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !guess ", true); + await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !guess ", true, autoDeleteAfter: cleanupDelay); return; } var wager = Convert.ToDecimal(amount.Value); var guess = Convert.ToInt32(arguments["number"].Value); + if (guess is < 1 or > 10) + { + await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, your guess must be between 1 and 10", true, autoDeleteAfter: cleanupDelay); + return; + } var gambler = await Money.GetGamblerEntityAsync(user.Id, ct: ctx); if (gambler == null) throw new InvalidOperationException($"Caught a null when retrieving gambler for {user.KfUsername}"); @@ -42,7 +48,7 @@ public class GuessWhatNumberCommand : ICommand { await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, your balance of {await gambler.Balance.FormatKasinoCurrencyAsync()} isn't enough for this wager.", - true); + true, autoDeleteAfter: cleanupDelay); return; } @@ -55,7 +61,7 @@ public class GuessWhatNumberCommand : ICommand newBalance = gambler.Balance + effect; await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, correct! You won {await effect.FormatKasinoCurrencyAsync()} and your balance is now {await newBalance.FormatKasinoCurrencyAsync()}", - true); + true, autoDeleteAfter: cleanupDelay); return; } @@ -63,7 +69,7 @@ public class GuessWhatNumberCommand : ICommand newBalance = gambler.Balance - wager; await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, wrong! I was thinking of {answer}. Your balance is now {await newBalance.FormatKasinoCurrencyAsync()}", - true); + true, autoDeleteAfter: cleanupDelay); } } @@ -96,9 +102,12 @@ 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()); if (!arguments.TryGetValue("amount", out var amount)) //if user just enters !keno { - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !keno , or !keno and 10 will be selected automatically", true); + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, not enough arguments. !keno , or !keno and 10 will be selected automatically", + true, autoDeleteAfter: cleanupDelay); return; } var wager = Convert.ToDecimal(amount.Value); @@ -110,13 +119,14 @@ public class KenoCommand : ICommand { await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, your balance of {await gambler.Balance.FormatKasinoCurrencyAsync()} isn't enough for this wager.", - true); + true, autoDeleteAfter: cleanupDelay); return; } if (numbers is < 1 or > 10) //if user picks invalid numbers { - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, you can only pick numbers from 1 - 10", true); + await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, you can only pick numbers from 1 - 10", + true, autoDeleteAfter: cleanupDelay); return; } @@ -147,7 +157,9 @@ public class KenoCommand : ICommand if (payoutMulti == 0) //you lose { await Money.NewWagerAsync(gambler.Id, wager, -wager, WagerGame.Keno, ct: ctx); - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]lost {await wager.FormatKasinoCurrencyAsync()}[/color]. Your balance is now: {await gambler.Balance.FormatKasinoCurrencyAsync()}.", true); + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]lost {await wager.FormatKasinoCurrencyAsync()}[/color]. Your balance is now: {await gambler.Balance.FormatKasinoCurrencyAsync()}.", + true, autoDeleteAfter: cleanupDelay); return; } @@ -156,11 +168,14 @@ public class KenoCommand : ICommand // Required to avoid compiler errors when trying to format it in the win message var newBalance = gambler.Balance + win; await Money.NewWagerAsync(gambler.Id, wager, wager * (decimal)payoutMulti, WagerGame.Keno, ct: ctx); - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]won {await win.FormatKasinoCurrencyAsync()} with a {payoutMulti}x multi![/color]. Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}.", true); + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]won {await win.FormatKasinoCurrencyAsync()} with a {payoutMulti}x multi![/color]. Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}.", + true, autoDeleteAfter: cleanupDelay); } private async Task AnimatedDisplayTable(List playerNumbers, List casinoNumbers, List matches, ChatBot botInstance) { + var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoKenoCleanupDelay)).ToType()); var logger = LogManager.GetCurrentClassLogger(); var displayMessage = ""; //keno board is 8 x 5, numbers left to right, top to bottom @@ -177,7 +192,7 @@ public class KenoCommand : ICommand displayMessage += "[br]"; } - var msg = await botInstance.SendChatMessageAsync(displayMessage, true); + var msg = await botInstance.SendChatMessageAsync(displayMessage, true, autoDeleteAfter: cleanupDelay); var i = 0; while (msg.ChatMessageId == null) { @@ -278,10 +293,12 @@ public class Planes : ICommand public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx) { + var cleanupDelay = TimeSpan.FromMilliseconds((await SettingsProvider.GetValueAsync(BuiltIn.Keys.KasinoPlanesCleanupDelay)).ToType()); var logger = LogManager.GetCurrentClassLogger(); if (!arguments.TryGetValue("amount", out var amount)) { - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !planes ", true); + await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, not enough arguments. !planes ", + true, autoDeleteAfter: cleanupDelay); return; } var wager = Convert.ToDecimal(amount.Value); @@ -292,7 +309,7 @@ public class Planes : ICommand { await botInstance.SendChatMessageAsync( $"{user.FormatUsername()}, your balance of {await gambler.Balance.FormatKasinoCurrencyAsync()} isn't enough for this wager.", - true); + true, autoDeleteAfter: cleanupDelay); return; } @@ -300,10 +317,11 @@ public class Planes : ICommand var planesBoard = CreatePlanesBoard(gambler); var planesBoard2 = CreatePlanesBoard(gambler); var plane = new Plane(gambler); - var frameLength = 1056.0; + var frameLength = 3888.0; + var fullCounter = 0; var counter = 0; var noseUp = true; - var planesDisplay = GetGameBoard(-3, planesBoard, plane, carrierCount, noseUp); + var planesDisplay = GetPreGameBoard(-3, planesBoard, plane, carrierCount, noseUp); var msgId = await botInstance.SendChatMessageAsync(planesDisplay, true); var num = 0; while (msgId.ChatMessageId == null) @@ -321,42 +339,40 @@ public class Planes : ICommand */ do { + counter = fullCounter % 13 - 3; await Task.Delay(TimeSpan.FromMilliseconds(frameLength / 3), ctx); var neutral = false; var frameCounter = 0; - if (counter % 13 < 3) + if (counter < 0) { - while (counter % 13 < 3) + while (counter < 0) { - planesDisplay = GetGameBoard(counter%13 - 3, planesBoard, plane, carrierCount, noseUp); + counter = fullCounter % 13 - 3; + planesDisplay = GetGameBoard(fullCounter, planesBoard, planesBoard2, plane, carrierCount, noseUp); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await Task.Delay(TimeSpan.FromMilliseconds(frameLength), ctx); - logger.Info($"Generated preGameFrame {counter} and waited {frameLength}ms."); - counter++; + fullCounter++; } - - logger.Info("Pregame frames successfully generated."); } else { while (!neutral) { frameCounter++; - logger.Info($"FrameCounter: {frameCounter} Counter: {counter}"); try { - switch (planesBoard[plane.Height, counter % 13 - 3]) + switch (planesBoard[plane.Height, fullCounter]) { case 0: //do nothing plane hit neutral space neutral = true; break; case 1: //hit rocket - planesBoard[plane.Height, counter % 13 - 3] = 0; //plane consumes rocket + planesBoard[plane.Height, fullCounter] = 0; //plane consumes rocket plane.HitRocket(); noseUp = false; break; case 2: //hit multi - planesBoard[plane.Height, counter % 13 - 3] = 0; //plane consumes multi + planesBoard[plane.Height, fullCounter] = 0; //plane consumes multi plane.HitMulti(); noseUp = true; break; @@ -367,7 +383,9 @@ public class Planes : ICommand } catch (IndexOutOfRangeException e) { - await botInstance.SendChatMessageAsync($"Something went wrong, error code 2. Counter: {counter} Counter%: {counter %13 - 3} Height: {plane.Height}[br]{e}", true); + await botInstance.SendChatMessageAsync( + $"Something went wrong, error code 2. Counter: {counter} Counter%: {counter % 13 - 3} Height: {plane.Height}[br]{e}", + true, autoDeleteAfter: cleanupDelay); logger.Error( $"Something went wrong, error code 2. Counter: {counter} Counter%: {counter % 13 - 3} Height: {plane.Height}"); logger.Error(e); @@ -380,7 +398,7 @@ public class Planes : ICommand else await Task.Delay(TimeSpan.FromMilliseconds(frameLength / (3 * (frameCounter - 1))), ctx); } else await Task.Delay(TimeSpan.FromMilliseconds(frameLength / (3 * frameCounter)), ctx); //if not the last frame use a fraction of the remaining frame time - planesDisplay = GetGameBoard(counter % 13 - 3, planesBoard, plane, carrierCount, noseUp); + planesDisplay = GetGameBoard(counter, planesBoard, planesBoard2, plane, carrierCount, noseUp); planesDisplay += $"[br]Multi: {plane.MultiTracker}x"; for (var i = 0; i < 10; i++) { @@ -396,10 +414,11 @@ public class Planes : ICommand } //maybe fuckery around here } - counter++; + fullCounter++; } + plane.Gravity(); - if (counter % 13 != 0) continue; + if (counter != 0) continue; planesBoard = planesBoard2; planesBoard2 = CreatePlanesBoard(gambler); } while (plane.Height < 6); @@ -409,34 +428,38 @@ public class Planes : ICommand BuiltIn.Keys.KiwiFarmsGreenColor, BuiltIn.Keys.KiwiFarmsRedColor ]); var newBalance = gambler.Balance - wager; - if (((counter % 13) - 3) % carrierCount == 0) //if you landed on the carrier + if ((fullCounter - 3) % carrierCount == 0) //if you landed on the carrier { var win = plane.MultiTracker * wager; newBalance = gambler.Balance + win; - planesDisplay = GetGameBoard(counter% 13 - 3, planesBoard, plane, carrierCount, noseUp); - await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await Money.NewWagerAsync(gambler.Id, wager, win, WagerGame.Planes, ct: ctx); + planesDisplay = GetGameBoard(fullCounter, planesBoard, planesBoard2, plane, carrierCount, noseUp); + await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await botInstance.SendChatMessageAsync( - $"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]successfully landed with {await win.FormatKasinoCurrencyAsync()} from a total {plane.MultiTracker:N2}x multi![/color]. Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}", true); + $"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]successfully landed with {await win.FormatKasinoCurrencyAsync()} from a total {plane.MultiTracker:N2}x multi![/color]. Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}", + true, autoDeleteAfter: cleanupDelay); return; } plane.Crash(); await Money.NewWagerAsync(gambler.Id, wager, -wager, WagerGame.Planes, ct: ctx); - planesDisplay = GetGameBoard(counter % 13 - 3, planesBoard, plane, carrierCount, noseUp); + planesDisplay = GetGameBoard(fullCounter, planesBoard, planesBoard2, plane, carrierCount, noseUp); await Task.Delay(TimeSpan.FromMilliseconds(frameLength), ctx); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); - await botInstance.SendChatMessageAsync($"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]crashed![/color] Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}", true); + await botInstance.SendChatMessageAsync( + $"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]crashed![/color] Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}", + true, autoDeleteAfter: cleanupDelay); } - - private string GetGameBoard(int counter, int[,] planesBoard, Plane plane, int carrierCount, bool noseUp) + private string GetPreGameBoard(int fullCounter, int[,] planesBoard, Plane plane, int carrierCount, bool noseUp) { + //counter < 5 + var counter = fullCounter % 13 - 3; var output = ""; for (var row = 0; row < 8; row++) { for (var column = -3; column < 10; column++) //plane starts out 3 space behind to give some space to the view, { - if (row == plane.Height && column == counter - 1 && plane.JustHitMulti > 0) + if (row == plane.Height && column == counter - 1 && plane.JustHitMulti > 1) { output += Boost; } @@ -489,6 +512,75 @@ public class Planes : ICommand } return output; } + + private string GetGameBoard(int fullCounter, int[,] planesBoard, int[,] planesBoard2, Plane plane, int carrierCount, bool noseUp) + { + var counter = fullCounter % 13 - 3; + var output = ""; + List planesBoards = new List() { planesBoard, planesBoard2 }; + if (counter < 3) + { + output = GetPreGameBoard(counter, planesBoard, plane, carrierCount, noseUp); + return output; + } + for (var row = 0; row < 8; row++) + { + for (var column = -3; column < 10; column++) //plane starts out 3 space behind to give some space to the view, + { + int useBoard; + if (counter + column % 26 < 13) useBoard = 0; //0 - 12 + else useBoard = 1; //13-25 + + if (row == plane.Height && column == 2 && plane.JustHitMulti > 1) + { + output += Boost; + } + else if (row == plane.Height && column == 3) + { + if (plane.Crashed) output += PlaneExplosion; + else + switch (noseUp) + { + case true: + output += PlaneUp; + break; + case false: + output += PlaneDown; + break; + } + } + + else if (row == 6)//row between the gameboard and where the carrier is displayed, should show the plane in this row on top of the boat on a win + { + output += Air; + } + else if (row == 7) //water/carrier row + { + if ((column + counter) % carrierCount == 0) output += Carrier; + else output += Water; + } + else //this leaves rows 0-5 and columns 0-10, exactly what we need for the board + { + switch (planesBoards[useBoard][row, column]) + { + case 0: + output += Air; + break; + case 1: + output += Bomb; + break; + case 2: + output += Multi; + break; + } + } + } + output += "[br]"; + + } + + return output; + } private int[,] CreatePlanesBoard(GamblerDbModel gambler) { diff --git a/KfChatDotNetBot/Settings/BuiltIn.cs b/KfChatDotNetBot/Settings/BuiltIn.cs index 0f9a337..6cd2678 100644 --- a/KfChatDotNetBot/Settings/BuiltIn.cs +++ b/KfChatDotNetBot/Settings/BuiltIn.cs @@ -1091,6 +1091,30 @@ public static class BuiltIn Default = "250", ValueType = SettingValueType.Text, Regex = WholeNumberRegex + }, + new BuiltInSettingsModel + { + Key = Keys.KasinoGuessWhatNumberCleanupDelay, + Description = "Delay in milliseconds before cleaning up the guess what result", + Default = "15000", + ValueType = SettingValueType.Text, + Regex = WholeNumberRegex + }, + new BuiltInSettingsModel + { + Key = Keys.KasinoKenoCleanupDelay, + Description = "Delay in milliseconds before cleaning up the Keno board", + Default = "30000", + ValueType = SettingValueType.Text, + Regex = WholeNumberRegex + }, + new BuiltInSettingsModel + { + Key = Keys.KasinoPlanesCleanupDelay, + Description = "Delay in milliseconds before cleaning up the planes board and result", + Default = "60000", + ValueType = SettingValueType.Text, + Regex = WholeNumberRegex } ]; @@ -1217,5 +1241,8 @@ public static class BuiltIn public static string DiscordOnlySendSummariesIncludingBmj = "Discord.OnlySendSummariesIncludingBmj"; public static string BossmanLastSighting = "Bot.BossmanLastSighting"; public static string KasinoKenoFrameDelay = "Kasino.Keno.FrameDelay"; + public static string KasinoGuessWhatNumberCleanupDelay = "Kasino.GuessWhatNumber.CleanupDelay"; + public static string KasinoKenoCleanupDelay = "Kasino.Keno.CleanupDelay"; + public static string KasinoPlanesCleanupDelay = "Kasino.Planes.CleanupDelay"; } } \ No newline at end of file