Module:LTEvent

--[[ LUA script to get Limited Time Event information

getLTE: get Limited Time Event based on input parameters Parameters: 1 = short name : Event / IP short name for multiple set to "MULTIyyyy" where yyyy (optional) is the year will list all events for type for year in order specified by sequence no in data 2 = type      : event type N = normal limited time event (default) T = Tower Challenge 3 = output    : output type N = Full Event Name (default) S = Short Name Only E = Event Name without year D = Event Name with start date R = Only Event start and end date C = Collection Name (=S if no Collection Name) A = Alternate Text (parameter 4) T = Text only Event Name without year P = Event Name with Event Period (start-end dates) 4 = alt text  : alternate text

Unknown Event is returned if Event is not in data.

getNavi: get Previous and Next event from current Event Page Parameter: none

getLastLTE: get Last X Events (formatted for main page) Parameter: 1 = Count  : return Last Count Events (default 5) --]]

local p = {}

local lteData = mw.loadData( 'Module:LTEvent/data' ) local date = require('Dev:Date') local util = require("Module:Utility")

Local Functions -- Select argument table. Prefers frame args over Parent args local function getArgs(frame) local tArgs

if frame == mw.getCurrentFrame then fParent = frame:getParent tArgs = fParent.args

if (fParent.args[1]) then tArgs = fParent.args else tArgs = frame.args end else tArgs = frame end return tArgs end

-- Date Functions local function strDate(nYear, nMonDay, days, cardinal, whenTo) if type(nYear) ~= "number" or nYear == 0 or type(nMonDay) ~= "number" or nMonDay == 0 then return "Unknown Date" end

local theDate = date(nYear,                        math.floor(nMonDay/100),                        math.fmod(nMonDay, 100)) local nDays = tonumber(days) or 0

local day = "" local retText = {}

if whenTo then if theDate < date then table.insert(retText, "started on ") else table.insert(retText, "will start on ") end end if nDays > 0 then local start = theDate:copy theDate:adddays(nDays)

table.insert(retText, util.ordinal(start:getday, cardinal))

if whenTo or start:getmonth ~= theDate:getmonth then table.insert(retText, start:fmt(" %B")) end

if whenTo or (not noYear and start:getyear ~= theDate:getyear) then table.insert(retText, start:fmt(" %Y")) end

if whenTo then if theDate < date then table.insert(retText, " and ended on ") else table.insert(retText, " and will end on ") end else table.insert(retText, " - ") end end

table.insert(retText, util.ordinal(theDate:getday, cardinal))

table.insert(retText, theDate:fmt(" %B"))

if not noYear then table.insert(retText, theDate:fmt(" %Y")) end

if whenTo and nDays > 0 then table.insert(retText, ", lasting ") table.insert(retText, tostring(nDays)) if nDays > 1 then table.insert(retText, " days") else table.insert(retText, " day") end end return table.concat(retText) end

local function singleEvent(sName, eType, outType, altText) local eData = {0, "Unknown", "", "", "Unknown", 0}

if eType == "N" then if lteData["N"] and lteData["N"][sName] then eData = lteData["N"][sName] elseif lteData["C"] and lteData["C"][sName] then eType = "C" eData = lteData["C"][sName] end else if lteData[eType] and lteData[eType][sName] then eData = lteData[eType][sName] end end

local tRetText = {}

if outType == "R" then table.insert(tRetText, strDate(eData[3], eData[4], eData[6])) elseif outType == "U" then table.insert(tRetText, "'''") table.insert(tRetText, eData[2]) table.insert(tRetText, " Event") table.insert(tRetText, "''' is the ") table.insert(tRetText, util.wordinal(eData[1])) table.insert(tRetText, " major event of Disney Magic Kingdoms") if eData[7] then table.insert(tRetText, ", and the ") table.insert(tRetText, util.wordinal(eData[7])) if eType == "T" then table.insert(tRetText, " Tower Challenge") elseif eType == "C" then table.insert(tRetText, " Cascading Critters") end table.insert(tRetText, " event") end table.insert(tRetText, ". It ") table.insert(tRetText, strDate(eData[3], eData[4], eData[6], nil, true)) table.insert(tRetText, ".") else tRetText = {"", "", eData[2], "", " Event", "", "", "", "", "",					"", "", "", "", "",					"",					}

