Documentation for this module may be created at Module:PrizePool/doc
local getArgs = require('Module:Arguments').getArgs
local PrizePool = {}
local funcs = require('Module:Functions')
local getTeamDisplaytitle = funcs.getTeamDisplaytitle
local VariablesLua = mw.ext.VariablesLua
local cargo = mw.ext.cargo
function PrizePool.main(frame)
local args = getArgs(frame)
local tableContainer = mw.html.create('table'):addClass('striped-table')
local titleRow = mw.html.create('tr')
titleRow:addClass('headerRow')
local placementCell = mw.html.create('th'):wikitext('Place')
titleRow:node(placementCell)
local currency = args.currency and string.upper(args.currency) or nil
if args.currency then titleRow:node(mw.html.create('th'):wikitext(currency)) end
local usdCell = mw.html.create('th'):wikitext('USD')
local participantCell = mw.html.create('th'):wikitext('Participant')
tableContainer:node(titleRow:node(usdCell))
-- If prize percentage
if args.percent then
titleRow:node(mw.html.create('th'):wikitext('Percent'))
end
titleRow:node(participantCell):node(joindateCell)
local columns = args.columns and mw.text.split(args.columns, ',') or nil
if columns then
for i = 1, #columns do
titleRow:node(mw.html.create('th'):wikitext(columns[i]))
i = i + 1
end
end
local i = 1
-- non-USD currency things
local conversionRate = args.rate or 1
local startDate = VariablesLua.varexists('startDate') and VariablesLua.var('startDate', nil) or nil
local endDate = VariablesLua.varexists('endDate') and VariablesLua.var('endDate', nil) or nil
local currentDate = os.date("%Y-%m-%d", os.time())
local date = os.date(endDate or startDate) > os.date(currentDate) and currentDate or (endDate or startDate)
-- if args.currency then
-- local tables = 'Conversion'
-- local fields = 'rate'
-- local cargoArgs = {
-- where = 'currency="' .. currency .. '" AND date="' .. date .. '"'
-- }
-- local results = cargo.query(tables, fields, cargoArgs)
-- if #results == 0 then
-- local conversion = mw.ext.externaldata.getWebData({
-- format = 'json',
-- url = "https://api.exchangerate.host/convert?from=" .. currency .. "&to=USD&date=" .. date
-- })
-- if conversion.success then
-- conversionRate = conversion.info
-- frame:callParserFunction{name = '#cargo_store:', args = {_table = 'Conversion', currency = currency, rate = conversion.info, date = date}}
-- end
-- else
-- conversionRate = results[1].rate
-- end
-- end
local placeOffset = 0
while (args[i] ~= nil) do
local row = mw.text.jsonDecode(args[i])
local prizeString = 'TBD'
local prizeInt
if args.prize and row.percent and not row.prize then
prizeString = args.prize:gsub(",", "")
prizeInt = math.floor(tonumber(prizeString) / 100 * tonumber(row.percent))
elseif row.prize then
prizeString = row.prize:gsub(",", "")
prizeInt = tonumber(prizeString)
end
local bgClass = row.bg or nil
if not bgClass and (i == 1 and not row.place) or (row.place and string.sub(row.place, 1, string.len('1-')) == '1-' ) then
bgClass = 'gold'
elseif not bgClass and (i == 2 and not row.place) or (row.place and string.sub(row.place, 1, string.len('2-')) == '2-' ) then
bgClass = 'silver'
elseif not bgClass and (i == 3 and not row.place) or (row.place and string.sub(row.place, 1, string.len('3-')) == '3-' ) then
bgClass = 'bronze'
end
local rowSpan = 1
if row.place then
local placeSplit = mw.text.split(row.place, '-')
if #placeSplit > 1 then
rowSpan = tonumber(placeSplit[2]) - tonumber(placeSplit[1]) + 1
end
placeOffset = placeOffset + rowSpan - 1
end
local tableRow = mw.html.create('tr'):addClass('bodyRow'):addClass(bgClass)
local placement = mw.html.create('td'):wikitext(row.place or i + placeOffset)
tableRow:node(placement)
local rowUSD = mw.html.create('td')
if args.currency then
local currencyCell = mw.html.create('td'):wikitext(prizeToString(prizeInt))
rowUSD:wikitext(conversionRate and prizeToString(math.floor(conversionRate * prizeInt)) or 'TBD')
if row.place then currencyCell:attr('rowspan', rowSpan) end
tableRow:node(currencyCell)
else
rowUSD:wikitext(prizeToString(prizeInt))
end
tableRow:node(rowUSD)
-- If table has percent and row has percent
if args.percent and row.percent then
tableRow:node(mw.html.create('td'):attr('rowspan', rowSpan):wikitext(row.percent .. '%'))
end
if row.place then
placement:attr('rowspan', rowSpan)
rowUSD:attr('rowspan', rowSpan)
end
tableContainer:node(tableRow)
if row.participants then
local participants = mw.text.split(row.participants, ',')
local currentTitle = mw.title.getCurrentTitle().text
local gameCategory = mw.text.split(currentTitle, '/')[1]
for j = 1, #participants do
-- Check if shorthand of a team was used
local tables = 'Teams'
local fields = '_pageName, shorthand'
local cargoArgs = {
where = '_pageName LIKE "' .. gameCategory .. '/%" AND shorthand = "' .. participants[j] .. '"'
}
local results = cargo.query(tables, fields, cargoArgs)
if #results > 0 then participants[j] = results[1]._pageName else participants[j] = gameCategory .. '/' .. mw.text.trim(participants[j]) end
j = j + 1
end
if #participants > 0 then
local players = nil
for j = 1, #participants do
-- If a team tournament, then go through teams to get lists of their players to enter into the prize table
if args.solo == nil then
local tables = 'Participants'
local fields = 'players'
local cargoArgs = {
where = '_pageName="' .. currentTitle .. '" AND team = "' .. participants[j] .. '"'
}
local results = cargo.query(tables, fields, cargoArgs)
if #results > 0 then players = results[1].players end
end
if j == 1 then
local participantCell = mw.html.create("td"):wikitext('[[' .. participants[1] .. '|' .. getTeamDisplaytitle(participants[1], VariablesLua.var('endDate')) .. ']]')
tableRow:node(participantCell)
else
local extraRow = mw.html.create('tr'):addClass('bodyRow'):addClass(bgClass)
extraRow:node(mw.html.create('td'):wikitext('[[' .. participants[j] .. '|' .. getTeamDisplaytitle(participants[j], VariablesLua.var('endDate')) .. ']]'))
tableContainer:node(extraRow)
end
end
-- Save prize to db
frame:callParserFunction{name = '#cargo_store:', args = {_table = 'Prizes', placement = row.place or i, prize = args.currency and conversionRate * prizeInt or prizeInt, localPrize = args.currency and prizeInt or nil, currency = currency, teams = not args.solo and table.concat(participants, ','), players = args.solo and table.concat(participants, ',') or players}}
end
else
for j = 1, rowSpan do
if j == 1 then
local participantCell = mw.html.create("td"):wikitext('TBD')
tableRow:node(participantCell)
else
local extraRow = mw.html.create('tr'):addClass('bodyRow')
extraRow:node(mw.html.create('td'):wikitext('TBD'))
tableContainer:node(extraRow)
end
j = j + 1
end
end
if columns then
local rowColumns = row.columns and mw.text.split(row.columns, ',') or nil
if rowColumns then
for j = 1, #rowColumns do
tableRow:node(mw.html.create('td'):attr('rowspan', rowSpan):wikitext(rowColumns[j]))
j = j + 1
end
else
for j = 1, #columns do
tableRow:node(mw.html.create('td'):attr('rowspan', rowSpan):wikitext('-'))
j = j + 1
end
end
end
i = i + 1
end
return tableContainer
end
function 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
return PrizePool