Update for new chyat

This commit is contained in:
barelyprofessional
2026-02-28 15:34:36 -06:00
parent 8a827a17de
commit c8016b4fc6
23 changed files with 178 additions and 104 deletions

View File

@@ -193,7 +193,7 @@ public class ChatBot
foreach (var deletion in _scheduledDeletions) foreach (var deletion in _scheduledDeletions)
{ {
if (deletion.DeleteAt > now) continue; if (deletion.DeleteAt > now) continue;
if (deletion.Message.ChatMessageId == null) if (deletion.Message.ChatMessageUuid == null)
{ {
_logger.Error($"Can't clean up {deletion.Message.Reference} as it doesn't have a chat message ID"); _logger.Error($"Can't clean up {deletion.Message.Reference} as it doesn't have a chat message ID");
if (failures.TryGetValue(deletion.Message.Reference, out var failure)) if (failures.TryGetValue(deletion.Message.Reference, out var failure))
@@ -213,7 +213,7 @@ public class ChatBot
} }
continue; continue;
} }
await KfClient.DeleteMessageAsync(deletion.Message.ChatMessageId.Value); await KfClient.DeleteMessageAsync(deletion.Message.ChatMessageUuid);
removals.Add(deletion); removals.Add(deletion);
} }
foreach (var removal in removals) foreach (var removal in removals)
@@ -295,7 +295,7 @@ public class ChatBot
// Update last edit timestamp // Update last edit timestamp
if (message.Author.Username == settings[BuiltIn.Keys.KiwiFarmsUsername].Value && message.MessageEditDate != null) if (message.Author.Username == settings[BuiltIn.Keys.KiwiFarmsUsername].Value && message.MessageEditDate != null)
{ {
var sentMessage = SentMessages.FirstOrDefault(x => x.ChatMessageId == message.MessageId); var sentMessage = SentMessages.FirstOrDefault(x => x.ChatMessageUuid == message.MessageUuid);
if (sentMessage != null) if (sentMessage != null)
{ {
sentMessage.LastEdited = message.MessageEditDate.Value; sentMessage.LastEdited = message.MessageEditDate.Value;
@@ -321,14 +321,14 @@ public class ChatBot
// back to you. So this fallback should be generally correct and will account for the occasional // back to you. So this fallback should be generally correct and will account for the occasional
// mismatch due to messages not being 1:1 with what we thought we sent // mismatch due to messages not being 1:1 with what we thought we sent
_logger.Info("Just going to lazily associate it with the latest message"); _logger.Info("Just going to lazily associate it with the latest message");
latest.ChatMessageId = message.MessageId; latest.ChatMessageUuid = message.MessageUuid;
latest.Delay = DateTimeOffset.UtcNow - latest.SentAt; latest.Delay = DateTimeOffset.UtcNow - latest.SentAt;
latest.Status = SentMessageTrackerStatus.ResponseReceived; latest.Status = SentMessageTrackerStatus.ResponseReceived;
} }
} }
else else
{ {
sentMessage.ChatMessageId = message.MessageId; sentMessage.ChatMessageUuid = message.MessageUuid;
sentMessage.Delay = DateTimeOffset.UtcNow - sentMessage.SentAt; sentMessage.Delay = DateTimeOffset.UtcNow - sentMessage.SentAt;
sentMessage.Status = SentMessageTrackerStatus.ResponseReceived; sentMessage.Status = SentMessageTrackerStatus.ResponseReceived;
} }
@@ -350,7 +350,7 @@ public class ChatBot
// So this avoids reprocessing messages on reconnect while being able to handle edits, even if the edit came // So this avoids reprocessing messages on reconnect while being able to handle edits, even if the edit came
// during a disconnect / reconnect event // during a disconnect / reconnect event
if (!_seenMessages.Any(msg => if (!_seenMessages.Any(msg =>
msg.MessageId == message.MessageId && msg.LastEdited == message.MessageEditDate) && msg.MessageUuid == message.MessageUuid && msg.LastEdited == message.MessageEditDate) &&
!InitialStartCooldown) !InitialStartCooldown)
{ {
_logger.Debug("Passing message to command interface"); _logger.Debug("Passing message to command interface");
@@ -366,14 +366,14 @@ public class ChatBot
} }
// Update or add the element to keep it in sync // Update or add the element to keep it in sync
var existingMsg = _seenMessages.FirstOrDefault(msg => msg.MessageId == message.MessageId); var existingMsg = _seenMessages.FirstOrDefault(msg => msg.MessageUuid == message.MessageUuid);
if (existingMsg != null) if (existingMsg != null)
{ {
existingMsg.LastEdited = message.MessageEditDate; existingMsg.LastEdited = message.MessageEditDate;
} }
else else
{ {
_seenMessages.Add(new SeenMessageMetadataModel {MessageId = message.MessageId, LastEdited = message.MessageEditDate}); _seenMessages.Add(new SeenMessageMetadataModel {MessageUuid = message.MessageUuid, LastEdited = message.MessageEditDate});
} }
UpdateUserLastActivityAsync(message.Author.Id, WhoWasActivityType.Message).Wait(_cancellationToken); UpdateUserLastActivityAsync(message.Author.Id, WhoWasActivityType.Message).Wait(_cancellationToken);
// Strip weird control characters and just allow basic punctuation + whitespace // Strip weird control characters and just allow basic punctuation + whitespace
@@ -546,7 +546,7 @@ public class ChatBot
} }
var patienceEnds = DateTimeOffset.UtcNow.Add(patience.Value); var patienceEnds = DateTimeOffset.UtcNow.Add(patience.Value);
while (message.ChatMessageId == null) while (message.ChatMessageUuid == null)
{ {
if (DateTimeOffset.UtcNow > patienceEnds) return false; if (DateTimeOffset.UtcNow > patienceEnds) return false;
if (message.Status is SentMessageTrackerStatus.Lost or SentMessageTrackerStatus.NotSending) return false; if (message.Status is SentMessageTrackerStatus.Lost or SentMessageTrackerStatus.NotSending) return false;

View File

@@ -337,12 +337,12 @@ public class DeleteMessagesCommand : ICommand
.TakeLast(amount); .TakeLast(amount);
foreach (var msg in messages) foreach (var msg in messages)
{ {
if (msg.ChatMessageId == null) if (msg.ChatMessageUuid == null)
{ {
continue; continue;
} }
await botInstance.KfClient.DeleteMessageAsync(msg.ChatMessageId.Value); await botInstance.KfClient.DeleteMessageAsync(msg.ChatMessageUuid);
} }
} }
} }

View File

