mirror of
https://github.com/barelyprofessional/KfChatDotNet.git
synced 2026-05-15 10:32:44 -04:00
Added a feature to replay buffered messages while chat is offline (up to a limit of the 10 latest by default) and changed the sent message tracking to pass-by-reference instead of exclusively using GUIDs. The GUIDs still exist for scenarios where you can't pass a reference to the object around.
This commit is contained in:
@@ -152,8 +152,22 @@ public class ChatBot
|
|||||||
// Reset value to 0 as we've now successfully joined
|
// Reset value to 0 as we've now successfully joined
|
||||||
if (_joinFailures > 0) _joinFailures = 0;
|
if (_joinFailures > 0) _joinFailures = 0;
|
||||||
var settings = Helpers.GetMultipleValues([BuiltIn.Keys.GambaSeshDetectEnabled,
|
var settings = Helpers.GetMultipleValues([BuiltIn.Keys.GambaSeshDetectEnabled,
|
||||||
BuiltIn.Keys.GambaSeshUserId, BuiltIn.Keys.KiwiFarmsUsername])
|
BuiltIn.Keys.GambaSeshUserId, BuiltIn.Keys.KiwiFarmsUsername, BuiltIn.Keys.BotDisconnectReplayLimit])
|
||||||
.Result;
|
.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)
|
||||||
|
.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
|
||||||
|
// The validation of whether to send based on GambaSesh's presence etc. has already been performed for msgs here
|
||||||
|
KfClient.SendMessage(replayMsg.Message);
|
||||||
|
replayMsg.Status = SentMessageTrackerStatus.WaitingForResponse;
|
||||||
|
replayMsg.SentAt = DateTimeOffset.UtcNow;
|
||||||
|
}
|
||||||
|
foreach(var lostMsg in _sentMessages.Where(msg => msg.Status == SentMessageTrackerStatus.ChatDisconnected))
|
||||||
|
{
|
||||||
|
lostMsg.Status = SentMessageTrackerStatus.Lost;
|
||||||
|
}
|
||||||
_logger.Debug($"Received {messages.Count} message(s)");
|
_logger.Debug($"Received {messages.Count} message(s)");
|
||||||
foreach (var message in messages)
|
foreach (var message in messages)
|
||||||
{
|
{
|
||||||
@@ -203,7 +217,7 @@ public class ChatBot
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string SendChatMessage(string message, bool bypassSeshDetect = false)
|
public SentMessageTrackerModel SendChatMessage(string message, bool bypassSeshDetect = false)
|
||||||
{
|
{
|
||||||
var settings = Helpers
|
var settings = Helpers
|
||||||
.GetMultipleValues([BuiltIn.Keys.KiwiFarmsSuppressChatMessages, BuiltIn.Keys.GambaSeshDetectEnabled])
|
.GetMultipleValues([BuiltIn.Keys.KiwiFarmsSuppressChatMessages, BuiltIn.Keys.GambaSeshDetectEnabled])
|
||||||
@@ -221,20 +235,28 @@ public class ChatBot
|
|||||||
_logger.Info($"Message was: {message}");
|
_logger.Info($"Message was: {message}");
|
||||||
messageTracker.Status = SentMessageTrackerStatus.NotSending;
|
messageTracker.Status = SentMessageTrackerStatus.NotSending;
|
||||||
_sentMessages.Add(messageTracker);
|
_sentMessages.Add(messageTracker);
|
||||||
return reference;
|
return messageTracker;
|
||||||
}
|
}
|
||||||
if (GambaSeshPresent && settings[BuiltIn.Keys.GambaSeshDetectEnabled].ToBoolean() && !bypassSeshDetect)
|
if (GambaSeshPresent && settings[BuiltIn.Keys.GambaSeshDetectEnabled].ToBoolean() && !bypassSeshDetect)
|
||||||
{
|
{
|
||||||
_logger.Info($"Not sending message '{message}' as GambaSesh is present");
|
_logger.Info($"Not sending message '{message}' as GambaSesh is present");
|
||||||
messageTracker.Status = SentMessageTrackerStatus.NotSending;
|
messageTracker.Status = SentMessageTrackerStatus.NotSending;
|
||||||
_sentMessages.Add(messageTracker);
|
_sentMessages.Add(messageTracker);
|
||||||
return reference;
|
return messageTracker;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!KfClient.IsConnected())
|
||||||
|
{
|
||||||
|
_logger.Info($"Not sending message '{message}' as Sneedchat is not connected");
|
||||||
|
messageTracker.Status = SentMessageTrackerStatus.ChatDisconnected;
|
||||||
|
_sentMessages.Add(messageTracker);
|
||||||
|
return messageTracker;
|
||||||
}
|
}
|
||||||
messageTracker.Status = SentMessageTrackerStatus.WaitingForResponse;
|
messageTracker.Status = SentMessageTrackerStatus.WaitingForResponse;
|
||||||
messageTracker.SentAt = DateTimeOffset.UtcNow;
|
messageTracker.SentAt = DateTimeOffset.UtcNow;
|
||||||
_sentMessages.Add(messageTracker);
|
_sentMessages.Add(messageTracker);
|
||||||
KfClient.SendMessage(message);
|
KfClient.SendMessage(message);
|
||||||
return reference;
|
return messageTracker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SentMessageTrackerModel GetSentMessageStatus(string reference)
|
public SentMessageTrackerModel GetSentMessageStatus(string reference)
|
||||||
|
|||||||
@@ -25,14 +25,15 @@ public class EditTestCommand : ICommand
|
|||||||
var i = 0;
|
var i = 0;
|
||||||
var delay = 1000;
|
var delay = 1000;
|
||||||
var reference = botInstance.SendChatMessage($"{msg} {i}", true);
|
var reference = botInstance.SendChatMessage($"{msg} {i}", true);
|
||||||
while (botInstance.GetSentMessageStatus(reference).Status == SentMessageTrackerStatus.WaitingForResponse)
|
while (reference.Status == SentMessageTrackerStatus.WaitingForResponse)
|
||||||
{
|
{
|
||||||
await Task.Delay(100, ctx);
|
await Task.Delay(100, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
var status = botInstance.GetSentMessageStatus(reference);
|
if (reference.Status == SentMessageTrackerStatus.NotSending ||
|
||||||
if (status.Status == SentMessageTrackerStatus.NotSending || status.Status == SentMessageTrackerStatus.Unknown ||
|
reference.Status == SentMessageTrackerStatus.Unknown ||
|
||||||
status.ChatMessageId == null)
|
reference.Status == SentMessageTrackerStatus.ChatDisconnected ||
|
||||||
|
reference.ChatMessageId == 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;
|
||||||
@@ -41,13 +42,13 @@ public class EditTestCommand : ICommand
|
|||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
await Task.Delay(delay, ctx);
|
await Task.Delay(delay, ctx);
|
||||||
botInstance.KfClient.EditMessage(status.ChatMessageId!.Value, $"{msg} {i}");
|
botInstance.KfClient.EditMessage(reference.ChatMessageId!.Value, $"{msg} {i}");
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.Delay(delay, ctx);
|
await Task.Delay(delay, ctx);
|
||||||
botInstance.KfClient.EditMessage(status.ChatMessageId!.Value, "This message will self destruct in 1 second");
|
botInstance.KfClient.EditMessage(reference.ChatMessageId!.Value, "This message will self destruct in 1 second");
|
||||||
await Task.Delay(delay, ctx);
|
await Task.Delay(delay, ctx);
|
||||||
botInstance.KfClient.DeleteMessage(status.ChatMessageId!.Value);
|
botInstance.KfClient.DeleteMessage(reference.ChatMessageId!.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,5 +19,9 @@ public enum SentMessageTrackerStatus
|
|||||||
// If the bot is blocked from sending the message, e.g. due to suppress chat messages being enabled
|
// If the bot is blocked from sending the message, e.g. due to suppress chat messages being enabled
|
||||||
NotSending,
|
NotSending,
|
||||||
// Shouldn't happen normally, it's just set before the bot has made a decision on whether to send or not,
|
// Shouldn't happen normally, it's just set before the bot has made a decision on whether to send or not,
|
||||||
Unknown
|
Unknown,
|
||||||
|
// Means the chat was disconnected when you attempted to send the message
|
||||||
|
ChatDisconnected,
|
||||||
|
// Was held in the replay buffer due to a disconnect, but there were too many messages ahead of it and so was culled
|
||||||
|
Lost
|
||||||
}
|
}
|
||||||
@@ -516,6 +516,15 @@ public static class BuiltIn
|
|||||||
Default = "https://kiwifarms.st/attachments/winmanjack_bgr-png.6414050/",
|
Default = "https://kiwifarms.st/attachments/winmanjack_bgr-png.6414050/",
|
||||||
IsSecret = false,
|
IsSecret = false,
|
||||||
CacheDuration = TimeSpan.FromHours(1)
|
CacheDuration = TimeSpan.FromHours(1)
|
||||||
|
},
|
||||||
|
new BuiltInSettingsModel
|
||||||
|
{
|
||||||
|
Key = Keys.BotDisconnectReplayLimit,
|
||||||
|
Regex = @"\d+",
|
||||||
|
Description = "Limit of messages which could not be sent while bot was disconnected to replay on connect",
|
||||||
|
Default = "10",
|
||||||
|
IsSecret = false,
|
||||||
|
CacheDuration = TimeSpan.FromHours(1)
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -565,5 +574,6 @@ public static class BuiltIn
|
|||||||
public static string CrackedZalgoFuckUpMode = "Cracked.ZalgoFuckUpMode";
|
public static string CrackedZalgoFuckUpMode = "Cracked.ZalgoFuckUpMode";
|
||||||
public static string CrackedZalgoFuckUpPosition = "Cracked.ZalgoFuckUpPosition";
|
public static string CrackedZalgoFuckUpPosition = "Cracked.ZalgoFuckUpPosition";
|
||||||
public static string WinmanjackImgUrl = "Winmanjack.ImgUrl";
|
public static string WinmanjackImgUrl = "Winmanjack.ImgUrl";
|
||||||
|
public static string BotDisconnectReplayLimit = "Bot.DisconnectReplayLimit";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user