diff --git a/KfChatDotNetBot/ChatBot.cs b/KfChatDotNetBot/ChatBot.cs index 272ff54..f4abc9c 100644 --- a/KfChatDotNetBot/ChatBot.cs +++ b/KfChatDotNetBot/ChatBot.cs @@ -26,7 +26,7 @@ public class ChatBot internal bool InitialStartCooldown = true; private readonly CancellationToken _cancellationToken = new(); private readonly BotCommands _botCommands; - private readonly List _sentMessages = []; + public readonly List SentMessages = []; internal bool GambaSeshPresent; internal readonly BotServices BotServices; private Task _kfChatPing; @@ -158,7 +158,7 @@ public class ChatBot BuiltIn.Keys.GambaSeshUserId, BuiltIn.Keys.KiwiFarmsUsername, BuiltIn.Keys.BotDisconnectReplayLimit]) .Result; // Send messages if there are any to replay (Assuming we DC'd, and it's now the message flood) - foreach (var replayMsg in _sentMessages.Where(msg => msg.Status == SentMessageTrackerStatus.ChatDisconnected) + foreach (var replayMsg in SentMessages.Where(msg => msg.Status == SentMessageTrackerStatus.ChatDisconnected) .TakeLast(settings[BuiltIn.Keys.BotDisconnectReplayLimit].ToType())) { // Bypass the helpful method we have for sending messages so we don't create new sent message items for them @@ -167,7 +167,7 @@ public class ChatBot replayMsg.Status = SentMessageTrackerStatus.WaitingForResponse; replayMsg.SentAt = DateTimeOffset.UtcNow; } - foreach(var lostMsg in _sentMessages.Where(msg => msg.Status == SentMessageTrackerStatus.ChatDisconnected)) + foreach(var lostMsg in SentMessages.Where(msg => msg.Status == SentMessageTrackerStatus.ChatDisconnected)) { lostMsg.Status = SentMessageTrackerStatus.Lost; } @@ -179,7 +179,7 @@ public class ChatBot { // MessageRaw is not actually REAL and RAW. The messages are still HTML encoded var decodedMessage = WebUtility.HtmlDecode(message.MessageRaw); - var sentMessage = _sentMessages.FirstOrDefault(sent => + var sentMessage = SentMessages.FirstOrDefault(sent => sent.Message == decodedMessage && sent.Status == SentMessageTrackerStatus.WaitingForResponse); if (sentMessage == null) { @@ -187,7 +187,7 @@ public class ChatBot _logger.Error(JsonSerializer.Serialize(message)); _logger.Error("Last item inserted into the sent messages collection waiting for response:"); var latest = - _sentMessages.LastOrDefault(msg => msg.Status == SentMessageTrackerStatus.WaitingForResponse); + SentMessages.LastOrDefault(msg => msg.Status == SentMessageTrackerStatus.WaitingForResponse); _logger.Error(JsonSerializer.Serialize(latest)); if (latest != null) { @@ -266,14 +266,14 @@ public class ChatBot _logger.Info("Not sending message as SuppressChatMessages is enabled"); _logger.Info($"Message was: {message}"); messageTracker.Status = SentMessageTrackerStatus.NotSending; - _sentMessages.Add(messageTracker); + SentMessages.Add(messageTracker); return messageTracker; } if (GambaSeshPresent && settings[BuiltIn.Keys.GambaSeshDetectEnabled].ToBoolean() && !bypassSeshDetect) { _logger.Info($"Not sending message '{message}' as GambaSesh is present"); messageTracker.Status = SentMessageTrackerStatus.NotSending; - _sentMessages.Add(messageTracker); + SentMessages.Add(messageTracker); return messageTracker; } @@ -281,7 +281,7 @@ public class ChatBot { _logger.Info($"Not sending message '{message}' as Sneedchat is not connected"); messageTracker.Status = SentMessageTrackerStatus.ChatDisconnected; - _sentMessages.Add(messageTracker); + SentMessages.Add(messageTracker); return messageTracker; } @@ -291,7 +291,7 @@ public class ChatBot { _logger.Info("Refusing to send message as it exceeds the length limit and LengthLimitBehavior is RefuseToSend"); messageTracker.Status = SentMessageTrackerStatus.NotSending; - _sentMessages.Add(messageTracker); + SentMessages.Add(messageTracker); return messageTracker; } if (lengthLimitBehavior == LengthLimitBehavior.TruncateNicely) @@ -310,7 +310,7 @@ public class ChatBot messageTracker.Status = SentMessageTrackerStatus.WaitingForResponse; messageTracker.SentAt = DateTimeOffset.UtcNow; _logger.Debug($"Message is {messageTracker.Message.Utf8LengthBytes()} bytes"); - _sentMessages.Add(messageTracker); + SentMessages.Add(messageTracker); await KfClient.SendMessageInstantAsync(messageTracker.Message); return messageTracker; } @@ -339,7 +339,7 @@ public class ChatBot public SentMessageTrackerModel GetSentMessageStatus(string reference) { - var message = _sentMessages.FirstOrDefault(m => m.Reference == reference); + var message = SentMessages.FirstOrDefault(m => m.Reference == reference); if (message == null) { throw new SentMessageNotFoundException(); diff --git a/KfChatDotNetBot/Commands/AdminCommands.cs b/KfChatDotNetBot/Commands/AdminCommands.cs index 8889f91..03aea2a 100644 --- a/KfChatDotNetBot/Commands/AdminCommands.cs +++ b/KfChatDotNetBot/Commands/AdminCommands.cs @@ -224,4 +224,37 @@ public class NonceLiveCommand : ICommand botInstance.BotServices.IsChrisDjLive = !botInstance.BotServices.IsChrisDjLive; await botInstance.SendChatMessageAsync($"IsChrisDjLive => {botInstance.BotServices.IsChrisDjLive}", true); } +} + +public class DeleteMessagesCommand : ICommand +{ + public List Patterns => [ + new Regex(@"^admin delete (?\d+)$") + ]; + + public string? HelpText => "Delete the most recent x number of messages"; + public UserRight RequiredRight => UserRight.Admin; + public TimeSpan Timeout => TimeSpan.FromSeconds(10); + + public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, + CancellationToken ctx) + { + var amount = int.Parse(arguments["msg_count"].Value); + if (amount > 10) + { + await botInstance.SendChatMessageAsync("More than 10 messages seems like a bit much?", true); + return; + } + var messages = botInstance.SentMessages.Where(msg => msg.Status == SentMessageTrackerStatus.ResponseReceived) + .TakeLast(amount); + foreach (var msg in messages) + { + if (msg.ChatMessageId == null) + { + continue; + } + + await botInstance.KfClient.DeleteMessageAsync(msg.ChatMessageId.Value); + } + } } \ No newline at end of file diff --git a/KfChatDotNetWsClient/ChatClient.cs b/KfChatDotNetWsClient/ChatClient.cs index 4fe9d1f..757b807 100644 --- a/KfChatDotNetWsClient/ChatClient.cs +++ b/KfChatDotNetWsClient/ChatClient.cs @@ -214,6 +214,12 @@ public class ChatClient _wsClient.Send($"/delete {messageId}"); } + public async Task DeleteMessageAsync(int messageId) + { + _logger.Debug($"Deleting {messageId}"); + await _wsClient.SendInstant($"/delete {messageId}"); + } + public void EditMessage(int messageId, string newMessage) { var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Id = messageId, Message = newMessage});