if outType ~= "T" then tRetText[1] = ""			tRetText[6]  = " "			tRetText[7]  = tostring(eData[3])			tRetText[14] = "" if outType ~= "N" then tRetText[8] = "|" end end

if eType == "T" then tRetText[2] = "The Tower Challenge ("			tRetText[4]  = ")" end

if outType == "S" then tRetText[9] = eData[2] elseif outType == "D" then if altText ~= "" then tRetText[9] = altText else tRetText[9] = eData[2] tRetText[13] = " Event" if eType == "T" then tRetText[10] = "'" if not eData[2]:match("s$") then tRetText[11] = "s" end tRetText[12] = " Tower Challenge" end end tRetText[15] = " on " tRetText[16] = strDate(eData[3], eData[4], 0) elseif outType == "A" then tRetText[9] = (altText ~= "") and altText or eData[2] elseif outType == "E" then tRetText[9] = (eType == "T") and "The Tower Challenge" or eData[2] tRetText[10] = " Event" elseif outType == "C" then tRetText[9] = eData[5] or eData[2] elseif outType == "P" then tRetText[9] = eData[2] if eType == "T" then tRetText[10] = "'" if not eData[2]:match("s$") then tRetText[11] = "s" end tRetText[12] = " Tower Challenge" end tRetText[15] = " " tRetText[16] = strDate(eData[3], eData[4], eData[6]) end end

return table.concat(tRetText) end

local function multiEvent(eType, outType, year) local tIndex = {} local nYear = tonumber(year) or 0

if lteData[eType] then for _, v in pairs(lteData[eType]) do	       if nYear == 0 or nYear == v[3] then table.insert(tIndex,v) end end end

table.sort(tIndex, function(a,b) return a[1] < b[1] end)

local outText = {} local sDot   = ""

for _, tData in ipairs(tIndex) do		local tItem = {sDot, "", "", tData[2], "",						" Event ", tData[3], "", "", "" }       if eType == "T" then tItem[3] = "The Tower Challenge ("       	tItem[5] = ")" end

if outType == "S" then tItem[8] = "|" tItem[9] = tData[2] elseif outType == "C" then tItem[8] = "|" tItem[9] = tData[5] or tData[2] end

table.insert(outText, table.concat(tItem))

sDot = " · " end return table.concat(outText) end

-- function get Limited Time Event function p.getLTE(frame)

local tArgs = getArgs(frame)

local sName   = tArgs[1] or "" local eType   = tArgs[2] or "" local outType = tArgs[3] or "" local altText = tArgs[4] or ""

sName = sName:lower:gsub("^%s*(.-)%s*$", "%1") or '' local tempName, tempType = sName:match("^(.+)%%([nNtTcC])$")

if tempName then sName = tempName eType = tempType end if eType == "" then eType = "N" end if outType == "" then outType = "N" end

eType = eType:upper outType = outType:upper

local multi, year = sName:match("^(multi)(%d*)$")

if multi then return multiEvent(eType, outType, tonumber(year)) else return singleEvent(sName, eType, outType, altText) end end

-- function get previous, next navigation links function p.getNavi(frame) local tArgs = getArgs(frame)

--local curName = tArgs[1] or mw.title.getCurrentTitle.text local curName = mw.title.getCurrentTitle.text

local eType = "N" local eName = "" local eYear = ""

if curName:match("^The Tower Challenge %(.+%) Event %d%d%d%d$") then eName, eYear = curName:match("^The Tower Challenge %((.+)%) Event (%d+)$") eType = "T" elseif curName:match("^.+ Event %d%d%d%d$") then eName, eYear = curName:match("^(.+) Event (%d+)$") eType = "N" end

eYear = tonumber(eYear)

local curDate = 0