@@ -153,7 +153,7 @@ public class KasinoEventStart : ICommand
var msg = $":!: :!: A Keno Kasino event has started! :!: :!:[br]{targetEvent.EventText}[br]{guide}"; var msg = $":!: :!: A Keno Kasino event has started! :!: :!:[br]{targetEvent.EventText}[br]{guide}";
var msgIds = await botInstance.SendChatMessagesAsync(msg.FancySplitMessage(partSeparator: "[br]"), true); var msgIds = await botInstance.SendChatMessagesAsync(msg.FancySplitMessage(partSeparator: "[br]"), true);
var i = 0; var i = 0;
while (msgIds[0].ChatMessageId != null) while (msgIds[0].ChatMessageUuid != null)
{ {
i++; i++;
await Task.Delay(TimeSpan.FromMilliseconds(100), ctx); await Task.Delay(TimeSpan.FromMilliseconds(100), ctx);

View File

@@ -227,7 +227,7 @@ public class KenoCommand : ICommand
_kenoTable = await botInstance.SendChatMessageAsync(displayMessage, true); _kenoTable = await botInstance.SendChatMessageAsync(displayMessage, true);
var i = 0; var i = 0;
while (_kenoTable.ChatMessageId == null) while (_kenoTable.ChatMessageUuid == null)
{ {
i++; i++;
if (_kenoTable.Status is SentMessageTrackerStatus.NotSending or SentMessageTrackerStatus.Lost) return; if (_kenoTable.Status is SentMessageTrackerStatus.NotSending or SentMessageTrackerStatus.Lost) return;
@@ -235,7 +235,7 @@ public class KenoCommand : ICommand
await Task.Delay(100); await Task.Delay(100);
} }
if (_kenoTable.ChatMessageId == null) if (_kenoTable.ChatMessageUuid == null)
{ {
throw new Exception($"_kenoTable chat message ID never got populated. Tracker status is: {_kenoTable?.Status}"); throw new Exception($"_kenoTable chat message ID never got populated. Tracker status is: {_kenoTable?.Status}");
} }
@@ -269,7 +269,7 @@ public class KenoCommand : ICommand
} }
displayMessage += "[br]"; displayMessage += "[br]";
} }
await botInstance.KfClient.EditMessageAsync(_kenoTable.ChatMessageId!.Value, displayMessage); await botInstance.KfClient.EditMessageAsync(_kenoTable.ChatMessageUuid, displayMessage);
await Task.Delay(frameDelay); await Task.Delay(frameDelay);
if (displayMessage.Length <= 79 && displayMessage.Contains(BlankSpaceDisplay) && if (displayMessage.Length <= 79 && displayMessage.Contains(BlankSpaceDisplay) &&
(displayMessage.Contains(CasinoNumberDisplay) || displayMessage.Contains(MatchRevealDisplay) || (displayMessage.Contains(CasinoNumberDisplay) || displayMessage.Contains(MatchRevealDisplay) ||

View File

@@ -145,7 +145,7 @@ public class LambchopCommand : ICommand
var lambChopDisplayMessage = var lambChopDisplayMessage =
await botInstance.SendChatMessageAsync(ConvertLambchopFieldToString(tiles, hazards, true), true, await botInstance.SendChatMessageAsync(ConvertLambchopFieldToString(tiles, hazards, true), true,
autoDeleteAfter: cleanupDelay); autoDeleteAfter: cleanupDelay);
while (lambChopDisplayMessage.ChatMessageId == null) while (lambChopDisplayMessage.ChatMessageUuid == null)
{ {
await Task.Delay(50, ctx); // wait until first message is fully sent await Task.Delay(50, ctx); // wait until first message is fully sent
if (lambChopDisplayMessage.Status is SentMessageTrackerStatus.Lost or SentMessageTrackerStatus.NotSending) if (lambChopDisplayMessage.Status is SentMessageTrackerStatus.Lost or SentMessageTrackerStatus.NotSending)
@@ -307,7 +307,7 @@ public class LambchopCommand : ICommand
async Task UpdateGameAsync(string? updateText = null) async Task UpdateGameAsync(string? updateText = null)
{ {
updateText ??= ConvertLambchopFieldToString(tiles, hazards, false); updateText ??= ConvertLambchopFieldToString(tiles, hazards, false);
await botInstance.KfClient.EditMessageAsync(lambChopDisplayMessage.ChatMessageId!.Value, updateText); await botInstance.KfClient.EditMessageAsync(lambChopDisplayMessage.ChatMessageUuid, updateText);
await Task.Delay(TimeSpan.FromMilliseconds(FRAME_DELAY), ctx); await Task.Delay(TimeSpan.FromMilliseconds(FRAME_DELAY), ctx);
} }
} }

View File

@@ -269,11 +269,11 @@ public class MinesCommand : ICommand
var lastmsg = KasinoMines.ActiveGames[gambler.Id].LastMessageId; var lastmsg = KasinoMines.ActiveGames[gambler.Id].LastMessageId;
SentMessageTrackerModel msg; SentMessageTrackerModel msg;
if (lastmsg == 0) if (lastmsg == null)
{ {
msg = (await botInstance.SendChatMessageAsync($"{KasinoMines.ActiveGames[gambler.Id].ToString()}", true)); msg = (await botInstance.SendChatMessageAsync($"{KasinoMines.ActiveGames[gambler.Id].ToString()}", true));
await botInstance.WaitForChatMessageAsync(msg, ct: ctx); await botInstance.WaitForChatMessageAsync(msg, ct: ctx);
if (msg.ChatMessageId == null) throw new InvalidOperationException("Timed out waiting for the message"); if (msg.ChatMessageUuid == null) throw new InvalidOperationException("Timed out waiting for the message");
} }
else else
{ {

View File

@@ -119,7 +119,7 @@ public class Planes : ICommand
var planesDisplay = GetPreGameBoard(-3, planesBoard2, plane, CarrierCount, noseUp); var planesDisplay = GetPreGameBoard(-3, planesBoard2, plane, CarrierCount, noseUp);
var msgId = await botInstance.SendChatMessageAsync(planesDisplay, true); var msgId = await botInstance.SendChatMessageAsync(planesDisplay, true);
var num = 0; var num = 0;
while (msgId.ChatMessageId == null) while (msgId.ChatMessageUuid == null)
{ {
num++; num++;
if (msgId.Status is SentMessageTrackerStatus.NotSending or SentMessageTrackerStatus.Lost) return; if (msgId.Status is SentMessageTrackerStatus.NotSending or SentMessageTrackerStatus.Lost) return;
@@ -148,7 +148,7 @@ public class Planes : ICommand
} }
var winnings = plane.MultiTracker * wager; var winnings = plane.MultiTracker * wager;
planesDisplay += $"Winnings: {await winnings.FormatKasinoCurrencyAsync()}"; planesDisplay += $"Winnings: {await winnings.FormatKasinoCurrencyAsync()}";
await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageUuid, planesDisplay);
} }
var neutral = false; var neutral = false;
@@ -159,7 +159,7 @@ public class Planes : ICommand
{ {
counter = (fullCounter - 3) % 24; counter = (fullCounter - 3) % 24;
planesDisplay = GetPreGameBoard(fullCounter, planesBoard2, plane, CarrierCount, noseUp); planesDisplay = GetPreGameBoard(fullCounter, planesBoard2, plane, CarrierCount, noseUp);
await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageUuid, planesDisplay);
await Task.Delay(TimeSpan.FromMilliseconds(frameLength), ctx); await Task.Delay(TimeSpan.FromMilliseconds(frameLength), ctx);
fullCounter++; fullCounter++;
} }
@@ -236,7 +236,7 @@ public class Planes : ICommand
var winnings = plane.MultiTracker * wager; var winnings = plane.MultiTracker * wager;
planesDisplay += $"Winnings: {await winnings.FormatKasinoCurrencyAsync()}"; planesDisplay += $"Winnings: {await winnings.FormatKasinoCurrencyAsync()}";
await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageUuid, planesDisplay);
if (plane.Height > 5) if (plane.Height > 5)
{ {
break; break;
@@ -264,7 +264,7 @@ public class Planes : ICommand
var win = plane.MultiTracker * wager; var win = plane.MultiTracker * wager;
newBalance = await Money.NewWagerAsync(gambler.Id, wager, win, WagerGame.Planes, ct: ctx); newBalance = await Money.NewWagerAsync(gambler.Id, wager, win, WagerGame.Planes, ct: ctx);
planesDisplay = GetGameBoard(fullCounter, planesBoards, plane, CarrierCount, noseUp); planesDisplay = GetGameBoard(fullCounter, planesBoards, plane, CarrierCount, noseUp);
await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageUuid, planesDisplay);
await botInstance.SendChatMessageAsync( 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()}", $"{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); true, autoDeleteAfter: cleanupDelay);
@@ -275,7 +275,7 @@ public class Planes : ICommand
newBalance = await Money.NewWagerAsync(gambler.Id, wager, -wager, WagerGame.Planes, ct: ctx); newBalance = await Money.NewWagerAsync(gambler.Id, wager, -wager, WagerGame.Planes, ct: ctx);
planesDisplay = GetGameBoard(fullCounter, planesBoards, plane, CarrierCount, noseUp); planesDisplay = GetGameBoard(fullCounter, planesBoards, plane, CarrierCount, noseUp);
await Task.Delay(TimeSpan.FromMilliseconds(frameLength), ctx); await Task.Delay(TimeSpan.FromMilliseconds(frameLength), ctx);
await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageId!.Value, planesDisplay); await botInstance.KfClient.EditMessageAsync(msgId.ChatMessageUuid, planesDisplay);
await botInstance.SendChatMessageAsync( await botInstance.SendChatMessageAsync(
$"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]crashed![/color] Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}", $"{user.FormatUsername()}, you [color={colors[BuiltIn.Keys.KiwiFarmsRedColor].Value}]crashed![/color] Your balance is now: {await newBalance.FormatKasinoCurrencyAsync()}",
true, autoDeleteAfter: cleanupDelay); true, autoDeleteAfter: cleanupDelay);

