Module:UserGroup
跳到导航
跳到搜索
本模块为萌娘百科维护和管理人员的信息显示和列举提供支持,它主要任务有:
- 在 Template:萌娘百科的苦力 中显示各个用户组的所有用户,并且计数;
- 为 Module:Summon 提供获取所有可投票的维护人员的接口;
- 统计各用户组可投票的成员的总人数。
- 目前本模块基于机器人维护的半自动更新用户组列表,因此在非必要情况下不建议修改相关的代码。
local luaq = require("Module:Luaq") -- 加载查询模块。 local module = {} local data = mw.text.jsonDecode(mw.title.new("Module:UserGroup/data"):getContent()) local config = mw.text.jsonDecode(mw.title.new("Module:UserGroup/config"):getContent()) local alias = { -- 别名,自己动手添加~ ["staff"] = "staff", ["职"] = "staff", ["b"] = "bureaucrat", ["行政员"] = "bureaucrat", ["行政員"] = "bureaucrat", ["行政"] = "bureaucrat", ["行"] = "bureaucrat", ["cu"] = "checkuser", ["用户查核员"] = "bureaucrat", ["用戶查核員"] = "bureaucrat", ["使用者查核員"] = "bureaucrat", ["查核员"] = "bureaucrat", ["查核員"] = "bureaucrat", ["查核"] = "bureaucrat", ["查"] = "bureaucrat", ["sp"] = "suppress", ["监督员"] = "suppress", ["監督員"] = "suppress", ["监督"] = "suppress", ["監督"] = "suppress", ["监"] = "suppress", ["監"] = "suppress", ["s"] = "sysop", ["管理员"] = "sysop", ["管理員"] = "sysop", ["管理"] = "sysop", ["管"] = "sysop", ["p"] = "patroller", ["巡查员"] = "patroller", ["巡查員"] = "patroller", ["巡查姬"] = "patroller", ["巡查"] = "patroller", ["巡"] = "patroller", ["ia"] = "interface-admin", ["界面管理员"] = "interface-admin", ["介面管理員"] = "interface-admin", ["界管"] = "interface-admin", ["介管"] = "interface-admin", ["界"] = "interface-admin", ["介"] = "interface-admin", ["se"] = "scripteditor", ["脚本编辑员"] = "scripteditor", ["指令碼編輯員"] = "scripteditor", ["脚编"] = "scripteditor", ["指編"] = "scripteditor", ["脚"] = "scripteditor", ["指"] = "scripteditor", ["te"] = "techeditor", ["技术编辑员"] = "techeditor", ["技術編輯員"] = "techeditor", ["技编"] = "techeditor", ["技編"] = "techeditor", ["技"] = "techeditor", ["am"] = "abusefilter-maintainer", ["af"] = "abusefilter-maintainer", ["滥用过滤器维护员"] = "abusefilter-maintainer", ["濫用過濾器維護員"] = "abusefilter-maintainer", ["hw"] = "honorary-webmaster", ["荣誉站长"] = "honorary-webmaster", ["榮譽站長"] = "honorary-webmaster" } local order = { -- 同[[Help:用户标识]]顺序 "staff", -- STAFF "bureaucrat", -- 行政员 "checkuser", -- 用户核查员 "suppress", -- 监督员 "sysop", -- 管理员 "patroller", -- 巡查姬 "honoredmaintainer", -- 荣誉维护人员 "interface-admin", -- 界面管理员 "scripteditor", -- 脚本编辑员 "templateeditor", -- 技术编辑员 "abusefilter-maintainer", -- 滥用过滤器维护员 "bot", -- 机器人 "flood", -- 机器用户 "ipblock-exempt", -- IP封禁豁免者 "goodeditor", -- 优质编辑者 "manually-confirmed", -- 手动确认用户 "kanbanmusume", -- 看板娘 "honorary-webmaster" -- 荣誉站长 } function table.indexof(t, item) for i, v in ipairs(t) do if v == item then return i end end return 0 end local getGroups = function(filter) return luaq.iasQuery(mw.text.split(filter, "%s+")) :select(function(_, name) return alias[name] or name end) :distinct() :orderBy(function(aname) return table.indexof(order, aname) end) :where(function(_, aname) return data[aname] ~= nil end) :select(function(_, aname) return data[aname] end) :query() end --[[ 供Module:Summon(大召唤术)读取数据的接口。 filter: 空格间隔,别名见上方alias表。 --]] function module.enumerate(filter) local users = {} local groups if type(filter) == "string" then groups = getGroups(filter) end if groups == nil or #groups == 0 then -- 由于行政员默认拥有管理员用户组,因此在显示时需要去重。 local sysop = {} for _, user in ipairs(data.sysop or {}) do local flag = false for _, _user in ipairs(data.bureaucrat or {}) do if user == _user then flag = true break end end if flag == false then table.insert(sysop, user) end end groups = { data.bureaucrat or {}, sysop, data.patroller or {} } -- 默认召唤的是所有维护人员(行政员、管理员、巡查姬)。 end for _, group in ipairs(groups) do for _, val in ipairs(group) do if mw.text.trim(val) ~= "" then local user = config[val] if (user == nil or user.active ~= false) then table.insert(users, mw.text.trim(val)) end end end end return users end local UserGroupInfo = function(group, frame) local parent = frame:getParent() if parent and parent:getTitle() == "Template:UserGroup" then frame = parent end if frame.args["Count"] then return #group else local list = {} for key, val in ipairs(group) do if mw.text.trim(val) ~= "" then local user = config[val] if (user) then table.insert(list, frame:preprocess(user.prefix or "").. frame:expandTemplate{ title = "User", args = { val } }.. frame:preprocess(user.postfix or "") ) else table.insert(list, frame:expandTemplate{ title = "User", args = { val } }) end end end return table.concat(list, " • ") end end --[==[ 动态生成用以展示某一用户组成员列表的模块导出函数, 生成操作支持的用户组同[[Module:UserGroup/data]]中明确列举出的用户组,没有列举出的将不会支持。 在调用模块时,仍然可以使用{{#invoke|UserGroup|【用户组的代号】}},旧代码可不做修改。 ]==] for gname, g in pairs(data) do module[gname] = function(frame) return UserGroupInfo(g, frame) end end --[[ 由于行政员默认拥有管理员用户组,因此在显示时需要去重。 ]] module.sysop = function(frame) local bureaucrat = data.bureaucrat or {} local sysop = luaq.iasQuery(data.sysop or {}) :where(function(_, user) return table.indexof(bureaucrat, user) < 1 end) :query() return UserGroupInfo(sysop, frame) end function module.vote_count(frame) local filter = mw.text.trim(frame.args[1] or "") local adjust = tonumber(frame.args[2]) or 0 local check_vote = function(_, users) local retn = 0 for _, val in ipairs(users) do if mw.text.trim(val) ~= "" then local user = config[val] retn = retn + ((user == nil or user.vote ~= false) and 1 or 0) end end return retn end local groups = getGroups(filter) -- 获取要求和的用户组列表 if groups == nil or #groups == 0 then return 0 end return adjust + luaq.iasQuery(groups) :select(check_vote) :sum(function(x, y) return { x[1] + y[1] } end) -- 求和 end return module