Files
Dota-Zombie-Invasion/scripts/vscripts/leaderboard_server.lua
T
2026-05-29 15:11:31 +07:00

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