View File

@@ -173,7 +173,7 @@ public class PlinkoCommand : ICommand
//game starts here //game starts here
int breakCounter = 0; int breakCounter = 0;
var plinkoMessageID = await botInstance.SendChatMessageAsync(PlinkoBoardDisplay(ballsInPlay), true, autoDeleteAfter: cleanupDelay); var plinkoMessageID = await botInstance.SendChatMessageAsync(PlinkoBoardDisplay(ballsInPlay), true, autoDeleteAfter: cleanupDelay);
while (plinkoMessageID.ChatMessageId == null && breakCounter < 1000) { while (plinkoMessageID.ChatMessageUuid == null && breakCounter < 1000) {
await Task.Delay(100, ctx); await Task.Delay(100, ctx);
breakCounter++; breakCounter++;
} }
@@ -195,7 +195,7 @@ public class PlinkoCommand : ICommand
ballsNotInPlay.RemoveAt(0); ballsNotInPlay.RemoveAt(0);
} }
PlinkoMessage = PlinkoBoardDisplay(ballsInPlay) + "[br]" + lastPayoutMessage; PlinkoMessage = PlinkoBoardDisplay(ballsInPlay) + "[br]" + lastPayoutMessage;
await botInstance.KfClient.EditMessageAsync(plinkoMessageID.ChatMessageId!.Value,PlinkoMessage); await botInstance.KfClient.EditMessageAsync(plinkoMessageID.ChatMessageUuid!, PlinkoMessage);
if (ballsInPlay[0].POSITION.row == DIFFICULTY - 1) //once your ball has reached the bottom calculate the payout if (ballsInPlay[0].POSITION.row == DIFFICULTY - 1) //once your ball has reached the bottom calculate the payout
{ {
currentPayout = wager * PlinkoPayoutBoard[ballsInPlay[0].POSITION.col]; currentPayout = wager * PlinkoPayoutBoard[ballsInPlay[0].POSITION.col];
@@ -219,7 +219,7 @@ public class PlinkoCommand : ICommand
await Task.Delay(300, ctx); await Task.Delay(300, ctx);
PlinkoMessage = PlinkoBoardDisplay(ballsInPlay) + "[br]" + lastPayoutMessage; PlinkoMessage = PlinkoBoardDisplay(ballsInPlay) + "[br]" + lastPayoutMessage;
await botInstance.KfClient.EditMessageAsync(plinkoMessageID.ChatMessageId!.Value, PlinkoMessage); await botInstance.KfClient.EditMessageAsync(plinkoMessageID.ChatMessageUuid!, PlinkoMessage);
await Task.Delay(300, ctx); await Task.Delay(300, ctx);
} }

View File

@@ -128,10 +128,12 @@ public class RainCommand : ICommand
{ {
timer--; timer--;
await Task.Delay(1000, ctx); await Task.Delay(1000, ctx);
await botInstance.KfClient.EditMessageAsync(msg.ChatMessageId!.Value, await botInstance.KfClient.EditMessageAsync(msg.ChatMessageUuid!,
$"{user.FormatUsername()} is making it rain with {await decAmount.FormatKasinoCurrencyAsync()}! Type !rain in the next {timer} seconds to join."); $"{user.FormatUsername()} is making it rain with {await decAmount.FormatKasinoCurrencyAsync()}! Type !rain in the next {timer} seconds to join.");
} }
await botInstance.KfClient.DeleteMessageAsync(msg.ChatMessageId!.Value);
await Task.Delay(100, ctx);
await botInstance.KfClient.DeleteMessageAsync(msg.ChatMessageUuid!);
// At this point the timer should take care of things but truthfully it's a disaster and probably won't work // At this point the timer should take care of things but truthfully it's a disaster and probably won't work
} }
} }

