モジュール:UserAN

半永久的に拡張半保護されているモジュール
モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

Template:UserAN用のモジュール。

使い方

書式

{{#invoke:UserAN|Main}}

local modip = require('Module:IP')

---Enclose a string by plainlinks
---@param str string
---@return string
local function plainlinks(str)
    return '<span class="plainlinks" style="font-size:smaller;">' .. str .. '</span>'
end

--Alternative to ternary operator
local function ternary(cond, T, F)
    if cond then return T else return F end
end

---OR evaluator
---@param comparator any
---@param ... unknown
---@return boolean
local function anyOf(comparator, ...)
    for _, v in ipairs(arg) do
        if comparator == v then return true end
    end
    return false
end

---Get links to show for a reportee in accordance with the UserAN type
---@param reportee string
---@param lcType string
---@param ipType "cidr"|"ip"|"none"
---@return string
local function getTypedLinks(reportee, lcType, ipType)

    local usernolink = '利用者:' .. reportee
    local userlink = '[[' .. usernolink .. ']]'

    local reporteeUri = string.gsub(reportee, ' ', '_')
	local talk = '[[User talk:' .. reporteeUri .. '|会話]]'
	local contribs = '[[特別:投稿記録/' .. reporteeUri .. '|投稿記録]]'
	local log = '[//ja.wikipedia.org/w/index.php?title=特別:Log&page=User:' .. reporteeUri .. ' 記録]'
    local filterLog = '[//ja.wikipedia.org/w/index.php?title=特別:AbuseLog&wpSearchUser=' .. reporteeUri .. ' フィルター記録]'
	local ca = '[[特別:CentralAuth/' .. reporteeUri .. '|CA]]'
    local guc = '[//xtools.wmflabs.org/globalcontribs/ipr-' .. reporteeUri .. ' GUC]'
    local spur = '[//spur.us/context/' .. reporteeUri .. ' SPUR]'
	local block = '[[特別:block/' .. reporteeUri .. '|ブロック]]'
    local logid = '[[特別:転送/logid/' .. reporteeUri .. '|Logid/' .. reporteeUri .. ']]'
	local diff = '[[特別:差分/' .. reporteeUri .. '|差分/' .. reporteeUri .. ']]の投稿者'

    local defaultLinks = {
        user2 = userlink .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. filterLog .. ' / ' .. ca .. ' / ' .. block .. ')'),
        unl = usernolink .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. filterLog .. ' / ' .. ca .. ' / ' .. block .. ')'),
        ip2 = 'IP:' .. reportee .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. filterLog .. ' / ' .. guc .. ' / ' .. spur .. ' / ' .. block .. ')'),
        ip2cidr = 'IP:' .. reportee .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. guc .. ' / ' .. spur .. ' / ' .. block .. ')'),
        logid = logid,
        diff = diff,
        none = reportee
    }

    local links
    if anyOf(lcType, 'usernolink', 'unl') then
        links = defaultLinks.unl
    elseif anyOf(lcType, 'ipuser2', 'ip2') then
        links = ternary(ipType == 'cidr', defaultLinks.ip2cidr, defaultLinks.ip2)
    elseif anyOf(lcType, 'log', 'logid') then
        links = defaultLinks.logid
    elseif anyOf(lcType, 'dif', 'diff') then
        links = defaultLinks.diff
    elseif lcType == 'none' then
        links = defaultLinks.none
    else
        links = defaultLinks.user2
    end

    return links

end

local errCnt = 0

---Error handling function
---@param errorType "nousername"|"nonipexpected"|"ipexpected"|"invalidcidr"|"numberexpected"|"invalidtype"
---@param typeParam string
---@param invalidSubnet string?
---@return string
local function errHandler(errorType, typeParam, invalidSubnet)
    errCnt = errCnt + 1
    local err = {
        nousername = '第一引数は必須です',
        nonipexpected = 'type=' .. typeParam .. 'に対しIPアドレスが指定されています',
        ipexpected = 'type=' .. typeParam .. 'には有効なIPアドレスを指定してください',
        invalidcidr = ternary(invalidSubnet, invalidSubnet, '') .. 'は無効なIPサブネットです',
        numberexpected = 'type=' .. typeParam .. 'には数字を指定してください',
        invalidtype = 'type=' .. typeParam .. 'は存在しません'
    }
    local msg = ternary(errCnt == 1, '[[Template:UserAN|UserAN]]エラー: ', '; ') .. err[errorType]
    msg = '<span style="color: red; font-weight: bold;">' .. msg .. '</span>'
    if errCnt == 1 and mw.getCurrentFrame():getParent():getTitle() == 'Template:UserAN' then -- Add category only when called from this template
        msg = msg .. '[[Category:テンプレート呼び出しエラーのあるページ/Template:UserAN]]'
    end
    return msg
