some sloppa fixes (#69)

* update

update

* service

service

* Optimize message retrieval in MinesCommand

Refactor message handling in MinesCommand to use last message directly.

* Replace LastMessageId with LastMessage object
This commit is contained in:
alogindtractor
2026-02-08 17:06:15 -08:00
committed by GitHub
parent 1901507c25
commit d5f04b5228
2 changed files with 71 additions and 40 deletions

View File

@@ -23,8 +23,8 @@ public class KasinoMines
public decimal Wager { get; set; }
public int Size { get; set; }
public int Mines { get; set; }
public List<(int r, int c)> BetsPlaced = new();
public int LastMessageId;
public List<(int r, int c)> BetsPlaced;
public SentMessageTrackerModel LastMessage;
public KasinoMinesGame(GamblerDbModel creator, decimal wager, int size, int mines)
@@ -34,30 +34,38 @@ public class KasinoMines
Mines = mines;
Wager = wager;
MinesBoard = CreateBoard();
BetsPlaced = new();
}
public async Task ResetMessage(SentMessageTrackerModel msg)
{
_logger.Info("Resetting message");
// 0 is the default for int
if (LastMessageId != 0)
if (LastMessage.ChatMessageId.Value != 0)
{
await _kfChatBot.KfClient.DeleteMessageAsync(LastMessageId);
await _kfChatBot.KfClient.DeleteMessageAsync(LastMessage.ChatMessageId.Value);
}
if (msg.ChatMessageId == null) throw new InvalidOperationException($"ChatMessageId was null for {msg.Reference}");
LastMessageId = msg.ChatMessageId.Value;
LastMessage = msg;
}
public async Task RigBoard((int r, int c) coord) //moves one of the mines to a specified coordinate for house edge rigging
{
//find the first mine
(int r, int c) originalMine = (11, 11);
bool brek = false;
for (int r = 0; r < Size; r++)
{
for (int c = 0; c < Size; c++)
{
if (MinesBoard[r, c] == 'M') originalMine = (r, c);
if (MinesBoard[r, c] == 'M')
{
originalMine = (r, c);
brek = true;
break;
}
}
if (brek) break;
}
MinesBoard[coord.r, coord.c] = 'M';
@@ -71,7 +79,7 @@ public class KasinoMines
}
public async Task Explode((int r, int c) mineLocation, SentMessageTrackerModel msg)
{
if (LastMessageId != msg.ChatMessageId!.Value)
if (LastMessage.ChatMessageId.Value != msg.ChatMessageId!.Value)
{
await ResetMessage(msg);
}
@@ -133,7 +141,7 @@ public class KasinoMines
}
await Task.Delay(100);
await _kfChatBot.KfClient.EditMessageAsync(LastMessageId, $"{str}[br]{Creator.User.FormatUsername()}");
await _kfChatBot.KfClient.EditMessageAsync(LastMessage.ChatMessageId.Value, $"{str}[br]{Creator.User.FormatUsername()}");
}
await Task.Delay(TimeSpan.FromSeconds(10));
@@ -278,11 +286,11 @@ public class KasinoMines
public async Task Cashout(KasinoMinesGame game)
{
decimal payout = 0;
decimal possiblePicks = game.Size * game.Size - game.Mines;
decimal numGems = game.Size * game.Size - game.Mines;
for (int i = 0; i < game.BetsPlaced.Count; i++)
{
payout += game.Wager * (possiblePicks / game.BetsPlaced.Count);
possiblePicks--;
payout += game.Wager * (game.Size * game.Size / numGems);
numGems--;
}
var newBalance = await Money.NewWagerAsync(game.Creator.Id, game.Wager, payout, WagerGame.Mines);
@@ -297,7 +305,7 @@ public class KasinoMines
await GetSavedGames(gamblerId);
var game = ActiveGames[gamblerId];
game.LastInteracted = DateTimeOffset.UtcNow;
if (game.LastMessageId != msg.ChatMessageId!.Value)
if (game.LastMessage.ChatMessageId.Value != msg.ChatMessageId!.Value)
{
await game.ResetMessage(msg);
}
@@ -316,6 +324,12 @@ public class KasinoMines
}
}
if (validBets.Count == 0)
{
await _kfChatBot.SendChatMessageAsync($"{game.Creator.User.FormatUsername()}, unable to generate valid betting positions, game closed.", true, autoDeleteAfter: TimeSpan.FromSeconds(5));
return false;
}
if (count > numGems)
{
count = numGems;
@@ -329,13 +343,14 @@ public class KasinoMines
await _kfChatBot.SendChatMessageAsync($"{game.Creator.User.FormatUsername()}, you bet on all gems, so you will automatically cash out if you win.", true, autoDeleteAfter: TimeSpan.FromSeconds(5));
cashOut = true;
}
//randomly pull from that list to add coordinates to bet on
for (int i = 0; i < count; i++)
{
int rand = Money.GetRandomNumber(game.Creator, 0, validBets.Count - 1);
betCoords.Add(validBets[rand]);
validBets.Remove(betCoords[rand]);
validBets.RemoveAt(rand);
}
return await Bet(gamblerId, betCoords, msg, cashOut, true);
@@ -347,7 +362,7 @@ public class KasinoMines
await GetSavedGames(gamblerId);
var game = ActiveGames[gamblerId];
game.LastInteracted = DateTimeOffset.UtcNow;
if (game.LastMessageId != msg.ChatMessageId!.Value)
if (game.LastMessage.ChatMessageId.Value != msg.ChatMessageId!.Value)
{
await game.ResetMessage(msg);
}
@@ -370,18 +385,19 @@ public class KasinoMines
}
var invalidBetMsg = await _kfChatBot.SendChatMessageAsync($"{game.Creator.User.FormatUsername()}, checking bets...", true);
await _kfChatBot.WaitForChatMessageAsync(invalidBetMsg);
await Task.Delay(3);
foreach (var bet in coords)
{
if (!validBets.Contains(bet) || game.BetsPlaced.Contains(bet) || bets.Contains(bet))
{
await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageId!.Value,
$"{game.Creator.User.FormatUsername()}, invalid bet of {bet.r},{bet.c} removed (already placed, duplicate, or invalid coordinate)");
await Task.Delay(3);
}
else bets.Add(bet);
}
await _kfChatBot.KfClient.DeleteMessageAsync(invalidBetMsg.ChatMessageId!.Value);
if (bets.Count > numGems)
{
@@ -397,6 +413,7 @@ public class KasinoMines
cashOut = true;
}
await Task.Delay(5);
_ = _kfChatBot.KfClient.DeleteMessageAsync(invalidBetMsg.ChatMessageId.Value);
}