View File

@@ -262,7 +262,7 @@ public class RouletteCommand : ICommand
if (activeRound != null) if (activeRound != null)
{ {
activeRound.CountdownMessageId = countdownMessage.ChatMessageId; activeRound.CountdownMessageId = countdownMessage.ChatMessageUuid;
await SaveRound(activeRound); await SaveRound(activeRound);
} }
@@ -291,7 +291,7 @@ public class RouletteCommand : ICommand
try try
{ {
var updatedMessage = await FormatCountdownMessage(endTime); var updatedMessage = await FormatCountdownMessage(endTime);
await botInstance.KfClient.EditMessageAsync(countdownMessage.ChatMessageId!.Value, updatedMessage); await botInstance.KfClient.EditMessageAsync(countdownMessage.ChatMessageUuid!, updatedMessage);
var timeSinceLastUpdate = DateTimeOffset.UtcNow - lastUpdate; var timeSinceLastUpdate = DateTimeOffset.UtcNow - lastUpdate;
logger.Debug($"Countdown updated (elapsed: {timeSinceLastUpdate.TotalSeconds:F1}s, remaining: {remaining.TotalSeconds:F0}s)"); logger.Debug($"Countdown updated (elapsed: {timeSinceLastUpdate.TotalSeconds:F1}s, remaining: {remaining.TotalSeconds:F0}s)");
@@ -414,12 +414,12 @@ public class RouletteCommand : ICommand
logger.Info($"Animation uploaded: {animationUrl}"); logger.Info($"Animation uploaded: {animationUrl}");
// Update countdown message to show it's spinning // Update countdown message to show it's spinning
if (round.CountdownMessageId.HasValue) if (round.CountdownMessageId != null)
{ {
var spinningMessage = $"🎰 [B]SPINNING THE WHEEL...[/B] 🎰[br][br]" + var spinningMessage = $"🎰 [B]SPINNING THE WHEEL...[/B] 🎰[br][br]" +
"Watch the animation below!"; "Watch the animation below!";
await botInstance.KfClient.EditMessageAsync( await botInstance.KfClient.EditMessageAsync(
round.CountdownMessageId.Value, round.CountdownMessageId,
spinningMessage); spinningMessage);
} }
@@ -486,10 +486,10 @@ public class RouletteCommand : ICommand
$"All {round.Bets.Count} bet(s) have been refunded (total: {await totalRefunded.FormatKasinoCurrencyAsync()}).[br]" + $"All {round.Bets.Count} bet(s) have been refunded (total: {await totalRefunded.FormatKasinoCurrencyAsync()}).[br]" +
$"Please try again."; $"Please try again.";
if (round.CountdownMessageId.HasValue) if (round.CountdownMessageId != null)
{ {
await botInstance.KfClient.EditMessageAsync( await botInstance.KfClient.EditMessageAsync(
round.CountdownMessageId.Value, round.CountdownMessageId,
cancelMessage); cancelMessage);
} }
else else
@@ -707,10 +707,10 @@ public class RouletteCommand : ICommand
$"Cancelled by {user.FormatUsername()}[br]" + $"Cancelled by {user.FormatUsername()}[br]" +
$"Refunded {round.Bets.Count} bet(s) totaling {await totalRefunded.FormatKasinoCurrencyAsync()}"; $"Refunded {round.Bets.Count} bet(s) totaling {await totalRefunded.FormatKasinoCurrencyAsync()}";
if (round.CountdownMessageId.HasValue) if (round.CountdownMessageId != null)
{ {
await botInstance.KfClient.EditMessageAsync( await botInstance.KfClient.EditMessageAsync(
round.CountdownMessageId.Value, round.CountdownMessageId,
cancelMessage); cancelMessage);
} }
else else
@@ -884,7 +884,7 @@ public class RouletteCommand : ICommand
{ {
public required int RoundId { get; init; } public required int RoundId { get; init; }
public required DateTimeOffset StartTime { get; init; } public required DateTimeOffset StartTime { get; init; }
public int? CountdownMessageId { get; set; } public string? CountdownMessageId { get; set; }
public required List<RouletteBetInfo> Bets { get; init; } public required List<RouletteBetInfo> Bets { get; init; }
} }

View File

@@ -156,7 +156,7 @@ public class WheelCommand : ICommand
int delay = (int)(MIN_WHEELSPIN_DELAY + easeOut * (MAX_WHEELSPIN_DELAY - MIN_WHEELSPIN_DELAY)); int delay = (int)(MIN_WHEELSPIN_DELAY + easeOut * (MAX_WHEELSPIN_DELAY - MIN_WHEELSPIN_DELAY));
await Task.Delay(delay, ctx); await Task.Delay(delay, ctx);
wheel.RotateWheelOnce(); wheel.RotateWheelOnce();
await botInstance.KfClient.EditMessageAsync(wheelDisplayMessage.ChatMessageId!.Value, await botInstance.KfClient.EditMessageAsync(wheelDisplayMessage.ChatMessageUuid!,
wheel.ConvertWheelToOvalString()); wheel.ConvertWheelToOvalString());
} }

View File

