Implement limit and time parameters for /client/mail/dialog/view, aka pagination (#735)

Co-authored-by: Tyfon <29051038+tyfon7@users.noreply.github.com>
This commit is contained in:
Tyfon
2026-01-28 01:47:45 -08:00
committed by GitHub
parent c37a9f37eb
commit 8de0102b03
@@ -248,7 +248,7 @@ public class DialogueController(
var fullProfile = saveServer.GetProfile(sessionId); var fullProfile = saveServer.GetProfile(sessionId);
var dialogue = GetDialogByIdFromProfile(fullProfile, request); var dialogue = GetDialogByIdFromProfile(fullProfile, request);
if (dialogue.Messages?.Count == 0) if (dialogue.Messages == null || dialogue.Messages.Count == 0)
{ {
return new GetMailDialogViewResponseData return new GetMailDialogViewResponseData
{ {
@@ -266,9 +266,9 @@ public class DialogueController(
return new GetMailDialogViewResponseData return new GetMailDialogViewResponseData
{ {
Messages = dialogue.Messages, Messages = GetLimitedMessages(dialogue.Messages, request.Limit, request.Time),
Profiles = GetProfilesForMail(fullProfile, dialogue.Users), 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); return messages.Any(message => (message.Items?.Data?.Count ?? 0) > 0);
} }
/// <summary>
/// Gets a subset of messages from before a certain time
/// </summary>
/// <param name="allMessages">The superset of messages</param>
/// <param name="limit">The maximum number of messages to return, null/0 means all</param>
/// <param name="time">Limit to messages before this Unix time (seconds since epoch), null/0 means all</param>
/// <returns>List of matching messages</returns>
protected List<Message> GetLimitedMessages(List<Message> 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<Message> 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;
}
/// <summary> /// <summary>
/// Handle client/mail/dialog/remove /// Handle client/mail/dialog/remove
/// Remove an entire dialog with an entity (trader/user) /// Remove an entire dialog with an entity (trader/user)