Module:Functions: Difference between revisions

From TwogPedia
mNo edit summary
mNo edit summary
 
(9 intermediate revisions by the same user not shown)
Line 13: Line 13:
local results = cargo.query(tables, fields, cargoArgs)
local results = cargo.query(tables, fields, cargoArgs)
if #results > 0 then return results[1]._pageName else return gameCategory .. '/' .. team end
if #results > 0 then return results[1]._pageName else return gameCategory .. '/' .. team end
end
function removeLastPart(inputString)
local separator = '/'
    -- Find the position of the last occurrence of the separator
    local lastSeparatorIndex = inputString:match(".*" .. separator .. "([^" .. separator .. "]*)$")
    if lastSeparatorIndex then
        -- Extract the substring before the last separator
        return inputString:sub(1, #inputString - #lastSeparatorIndex - 1)
    else
        -- If separator is not found, return the input string as is
        return inputString
    end
end
function p.getTournamentEndDate(page)
local tables = 'Tournaments'
local fields = 'end'
local cargoArgs = {
where = '_pageName = "' .. page .. '" OR _pageName= "' .. removeLastPart(page) .. '"'
}
local results = cargo.query(tables, fields, cargoArgs)
if #results > 0 then return results[1]['end'] else return nil end
end
function p.getTeamDisplaytitle(name, date)
    local title = mw.title.new(name)
if not date then return (title and title.exists) and mw.ext.displaytitle.get(name) or mw.text.split(name, '/')[2] end
local tables = 'DisplayTitles'
local fields = 'title'
local cargoArgs = {
where = '_pageName = "' .. name .. '" AND  (start is NULL OR start < "' .. date .. '") AND (end is NULL OR end > "' .. date .. '")'
}
local results = cargo.query(tables, fields, cargoArgs)
if #results > 0 then return results[1].title else return (title and title.exists) and mw.ext.displaytitle.get(name) or mw.text.split(name, '/')[2] end
end
end


Line 28: Line 65:


function p.getTeamLogo(team, game, size)
function p.getTeamLogo(team, game, size)
    if not team then return mw.html.create('div'):node(mw.html.create('div'):addClass('light'):wikitext('[[File:Team_placeholder_light.png|' .. (size or '20x20px') .. ']]') ):node(mw.html.create('div'):addClass('dark'):wikitext('[[File:Team_placeholder_dark.png|' .. (size or '20x20px') .. ']]') ) end
     -- Check if team has org incase the logo is saved under org
     -- Check if team has org incase the logo is saved under org
     local org = ''
     local org = ''
Line 33: Line 71:
fields = 'org'
fields = 'org'
cargoArgs = {
cargoArgs = {
where = '_pageName = "' .. team .. '"'
where = '_pageName = "' .. team .. '" AND org IS NOT NULL'
}
}
results = cargo.query(tables, fields, cargoArgs)
results = cargo.query(tables, fields, cargoArgs)
     if #results > 0 then company = results[1].org end
 
     if #results > 0 then org = results[1].org end


local tables = 'Logos'
local tables = 'Logos'
Line 42: Line 81:
local currentDate = os.date('%Y-%m-%d')
local currentDate = os.date('%Y-%m-%d')
local cargoArgs = {
local cargoArgs = {
where = '(_pageName = "' .. team .. '" OR _pageName="' .. company .. '") AND  (start is NULL OR start < "' .. currentDate .. '") AND (end is NULL OR end > "' .. currentDate .. '")'
where = '(_pageName = "' .. team .. '" OR _pageName="' .. org .. '") AND  (start is NULL OR start < "' .. currentDate .. '") AND (end is NULL OR end > "' .. currentDate .. '")'
}
}
local results = cargo.query(tables, fields, cargoArgs)
local results = cargo.query(tables, fields, cargoArgs)
Line 80: Line 119:
     local dateTimeSplit = mw.text.split(inputDate, ' ')
     local dateTimeSplit = mw.text.split(inputDate, ' ')
     local date = dateTimeSplit[1]
     local date = dateTimeSplit[1]
     local time = dateTimeSplit[2] and ' ' .. dateTimeSplit[2] or ''
     local time = dateTimeSplit[2] and ' ' .. timeAbbr(dateTimeSplit[2]) or ''
      
      
local monthNames = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
local monthNames = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
Line 89: Line 128:


return month .. day .. year .. time  
return month .. day .. year .. time  
end
function timeAbbr(time)
local split = mw.text.split(time, ':')
local hours = split[1]
local minutes = split[2]
return hours .. ':' .. minutes
end
function p.timeUntil(inputDate)
local currentDate = os.time() -- Get the current Unix timestamp
-- Parse the date string into a table
local year, month, day, hour, minute, second = inputDate:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
-- Create a table with the parsed date and time
local targetDate = {
    year = tonumber(year),
    month = tonumber(month),
    day = tonumber(day),
    hour = tonumber(hour),
    min = tonumber(minute),
    sec = tonumber(second)
}
-- Convert the target date and time to a Unix timestamp
local targetTimestamp = os.time(targetDate)
-- Calculate the time difference in seconds
local timeDifference = targetTimestamp - currentDate
if timeDifference <= 0 then
return 'LIVE'
else
-- Calculate days, hours, and minutes
local days = math.floor(timeDifference / (24 * 3600))
local hours = math.floor((timeDifference % (24 * 3600)) / 3600)
local minutes = math.floor((timeDifference % 3600) / 60)
local timeUntil = ""
    if days > 0 then
        timeUntil = timeUntil .. days .. "d "
    end
    if hours > 0 then
        timeUntil = timeUntil .. hours .. "h "
    end
    if minutes > 0 or (days == 0 and hours == 0) then
        timeUntil = timeUntil .. minutes .. "m"
    end
return timeUntil
end
end
function p.colorModeDiv(light, dark)
local light = mw.html.create('div'):addClass('light'):node(light)
local dark = mw.html.create('div'):addClass('dark'):node(dark)
return mw.html.create('div'):node(light):node(dark)
end
end


return p
return p

Latest revision as of 07:30, 21 November 2023

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

local cargo = mw.ext.cargo
local p = {}

function p.getTeamPage(team, game)
	local currentTitle = mw.title.getCurrentTitle().text
	local gameCategory = game or mw.text.split(currentTitle, '/')[1]
	-- Check if shorthand of a team was used
	local tables = 'Teams'
	local fields = '_pageName, shorthand'
	local cargoArgs = {
		where = '_pageName LIKE "' .. gameCategory .. '/%" AND shorthand = "' .. team .. '"'
	}
	local results = cargo.query(tables, fields, cargoArgs)
	if #results > 0 then return results[1]._pageName else return gameCategory .. '/' .. team end	
end

function removeLastPart(inputString)
	local separator = '/'
    -- Find the position of the last occurrence of the separator
    local lastSeparatorIndex = inputString:match(".*" .. separator .. "([^" .. separator .. "]*)$")

    if lastSeparatorIndex then
        -- Extract the substring before the last separator
        return inputString:sub(1, #inputString - #lastSeparatorIndex - 1)
    else
        -- If separator is not found, return the input string as is
        return inputString
    end
end

function p.getTournamentEndDate(page)
	local tables = 'Tournaments'
	local fields = 'end'
	local cargoArgs = {
		where = '_pageName = "' .. page .. '" OR _pageName= "' .. removeLastPart(page) .. '"'
	}
	local results = cargo.query(tables, fields, cargoArgs)
	if #results > 0 then return results[1]['end'] else return nil end
end

function p.getTeamDisplaytitle(name, date)
    local title = mw.title.new(name)
	if not date then return (title and title.exists) and mw.ext.displaytitle.get(name) or mw.text.split(name, '/')[2] end
	local tables = 'DisplayTitles'
	local fields = 'title'
	local cargoArgs = {
		where = '_pageName = "' .. name .. '" AND  (start is NULL OR start < "' .. date .. '") AND (end is NULL OR end > "' .. date .. '")'
	}
	local results = cargo.query(tables, fields, cargoArgs)

	if #results > 0 then return results[1].title else return (title and title.exists) and mw.ext.displaytitle.get(name) or mw.text.split(name, '/')[2] end
end

function p.prizeToString(nr)
	if nr == nil then return 'TBD' end
	local prize = ''
    local reversed = string.reverse(tostring(nr))
    for k = 1, #reversed do
    	prize = reversed:sub(k, k) .. prize
    	if k % 3 == 0 and k < #reversed then prize =  ',' .. prize end
    	k = k + 1
    end
    return prize
end

function p.getTeamLogo(team, game, size)
    if not team then return mw.html.create('div'):node(mw.html.create('div'):addClass('light'):wikitext('[[File:Team_placeholder_light.png|' .. (size or '20x20px') .. ']]') ):node(mw.html.create('div'):addClass('dark'):wikitext('[[File:Team_placeholder_dark.png|' .. (size or '20x20px') .. ']]') ) end
    -- Check if team has org incase the logo is saved under org
    local org = ''
    tables = 'Teams'
	fields = 'org'
	cargoArgs = {
		where = '_pageName = "' .. team .. '" AND org IS NOT NULL'
	}
	results = cargo.query(tables, fields, cargoArgs)

    if #results > 0 then org = results[1].org end

	local tables = 'Logos'
	local fields = '_pageName, logoLight, logoDark, logoAll, iconAll, iconLight, iconDark, start, end'
	local currentDate = os.date('%Y-%m-%d')
	local cargoArgs = {
		where = '(_pageName = "' .. team .. '" OR _pageName="' .. org .. '") AND  (start is NULL OR start < "' .. currentDate .. '") AND (end is NULL OR end > "' .. currentDate .. '")'
	}
	local results = cargo.query(tables, fields, cargoArgs)
	if #results > 0 then
		if results[1].iconAll then
			return p.createLogo(results[1].iconAll, team, nil, game, size)
		elseif results[1].iconLight and results[1].iconDark then
			return mw.html.create('div'):node(p.createLogo(results[1].iconLight, team, 'light', game, size)):node(p.createLogo(results[1].iconDark, team, 'dark', game, size))
		elseif results[1].logoAll then
			return p.createLogo(results[1].logoAll, team, nil, game, size)
		elseif results[1].logoLight and results[1].logoDark then
			return mw.html.create('div'):node(p.createLogo(results[1].logoLight, team, 'light', game, size)):node(p.createLogo(results[1].logoDark, team, 'dark', game, size))
		else 
			local logo = results[1].iconLight or results[1].iconDark or results[1].logoLight or results[1].logoDark
			return p.createLogo(logo, team, nil, game, size)
		end
	else 
		return mw.html.create('div'):node(p.createLogo(nil, team, 'light', game, size)):node(p.createLogo(nil, team, 'dark', game, size))
	end
end

function p.createLogo(url, teamPage, class, game, size)
	size = size or '20px'
	local className = class and class .. ' h-100' or 'h-100'
	local logoURL = url and url or 'Team_placeholder_' .. class .. '.png'
	local logoContainer = mw.html.create('div'):addClass(className)
	local logo = mw.html.create('div')
		:addClass('team-list-logo')
		:node('[[File:' .. logoURL .. '|' .. size .. '|link=' .. teamPage .. '|' .. string.gsub(teamPage, game .. '/', '') .. ']]')

	logoContainer:node(logo)
	return logoContainer
end

function p.stringifyDate(inputDate)
	if not inputDate then return nil end
    local dateTimeSplit = mw.text.split(inputDate, ' ')
    local date = dateTimeSplit[1]
    local time = dateTimeSplit[2] and ' ' .. timeAbbr(dateTimeSplit[2]) or ''
    
	local monthNames = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
    local dateSplit = mw.text.split(date, '-')
    local year = dateSplit[1] or ''
    local month = dateSplit[2] and monthNames[tonumber(dateSplit[2])] .. ' ' or ''
    local day = dateSplit[3] and dateSplit[3] .. ', ' or ''

	return month .. day .. year	.. time 
end

function timeAbbr(time)
	local split = mw.text.split(time, ':')
	local hours = split[1]
	local minutes = split[2]
	return hours .. ':' .. minutes
end

function p.timeUntil(inputDate)
	local currentDate = os.time() -- Get the current Unix timestamp
	-- Parse the date string into a table
	local year, month, day, hour, minute, second = inputDate:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
	-- Create a table with the parsed date and time
	local targetDate = {
	    year = tonumber(year),
	    month = tonumber(month),
	    day = tonumber(day),
	    hour = tonumber(hour),
	    min = tonumber(minute),
	    sec = tonumber(second)
	}
	-- Convert the target date and time to a Unix timestamp
	local targetTimestamp = os.time(targetDate)
	
	-- Calculate the time difference in seconds
	local timeDifference = targetTimestamp - currentDate
	
	if timeDifference <= 0 then
		return 'LIVE'
	else
		-- Calculate days, hours, and minutes
		local days = math.floor(timeDifference / (24 * 3600))
		local hours = math.floor((timeDifference % (24 * 3600)) / 3600)
		local minutes = math.floor((timeDifference % 3600) / 60)

		local timeUntil = ""

	    if days > 0 then
	        timeUntil = timeUntil .. days .. "d "
	    end
	
	    if hours > 0 then
	        timeUntil = timeUntil .. hours .. "h "
	    end
	
	    if minutes > 0 or (days == 0 and hours == 0) then
	        timeUntil = timeUntil .. minutes .. "m"
	    end
		
		return timeUntil
	end
end

function p.colorModeDiv(light, dark)
	local light = mw.html.create('div'):addClass('light'):node(light)
	local dark = mw.html.create('div'):addClass('dark'):node(dark)
	return mw.html.create('div'):node(light):node(dark)
end

return p