@@ -156,16 +156,14 @@ public class NextPoVisitCommand : ICommand
return; return;
} }
var sent = await botInstance.SendChatMessageAsync($"Austin's next PO visit will be in roughly {timespan.Humanize(precision: 10, minUnit: TimeUnit.Millisecond)}", true); var sent = await botInstance.SendChatMessageAsync($"Austin's next PO visit will be in roughly {timespan.Humanize(precision: 10, minUnit: TimeUnit.Millisecond)}", true);
while (sent.Status != SentMessageTrackerStatus.ResponseReceived) var success = await botInstance.WaitForChatMessageAsync(sent, TimeSpan.FromSeconds(30), ctx);
{ if (!success) throw new InvalidOperationException();
await Task.Delay(250, ctx);
}
var i = 0; var i = 0;
while (i < 60) while (i < 60)
{ {
await Task.Delay(1000, ctx); await Task.Delay(1000, ctx);
timespan = DateTimeOffset.Parse(time.Value) - DateTimeOffset.UtcNow; timespan = DateTimeOffset.Parse(time.Value) - DateTimeOffset.UtcNow;
await botInstance.KfClient.EditMessageAsync(sent.ChatMessageId!.Value, await botInstance.KfClient.EditMessageAsync(sent.ChatMessageUuid!,
$"Austin's next PO visit will be in roughly {timespan.Humanize(precision: 10, minUnit: TimeUnit.Millisecond)}"); $"Austin's next PO visit will be in roughly {timespan.Humanize(precision: 10, minUnit: TimeUnit.Millisecond)}");
i++; i++;
} }
@@ -197,15 +195,13 @@ public class NextCourtHearingCommand : ICommand
} }
var sent = await botInstance.SendChatMessageAsync(RenderHearings(hearings),true); var sent = await botInstance.SendChatMessageAsync(RenderHearings(hearings),true);
while (sent.Status != SentMessageTrackerStatus.ResponseReceived) var success = await botInstance.WaitForChatMessageAsync(sent, TimeSpan.FromSeconds(15), ctx);
{ if (!success) throw new InvalidOperationException();
await Task.Delay(250, ctx);
}
var i = 0; var i = 0;
while (i < 60) while (i < 60)
{ {
await Task.Delay(1000, ctx); await Task.Delay(1000, ctx);
await botInstance.KfClient.EditMessageAsync(sent.ChatMessageId!.Value, RenderHearings(hearings)); await botInstance.KfClient.EditMessageAsync(sent.ChatMessageUuid!, RenderHearings(hearings));
i++; i++;
} }
} }

View File

@@ -35,7 +35,7 @@ public class EditTestCommand : ICommand
reference.Status == SentMessageTrackerStatus.Unknown || reference.Status == SentMessageTrackerStatus.Unknown ||
reference.Status == SentMessageTrackerStatus.ChatDisconnected || reference.Status == SentMessageTrackerStatus.ChatDisconnected ||
reference.Status == SentMessageTrackerStatus.Lost || reference.Status == SentMessageTrackerStatus.Lost ||
reference.ChatMessageId == null) reference.ChatMessageUuid == null)
{ {
logger.Error("Either message refused to send due to bot settings or something fucked up getting the message ID"); logger.Error("Either message refused to send due to bot settings or something fucked up getting the message ID");
return; return;
@@ -44,13 +44,13 @@ public class EditTestCommand : ICommand
{ {
i++; i++;
await Task.Delay(delay, ctx); await Task.Delay(delay, ctx);
await botInstance.KfClient.EditMessageAsync(reference.ChatMessageId!.Value, $"{msg} {i}"); await botInstance.KfClient.EditMessageAsync(reference.ChatMessageUuid, $"{msg} {i}");
} }
await Task.Delay(delay, ctx); await Task.Delay(delay, ctx);
await botInstance.KfClient.EditMessageAsync(reference.ChatMessageId!.Value, "This message will self destruct in 1 second"); await botInstance.KfClient.EditMessageAsync(reference.ChatMessageUuid, "This message will self destruct in 1 second");
await Task.Delay(delay, ctx); await Task.Delay(delay, ctx);
await botInstance.KfClient.DeleteMessageAsync(reference.ChatMessageId!.Value); await botInstance.KfClient.DeleteMessageAsync(reference.ChatMessageUuid);
} }
} }
@@ -113,15 +113,15 @@ public class LengthLimitTestCommand : ICommand
true, ChatBot.LengthLimitBehavior.RefuseToSend, 20); true, ChatBot.LengthLimitBehavior.RefuseToSend, 20);
await Task.Delay(TimeSpan.FromSeconds(5), ctx); await Task.Delay(TimeSpan.FromSeconds(5), ctx);
logger.Info($"niceTruncation => {niceTruncation.Status}; exactTruncation => {exactTruncation.Status}; doNothing => {doNothing.Status}; refuseToSend => {refuseToSend.Status}"); logger.Info($"niceTruncation => {niceTruncation.Status}; exactTruncation => {exactTruncation.Status}; doNothing => {doNothing.Status}; refuseToSend => {refuseToSend.Status}");
if (niceTruncation.ChatMessageId != null) if (niceTruncation.ChatMessageUuid != null)
await botInstance.KfClient.DeleteMessageAsync(niceTruncation.ChatMessageId.Value); await botInstance.KfClient.DeleteMessageAsync(niceTruncation.ChatMessageUuid);
if (exactTruncation.ChatMessageId != null) if (exactTruncation.ChatMessageUuid != null)
await botInstance.KfClient.DeleteMessageAsync(exactTruncation.ChatMessageId.Value); await botInstance.KfClient.DeleteMessageAsync(exactTruncation.ChatMessageUuid);
if (doNothing.ChatMessageId != null) if (doNothing.ChatMessageUuid != null)
await botInstance.KfClient.DeleteMessageAsync(doNothing.ChatMessageId.Value); await botInstance.KfClient.DeleteMessageAsync(doNothing.ChatMessageUuid);
// Should never happen // Should never happen
if (refuseToSend.ChatMessageId != null) if (refuseToSend.ChatMessageUuid != null)
await botInstance.KfClient.DeleteMessageAsync(refuseToSend.ChatMessageId.Value); await botInstance.KfClient.DeleteMessageAsync(refuseToSend.ChatMessageUuid);
} }
} }

View File

@@ -2,6 +2,6 @@
public class SeenMessageMetadataModel public class SeenMessageMetadataModel
{ {
public int MessageId { get; set; } public string MessageUuid { get; set; }
public DateTimeOffset? LastEdited { get; set; } public DateTimeOffset? LastEdited { get; set; }
} }

View File

@@ -6,7 +6,7 @@ public class SentMessageTrackerModel
public required string Reference { get; set; } public required string Reference { get; set; }
public required string Message { get; set; } public required string Message { get; set; }
public required SentMessageTrackerStatus Status { get; set; } public required SentMessageTrackerStatus Status { get; set; }
public int? ChatMessageId { get; set; } public string? ChatMessageUuid { get; set; }
// Timespan from when the message was sent until we saw it come back // Timespan from when the message was sent until we saw it come back
public TimeSpan? Delay { get; set; } public TimeSpan? Delay { get; set; }
public DateTimeOffset? SentAt { get; set; } public DateTimeOffset? SentAt { get; set; }

View File

