Хочу сделать список топ 3 донатера на загрузочном экране. Реализовал через такой код:
local donaters = {}
IGS.GetTransactions(function(a)
for k,v in pairs(a) do
if v['Note']:find('A: ') then
donaters[v['SteamID']]=(isnumber(donaters[v['SteamID']]) and donaters[v['SteamID']]+v['Sum']) or v['Sum']
end
end
table.SortDesc( donaters )
http.Post( "https://example.com/example", { donaters = util.TableToJSON(donaters) },print,print)
end)
Работает почти как надо, но старые пополнения не приходят, из-за чего топ получается не правильный (те кто донатили много неделю назад в топе не показываются). Может есть у кого готовый код?
Если не ошибаюсь то GMD API работает в формате Get-Updates. Думаю нужно делать реквест вручную с желаемым payload, а не с помощью функции обертки.
Почитай сурс этой функции что-бы узнать больше.
Алсо, если API работает по Get-Updates и само хранит время предыдущего реквеста - то можно спарсить старые данные из панели проекта к себе в бд а потом обнавлять бд с помощью функции которую ты юзаешь.
-- ДАБЫ ИЗБЕЖАТЬ API ЛИМИТОВ, ВЫПОЛНЯТЬ ЭТУ ФУНКЦИЮ ЧАСТО НЕЛЬЗЯ
-- Она запрашивает последние 2 тыс транзакций, выполняя при этом 8 API запросов
-- Если делать слишком часто -- включится flood-wait, что приведет к задержкам других запросов
local function getTopDonators(pick_n, cb)
IGS.GetPlayerTransactionsBypassingLimit(function(txs)
local sid_sum = {}
for _,tx in ipairs(txs) do
sid_sum[tx.SteamID] = (sid_sum[tx.SteamID] or 0) + math.max(tx.Sum, 0)
end
local t = {}
for s64,sum in SortedPairsByValue(sid_sum, true) do
table.insert(t, {s64, sum})
if #t >= pick_n then break end
end
cb(t)
end, nil, 2000)
end
getTopDonators(10, function(t)
http.Post("https://example.com", { top = util.TableToJSON(t) })
end)
Обрати внимание, что нельзя выполнять getTopDonators слишком часто. Лучше не чаще, чем раз в 5 минут, а в идеале раз в час или раз в несколько часов
Эта штука строит данные не по датам, а по последним транзакциям, так что погрешности будут, но никто не заметит. Чем больше число вместо 2000 тыс указать, тем более точны будут данные, но лимиты не позволят выполнять ее слишком часто и будут кидать проект в flood-wait