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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user