From 3df2fdfc0f39c6063a27e5a5a30d01442d4ab2dc Mon Sep 17 00:00:00 2001 From: Chomp Date: Sat, 7 Jun 2025 10:19:24 +0100 Subject: [PATCH] Added edge-case handling to flea offer results pagination, stops server trying to get offers starting at a higher index than the end position Moved pagination code into own function Resolved various IDE warnings Added comments --- .../Controllers/RagfairController.cs | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs index 6900caec..1880e9d4 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs @@ -125,14 +125,14 @@ public class RagfairController /// /// Handles client/ragfair/find + /// Returns an object containing an array of flea offers to show to player /// /// Session/Player id - /// Search request data + /// Search request data from client /// Flea offers that match required search parameters public GetOffersResult GetOffers(string sessionID, SearchRequestData searchRequest) { var profile = _profileHelper.GetFullProfile(sessionID); - var itemsToAdd = _ragfairHelper.FilterCategories(sessionID, searchRequest); var traderAssorts = _ragfairHelper.GetDisplayableAssorts(sessionID); var result = new GetOffersResult @@ -150,6 +150,7 @@ public class RagfairController result.Categories = GetSpecificCategories(profile.CharacterData.PmcData, searchRequest, result.Offers); } + // Adjust index value of offers found to start at 0 AddIndexValueToOffers(result.Offers); // Sort offers @@ -176,17 +177,52 @@ public class RagfairController result.OffersCount = result.Offers.Count; - // Handle paging before returning results only if searching for general items, not preset items + // Handle paging before returning results if searching for general items, not preset items if (searchRequest.BuildCount == 0) { - var start = searchRequest.Page * searchRequest.Limit; - var end = Math.Min((searchRequest.Page.Value + 1) * searchRequest.Limit.Value, result.Offers.Count); - result.Offers = result.Offers.Slice(start.Value, end - start.Value); + PaginateOffers(searchRequest, result); } return result; } + /// + /// Paginate offers based on search request properties + /// + /// Client request + /// Object to return to client + protected void PaginateOffers(SearchRequestData searchRequest, GetOffersResult result) + { + // Number of items to show per page + var perPageLimit = searchRequest.Limit.GetValueOrDefault(15); // Client defaults to 15 items per page + + // Total pages to show player + var totalPages = result.Offers.Count / perPageLimit; + + // Page player was just on before clicking new page + var previousPage = searchRequest.Page.GetValueOrDefault(0); + + // Assumed page player is moving to + var nextPage = searchRequest.Page.GetValueOrDefault(0) + 1; + + // Get start/end item indexes + var startIndex = previousPage * perPageLimit; + var endIndex = Math.Min(nextPage * perPageLimit, result.Offers.Count); + + // Edge case + if (previousPage > totalPages) + { + // Occurs when player edits "item count shown per page" value when on page near end of offer list + // The page no longer exists due to the larger number of items on each page, show them the very end of the offer list instead + _logger.Warning("Ragfair page no longer exists, showing end of offers list"); + startIndex = result.Offers.Count - perPageLimit; + endIndex = result.Offers.Count; + } + + //result.Offers = result.Offers.Slice(start, end - start); + result.Offers = result.Offers.Skip(startIndex).Take(endIndex - startIndex).ToList(); + } + /// /// Adjust ragfair offer stack count to match same value as traders assort stack count ///