Module:Mass notification

From Minecraft Discontinued Features Wiki
Jump to navigation Jump to search

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

-- This module sends out notifications to multiple users.

local MAX_USERS = 50 -- The Echo user limit.
local GROUP_PAGE_PATH = 'Module:Mass notification/groups/'
local NO_NAME_ERROR = 'no group name was specified'
local LOAD_ERROR = 'the group "[[$1|$2]]" was not found'
local MAX_USER_ERROR = 'attempted to send notifications to more than $1 users'
local NO_USER_ERROR = 'could not find any usernames in $1'
local INTRO_BLURB = 'Notifying all members of $1'
	.. ' <small>([[Template:Mass notification|more info]]'
	.. " '''·''' "
	.. '<span class="plainlinks">[$2 opt out]</span>)</small>: '
	
local p = {}

local function makeWikitextError(msg)
	return string.format(
		'<strong class="error">Error: %s.</strong>',
		msg
	)
end

local function message(msg, ...)
	return mw.message.newRawMessage(msg):params{...}:plain()
end

function p.main(frame)
	local args = frame:getParent().args;
	local groupName = args[1];
	-- Validate input.
	if type(groupName) ~= 'string' then
		return makeWikitextError(NO_NAME_ERROR)
	end
	
	local groupSubmodule = GROUP_PAGE_PATH .. groupName
	local data
	do
		local success
		success, data = pcall(mw.loadData, groupSubmodule)
		if not success then
			return makeWikitextError(message(LOAD_ERROR, groupSubmodule, groupName))
		elseif type(data) ~= 'table' or not data[1] then -- # doesn't work with mw.loadData
			return makeWikitextError(message(NO_USER_ERROR, groupName))
		elseif data[MAX_USERS + 1] then -- # doesn't work with mw.loadData
			return makeWikitextError(message(MAX_USER_ERROR, tostring(MAX_USERS)))
		end
	end
	
	local optOutUrl = tostring(mw.uri.fullUrl(
		groupSubmodule,
		{action = 'edit'}
	))
	local groupLink
	if data.group_page then
		groupLink = string.format('[[%s|%s]]', data.group_page, groupName)
	else
		groupLink = groupName
	end
	introBlurb = message(INTRO_BLURB, groupLink, optOutUrl)
	
	local userLinks
	local userNamespace = mw.site.namespaces[2].name
	local links = {}
	for i, username in ipairs(data) do
		username = tostring(username)
		links[i] = string.format(
			'[[%s:%s]]',
			userNamespace,
			username
		)
	end
	userLinks = string.format(
		'<span style="display: none;">(%s)</span>',
		table.concat(links, ', ')
	)
	return introBlurb .. userLinks
end

return p