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)