Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Documentation for this module may be created at Module:Checkuser/doc

local p = {}

local getArgs = function(fr)
	return require('Module:Arguments').getArgs(fr, {
		trim = true,
		removeBlanks = true
	})
end
local noping = function(name)
	return require('Module:No ping')._main({name})
end

local middot = '&nbsp;<b>&middot;</b>&#32;'
local spi = 'Wikipedia:Sockpuppet investigations'
local extlink = function(url, text)
	return '[' .. tostring(url) .. (text and ' ' .. text or '') .. ']'
end
local link = function(page, param, text)
	return extlink(mw.uri.fullUrl(page, param), text)
end

function p.user(frame)
	local args = getArgs(frame)
	return p._user(args['User'] or args[1], args['master name'], args['master'])
end

function p._user(sock, mastername, master)
	if not sock then
		return (
			'<strong class="error">No username provided.</strong>' ..
			'[[Category:Checkuser with no specified user]]'
		)
	end
	local span = mw.html.create('span'):attr('class', 'plainlinks cuEntry')
	local curtitle = mw.title.getCurrentTitle()
	local links = {
		'[[User talk:' .. sock .. '|talk]]' ..
			'<sup><span style="font-size: 120%;">' ..
				link('User talk:' .. sock, {
					action = 'edit',
					section = 'new'
				}, '<span style="color: grey;">+</span>') ..
			'</span></sup>',
		link('User:' .. sock, (function()
			local param = {
				action = 'edit',
				preload = 'Template:Checkuser/Preload' .. (master == 'yes' and ' master' or '')
			}
			if master ~= 'yes' then
				param['preloadparams[]'] = (
					mastername and
					mastername or
					'<!-- insert sock master here -->'
				)
			end
			return param
		end)(), 'tag'),
		'[[Special:Contributions/' .. sock .. '|contribs]]' ..
			'<span class="sysop-show">',
		'[[Special:DeletedContributions/' .. sock .. '|deleted contribs]]' ..
			'</span>',
		link('Special:Log', {
			user = sock
		}, 'logs'),
		link('Special:AbuseLog', {
			wpSearchUser = sock
		}, 'filter log') ..
			'<span class="sysop-show">',
		'[[Special:Block/' .. sock .. '|block user]]' ..
		(function()
			if curtitle:isSubpageOf(mw.title.new(spi)) then
				return (
					middot .. link('Special:Block', {
						wpBlockAddress = sock,
						wpExpiry = 'indefinite',
						wpReason = 'Abusing [[WP:Sock puppetry|multiple accounts]]',
						['wpReason-other'] = 'Please see: [[:w:en:' .. spi .. '/' ..
							mw.text.split(curtitle.text, '/')[2] ..
						']]'
					}, 'spi block')
				)
			else
				return ''
			end
		end)() ..
			'</span>',
		link('Special:Log/block', {
			page = 'User:' .. sock
		}, 'block log'),
		'[[:m:Special:CentralAuth/' .. sock .. '|CA]]' ..
			'<span class="cuLink checkuser-show">',
		link('Special:CheckUser', (function()
			local param = {
				user = sock
			}
			if mw.text.split(curtitle.prefixedText, '/')[1] == spi then
				param['reason'] = sock .. ' from [[' .. curtitle.prefixedText .. ']]'
			end
			return param
		end)(), 'CheckUser') ..
		'(' .. link('Special:CheckUserLog', {
			cuSearch = sock
		}, 'log') .. ')',
		link('Special:Investigate', (function()
			local param = {
				targets = sock
			}
			if curtitle.prefixedText == spi .. '/' .. table.concat({
				mw.text.split(curtitle.prefixedText, '/')[2],
				mw.text.split(curtitle.prefixedText, '/')[3]
			}, '/') then
				param['reason'] = sock .. ' from [[' .. curtitle.prefixedText .. ']]'
			end
			return param
		end)(), 'investigate'),
		extlink(
			tostring(mw.uri.new('https://checkuser.wikimedia.org/w/index.php'):extend({
				title = 'Special:Search',
				search = sock,
				ns0 = 1,
				ns2 = 1,
				ns14 = 1
			})),
			'cuwiki'
		) ..
			'</span>'
	}
	span = span:wikitext(table.concat({
		noping(sock),
		'(' .. table.concat(links, middot) .. ')'
	}, ' '))
	return tostring(span) .. '__NOINDEX__'
