Module:UserGroup

Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

本模块为萌娘百科维护和管理人员的信息显示和列举提供支持,它主要任务有:

  1. Template:萌娘百科的苦力 中显示各个用户组的所有用户,并且计数;
  2. Module:Summon 提供获取所有可投票的维护人员的接口;
  3. 统计各用户组可投票的成员的总人数。
目前本模块基于机器人维护的半自动更新用户组列表,因此在非必要情况下不建议修改相关的代码。
  1. local luaq = require("Module:Luaq") -- 加载查询模块。
  2. local module = {}
  3. local data = mw.text.jsonDecode(mw.title.new("Module:UserGroup/data"):getContent())
  4. local config = mw.text.jsonDecode(mw.title.new("Module:UserGroup/config"):getContent())
  5. local alias = { -- 别名,自己动手添加~
  6. ["staff"] = "staff",
  7. ["职"] = "staff",
  8. ["b"] = "bureaucrat",
  9. ["行政员"] = "bureaucrat",
  10. ["行政員"] = "bureaucrat",
  11. ["行政"] = "bureaucrat",
  12. ["行"] = "bureaucrat",
  13. ["cu"] = "checkuser",
  14. ["用户查核员"] = "bureaucrat",
  15. ["用戶查核員"] = "bureaucrat",
  16. ["使用者查核員"] = "bureaucrat",
  17. ["查核员"] = "bureaucrat",
  18. ["查核員"] = "bureaucrat",
  19. ["查核"] = "bureaucrat",
  20. ["查"] = "bureaucrat",
  21. ["sp"] = "suppress",
  22. ["监督员"] = "suppress",
  23. ["監督員"] = "suppress",
  24. ["监督"] = "suppress",
  25. ["監督"] = "suppress",
  26. ["监"] = "suppress",
  27. ["監"] = "suppress",
  28. ["s"] = "sysop",
  29. ["管理员"] = "sysop",
  30. ["管理員"] = "sysop",
  31. ["管理"] = "sysop",
  32. ["管"] = "sysop",
  33. ["p"] = "patroller",
  34. ["巡查员"] = "patroller",
  35. ["巡查員"] = "patroller",
  36. ["巡查姬"] = "patroller",
  37. ["巡查"] = "patroller",
  38. ["巡"] = "patroller",
  39. ["ia"] = "interface-admin",
  40. ["界面管理员"] = "interface-admin",
  41. ["介面管理員"] = "interface-admin",
  42. ["界管"] = "interface-admin",
  43. ["介管"] = "interface-admin",
  44. ["界"] = "interface-admin",
  45. ["介"] = "interface-admin",
  46. ["se"] = "scripteditor",
  47. ["脚本编辑员"] = "scripteditor",
  48. ["指令碼編輯員"] = "scripteditor",
  49. ["脚编"] = "scripteditor",
  50. ["指編"] = "scripteditor",
  51. ["脚"] = "scripteditor",
  52. ["指"] = "scripteditor",
  53. ["te"] = "techeditor",
  54. ["技术编辑员"] = "techeditor",
  55. ["技術編輯員"] = "techeditor",
  56. ["技编"] = "techeditor",
  57. ["技編"] = "techeditor",
  58. ["技"] = "techeditor",
  59. ["am"] = "abusefilter-maintainer",
  60. ["af"] = "abusefilter-maintainer",
  61. ["滥用过滤器维护员"] = "abusefilter-maintainer",
  62. ["濫用過濾器維護員"] = "abusefilter-maintainer",
  63. ["hw"] = "honorary-webmaster",
  64. ["荣誉站长"] = "honorary-webmaster",
  65. ["榮譽站長"] = "honorary-webmaster"
  66. }
  67. local order = { -- 同[[Help:用户标识]]顺序
  68. "staff", -- STAFF
  69. "bureaucrat", -- 行政员
  70. "checkuser", -- 用户核查员
  71. "suppress", -- 监督员
  72. "sysop", -- 管理员
  73. "patroller", -- 巡查姬
  74. "honoredmaintainer", -- 荣誉维护人员
  75. "interface-admin", -- 界面管理员
  76. "scripteditor", -- 脚本编辑员
  77. "templateeditor", -- 技术编辑员
  78. "abusefilter-maintainer", -- 滥用过滤器维护员
  79. "bot", -- 机器人
  80. "flood", -- 机器用户
  81. "ipblock-exempt", -- IP封禁豁免者
  82. "goodeditor", -- 优质编辑者
  83. "manually-confirmed", -- 手动确认用户
  84. "kanbanmusume", -- 看板娘
  85. "honorary-webmaster" -- 荣誉站长
  86. }
  87. function table.indexof(t, item)
  88. for i, v in ipairs(t) do
  89. if v == item then return i end
  90. end
  91. return 0
  92. end
  93. local getGroups = function(filter)
  94. return luaq.iasQuery(mw.text.split(filter, "%s+"))
  95. :select(function(_, name) return alias[name] or name end)
  96. :distinct()
  97. :orderBy(function(aname) return table.indexof(order, aname) end)
  98. :where(function(_, aname) return data[aname] ~= nil end)
  99. :select(function(_, aname) return data[aname] end)
  100. :query()
  101. end
  102. --[[
  103. 供Module:Summon(大召唤术)读取数据的接口。
  104. filter: 空格间隔,别名见上方alias表。
  105. --]]
  106. function module.enumerate(filter)
  107. local users = {}
  108. local groups
  109. if type(filter) == "string" then
  110. groups = getGroups(filter)
  111. end
  112. if groups == nil or #groups == 0 then
  113. -- 由于行政员默认拥有管理员用户组,因此在显示时需要去重。
  114. local sysop = {}
  115. for _, user in ipairs(data.sysop or {}) do
  116. local flag = false
  117. for _, _user in ipairs(data.bureaucrat or {}) do
  118. if user == _user then
  119. flag = true
  120. break
  121. end
  122. end
  123. if flag == false then table.insert(sysop, user) end
  124. end
  125. groups = { data.bureaucrat or {}, sysop, data.patroller or {} } -- 默认召唤的是所有维护人员(行政员、管理员、巡查姬)。
  126. end
  127. for _, group in ipairs(groups) do
  128. for _, val in ipairs(group) do
  129. if mw.text.trim(val) ~= "" then
  130. local user = config[val]
  131. if (user == nil or user.active ~= false) then
  132. table.insert(users, mw.text.trim(val))
  133. end
  134. end
  135. end
  136. end
  137. return users
  138. end
  139. local UserGroupInfo = function(group, frame)
  140. local parent = frame:getParent()
  141. if parent and parent:getTitle() == "Template:UserGroup" then
  142. frame = parent
  143. end
  144. if frame.args["Count"] then
  145. return #group
  146. else
  147. local list = {}
  148. for key, val in ipairs(group) do
  149. if mw.text.trim(val) ~= "" then
  150. local user = config[val]
  151. if (user) then
  152. table.insert(list,
  153. frame:preprocess(user.prefix or "")..
  154. frame:expandTemplate{ title = "User", args = { val } }..
  155. frame:preprocess(user.postfix or "")
  156. )
  157. else
  158. table.insert(list, frame:expandTemplate{ title = "User", args = { val } })
  159. end
  160. end
  161. end
  162. return table.concat(list, " • ")
  163. end
  164. end
  165. --[==[
  166. 动态生成用以展示某一用户组成员列表的模块导出函数,
  167. 生成操作支持的用户组同[[Module:UserGroup/data]]中明确列举出的用户组,没有列举出的将不会支持。
  168. 在调用模块时,仍然可以使用{{#invoke|UserGroup|【用户组的代号】}},旧代码可不做修改。
  169. ]==]
  170. for gname, g in pairs(data) do
  171. module[gname] = function(frame)
  172. return UserGroupInfo(g, frame)
  173. end
  174. end
  175. --[[
  176. 由于行政员默认拥有管理员用户组,因此在显示时需要去重。
  177. ]]
  178. module.sysop = function(frame)
  179. local bureaucrat = data.bureaucrat or {}
  180. local sysop = luaq.iasQuery(data.sysop or {})
  181. :where(function(_, user) return table.indexof(bureaucrat, user) < 1 end)
  182. :query()
  183. return UserGroupInfo(sysop, frame)
  184. end
  185. function module.vote_count(frame)
  186. local filter = mw.text.trim(frame.args[1] or "")
  187. local adjust = tonumber(frame.args[2]) or 0
  188. local check_vote = function(_, users)
  189. local retn = 0
  190. for _, val in ipairs(users) do
  191. if mw.text.trim(val) ~= "" then
  192. local user = config[val]
  193. retn = retn + ((user == nil or user.vote ~= false) and 1 or 0)
  194. end
  195. end
  196. return retn
  197. end
  198. local groups = getGroups(filter) -- 获取要求和的用户组列表
  199. if groups == nil or #groups == 0 then return 0 end
  200. return adjust + luaq.iasQuery(groups)
  201. :select(check_vote)
  202. :sum(function(x, y) return { x[1] + y[1] } end) -- 求和
  203. end
  204. return module
返回顶部
页面反馈