120 lines
6.2 KiB
Lua
120 lines
6.2 KiB
Lua
local ____lualib = require("lualib_bundle")
|
|
local __TS__Class = ____lualib.__TS__Class
|
|
local __TS__New = ____lualib.__TS__New
|
|
local __TS__ArrayIsArray = ____lualib.__TS__ArrayIsArray
|
|
local __TS__ObjectKeys = ____lualib.__TS__ObjectKeys
|
|
local ____exports = {}
|
|
local ____server_config = require("server_config")
|
|
local SERVER_CONFIG = ____server_config.SERVER_CONFIG
|
|
local ____api_helper = require("api_helper")
|
|
local setApiHeaders = ____api_helper.setApiHeaders
|
|
____exports.LeaderboardServer = __TS__Class()
|
|
local LeaderboardServer = ____exports.LeaderboardServer
|
|
LeaderboardServer.name = "LeaderboardServer"
|
|
LeaderboardServer.____file_path = "scripts/vscripts/leaderboard_server.lua"
|
|
function LeaderboardServer.prototype.____constructor(self)
|
|
self.serverUrl = SERVER_CONFIG.API_URL
|
|
self:setupEventListeners()
|
|
end
|
|
function LeaderboardServer.getInstance(self)
|
|
if not ____exports.LeaderboardServer.instance then
|
|
____exports.LeaderboardServer.instance = __TS__New(____exports.LeaderboardServer)
|
|
end
|
|
return ____exports.LeaderboardServer.instance
|
|
end
|
|
function LeaderboardServer.prototype.setupEventListeners(self)
|
|
CustomGameEventManager:RegisterListener(
|
|
"request_leaderboard",
|
|
function(source, event)
|
|
local playerId = event.PlayerID
|
|
local limit = event.limit or 20
|
|
local offset = event.offset or 0
|
|
local rawBoard = event.board ~= nil and event.board ~= nil and tostring(event.board) or "rating"
|
|
local board = string.lower(rawBoard)
|
|
if board ~= "rating" and board ~= "wealth" and board ~= "impossible" then
|
|
board = "rating"
|
|
end
|
|
self:loadLeaderboardFromServer(playerId, limit, offset, board)
|
|
end
|
|
)
|
|
end
|
|
function LeaderboardServer.prototype.loadLeaderboardFromServer(self, playerId, limit, offset, board)
|
|
local request = CreateHTTPRequest(
|
|
"GET",
|
|
(((((self.serverUrl .. "/leaderboard?limit=") .. tostring(limit)) .. "&offset=") .. tostring(offset)) .. "&board=") .. board
|
|
)
|
|
setApiHeaders(nil, request)
|
|
request:Send(function(result)
|
|
do
|
|
local function ____catch(____error)
|
|
local player = PlayerResource:GetPlayer(playerId)
|
|
if player then
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {error = "Ошибка обработки данных"})
|
|
end
|
|
end
|
|
local ____try, ____hasReturned, ____returnValue = pcall(function()
|
|
local player = PlayerResource:GetPlayer(playerId)
|
|
if not player then
|
|
return true
|
|
end
|
|
if result.StatusCode == 0 then
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {error = "Сервер недоступен"})
|
|
return true
|
|
end
|
|
if result.StatusCode >= 200 and result.StatusCode < 300 then
|
|
do
|
|
local function ____catch(decodeError)
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {error = "Ошибка парсинга JSON"})
|
|
end
|
|
local ____try, ____hasReturned = pcall(function()
|
|
local responseData = {json.decode(result.Body)}
|
|
local data = nil
|
|
if __TS__ArrayIsArray(responseData) and #responseData > 0 then
|
|
data = responseData[1]
|
|
elseif responseData and type(responseData) == "table" then
|
|
data = responseData
|
|
end
|
|
if data then
|
|
if data.leaderboard ~= nil and data.leaderboard ~= nil then
|
|
local leaderboard = data.leaderboard
|
|
local leaderboardLength = 0
|
|
if __TS__ArrayIsArray(leaderboard) then
|
|
leaderboardLength = #leaderboard or 0
|
|
elseif type(leaderboard) == "table" then
|
|
local keys = __TS__ObjectKeys(leaderboard)
|
|
leaderboardLength = keys ~= nil and keys ~= nil and #keys or 0
|
|
end
|
|
local total = data.total or leaderboardLength
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {success = true, leaderboard = leaderboard, total = total, board = data.board or board})
|
|
elseif __TS__ArrayIsArray(data) then
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {success = true, leaderboard = data, total = #data, board = board})
|
|
else
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {error = "Ошибка декодирования данных: leaderboard не найден"})
|
|
end
|
|
else
|
|
CustomGameEventManager:Send_ServerToPlayer(player, "leaderboard_data", {error = "Ошибка декодирования данных: данные пусты"})
|
|
end
|
|
end)
|
|
if not ____try then
|
|
____catch(____hasReturned)
|
|
end
|
|
end
|
|
else
|
|
CustomGameEventManager:Send_ServerToPlayer(
|
|
player,
|
|
"leaderboard_data",
|
|
{error = "Ошибка сервера: " .. tostring(result.StatusCode)}
|
|
)
|
|
end
|
|
end)
|
|
if not ____try then
|
|
____hasReturned, ____returnValue = ____catch(____hasReturned)
|
|
end
|
|
if ____hasReturned then
|
|
return ____returnValue
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
return ____exports
|