This commit is contained in:
51
backend/redis-scripts/get-rank.lua
Normal file
51
backend/redis-scripts/get-rank.lua
Normal file
@@ -0,0 +1,51 @@
|
||||
-- Helper to split CSV string into a list
|
||||
local function split_csv(csv)
|
||||
local result = {}
|
||||
for user_id in string.gmatch(csv, '([^,]+)') do
|
||||
table.insert(result, user_id)
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
local redis_call = redis.call
|
||||
local leaderboard_scores_key, leaderboard_results_key = KEYS[1], KEYS[2]
|
||||
|
||||
local user_id = ARGV[1]
|
||||
local include_scores = ARGV[2]
|
||||
local user_ids_csv = ARGV[3]
|
||||
|
||||
local rank = nil
|
||||
local friendsRank = nil
|
||||
local result = {}
|
||||
local score = ''
|
||||
|
||||
|
||||
-- filtered leaderboard
|
||||
if user_ids_csv ~= "" then
|
||||
|
||||
local filtered_user_ids = split_csv(user_ids_csv)
|
||||
local scored_users = {}
|
||||
for _, user_id in ipairs(filtered_user_ids) do
|
||||
local score = redis_call('ZSCORE', leaderboard_scores_key, user_id)
|
||||
if score then
|
||||
local number_score = tonumber(score)
|
||||
table.insert(scored_users, {user_id = user_id, score = number_score})
|
||||
end
|
||||
end
|
||||
table.sort(scored_users, function(a, b) return a.score > b.score end)
|
||||
|
||||
for i = 1, #scored_users do
|
||||
if scored_users[i].user_id == user_id then
|
||||
friendsRank = i - 1
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
rank = redis_call('ZREVRANK', leaderboard_scores_key, user_id)
|
||||
if (include_scores == "true") then
|
||||
score = redis_call('ZSCORE', leaderboard_scores_key, user_id)
|
||||
end
|
||||
result = redis_call('HGET', leaderboard_results_key, user_id)
|
||||
|
||||
return {rank, score, result, friendsRank}
|
||||
Reference in New Issue
Block a user