跳转到内容

模組:CCHPaward

维基百科,自由的百科全书
require("strict")

local getArgs = require("Module:Arguments").getArgs

-- 数据
local RECORD_MODULE = "Module:CCHPaward/list"

local function load_record()
    return mw.loadData(RECORD_MODULE)
end

-- 获取用户名(页面名称或指定参数)
local function fetch_username(user)
    if user == nil or user == "" then
        return mw.title.getCurrentTitle().baseText
    end
    return user
end

-- 计算等级和总分
local function calculate_scores(article, image, review)
    local total_score = article * 1 + image * 0.2 + review * 0.4
    local level = math.floor(total_score / 10)  -- 舍去小数部分取整
    return level, total_score
end

local p = {}

-- 获取用户等级
function p.level(frame)
    local args = getArgs(frame)
    local user = args.user
    local record = load_record()
    local username = fetch_username(user)
    
    -- 获取得分
    local user_data = record[username] or {article = 0, image = 0, review = 0}
    
    -- 计算并返回等级
    local level = calculate_scores(user_data.article, user_data.image, user_data.review)
    return tostring(level)
end

-- 生成排行榜
function p._ranking()
    local record = load_record()
    local user_list = {}
    
    -- 整理数据
    for username, scores in pairs(record) do
        local level, total_score = calculate_scores(scores.article, scores.image, scores.review)
        table.insert(user_list, {
            username = username,
            level = level,
            total_score = total_score,
            article = scores.article,
            image = scores.image,
            review = scores.review
        })
    end
    
    -- 按总分排序
    table.sort(user_list, function(a, b)
        if a.total_score == b.total_score then
            return a.username < b.username
        end
        return a.total_score > b.total_score
    end)
    
    -- 生成排行榜
    local lines = {
        '{| class="wikitable sortable"',
        '! 排名 !! 用户名 !! 等级 !! 总分 !! 条目分 !! 图片分 !! 评审分'
    }
    
    for i, user in ipairs(user_list) do
        table.insert(lines, "|-")
        table.insert(lines, string.format(
            "| %d || [[User:%s|%s]] || %d级 || %.1f || %.1f || %.1f || %.1f",
            i,
            user.username,
            user.username,
            user.level,
            user.total_score,
            user.article,
            user.image,
            user.review
        ))
    end
    
    table.insert(lines, "|}")
    
    return table.concat(lines, "\n")
end

function p.ranking(frame)
    return p._ranking()
end

return p