if eType == "N" then if lteData["N"] then for k, v in pairs(lteData["N"]) do	           if eYear == v[3] and eName == v[2] then curDate = (v[3] * 10000) + v[4] break end end end if curDate == 0 then if lteData["C"] then for k, v in pairs(lteData["C"]) do		           if eYear == v[3] and eName == v[2] then curDate = (v[3] * 10000) + v[4] eType = "C" break end end end end else if lteData[eType] then for k, v in pairs(lteData[eType]) do	           if eYear == v[3] and eName == v[2] then curDate = (v[3] * 10000) + v[4] break end end end end

local prevDate = 0 local prevEvent = "" local prevType = "" local nextDate = 99999999 local nextEvent = "" local nextType = ""

if curDate ~= 0 then for k, v in pairs(lteData["N"]) do           local xDate = (v[3] * 10000) + v[4] if xDate < curDate and xDate > prevDate then prevDate = xDate prevEvent = v               prevType = "N" end if xDate > curDate and xDate < nextDate then nextDate = xDate nextEvent = v               nextType = "N" end end for k, v in pairs(lteData["C"]) do           local xDate = (v[3] * 10000) + v[4] if xDate < curDate and xDate > prevDate then prevDate = xDate prevEvent = v               prevType = "C" end if xDate > curDate and xDate < nextDate then nextDate = xDate nextEvent = v               nextType = "C" end end for k, v in pairs(lteData["T"]) do           local xDate = (v[3] * 10000) + v[4] if xDate < curDate and xDate > prevDate then prevDate = xDate prevEvent = v               prevType = "T" end if xDate > curDate and xDate < nextDate then nextDate = xDate nextEvent = v               nextType = "T" end end end

local prevName = "Main Storyline Walkthrough" local nextName = ""

if prevDate ~= 0 then if prevType == "T" then prevName = "The Tower Challenge ("                       .. prevEvent[2]                        .. ") Event " .. prevEvent[3] .. "|Tower Challenge ("                       .. prevEvent[2]                        .. ")" else prevName = prevEvent[2] .. " Event " .. prevEvent[3] end end if nextDate ~= 99999999 then if nextType == "T" then nextName = "The Tower Challenge ("                       .. nextEvent[2]                        .. ") Event " .. nextEvent[3] .. "|Tower Challenge ("                       .. nextEvent[2]                        .. ")" else nextName = nextEvent[2] .. " Event " .. nextEvent[3] end nextName = "" .. nextName .. " »" end return "{| class=\"article-table\" style=\"width: 100%;\"" .. "\n| nowrap width=\"50%\"|« "           .. prevName            .. "\n| nowrap align=\"right\"|" .. nextName .. "\n|}" end

-- function get Last X events function p.getLastLTE(frame) local tArgs = getArgs(frame)

if frame == mw.getCurrentFrame then fParent = frame:getParent tArgs = fParent.args

if (fParent.args[1]) then tArgs = fParent.args else tArgs = frame.args end else tArgs = frame end

local count = tArgs[1] count = tonumber(count) or 5 local allEvents = {} local today = os.time

for k, t in pairs(lteData) do       for _, v in pairs(t) do        	-- The Events start at UTC 16:00:00 local startTime = os.time({year = v[3],                       month= math.floor(v[4]/100),                        day= math.fmod(v[4], 100),            			hour= 16})

if (startTime < today) then table.insert(allEvents, {startTime, k, v[2], v[3]}) end end end

table.sort(allEvents, function(a,b) return a[1] > b[1] end)

local outText = ""

for i, v in ipairs(allEvents) do       local linkText  = "" local dateText = os.date("%e %B %Y", v[1]) dateText = dateText:gsub("^%s*(.-)%s*$", "%1") or ''

if v[2] == "T" then linkText = "* "                       .. mw.text.truncate(v[3] .. "'s Tower Challenge", 43 - mw.ustring.len(dateText), nil, true)                        .. " " .. dateText .. " \n" else linkText = "* "                       .. mw.text.truncate(v[3], 43 - mw.ustring.len(dateText), nil, true)                        .. " " .. dateText .. " \n" end

outText = outText .. linkText if i >= count then break end end return outText end

return p

-- --