diff --git a/Libraries/SPTarkov.Server.Core/Controllers/DialogueController.cs b/Libraries/SPTarkov.Server.Core/Controllers/DialogueController.cs
index 9edc2b95..7d0de32b 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/DialogueController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/DialogueController.cs
@@ -248,7 +248,7 @@ public class DialogueController(
var fullProfile = saveServer.GetProfile(sessionId);
var dialogue = GetDialogByIdFromProfile(fullProfile, request);
- if (dialogue.Messages?.Count == 0)
+ if (dialogue.Messages == null || dialogue.Messages.Count == 0)
{
return new GetMailDialogViewResponseData
{
@@ -266,9 +266,9 @@ public class DialogueController(
return new GetMailDialogViewResponseData
{
- Messages = dialogue.Messages,
+ Messages = GetLimitedMessages(dialogue.Messages, request.Limit, request.Time),
Profiles = GetProfilesForMail(fullProfile, dialogue.Users),
- HasMessagesWithRewards = MessagesHaveUncollectedRewards(dialogue.Messages!),
+ HasMessagesWithRewards = MessagesHaveUncollectedRewards(dialogue.Messages),
};
}
@@ -410,6 +410,49 @@ public class DialogueController(
return messages.Any(message => (message.Items?.Data?.Count ?? 0) > 0);
}
+ ///
+ /// Gets a subset of messages from before a certain time
+ ///
+ /// The superset of messages
+ /// The maximum number of messages to return, null/0 means all
+ /// Limit to messages before this Unix time (seconds since epoch), null/0 means all
+ /// List of matching messages
+ protected List GetLimitedMessages(List allMessages, int? limit, decimal? time)
+ {
+ if ((time == null || time == 0) && (limit == null || limit == 0 || limit >= allMessages.Count))
+ {
+ return allMessages;
+ }
+
+ if (time == null || time == 0)
+ {
+ time = timeUtil.GetTimeStamp();
+ }
+
+ if (limit == null || limit == 0)
+ {
+ limit = int.MaxValue;
+ }
+
+ List results = [];
+ for (var i = allMessages.Count - 1; i >= 0; i--)
+ {
+ var message = allMessages[i];
+ if (message.DateTime <= time)
+ {
+ results.Add(message);
+
+ if (results.Count >= limit)
+ {
+ break;
+ }
+ }
+ }
+
+ results.Reverse(); // Since we iterated from newest to oldest, reverse so the result is in order
+ return results;
+ }
+
///
/// Handle client/mail/dialog/remove
/// Remove an entire dialog with an entity (trader/user)