@@ -736,19 +736,19 @@ public class BotServices
private async Task OnYeetWinEditTaskAsync(SentMessageTrackerModel oldMsg, string newMsg) private async Task OnYeetWinEditTaskAsync(SentMessageTrackerModel oldMsg, string newMsg)
{ {
var i = 0; var i = 0;
while (oldMsg.ChatMessageId == null && i < 50) while (oldMsg.ChatMessageUuid == null && i < 50)
{ {
await Task.Delay(100, _cancellationToken); await Task.Delay(100, _cancellationToken);
i++; i++;
} }
if (oldMsg.ChatMessageId == null) if (oldMsg.ChatMessageUuid == null)
{ {
_logger.Error($"Timed out waiting to figure out our message ID"); _logger.Error($"Timed out waiting to figure out our message ID");
return; return;
} }
await _chatBot.KfClient.EditMessageAsync(oldMsg.ChatMessageId.Value, newMsg); await _chatBot.KfClient.EditMessageAsync(oldMsg.ChatMessageUuid, newMsg);
} }
private void OnHowlggBetHistory(object sender, HowlggBetHistoryResponseModel data) private void OnHowlggBetHistory(object sender, HowlggBetHistoryResponseModel data)
@@ -918,7 +918,7 @@ public class BotServices
BuiltIn.Keys.KiwiFarmsRedColor, BuiltIn.Keys.KiwiFarmsGreenColor BuiltIn.Keys.KiwiFarmsRedColor, BuiltIn.Keys.KiwiFarmsGreenColor
]); ]);
var patience = 0; var patience = 0;
while (msg.ChatMessageId == null) while (msg.ChatMessageUuid == null)
{ {
patience++; patience++;
if (msg.Status is SentMessageTrackerStatus.Lost or SentMessageTrackerStatus.NotSending || patience > 50) if (msg.Status is SentMessageTrackerStatus.Lost or SentMessageTrackerStatus.NotSending || patience > 50)
@@ -935,11 +935,11 @@ public class BotServices
{ {
if (seconds % 2 == 0) if (seconds % 2 == 0)
{ {
await _chatBot.KfClient.EditMessageAsync(msg.ChatMessageId.Value, $"[color={settings[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]{msg.Message}[/color]"); await _chatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid, $"[color={settings[BuiltIn.Keys.KiwiFarmsGreenColor].Value}]{msg.Message}[/color]");
} }
else else
{ {
await _chatBot.KfClient.EditMessageAsync(msg.ChatMessageId.Value, $"[color={settings[BuiltIn.Keys.KiwiFarmsRedColor].Value}]{msg.Message}[/color]"); await _chatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid, $"[color={settings[BuiltIn.Keys.KiwiFarmsRedColor].Value}]{msg.Message}[/color]");
} }
await Task.Delay(1000, _cancellationToken); await Task.Delay(1000, _cancellationToken);

View File

@@ -26,7 +26,7 @@ public class KasinoMines
public int Size { get; set; } public int Size { get; set; }
public int Mines { get; set; } public int Mines { get; set; }
public List<(int r, int c)> BetsPlaced; public List<(int r, int c)> BetsPlaced;
public int LastMessageId = 0; public string? LastMessageId;
public string LastMessageReference = ""; public string LastMessageReference = "";
@@ -44,12 +44,12 @@ public class KasinoMines
{ {
_logger.Info("Resetting message"); _logger.Info("Resetting message");
// 0 is the default for int // 0 is the default for int
if (LastMessageId != 0) if (LastMessageId != null)
{ {
await _kfChatBot.KfClient.DeleteMessageAsync(LastMessageId); await _kfChatBot.KfClient.DeleteMessageAsync(LastMessageId);
} }
if (msg.ChatMessageId == null) throw new InvalidOperationException($"ChatMessageId was null for {msg.Reference}");
LastMessageId = msg.ChatMessageId.Value; LastMessageId = msg.ChatMessageUuid ?? throw new InvalidOperationException($"ChatMessageId was null for {msg.Reference}");
LastMessageReference = msg.Reference; LastMessageReference = msg.Reference;
} }
@@ -83,7 +83,7 @@ public class KasinoMines
} }
public async Task Explode((int r, int c) mineLocation, SentMessageTrackerModel msg) public async Task Explode((int r, int c) mineLocation, SentMessageTrackerModel msg)
{ {
if (LastMessageId == 0 || LastMessageId != msg.ChatMessageId) if (LastMessageId == null || LastMessageId != msg.ChatMessageUuid)
{ {
await ResetMessage(msg); await ResetMessage(msg);
} }
@@ -154,8 +154,8 @@ public class KasinoMines
} }
await Task.Delay(TimeSpan.FromSeconds(10)); await Task.Delay(TimeSpan.FromSeconds(10));
await _kfChatBot.KfClient.DeleteMessageAsync(msg.ChatMessageId!.Value); await _kfChatBot.KfClient.DeleteMessageAsync(msg.ChatMessageUuid);
LastMessageId = 0; LastMessageId = null;
(int vertical, int horizontal) DistanceFromMine((int r, int c) coord) (int vertical, int horizontal) DistanceFromMine((int r, int c) coord)
{ {
@@ -298,8 +298,8 @@ public class KasinoMines
{ {
await GetSavedGames(gamblerId); await GetSavedGames(gamblerId);
//attempt to delete the message if its there //attempt to delete the message if its there
if (ActiveGames[gamblerId].LastMessageId != 0) await _kfChatBot.KfClient.DeleteMessageAsync(ActiveGames[gamblerId].LastMessageId); if (ActiveGames[gamblerId].LastMessageId != null) await _kfChatBot.KfClient.DeleteMessageAsync(ActiveGames[gamblerId].LastMessageId!);
ActiveGames?.Remove(gamblerId); ActiveGames.Remove(gamblerId);
await SaveActiveGames(gamblerId); await SaveActiveGames(gamblerId);
} }
@@ -345,7 +345,7 @@ public class KasinoMines
await GetSavedGames(gamblerId); await GetSavedGames(gamblerId);
var game = ActiveGames[gamblerId]; var game = ActiveGames[gamblerId];
game.LastInteracted = DateTimeOffset.UtcNow; game.LastInteracted = DateTimeOffset.UtcNow;
if (game.LastMessageId == 0 || game.LastMessageId != msg.ChatMessageId) if (game.LastMessageId == null || game.LastMessageId != msg.ChatMessageUuid)
{ {
await game.ResetMessage(msg); await game.ResetMessage(msg);
@@ -405,7 +405,7 @@ public class KasinoMines
await GetSavedGames(gamblerId); await GetSavedGames(gamblerId);
var game = ActiveGames[gamblerId]; var game = ActiveGames[gamblerId];
game.LastInteracted = DateTimeOffset.UtcNow; game.LastInteracted = DateTimeOffset.UtcNow;
if (game.LastMessageId == 0 || game.LastMessageId != msg.ChatMessageId) if (game.LastMessageId == null || game.LastMessageId != msg.ChatMessageUuid)
{ {
await game.ResetMessage(msg); await game.ResetMessage(msg);
} }
@@ -435,7 +435,7 @@ public class KasinoMines
{ {
if (!validBets.Contains(bet) || game.BetsPlaced.Contains(bet) || bets.Contains(bet)) if (!validBets.Contains(bet) || game.BetsPlaced.Contains(bet) || bets.Contains(bet))
{ {
await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageId!.Value, await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageUuid!,
$"{game.Creator.User.FormatUsername()}, invalid bet of {bet.r},{bet.c} removed (already placed, duplicate, or invalid coordinate)"); $"{game.Creator.User.FormatUsername()}, invalid bet of {bet.r},{bet.c} removed (already placed, duplicate, or invalid coordinate)");
await Task.Delay(5); await Task.Delay(5);
} }
@@ -446,20 +446,20 @@ public class KasinoMines
if (bets.Count > numGems) if (bets.Count > numGems)
{ {
await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageId!.Value, await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageUuid!,
$"{game.Creator.User.FormatUsername()}, you bet on {bets.Count} gems, but there are only {numGems} left. Your list of bets was automatically truncated, and the game will automatically cash out if you win."); $"{game.Creator.User.FormatUsername()}, you bet on {bets.Count} gems, but there are only {numGems} left. Your list of bets was automatically truncated, and the game will automatically cash out if you win.");
bets.RemoveRange(numGems, bets.Count - numGems); bets.RemoveRange(numGems, bets.Count - numGems);
cashOut = true; cashOut = true;
} }
else if (bets.Count == numGems) else if (bets.Count == numGems)
{ {
await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageId!.Value, await _kfChatBot.KfClient.EditMessageAsync(invalidBetMsg.ChatMessageUuid!,
$"{game.Creator.User.FormatUsername()}, you bet on all gems, so you will automatically cash out if you win."); $"{game.Creator.User.FormatUsername()}, you bet on all gems, so you will automatically cash out if you win.");
cashOut = true; cashOut = true;
} }
await Task.Delay(50); await Task.Delay(50);
_ = _kfChatBot.KfClient.DeleteMessageAsync(invalidBetMsg.ChatMessageId!.Value); _ = _kfChatBot.KfClient.DeleteMessageAsync(invalidBetMsg.ChatMessageUuid!);
} }
else bets = coords; else bets = coords;
@@ -469,7 +469,7 @@ public class KasinoMines
if (game.MinesBoard[coord.r][ coord.c] == 'M') if (game.MinesBoard[coord.r][ coord.c] == 'M')
{ {
game.BetsPlaced.Add(coord); game.BetsPlaced.Add(coord);
await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageId!.Value, game.ToString()); await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid!, game.ToString());
_ = game.Explode((coord.r, coord.c), msg); _ = game.Explode((coord.r, coord.c), msg);
var newBalance = await Money.NewWagerAsync(game.Creator.Id, game.Wager, -game.Wager, WagerGame.Mines); var newBalance = await Money.NewWagerAsync(game.Creator.Id, game.Wager, -game.Wager, WagerGame.Mines);
var net = -game.Wager; var net = -game.Wager;
@@ -483,10 +483,10 @@ public class KasinoMines
if (Money.GetRandomNumber(game.Creator, 0, 100) > 100 * HOUSE_EDGE)//if you didn't lose, check to see if the switch was flipped if (Money.GetRandomNumber(game.Creator, 0, 100) > 100 * HOUSE_EDGE)//if you didn't lose, check to see if the switch was flipped
{ {
game.BetsPlaced.Add(coord); game.BetsPlaced.Add(coord);
await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageId!.Value, game.ToString()); await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid!, game.ToString());
await game.RigBoard(coord); await game.RigBoard(coord);
await Task.Delay(50); await Task.Delay(50);
await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageId!.Value, game.ToString()); await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid!, game.ToString());
_ = game.Explode(coord, msg); _ = game.Explode(coord, msg);
var newBalance = await Money.NewWagerAsync(game.Creator.Id, game.Wager, -game.Wager, WagerGame.Mines); var newBalance = await Money.NewWagerAsync(game.Creator.Id, game.Wager, -game.Wager, WagerGame.Mines);
var net = -game.Wager; var net = -game.Wager;
@@ -500,7 +500,7 @@ public class KasinoMines
{ {
game.BetsPlaced.Add(coord); game.BetsPlaced.Add(coord);
} }
await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageId!.Value, game.ToString()); await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid!, game.ToString());
} }

