Module:Sensitive IP addresses/blocktext
Documentation for this module may be created at Module:Sensitive IP addresses/blocktext/doc
-- This module creates a warning about sensitive IP addresses that is intended -- to be placed in [[Special:Block]] via the [[Mediawiki:Blockiptext]] message. local querySensitiveIPs = require('Module:Sensitive IP addresses').query local mIP = require('Module:IP') local IPAddress = mIP.IPAddress local Subnet = mIP.Subnet local function normalizeIPOrSubnet(ipOrSubnet) -- Normalize an IP address or subnet. -- If ipOrSubnet is not a valid IP address or subnet, returns nil. local ipSuccess, ipObj = pcall(IPAddress.new, ipOrSubnet) if ipSuccess and ipObj then return tostring(ipObj) end local subnetSuccess, subnetObj = pcall(Subnet.new, ipOrSubnet) if subnetSuccess and subnetObj then return tostring(subnetObj) end return nil end local function parseTitle(title) -- Parse a title. If the subpage(s) of the root page are a valid IP -- address or subnet, then return the normalized IP address or subnet. local ipOrSubnet = title.text:gsub('^.-/', '') return normalizeIPOrSubnet(ipOrSubnet) end local function fetchSensitivityData(ipOrSubnet) return querySensitiveIPs{test = {ipOrSubnet}} end local function parseSensitivityData(sensitivityData) -- Parse the data from the sensitive IP API call, and return a table with -- information about the first match that we can use as arguments to a -- template call. local function parse(sensitivityData) sensitivityData = sensitivityData.sensitiveips if #sensitivityData.matches == 0 then return nil end local ret = {} ret.type = sensitivityData.matches[1].type if ret.type == 'ip' then ret.ip = sensitivityData.matches[1].ip elseif ret.type == 'range' then ret.range = sensitivityData.matches[1].range else return nil end ret['entity-id'] = sensitivityData.matches[1]['entity-id'] ret['matches-range'] = sensitivityData.matches[1]['matches-range'] ret['entity-name'] = sensitivityData.entities[ret['entity-id']].name ret['entity-description'] = sensitivityData.entities[ret['entity-id']].description ret.reason = sensitivityData.entities[ret['entity-id']].reason return ret end local success, ret = pcall(parse, sensitivityData) if success and ret then return ret else return nil end end local function renderMessage(rawMessage, messageArgs) local message if rawMessage then message = mw.message.newRawMessage(rawMessage) else message = mw.message.new('sensitive-ip-block-text') end local wikitext = message:params( messageArgs.type, messageArgs.type == 'ip' and messageArgs.ip or messageArgs.range, messageArgs['matches-range'], messageArgs['entity-id'], messageArgs['entity-name'], messageArgs['entity-description'], messageArgs.reason ):plain() local frame = mw.getCurrentFrame() return frame:preprocess(wikitext) end local p = {} function p._main(args, title) args = args or {} title = title or mw.title.getCurrentTitle() local ipOrSubnet = parseTitle(title) if not ipOrSubnet then return nil end local sensitivityData = fetchSensitivityData(ipOrSubnet) if not sensitivityData then return nil end local messageArgs = parseSensitivityData(sensitivityData) return renderMessage(args.message, messageArgs) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame) return p._main(args) end function p._exportFunctions() return { parseTitle = parseTitle, fetchSensitivityData = fetchSensitivityData, parseSensitivityData = parseSensitivityData, renderMessage = renderMessage, } end return p