<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.xhsr.org.cn/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AUserGroup</id>
	<title>模块:UserGroup - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.xhsr.org.cn/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AUserGroup"/>
	<link rel="alternate" type="text/html" href="https://wiki.xhsr.org.cn/index.php?title=%E6%A8%A1%E5%9D%97:UserGroup&amp;action=history"/>
	<updated>2026-06-03T05:54:58Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.12</generator>
	<entry>
		<id>https://wiki.xhsr.org.cn/index.php?title=%E6%A8%A1%E5%9D%97:UserGroup&amp;diff=3324&amp;oldid=prev</id>
		<title>星河：​创建页面，内容为“local luaq = require(&quot;Module:Luaq&quot;) -- 加载查询模块。  local module = {}  local data = mw.text.jsonDecode(mw.title.new(&quot;Module:UserGroup/data&quot;):getContent()) local config = mw.text.jsonDecode(mw.title.new(&quot;Module:UserGroup/config&quot;):getContent())  local alias = { -- 别名，自己动手添加~     [&quot;staff&quot;] = &quot;staff&quot;,     [&quot;职&quot;] = &quot;staff&quot;,          [&quot;b&quot;] = &quot;bureaucrat&quot;,     [&quot;行政员&quot;] = &quot;bureaucrat&quot;,     [&quot;行政員&quot;] = &quot;bureaucrat&quot;,     [&quot;行政&quot;] =…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.xhsr.org.cn/index.php?title=%E6%A8%A1%E5%9D%97:UserGroup&amp;diff=3324&amp;oldid=prev"/>
		<updated>2024-02-15T02:10:49Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“local luaq = require(&amp;quot;Module:Luaq&amp;quot;) -- 加载查询模块。  local module = {}  local data = mw.text.jsonDecode(mw.title.new(&amp;quot;Module:UserGroup/data&amp;quot;):getContent()) local config = mw.text.jsonDecode(mw.title.new(&amp;quot;Module:UserGroup/config&amp;quot;):getContent())  local alias = { -- 别名，自己动手添加~     [&amp;quot;staff&amp;quot;] = &amp;quot;staff&amp;quot;,     [&amp;quot;职&amp;quot;] = &amp;quot;staff&amp;quot;,          [&amp;quot;b&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,     [&amp;quot;行政员&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,     [&amp;quot;行政員&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,     [&amp;quot;行政&amp;quot;] =…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local luaq = require(&amp;quot;Module:Luaq&amp;quot;) -- 加载查询模块。&lt;br /&gt;
&lt;br /&gt;
local module = {}&lt;br /&gt;
&lt;br /&gt;
local data = mw.text.jsonDecode(mw.title.new(&amp;quot;Module:UserGroup/data&amp;quot;):getContent())&lt;br /&gt;
local config = mw.text.jsonDecode(mw.title.new(&amp;quot;Module:UserGroup/config&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
local alias = { -- 别名，自己动手添加~&lt;br /&gt;
    [&amp;quot;staff&amp;quot;] = &amp;quot;staff&amp;quot;,&lt;br /&gt;
    [&amp;quot;职&amp;quot;] = &amp;quot;staff&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;b&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;行政员&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;行政員&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;行政&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;行&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;cu&amp;quot;] = &amp;quot;checkuser&amp;quot;,&lt;br /&gt;
    [&amp;quot;用户查核员&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;用戶查核員&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;使用者查核員&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;查核员&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;查核員&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;查核&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    [&amp;quot;查&amp;quot;] = &amp;quot;bureaucrat&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;sp&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    [&amp;quot;监督员&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    [&amp;quot;監督員&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    [&amp;quot;监督&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    [&amp;quot;監督&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    [&amp;quot;监&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    [&amp;quot;監&amp;quot;] = &amp;quot;suppress&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;s&amp;quot;] = &amp;quot;sysop&amp;quot;,&lt;br /&gt;
    [&amp;quot;管理员&amp;quot;] = &amp;quot;sysop&amp;quot;,&lt;br /&gt;
    [&amp;quot;管理員&amp;quot;] = &amp;quot;sysop&amp;quot;,&lt;br /&gt;
    [&amp;quot;管理&amp;quot;] = &amp;quot;sysop&amp;quot;,&lt;br /&gt;
    [&amp;quot;管&amp;quot;] = &amp;quot;sysop&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;p&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;维护姬&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;維護姬&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;巡查员&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;巡查員&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;巡查姬&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;巡查&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;巡&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;维&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    [&amp;quot;維&amp;quot;] = &amp;quot;patroller&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;ia&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    [&amp;quot;界面管理员&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    [&amp;quot;介面管理員&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    [&amp;quot;界管&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    [&amp;quot;介管&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    [&amp;quot;界&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    [&amp;quot;介&amp;quot;] = &amp;quot;interface-admin&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;te&amp;quot;] = &amp;quot;techeditor&amp;quot;,&lt;br /&gt;
    [&amp;quot;技术编辑员&amp;quot;] = &amp;quot;techeditor&amp;quot;,&lt;br /&gt;
    [&amp;quot;技術編輯員&amp;quot;] = &amp;quot;techeditor&amp;quot;,&lt;br /&gt;
    [&amp;quot;技编&amp;quot;] = &amp;quot;techeditor&amp;quot;,&lt;br /&gt;
    [&amp;quot;技編&amp;quot;] = &amp;quot;techeditor&amp;quot;,&lt;br /&gt;
    [&amp;quot;技&amp;quot;] = &amp;quot;techeditor&amp;quot;,&lt;br /&gt;
    &lt;br /&gt;
    [&amp;quot;sc&amp;quot;] = &amp;quot;special-contributor&amp;quot;,&lt;br /&gt;
    [&amp;quot;特殊贡献者&amp;quot;] = &amp;quot;special-contributor&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
local order = { -- 同[[Help:用户标识]]顺序&lt;br /&gt;
    &amp;quot;staff&amp;quot;,                   -- STAFF&lt;br /&gt;
    &amp;quot;bureaucrat&amp;quot;,              -- 行政员&lt;br /&gt;
    &amp;quot;checkuser&amp;quot;,               -- 用户核查员&lt;br /&gt;
    &amp;quot;suppress&amp;quot;,                -- 监督员&lt;br /&gt;
    &amp;quot;sysop&amp;quot;,                   -- 管理员&lt;br /&gt;
    &amp;quot;patroller&amp;quot;,               -- 维护姬&lt;br /&gt;
    &amp;quot;honoredmaintainer&amp;quot;,       -- 荣誉维护人员&lt;br /&gt;
    &amp;quot;special-contributor&amp;quot;,      -- 特殊贡献者&lt;br /&gt;
    &amp;quot;interface-admin&amp;quot;,         -- 界面管理员&lt;br /&gt;
    &amp;quot;templateeditor&amp;quot;,          -- 技术编辑员&lt;br /&gt;
    &amp;quot;bot&amp;quot;,                     -- 机器人&lt;br /&gt;
    &amp;quot;flood&amp;quot;,                   -- 机器用户&lt;br /&gt;
    &amp;quot;ipblock-exempt&amp;quot;,          -- IP封禁豁免者&lt;br /&gt;
    &amp;quot;goodeditor&amp;quot;,              -- 优质编辑者&lt;br /&gt;
    &amp;quot;manually-confirmed&amp;quot;       -- 手动确认用户&lt;br /&gt;
}&lt;br /&gt;
function table.indexof(t, item)&lt;br /&gt;
    for i, v in ipairs(t) do&lt;br /&gt;
        if v == item then return i end&lt;br /&gt;
    end&lt;br /&gt;
    return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local getGroups = function(filter)&lt;br /&gt;
    return luaq.iasQuery(mw.text.split(filter, &amp;quot;%s+&amp;quot;))&lt;br /&gt;
            :select(function(_, name) return alias[name] or name end)&lt;br /&gt;
            :distinct()&lt;br /&gt;
            :orderBy(function(aname) return table.indexof(order, aname) end)&lt;br /&gt;
            :where(function(_, aname) return data[aname] ~= nil end)&lt;br /&gt;
            :select(function(_, aname) return data[aname] end)&lt;br /&gt;
            :query()&lt;br /&gt;
end&lt;br /&gt;
--[[&lt;br /&gt;
    供Module:Summon（大召唤术）读取数据的接口。&lt;br /&gt;
    filter: 空格间隔，别名见上方alias表。&lt;br /&gt;
--]]&lt;br /&gt;
function module.enumerate(filter)&lt;br /&gt;
    local users = {}&lt;br /&gt;
    local groups&lt;br /&gt;
    if type(filter) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        groups = getGroups(filter)&lt;br /&gt;
    end&lt;br /&gt;
    if groups == nil or #groups == 0 then&lt;br /&gt;
        -- 由于行政员默认拥有管理员用户组，因此在显示时需要去重。&lt;br /&gt;
        local sysop = {}&lt;br /&gt;
        for _, user in ipairs(data.sysop or {}) do&lt;br /&gt;
            local flag = false&lt;br /&gt;
            for _, _user in ipairs(data.bureaucrat or {}) do&lt;br /&gt;
                if user == _user then&lt;br /&gt;
                    flag = true&lt;br /&gt;
                    break&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if flag == false then table.insert(sysop, user) end&lt;br /&gt;
        end&lt;br /&gt;
        groups = { data.bureaucrat or {}, sysop, data.patroller or {} } -- 默认召唤的是所有维护人员（行政员、管理员、巡查姬）。&lt;br /&gt;
    end&lt;br /&gt;
    for _, group in ipairs(groups) do&lt;br /&gt;
        for _, val in ipairs(group) do&lt;br /&gt;
            if mw.text.trim(val) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                local user = config[val]&lt;br /&gt;
                if (user == nil or user.active ~= false) then&lt;br /&gt;
                    table.insert(users, mw.text.trim(val))&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return users&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local UserGroupInfo = function(group, frame)&lt;br /&gt;
    local parent = frame:getParent()&lt;br /&gt;
    if parent and parent:getTitle() == &amp;quot;Template:UserGroup&amp;quot; then&lt;br /&gt;
        frame = parent&lt;br /&gt;
    end&lt;br /&gt;
    if frame.args[&amp;quot;Count&amp;quot;] then&lt;br /&gt;
        return #group&lt;br /&gt;
    else&lt;br /&gt;
        local list = {}&lt;br /&gt;
        for key, val in ipairs(group) do&lt;br /&gt;
            if mw.text.trim(val) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                local user = config[val]&lt;br /&gt;
                if (user) then&lt;br /&gt;
                    table.insert(list,&lt;br /&gt;
                        frame:preprocess(user.prefix or &amp;quot;&amp;quot;)..&lt;br /&gt;
                        frame:expandTemplate{ title = &amp;quot;User&amp;quot;, args = { val } }..&lt;br /&gt;
                        frame:preprocess(user.postfix or &amp;quot;&amp;quot;)&lt;br /&gt;
                    )&lt;br /&gt;
                else&lt;br /&gt;
                    table.insert(list, frame:expandTemplate{ title = &amp;quot;User&amp;quot;, args = { val } })&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return table.concat(list, &amp;quot; • &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
动态生成用以展示某一用户组成员列表的模块导出函数，&lt;br /&gt;
生成操作支持的用户组同[[Module:UserGroup/data]]中明确列举出的用户组，没有列举出的将不会支持。&lt;br /&gt;
在调用模块时，仍然可以使用{{#invoke|UserGroup|【用户组的代号】}}，旧代码可不做修改。&lt;br /&gt;
  ]==]&lt;br /&gt;
for gname, g in pairs(data) do&lt;br /&gt;
    module[gname] = function(frame)&lt;br /&gt;
        return UserGroupInfo(g, frame)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
--[[&lt;br /&gt;
由于行政员默认拥有管理员用户组，因此在显示时需要去重。&lt;br /&gt;
  ]]&lt;br /&gt;
module.sysop = function(frame)&lt;br /&gt;
    local bureaucrat = data.bureaucrat or {}&lt;br /&gt;
    local sysop = luaq.iasQuery(data.sysop or {})&lt;br /&gt;
        :where(function(_, user) return table.indexof(bureaucrat, user) &amp;lt; 1 end)&lt;br /&gt;
        :query()&lt;br /&gt;
    return UserGroupInfo(sysop, frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function module.vote_count(frame)&lt;br /&gt;
    local filter = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    local adjust = tonumber(frame.args[2]) or 0&lt;br /&gt;
    local check_vote = function(_, users)&lt;br /&gt;
        local retn = 0&lt;br /&gt;
        for _, val in ipairs(users) do&lt;br /&gt;
            if mw.text.trim(val) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                local user = config[val]&lt;br /&gt;
                retn = retn + ((user == nil or user.vote ~= false) and 1 or 0)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return retn&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local groups = getGroups(filter) -- 获取要求和的用户组列表&lt;br /&gt;
    if groups == nil or #groups == 0 then return 0 end&lt;br /&gt;
    return adjust + luaq.iasQuery(groups)&lt;br /&gt;
        :select(check_vote)&lt;br /&gt;
        :sum(function(x, y) return { x[1] + y[1] } end) -- 求和&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return module&lt;/div&gt;</summary>
		<author><name>星河</name></author>
	</entry>
</feed>