View File

@@ -24,6 +24,8 @@ public class ChatClient
public event EventHandlers.OnWsDisconnectionEventHandler? OnWsDisconnection; public event EventHandlers.OnWsDisconnectionEventHandler? OnWsDisconnection;
public event EventHandlers.OnFailedToJoinRoom? OnFailedToJoinRoom; public event EventHandlers.OnFailedToJoinRoom? OnFailedToJoinRoom;
public event EventHandlers.OnUnknownCommand? OnUnknownCommand; public event EventHandlers.OnUnknownCommand? OnUnknownCommand;
public event EventHandlers.OnPermissionsEventHandler? OnPermissions;
public event EventHandlers.OnSystemMessage? OnSystemMessage;
private WebsocketClient? _wsClient; private WebsocketClient? _wsClient;
private readonly Logger _logger = LogManager.GetCurrentClassLogger(); private readonly Logger _logger = LogManager.GetCurrentClassLogger();
private ChatClientConfigModel _config; private ChatClientConfigModel _config;
@@ -188,6 +190,20 @@ public class ChatClient
return; return;
} }
if (packetType.ContainsKey("permissions"))
{
_logger.Debug("Looks like we got permissions");
WsPermissions(message);
return;
}
if (packetType.ContainsKey("system"))
{
_logger.Debug("Looks like a system message");
WsSystemMessage(message);
return;
}
if (packetType.ContainsKey("delete")) if (packetType.ContainsKey("delete"))
{ {
_logger.Debug($"Looks like this is a message deletion packet"); _logger.Debug($"Looks like this is a message deletion packet");
@@ -226,22 +242,22 @@ public class ChatClient
_wsClient.Send($"/delete {messageId}"); _wsClient.Send($"/delete {messageId}");
} }
public async Task DeleteMessageAsync(int messageId) public async Task DeleteMessageAsync(string messageUuid)
{ {
_logger.Debug($"Deleting {messageId}"); _logger.Debug($"Deleting {messageUuid}");
if (_wsClient == null) throw new WebSocketNotInitializedException(); if (_wsClient == null) throw new WebSocketNotInitializedException();
await _wsClient.SendInstant($"/delete {messageId}"); await _wsClient.SendInstant($"/delete {messageUuid}");
} }
public void EditMessage(int messageId, string newMessage) public void EditMessage(string messageUuid, string newMessage)
{ {
var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Id = messageId, Message = newMessage}); var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Uuid = messageUuid, Message = newMessage});
_logger.Debug($"Editing {messageId} with '{newMessage}'"); _logger.Debug($"Editing {messageUuid} with '{newMessage}'");
if (_wsClient == null) throw new WebSocketNotInitializedException(); if (_wsClient == null) throw new WebSocketNotInitializedException();
_wsClient.Send($"/edit {payload}"); _wsClient.Send($"/edit {payload}");
} }
public async Task EditMessageAsync(int messageId, string newMessage) public async Task EditMessageAsync(string messageUuid, string newMessage)
{ {
var settings = new TextEncoderSettings(); var settings = new TextEncoderSettings();
settings.AllowRange(UnicodeRanges.All); settings.AllowRange(UnicodeRanges.All);
@@ -249,8 +265,8 @@ public class ChatClient
{ {
Encoder = JavaScriptEncoder.Create(settings) Encoder = JavaScriptEncoder.Create(settings)
}; };
var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Id = messageId, Message = newMessage}, options); var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Uuid = messageUuid, Message = newMessage}, options);
_logger.Debug($"Editing {messageId} with '{newMessage}'"); _logger.Debug($"Editing {messageUuid} with '{newMessage}'");
if (_wsClient == null) throw new WebSocketNotInitializedException(); if (_wsClient == null) throw new WebSocketNotInitializedException();
var msg = $"/edit {payload}"; var msg = $"/edit {payload}";
var length = Encoding.UTF8.GetByteCount(msg); var length = Encoding.UTF8.GetByteCount(msg);
@@ -285,7 +301,7 @@ public class ChatClient
LastActivity = null LastActivity = null
}, },
Message = chatMessage.Message, Message = chatMessage.Message,
MessageId = chatMessage.MessageId, MessageUuid = chatMessage.MessageUuid,
MessageRaw = chatMessage.MessageRaw, MessageRaw = chatMessage.MessageRaw,
RoomId = chatMessage.RoomId, RoomId = chatMessage.RoomId,
MessageRawHtmlDecoded = WebUtility.HtmlDecode(chatMessage.MessageRaw), MessageRawHtmlDecoded = WebUtility.HtmlDecode(chatMessage.MessageRaw),
@@ -347,6 +363,35 @@ public class ChatClient
_logger.Debug($"Following users have parted: {string.Join(',', usersParted)}"); _logger.Debug($"Following users have parted: {string.Join(',', usersParted)}");
OnUsersParted?.Invoke(this, usersParted); OnUsersParted?.Invoke(this, usersParted);
} }
private void WsPermissions(ResponseMessage message)
{
var data = JsonSerializer.Deserialize<JsonElement>(message.Text);
var permissions = data.GetProperty("permissions").Deserialize<PermissionsJsonModel>();
try
{
OnPermissions?.Invoke(this, permissions);
}
catch (Exception e)
{
_logger.Error("Caught error when invoking OnPermissions");
_logger.Error(e);
}
}
private void WsSystemMessage(ResponseMessage message)
{
var msg = JsonSerializer.Deserialize<JsonElement>(message.Text).GetProperty("system").GetString();
try
{
OnSystemMessage?.Invoke(this, msg);
}
catch (Exception e)
{
_logger.Error("Caught error when invoking OnSystemMessage");
_logger.Error(e);
}
}
} }
public class WebSocketNotInitializedException : Exception; public class WebSocketNotInitializedException : Exception;