end

function p.ip(frame)
	local args = getArgs(frame)
	return p._ip(args['User'] or args[1], args['master name'])
end

function p._ip(ip, mastername)
	if not ip then
		return (
			'<strong class="error">No username provided.</strong>' ..
			'[[Category:Checkip with no specified IP]]'
		)
	end
	local span = mw.html.create('span'):attr('class', 'plainlinks neverexpand cuEntry')
	local curtitle = mw.title.getCurrentTitle()
	local links = {
		'[[User talk:' .. ip .. '|talk]]' ..
			'<sup><span style="font-size: 120%;">' ..
				link('User talk:' .. ip, {
					action = 'edit',
					section = 'new'
				}, '<span style="color: grey">+</span>') ..
			'</span></sup>',
		link('User:' .. ip, {
			action = 'edit',
			preload = 'Template:Checkip/Preload',
			['preloadparams[]'] = (
				mastername and
				mastername or
				'<!-- Insert sock master name here -->'
			)
		}, 'tag'),
		'[[Special:Contributions/' .. ip .. '|contribs]]',
		link('Special:AbuseLog', {
			wpSearchUser = ip
		}, 'filter log'),
		extlink(
			tostring(mw.uri.new('https://whois-referral.toolforge.org/gateway.py'):extend({
				lookup = 'true',
				ip = ip
			})),
			'WHOIS'
		),
		extlink(
			tostring(mw.uri.new('https://www.robtex.com/rbls/' .. ip .. '.html')),
			'RBLs'
		),
		extlink(
			tostring(mw.uri.new('https://ipcheck.toolforge.org/index.php'):extend({
				ip = ip
			})),
			'proxy check'
		) ..
			'<span class="sysop-show">',
		'[[Special:Block/' .. ip .. '|block user]]' .. (function()
			if curtitle:isSubpageOf(mw.title.new(spi)) then
				return (
					middot .. link('Special:Block', {
						wpTarget = ip,
						wpReason = 'Abusing [[WP:Sock puppetry|multiple accounts]]',
						['wpReason-other'] = 'Please see: [[:w:en:' .. spi .. '/' ..
							mw.text.split(curtitle.text, '/')[2] ..
						']]'
					}, 'spi block')
				)
			else
				return ''
			end
		end)() ..
			'</span>',
		link('Special:Log/block', {
			page = 'User:' .. ip
		}, 'block log'),
		extlink(
			tostring(mw.uri.new('https://guc.toolforge.org/'):extend({
				by = 'date',
				user = ip
			})),
			'cross-wiki contribs'
		) ..
			'<span class="cuLink checkuser-show">',
		link('Special:CheckUser', (function()
			local param = {
				ip = ip
			}
			if curtitle.prefixedText == spi .. '/' .. table.concat({
				mw.text.split(curtitle.prefixedText, '/')[2],
				mw.text.split(curtitle.prefixedText, '/')[3]
			}, '/') then
				param['reason'] = '[[' .. curtitle.prefixedText .. ']]'
			end
			return param
		end)(), 'CheckUser') .. ' ' ..
		'(' .. link('Special:CheckUserLog', {
			cuSearch = ip
		}, 'log') .. ')' ..
			'</span>'
	}
	span = span:wikitext(table.concat({
		noping(ip),
		'(' .. table.concat(links, middot) .. ')'
	}, ' '))
	return tostring(span)
end

return p