92 lines
3.1 KiB
Lua
92 lines
3.1 KiB
Lua
local CorePackages = game:GetService("CorePackages")
|
|
local LuaApp = CorePackages.AppTempCommon.LuaApp
|
|
|
|
local GamesGetThumbnails = require(LuaApp.Http.Requests.GamesGetThumbnails)
|
|
local SetGameThumbnails = require(LuaApp.Actions.SetGameThumbnails)
|
|
|
|
local Functional = require(CorePackages.AppTempCommon.Common.Functional)
|
|
local Promise = require(LuaApp.Promise)
|
|
local Result = require(LuaApp.Result)
|
|
|
|
local TableUtilities = require(LuaApp.TableUtilities)
|
|
|
|
local THUMBNAIL_PAGE_COUNT = 20
|
|
local THUMBNAIL_SIZE = 150
|
|
local RETRY_MAX_COUNT = math.max(0, settings():GetFVariable("LuaAppNonFinalThumbnailMaxRetries"))
|
|
local RETRY_TIME_MULTIPLIER = 2 -- seconds
|
|
|
|
local function convertToId(value)
|
|
if type(value) ~= "number" and type(value) ~= "string" then
|
|
return Result.error("convertToId expects value passed in to be a number or a string")
|
|
end
|
|
|
|
return Result.success(tostring(value))
|
|
end
|
|
|
|
local function subdivideThumbnailTokenArray(thumbnailTokens, tokenLimit)
|
|
local someTokens = {}
|
|
for i = 1, #thumbnailTokens, tokenLimit do
|
|
local subArray = Functional.Take(thumbnailTokens, tokenLimit, i)
|
|
table.insert(someTokens, subArray)
|
|
end
|
|
|
|
return someTokens
|
|
end
|
|
|
|
local function fetchThumbnailBatch(networkImpl, store, thumbnailTokens)
|
|
return GamesGetThumbnails(networkImpl, thumbnailTokens, THUMBNAIL_SIZE, THUMBNAIL_SIZE):andThen(function(result)
|
|
local thumbnails = {}
|
|
local unfinalizedThumbnails = {}
|
|
|
|
for _,image in pairs(result.responseBody) do
|
|
local convertToIdResult = convertToId(image.universeId)
|
|
|
|
convertToIdResult:match(function(universeId)
|
|
if image.final == false then
|
|
unfinalizedThumbnails[universeId] = image.retryToken
|
|
else
|
|
-- index all of the thumbnails by universeId
|
|
thumbnails[universeId] = image
|
|
end
|
|
end, function(convertToIdError)
|
|
warn(convertToIdError)
|
|
end)
|
|
end
|
|
|
|
store:dispatch(SetGameThumbnails(thumbnails))
|
|
return Promise.resolve(unfinalizedThumbnails)
|
|
end)
|
|
end
|
|
|
|
local function fetchSubdividedThumbnailsArray(networkImpl, store, thumbnailTokens)
|
|
return fetchThumbnailBatch(networkImpl, store, thumbnailTokens):andThen(function(unfinalizedThumbnails)
|
|
local remainingUnfinalizedThumbnails = unfinalizedThumbnails
|
|
|
|
for retryCount = 1, RETRY_MAX_COUNT do
|
|
if TableUtilities.FieldCount(remainingUnfinalizedThumbnails) == 0 then
|
|
return -- Bail out, we're done!
|
|
end
|
|
|
|
wait(RETRY_TIME_MULTIPLIER * math.pow(2, retryCount - 1))
|
|
remainingUnfinalizedThumbnails = fetchThumbnailBatch(networkImpl, store, remainingUnfinalizedThumbnails):await()
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function fetchThumbnails(networkImpl, thumbnailTokens)
|
|
return function(store)
|
|
-- NOTE : because the size of each thumbnail token, me must limit the number we can fetch at a time.
|
|
-- So break apart the array of tokens we get into smaller, more manageable pieces.
|
|
local fetchPromises = {}
|
|
local someTokens = subdivideThumbnailTokenArray(thumbnailTokens, THUMBNAIL_PAGE_COUNT)
|
|
for _, thumbsArr in ipairs(someTokens) do
|
|
local promise = fetchSubdividedThumbnailsArray(networkImpl, store, thumbsArr)
|
|
table.insert(fetchPromises, promise)
|
|
end
|
|
|
|
return Promise.all(fetchPromises)
|
|
end
|
|
end
|
|
|
|
return fetchThumbnails
|