模組:ACGaward
外观
本模块用于处理維基ACG專題獎分数相关内容。请在Module:ACGaward/list登记用户得分。
用法
[编辑]本模组包括若干函数:
level
- 獲得指定用戶的专题奖等级。ranking
- 获取用户专题奖等级列表,效果见WikiProject:ACG/維基ACG專題獎/分數排名榜。diff
- 和Module:ACGaward/list/old搭配使用,比較兩筆記錄間的用戶分数變化情況。all
- 以「用户名|分数」格式輸出list子頁的資料,方便拷貝到其他编辑器中处理。
備註
[编辑]以下子模组和本模組功能無關,係爲避免「浪費」而借用本模組空間:
- /nominee check — 用於
{{ACG提名/check}}
。 - /nominee check new — 用於
{{ACG提名2/request}}
、{{ACG提名2/check}}
等处
local list = require('Module:ACGaward/list').list
local getArgs = require('Module:Arguments').getArgs
local p = {}
local function makeInvokeFunc(funcName)
return function(frame)
local args = getArgs(frame)
return p[funcName](args)
end
end
p.level = makeInvokeFunc('_level')
function p._level(args)
local username = string.match(tostring(mw.title.getCurrentTitle().text), '^[^/]+')
if args.level then
return args.level
end
for _, value in ipairs(list) do
if value[1] == username then
return math.floor(value[2] / 10)
end
end
return args[1]
end
p.ranking = makeInvokeFunc('_ranking')
function p._ranking(args)
local tab, tabList, scoreLessThenTenCounter = '', {}, {}
for i = 1, 9 do
scoreLessThenTenCounter[i] = 0
end
table.sort(list, function(a, b)
return (a[2] > b[2])
end)
local rank = 1
local function addHeader(header)
table.insert(tabList, ';' .. "" .. header .. "")
end
addHeader("50级或以上维基ACG专题奖")
for key, value in ipairs(list) do
if value[2] < 500 and list[key - 1][2] >= 500 then
addHeader("40至49级维基ACG专题奖")
elseif value[2] < 400 and list[key - 1][2] >= 400 then
addHeader("30至39级维基ACG专题奖")
elseif value[2] < 300 and list[key - 1][2] >= 300 then
addHeader("20至29级维基ACG专题奖")
elseif value[2] < 200 and list[key - 1][2] >= 200 then
addHeader("10至19级维基ACG专题奖")
elseif value[2] < 100 and list[key - 1][2] >= 100 then
addHeader("5至9级维基ACG专题奖")
elseif value[2] < 50 and list[key - 1][2] >= 50 then
addHeader("4级维基ACG专题奖")
elseif value[2] < 40 and list[key - 1][2] >= 40 then
addHeader("3级维基ACG专题奖")
elseif value[2] < 30 and list[key - 1][2] >= 30 then
addHeader("2级维基ACG专题奖")
elseif value[2] < 20 and list[key - 1][2] >= 20 then
addHeader("1级维基ACG专题奖")
elseif value[2] < 10 and list[key - 1][2] >= 10 then
addHeader("未满1级维基ACG专题奖")
end
if value[2] < 10 then
for i = 1, 9 do
if value[2] == i then
scoreLessThenTenCounter[i] = scoreLessThenTenCounter[i] + 1
end
end
else
local user = string.format('[[User:%s|%s]]', value[1], value.nickname or value[1])
table.insert(tabList, ':' .. rank .. '. ' .. user .. ':' .. value[2] .. '分') -- 关键:确保换行
rank = rank + 1 -- 递增排名
end
end
for i = 9, 1, -1 do
table.insert(tabList, ':' .. scoreLessThenTenCounter[i] .. '名维基人:' .. i .. '分')
end
return mw.getCurrentFrame():expandTemplate { title = 'Div col', args = { colwidth = '16em' } } .. '\n' .. table.concat(tabList, '\n') .. mw.getCurrentFrame():expandTemplate { title = 'Div col end' }
end
p.lv = makeInvokeFunc('_lv')
function p._lv(args)
-- Code for the second function goes here.
local tab, tabList = '', {}
table.sort(list, function(a, b)
return (a[2] > b[2])
end)
local scoreLessThenTenCounter = 0
for _, value in ipairs(list) do
if value[2] < 10 then
scoreLessThenTenCounter = scoreLessThenTenCounter + 1
else
local user = string.format('[[User:%s|%s]]', value[1], value.nickname or value[1])
table.insert(tabList, '*' .. math.floor(value[2] / 10) .. '級:' .. user .. '\n')
end
end
local text = table.concat(tabList) .. '* 另有' .. scoreLessThenTenCounter .. '名维基人不滿1級ACG創作貢獻獎' .. '\n'
return mw.getCurrentFrame():expandTemplate { title = 'Div col', args = { colwidth = '16em' } } .. '\n' .. text .. mw.getCurrentFrame():expandTemplate { title = 'Div col end' }
end
p.all = makeInvokeFunc('_all')
function p._all(args)
local tabList = {}
for _, v in ipairs(list) do
table.insert(tabList, '* ' .. v[1] .. '|' .. v[2])
end
return table.concat(tabList, '\n')
end
p.diff = makeInvokeFunc('_diff')
function p._diff(args)
local new_list = list
local old_list = require('Module:ACGaward/list/old').list
local function get_score(list, username)
for _, v in pairs(list) do
if v[1] == username then
return v[2]
end
end
return 0
end
-- New scores vs. old scores
local new_vs_old = {}
for _, v in pairs(new_list) do
local user = v[1]
local new_score = v[2]
local old_score = get_score(old_list, user)
local diff = new_score - old_score
if diff ~= 0 then
table.insert(new_vs_old, { user, diff, new_score })
end
end
table.sort(new_vs_old, function(a, b)
return a[2] > b[2]
end)
local function nowiki(text)
return mw.getCurrentFrame():callParserFunction( '#tag:nowiki', text )
end
local report_new_vs_old = {}
for _, v in pairs(new_vs_old) do
local str = '# ' .. nowiki('* [[User:' .. v[1] .. '|' .. v[1] .. ']]:共得' .. v[2] .. '分' ..
'<small>(累計分數' .. v[3] .. '分)</small>')
table.insert(report_new_vs_old, str)
end
-- Old scores vs. new scores
local old_vs_new = {}
for _, v in pairs(old_list) do
local user = v[1]
local new_score = get_score(new_list, user)
local old_score = v[2]
local diff = new_score - old_score
if diff < 0 then
table.insert(old_vs_new, { user, diff, new_score })
end
end
table.sort(old_vs_new, function(a, b)
return a[2] < b[2]
end)
local report_old_vs_new = {}
for _, v in pairs(old_vs_new) do
local str = '# ' .. nowiki('* [[User:' .. v[1] .. '|' .. v[1] .. ']]:共得' .. v[2] .. '分' ..
'<small>(累計分數' .. v[3] .. '分)</small>')
table.insert(report_old_vs_new, str)
end
-- result
local res = {}
table.insert(res, table.concat(report_new_vs_old, '\n'))
if #report_old_vs_new > 0 then
table.insert(res, '異常分數變化(如用戶更名)')
table.insert(res, table.concat(report_old_vs_new, '\n'))
end
return table.concat(res, '\n')
end
return p