end

-- Icons to show leading the username
local defaultIcons = {
    done = '[[File:Yes check.svg|20px|<span class="done">済</span>]]',
    done2 = '[[File:Yes check.svg|20px|<span class="done">済</span>]] <small><b>済</b></small>',
    doing = '[[File:Stock post message.svg|22px|<span class="doing">未了</span>]]',
    rejected = '[[File:X mark.svg|20px|<span class="done">却下</span>]] <small><b>却下</b></small>',
    withdrawn = '[[File:X mark.svg|20px|<span class="done">取り下げ</span>]] <small><b>取り下げ</b></small>',
    deferred = '[[File:X mark.svg|20px|<span class="done">見送り</span>]] <small><b>見送り</b></small>'
}

-- Main package function
local p = {}

function p.Main(frame)

    local args = frame.args
    local u = modip.Util.removeDirMarkers(args.username)
    local t = modip.Util.removeDirMarkers(args.type)
    t = ternary(t == '', 'User2', t)

    -- Evaluate the username parameter
    if u == '' then
        return errHandler('nousername', '')
    else
        u = u:gsub('_', ' ')
    end

    -- Evaluate IP
    local isIp = modip.Util.isIPAddress(u)
    local isCidr, _, corrected = modip.Util.isIPAddress(u, true, true)
    local isIPAddress = isIp or isCidr
    u = ternary(isIPAddress, u:upper(), u) -- Capitalize u if it's an IP
    if corrected ~= nil then corrected = corrected:upper() end -- Same as above

    -- Evaluate the type parameter and its compatibility with the username parameter
    local lcType = string.lower(t)
    local function generateIpErr()
        return errHandler('nonipexpected', t) .. ternary(corrected ~= nil, errHandler('invalidcidr', t, u), '')
    end
    local errorMsg = ''
    if anyOf(lcType, 'usernolink', 'unl', 'user2', 'none') then
        if isIPAddress then
            errorMsg = generateIpErr()
            lcType = 'ip2'
        end
    elseif anyOf(lcType, 'ipuser2', 'ip2') then
        if not isIPAddress then
            errorMsg = errHandler('ipexpected', t)
            lcType = 'unl'
        elseif corrected ~= nil then -- Cidr is provided but modified because it's invalid
            errorMsg = errHandler('invalidcidr', t, u)
        end
    elseif anyOf(lcType, 'log', 'logid', 'dif', 'diff') then
        if not u:find('^%d+$') then -- if not a number
            errorMsg = errHandler('numberexpected', t)
            lcType = 'unl'
            if isIPAddress then
                errorMsg = errorMsg .. generateIpErr()
                lcType = 'ip2'
            end
        end
    else
        errorMsg = errHandler('invalidtype', t)
        lcType = 'unl'
        if isIPAddress then
            errorMsg = errorMsg .. generateIpErr()
            lcType = 'ip2'
        end
    end
    errorMsg = ternary(errorMsg ~= '', '<small>' .. errorMsg .. '</small>', errorMsg)

    -- Get links to show
    local ipType = ternary(isCidr, 'cidr', ternary(isIp, 'ip', 'none'))
    local links = getTypedLinks(ternary(corrected ~= nil, corrected, u), lcType, ipType)

    -- Add icon
    local icon
	local autostatus = args.autostatus -- 2=
    local lcAutostatus = string.lower(autostatus)
	local manualstatus = args.manualstatus -- 状態=
    if lcAutostatus == '' then
        icon = ternary(manualstatus == '', defaultIcons.doing, defaultIcons.done2)
    elseif anyOf(lcAutostatus, 'done', '済', '済み') then
        icon = defaultIcons.done
    elseif anyOf(lcAutostatus, 'not done', '却下', '非対処') then
        icon = defaultIcons.rejected
    elseif lcAutostatus == '取り下げ' then
        icon = defaultIcons.withdrawn
    elseif lcAutostatus == '見送り' then
        icon = defaultIcons.deferred
    else
        icon = defaultIcons.done .. ' <small><b>' .. autostatus .. '</b></small>'
    end

    -- Return the string to display
	return icon .. ' ' .. links .. errorMsg

end

return p