Jump to content

Module:Choice

From Wikipedia, the free encyclopedia
local p = {};
local cfg = {}

--------------------------------------------------------------------------------------
-- Configuration
--------------------------------------------------------------------------------------

-- Set this to true if your wiki has a traffic rate of less than one edit every two minutes or so.
-- This will prevent the same "random" number being generated many times in a row until a new edit is made
-- to the wiki. This setting is only relevant if the |same= parameter is set.
cfg.lowTraffic = false

-- If cfg.lowTraffic is set to true, and the |same= parameter is set, this value is used for the refresh rate of the random seed.
-- This is the number of seconds until the seed is changed. Getting this right is tricky. If you set it too high, the same number
-- will be returned many times in a row. If you set it too low, you may get different random numbers appearing on the same page,
-- particularly for pages that take many seconds to process.
cfg.seedRefreshRate = 60

local function deepargs(args)
	local nice_args_table = {}
	for k, v in pairs(args) do
		if v and v ~= '' then
			nice_args_table[k] = v
		end
	end
	return nice_args_table
end

p._choice = function( args )
    args = deepargs(args)
    local res = {};
    local n;
    local lim = tonumber(args[1])
    local separator = args[2]
    table.remove(args,1);
    table.remove(args,1);
    for i = 1,lim,1 do
        n = math.random( #args );
        table.insert(res,args[n]);
        table.remove(args,n);
    end
    return table.concat(res,separator);
end


p.choice = function( frame )     --Add a function to "p".
    if not cfg.lowTraffic then
		-- Make the seed as random as possible without using anything time-based. This means that the same random number
		-- will be generated for the same input from the same page - necessary behaviour for some wikicode templates that
		-- assume bad pseudo-random-number generation.
		local stats = mw.site.stats
		local views = stats.views or 0 -- This is not always available, so we need a backup.
		local seed = views + stats.pages + stats.articles + stats.files + stats.edits + stats.users + stats.activeUsers + stats.admins -- Make this as random as possible without using os.time() or os.clock()
		math.randomseed(seed)
	else
		-- Make the random seed change every n seconds, where n is set by cfg.seedRefreshRate.
		-- This is useful for low-traffic wikis where new edits may not happen very often.
		math.randomseed(math.floor(os.time() / cfg.seedRefreshRate))
    end
    local args = frame:getParent().args;
    return p._choice(args)
end
return p;