Added an async method to delete messages and a command to delete last n messages based on sent message tracking

This commit is contained in:
barelyprofessional
2025-02-17 00:23:04 +08:00
parent 7e9137c35c
commit 0319c73998
3 changed files with 50 additions and 11 deletions

View File

@@ -26,7 +26,7 @@ public class ChatBot
internal bool InitialStartCooldown = true;
private readonly CancellationToken _cancellationToken = new();
private readonly BotCommands _botCommands;
private readonly List<SentMessageTrackerModel> _sentMessages = [];
public readonly List<SentMessageTrackerModel> 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<int>()))
{
// 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();

View File

@@ -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<Regex> Patterns => [
new Regex(@"^admin delete (?<msg_count>\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);
}
}
}

View File

@@ -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});