Module:Report

-- -- @authors Applemasterexpert (thanks Kocka, Noreplyz) -- --                                Module:Report     Module for report templates. Proofreads user input.     This module is invoked using Template:Report spam,      Template:Report vandalism, Template:Report profile,     Template:Report filter and Template:Badwiki. -- -- local Report = {} local fallback = require('Dev:Fallback') local switch = require('Module:Report/i18n') local getArgs = require('Dev:Arguments').getArgs local wikialang = require('Module:Report/wikialang') local lang, i18n local DEFAULT_DOMAIN = 'fandom' local function init_lang(frame) lang = frame:preprocess('') i18n = fallback._langSwitch(switch, lang) end -- remove excess or wrongly entered content local function trim(s) s = s:match( "^%s*(.-)%s*$" ) return s end local function trimURL(s) s = s:match( "^%s*(.-)%s*$" ) s = s:gsub("http:%/%/","") s = s:gsub("https:%/%/","") s = s:gsub("%/+$", "/") return s end local function trim_user(s, wikiurl) s = s:match( "^%s*(.-)%s*$" ) if wikiurl then -- Make wiki url pattern-friendly wikiurl = wikiurl:gsub('%/', '%/') wikiurl = wikiurl:gsub('%.', '%.') wikiurl = wikiurl:gsub('%-', '%-') -- Remove wiki url from the parameters s = s:gsub("^.*%." .. wikiurl .. "%/", "") s = s:gsub("^.*%." .. wikiurl .. "%/wiki%/", "") end s = s:gsub("^.*%.wikia%.com%/wiki%/","") s = s:gsub("^.*%.wikia%.com%/","") s = s:gsub("^.*%.fandom%.com%/wiki%/","") s = s:gsub("^.*%.fandom%.com%/","") s = s:gsub("^.*%.wikia%.org%/wiki%/","") s = s:gsub("^.*%.wikia%.org%/","") s = s:gsub("User:","") s = s:gsub("Special:Contributions%/","") s = s:gsub("Special:Contribs%/","") s = s:gsub(" ","_") s = s:gsub("&","%%26") return s end local function trim_reason(s) s = s:match( "^%s*(.-)%s*$" ) s = s:gsub( "\\\\", "|" ) return s end local function trim_id(s) s = s:match( "^%s*(.-)%s*$" ) s = s:gsub("#","") s = s:gsub("%%23", "") return s end -- @return true if is IP, false otherwise local function is_ip(ip) if ip == nil or type(ip) ~= "string" then return false end -- Check IPv4 local chunks = {ip:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")} if (#chunks == 4) then for _,v in pairs(chunks) do           if (tonumber(v) < 0 or tonumber(v) > 255) then return false end end return true end -- Check IPv6 local _, chunks = ip:gsub("%:", "") if chunks == 7 then return true end -- Otherwise return false end local function crosswikilinks(wikiurl, user) local cwret = {} cwret[#cwret + 1] = ' ' if (is_ip(user)) then cwret[#cwret + 1] = '(cwret[#cwret + 1 = user        cwret[#cwret + 1] = ' ML] &bull; '    else        cwret[#cwret + 1] = '([https://community.wikia.com/wiki/Special:LookupContribs?target=' cwret[#cwret + 1] = user cwret[#cwret + 1] = ' LC] &bull; ' end cwret[#cwret + 1] = '[' .. wikiurl .. '/wiki/Special:CheckUser?user=' .. user cwret[#cwret + 1] = ' CU] &bull; ' cwret[#cwret + 1] = '[https://community.wikia.com/wiki/Special:Phalanx?type=8&target=' cwret[#cwret + 1] = user cwret[#cwret + 1] = '&wpPhalanxCheckBlocker=' cwret[#cwret + 1] = user cwret[#cwret + 1] = ' Phalanx])'   cwret[#cwret + 1] = ' '    return table.concat(cwret) end -- Splits wiki, domain and language from a full URL -- example: http://community.fandom.com/es/ function Report._splitWikiFromURL(url)    url = trimURL(url) .. '/'    -- try wikia.com parse    local domain = 'wikia'    local res, _, lang, wikiname = string.find(url, '([^%.]-)%.*([^%.]*)%.wikia%.com.*')    -- try fandom.com parse    if not res then        domain = 'fandom'        res, _, wikiname, lang = string.find(url, '([^%.]-)%.fandom%.com%/*([^%/]*)%/*.*')    end    -- try wikia.org parse    if not res then        domain = 'org'        res, _, wikiname, lang = string.find(url, '([^%.]-)%.wikia%.org%/*([^%/]*)%/*.*')    end    -- revert to the default: wikia    if not res then        domain = DEFAULT_DOMAIN        wikiname = url    end    -- Force CC to be wikia.com    if wikiname == 'community' or wikiname == 'c' then domain = 'wikia' end if lang ~= '' and not wikialang[lang] then -- deal with situations like naruto.answers.wikia.com if lang ~= 'wiki' and domain == 'wikia' then wikiname = lang .. '.' .. wikiname end lang = '' end return {wikiname, domain, lang} end -- Splits wiki, domain and language from a standard entry -- example: es.community, fandom function Report._splitWikiFromPartial(wiki) local res, _, lang, wikiname = string.find(wiki, '([^%.]-)%.*([^%.]-)$') if not res then lang = '' wikiname = wiki end if lang ~= '' and not wikialang[lang] then -- deal with situations like naruto.answers.wikia.com if lang ~= 'wiki' then wikiname = lang .. '.' .. wikiname end lang = '' end return {wikiname, lang} end -- Returns a wiki URL based on domain and language function Report._getWikiURL(wiki, domain, lang) if domain == 'fandom' then if lang == '' then return 'https://' .. wiki .. '.fandom.com' else return 'https://' .. wiki .. '.fandom.com/' .. lang end elseif domain == 'org' then if lang == '' then return 'https://' .. wiki .. '.wikia.org' else return 'https://' .. wiki .. '.wikia.org/' .. lang end else if lang == '' then if string.find(wiki, '%.') then return 'http://' .. wiki .. '.wikia.com' end return 'https://' .. wiki .. '.wikia.com' else return 'http://' .. lang .. '.' .. wiki .. '.wikia.com' end end end -- Domain is one of [wikia, fandom, org] function Report._getWikiComponents(wiki, domain) local lang wiki = wiki or 'WIKI' -- es.community.wikia.com or community.fandom.com/es if string.match(wiki, 'wikia%.com') or string.match(wiki, 'fandom%.com') or string.match(wiki, 'wikia%.org') then if domain then wiki, _, lang = unpack(Report._splitWikiFromURL(wiki)) else wiki, domain, lang = unpack(Report._splitWikiFromURL(wiki)) end -- es.community elseif domain then if not domain == 'wikia' and not domain == 'fandom' and not domain == 'org' then domain = DEFAULT_DOMAIN end wiki, lang = unpack(Report._splitWikiFromPartial(wiki)) -- deal with situations like naruto.answers.wikia.com local res, _, originalwiki = string.find(wiki, '%.([^%.]-)$') if domain ~= 'wikia' and res then wiki = originalwiki end else wiki, lang = unpack(Report._splitWikiFromPartial(wiki)) domain = DEFAULT_DOMAIN end -- Force CC to be wikia.com if wiki == 'community' or wiki == 'c' then domain = 'wikia' end local wikiurl = Report._getWikiURL(wiki, domain, lang) local partial = wiki if lang ~= '' then partial = lang .. '.' .. wiki end return {wikiurl, partial, wiki, domain, lang} end -- creates the general format of the report -- reportType: string of the type of user (Spammer, Vandal, Profile) function Report._createReport(args, reportType) local ret = {} -- check total users local num_args = 0 for key, user in ipairs(args) do       num_args = num_args + 1 end local reason = trim_reason(args[2] or '') local crosswiki = args.crosswiki or '' local socks = args.socks or '' local reporter = args[num_args - 1] or '' local time = args[num_args] or '' local wikiurl, partial = unpack(Report._getWikiComponents(args[1], args.domain)) -- start report creation ret[#ret + 1] = ' \n' ret[#ret + 1] = '*' .. i18n["wiki"] .. ': '   ret[#ret + 1] = ' ' .. wikiurl .. ' '   ret[#ret + 1] = ' ' ret[#ret + 1] = '(admins)' ret[#ret + 1] = ' \n' if crosswiki == "yes" then ret[#ret + 1] = "*''" .. i18n["cwmsg"] .. "''\n" end ret[#ret + 1] = '*' .. i18n["reason"] .. ': '   ret[#ret + 1] = reason ..'\n' ret[#ret + 1] = '*' .. i18n["sig"] .. ': '   ret[#ret + 1] = '-- ' .. reporter .. ' ' ret[#ret + 1] = '(' .. i18n["talk"] .. ') ' ret[#ret + 1] = time .. '\n' ret[#ret + 1] = ' ' return table.concat(ret) end function Report._filterproblem(args) local ret = {} local page = trim_user(args[2] or "") local blockId = trim_id(args[3] or "") local reason = args[4] or "" local reporter = args[5] or "" local time = args[6] or "" local wikiurl, partial = unpack(Report._getWikiComponents(args[1], args.domain)) ret[#ret + 1] = '*' .. i18n["wiki"] .. ': '   ret[#ret + 1] = ' ' .. wikiurl ret[#ret + 1] = ' \n' ret[#ret + 1] = '*' .. i18n["page"] .. ': '   ret[#ret + 1] = ' ' .. wikiurl .. '/wiki/' .. page ret[#ret + 1] = ' \n' ret[#ret + 1] = '*' ret[#ret + 1] = i18n["blockid"] ret[#ret + 1] = ': ' .. wikiurl .. '/wiki/Special:BlockList/#' ret[#ret + 1] = blockId ret[#ret + 1] = ' \n' ret[#ret + 1] = '*' .. i18n["reason"] .. ': '   ret[#ret + 1] = reason ..'\n' ret[#ret + 1] = '*' .. i18n["sig"] .. ': '   ret[#ret + 1] = '-- ' .. reporter .. ' ' ret[#ret + 1] = '(' .. i18n["talk"] .. ') ' ret[#ret + 1] = time .. '\n' return table.concat(ret) end function Report._badwiki(args) local reason = args[2] or 'spam' local wikiurl, partial = unpack(Report._getWikiComponents(args[1], args[3])) local ret = mw.html.create('span'):attr('class', 'plainlinks') :attr('data-wiki', args[1]) :tag('span'):attr('class', 'closeme') :wikitext('.. partial .. '/close close me ') :done :wikitext('[' .. wikiurl .. ' ' .. partial .. ' Wiki] ') :tag('code') :wikitext('reason: ') :tag('span'):attr('class', 'QuickReason') :wikitext(reason) :done :done :done return tostring(ret) end

function Report.filter_problem(frame) init_lang(frame) local args = getArgs(frame, {removeBlanks = false}) return Report._filterproblem(args) end return Report --