<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASensitive_IP_addresses%2Fblocktext</id>
	<title>Module:Sensitive IP addresses/blocktext - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASensitive_IP_addresses%2Fblocktext"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Sensitive_IP_addresses/blocktext&amp;action=history"/>
	<updated>2026-06-12T20:38:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Sensitive_IP_addresses/blocktext&amp;diff=479402&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Sensitive_IP_addresses/blocktext&amp;diff=479402&amp;oldid=prev"/>
		<updated>2021-07-16T05:55:54Z</updated>

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