Module:Unsigned
Appearance
![]() | This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This module depends on the following other modules: |
This module implements {{unsigned}}. It has a few functions:
main
called by {{unsigned}}; not intended for broader usegetTimestamp
find a timestamp from a string. If only a date is found, it returns the date. If only a time is found, it returns the empty string. If a time and a date are both found, it appends(UTC)
.getUsername
gets the username from a string containing a timestamp. It currently assumes that everything besides a timestamp is part of the username.
local p = {}
local function trim(s)
return s:gsub("^%s+", ""):gsub("%s+$", ""):gsub("\226\128\142", "")
end
function p.getTimestamp(s)
--gets the timestamp in the input
--if nothing is found, returns the empty string
--we search for time and date seperately to allow for a time-less addition of date
local currentTestString
--this flag tells us to return an error if we only have a time (no date)
--match() on a nil is a bad thing, so avoid that
local sOrBlank = s or ''
currentTestString = mw.ustring.match( sOrBlank, '%d%d? %u%l+ %d%d%d%d', 0 ) or ''
if currentTestString ~= '' then
-- we have a date, so process and return accordingly
local theTime = mw.ustring.match( sOrBlank, '%d%d:%d%d,', 0 ) or ''
if theTime ~= '' then
return theTime .. ' ' .. currentTestString .. ' (UTC)'
else
return currentTestString
end
else
return ''
end
end
function p.getUsername(s)
--gets the username in the input
--------WARNING--------
--this method assumes that *everything* besides the timestamp is, in fact, part of the username
--it does no further username validation
--if you try putting random garbage in, you **will** get garbage out
--------YOU HAVE BEEN WARNED--------
local toReturn = s or ''
--remove the date
toReturn = mw.ustring.gsub(toReturn, '%d%d? %u%l+ %d%d%d%d', '', 1) or ''
--remove the time
toReturn = mw.ustring.gsub(toReturn, '%d%d:%d%d,?', '', 1) or ''
--remove (UTC)
toReturn = mw.ustring.gsub(toReturn, '%(UTC%)', '', 1) or ''
--concat the empty string to ensure we only return the string and not the number of matches
return trim(toReturn) .. ''
end
local function makeUnsigned(args)
local isIP
local username
local timestamp
local toReturn
if args[2] then
-- we have multiple parameters
-- so we can be less janky
timestamp = p.getTimestamp(args[2])
if timestamp ~= '' then
username = trim(args[1] or '')
else
username = trim(args[2] or '')
timestamp = args[1]
end
else
-- be very janky; this has a high probability of GIGO-ing
-- due to the way getUsername is implemented
username = p.getUsername(args[1])
timestamp = p.getTimestamp(args[1])
end
-- error if we cannot find a username
if username == '' then
return '<em class="error">Unable to detect username</em>'
end
-- check if we have an IP address or not
isIp = require('Module:IPAddress')._isIp(username)
if isIp then
return mw.getCurrentFrame():expandTemplate{ title = 'unsigned/unregistered', args = { username , timestamp } }
else
return mw.getCurrentFrame():expandTemplate{ title = 'unsigned/registered', args = { username , timestamp } }
end
end
function p.main(frame)
local args
if type(frame.args) == 'table' then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
args = require('Module:Arguments').getArgs(frame)
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
end
return makeUnsigned(args)
end
return p