模組: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.total_score(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 _, total_score = calculate_scores(user_data.article, user_data.image, user_data.review)
-- 四舍五入至十分位
local rounded_score = math.floor(total_score * 10 + 0.5) / 10
return tostring(rounded_score)
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
-- 查询超过特定等级的人数
function p.count_above_level(frame)
local args = getArgs(frame)
local level_threshold = tonumber(args[1]) or 0
local record = load_record()
local count = 0
for _, scores in pairs(record) do
local level = calculate_scores(scores.article, scores.image, scores.review)
if level >= level_threshold then
count = count + 1
end
end
return tostring(count)
end
return p