View File

@@ -25,4 +25,8 @@ public class EventHandlers
public delegate void OnFailedToJoinRoom(object sender, string message); public delegate void OnFailedToJoinRoom(object sender, string message);
public delegate void OnUnknownCommand(object sender, string message); public delegate void OnUnknownCommand(object sender, string message);
public delegate void OnPermissionsEventHandler(object sender, PermissionsJsonModel permissions);
public delegate void OnSystemMessage(object sender, string message);
} }

View File

@@ -7,7 +7,7 @@ public class MessageModel
/// HTML formatted message /// HTML formatted message
/// </summary> /// </summary>
public required string Message { get; set; } public required string Message { get; set; }
public required int MessageId { get; set; } public required string MessageUuid { get; set; }
public DateTimeOffset? MessageEditDate { get; set; } public DateTimeOffset? MessageEditDate { get; set; }
public required DateTimeOffset MessageDate { get; set; } public required DateTimeOffset MessageDate { get; set; }
/// <summary> /// <summary>

View File

@@ -4,8 +4,8 @@ namespace KfChatDotNetWsClient.Models.Json;
public class EditMessageJsonModel public class EditMessageJsonModel
{ {
[JsonPropertyName("id")] [JsonPropertyName("uuid")]
public required int Id { get; set; } public required string Uuid { get; set; }
[JsonPropertyName("message")] [JsonPropertyName("message")]
public required string Message { get; set; } public required string Message { get; set; }

View File

@@ -41,8 +41,8 @@ public class MessagesJsonModel
public required AuthorModel Author { get; set; } public required AuthorModel Author { get; set; }
[JsonPropertyName("message")] [JsonPropertyName("message")]
public required string Message { get; set; } public required string Message { get; set; }
[JsonPropertyName("message_id")] [JsonPropertyName("message_uuid")]
public int MessageId { get; set; } public required string MessageUuid { get; set; }
[JsonPropertyName("message_edit_date")] [JsonPropertyName("message_edit_date")]
public int MessageEditDate { get; set; } public int MessageEditDate { get; set; }
[JsonPropertyName("message_date")] [JsonPropertyName("message_date")]

View File

@@ -0,0 +1,27 @@
using System.Text.Json.Serialization;
namespace KfChatDotNetWsClient.Models.Json;
public class PermissionsJsonModel
{
[JsonPropertyName("can_view")]
public required bool CanView { get; set; }
[JsonPropertyName("can_send")]
public required bool CanSend { get; set; }
[JsonPropertyName("can_edit_own")]
public required bool CanEditOwn { get; set; }
[JsonPropertyName("can_edit_other")]
public required bool CanEditOther { get; set; }
[JsonPropertyName("can_delete_own")]
public required bool CanDeleteOwn { get; set; }
[JsonPropertyName("can_delete_other")]
public required bool CanDeleteOther { get; set; }
[JsonPropertyName("can_report")]
public required bool CanReport { get; set; }
[JsonPropertyName("can_view_deleted")]
public required bool CanViewDeleted { get; set; }
[JsonPropertyName("can_undelete")]
public required bool CanUndelete { get; set; }
[JsonPropertyName("can_motd")]
public required bool CanMotd { get; set; }
}