Files
2025-09-18 17:55:52 -04:00

231 lines
4.5 KiB
Lua

--[[
// SortData.lua
// API for Game Sorts
]]
local CoreGui = Game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local GameData = require(Modules:FindFirstChild('GameData'))
local Http = require(Modules:FindFirstChild('Http'))
local Strings = require(Modules:FindFirstChild('LocalizedStrings'))
local Utility = require(Modules:FindFirstChild('Utility'))
local SortData = {}
-- this is a temp cache for play my place. We need to be able to check if a user is joining
-- a featured game or not in order to set their session privacy.
local featuredSortCache = nil
local FEATURED_SORT_ID = 3
local REFRESH_TIME = 300
local lastTimeUpdated = 0
local isFetching = false
local function getFeaturedCacheAsync()
while isFetching do
wait()
end
if featuredSortCache and (tick() - lastTimeUpdated < REFRESH_TIME) then
return featuredSortCache
end
isFetching = true
local newFeaturedSortCache = {}
local lastIndexLoaded = 0
local PAGE_SIZE = 100
local sort = SortData.GetSort(FEATURED_SORT_ID)
local getFeaturedSortSuccess = true
local isLastPage = false
repeat
local currentPage = nil
local function tryGetSortAsync()
currentPage = sort:GetPageAsync(lastIndexLoaded, PAGE_SIZE)
if currentPage then
return true
end
end
Utility.ExponentialRepeat(
function() return currentPage == nil end, tryGetSortAsync, 3)
if currentPage then
if currentPage.Count > 0 then
local placeIds = currentPage:GetPagePlaceIds()
for i = 1, #placeIds do
newFeaturedSortCache[placeIds[i]] = true
end
lastIndexLoaded = lastIndexLoaded + currentPage.Count
end
isLastPage = currentPage.Count < PAGE_SIZE
else
getFeaturedSortSuccess = false
end
until not getFeaturedSortSuccess == false or isLastPage == true
if getFeaturedSortSuccess == true then
featuredSortCache = newFeaturedSortCache
end
lastTimeUpdated = tick()
isFetching = false
return featuredSortCache
end
function SortData:IsFeaturedGameAsync(placeId)
local featuredSort = getFeaturedCacheAsync()
if featuredSort then
return featuredSort[placeId]
end
return false
end
local function initPage(data)
local page = {}
page.Data = data
page.Count = #data
function page:GetPagePlaceIds()
local ids = {}
for i = 1, #data do
ids[i] = data[i]["PlaceID"]
end
return ids
end
function page:GetPagePlaceNames()
local names = {}
for i = 1, #data do
names[i] = GameData:GetFilteredGameName(data[i]["Name"], data[i]["CreatorName"])
end
return names
end
function page:GetCreatorNames()
local names = {}
for i = 1, #data do
names[i] = data[i]["CreatorName"]
end
return names
end
function page:GetPageIconIds()
local iconIds = {}
for i = 1, #data do
local id = data[i]["ImageId"]
iconIds[i] = id
end
return iconIds
end
function page:GetPageVoteData()
local voteData = {}
for i = 1, #data do
local vote = {
UpVotes = data[i]["TotalUpVotes"];
DownVotes = data[i]["TotalDownVotes"];
}
voteData[i] = vote
end
return voteData
end
function page:GetPageCreatorUserIds()
local creatorIds = {}
for i = 1, #data do
local id = data[i]["CreatorID"]
table.insert(creatorIds, id)
end
return creatorIds
end
return page
end
-- returns class style table for sorts
function SortData.GetSortCategoriesAsync()
local result = Http.GetGameSortsAsync()
if not result then
-- TODO: Error codes
return
end
--
local sorts = {}
for i = 1, #result do
local sort = {
Id = result[i]["Id"];
Name = result[i]["Name"];
}
table.insert(sorts, sort)
end
return sorts
end
local function createSort(sort, sortId, httpFunc)
function sort:GetPageAsync(startIndex, pageSize, timeFilter)
local result = httpFunc(startIndex, pageSize, sortId, timeFilter)
if not result then
return nil
end
return initPage(result)
end
end
function SortData.GetSort(sortId)
local sort = {}
local httpFunc = Http.GetSortAsync
createSort(sort, sortId, httpFunc)
return sort
end
function SortData.GetUserFavorites()
local sort = {}
local sortId = "MyFavorite"
local httpFunc = Http.GetUserFavoritesAsync
createSort(sort, sortId, httpFunc)
return sort
end
function SortData.GetUserRecent()
local sort = {}
local sortId = "MyRecent"
local httpFunc = Http.GetUserRecentAsync
createSort(sort, sortId, httpFunc)
return sort
end
function SortData.GetUserPlaces(userId)
local sort = {}
local httpFunc = Http.GetUserPlacesAsync
createSort(sort, userId, httpFunc)
return sort
end
return SortData