Module:Update

Iš MCSlime.LT.
Pereiti į navigaciją Jump to search
Module documentation
This documentation is transcluded from Module:Update/doc. [edit] [history] [purge]
Module:Update's function datedpl is invoked by Šablonas:Date page dpl.
Module:Update requires Module:Array.
Module:Update requires Module:Ordinal.
Module:Update requires Module:Paramtest.
Module:Update requires Module:Top icons.
Module:Update transcludes Template:Parentitle override using frame:preprocess().
Module:Update is invoked by Template:Update.

This template displays an notification stating the update pages copyrighted by MCSlime.LT.

Usage

This template can be used by entering the following onto a relevant update article.

{{Update|date=|<rev=>|category=|<link=>|<time=>}}

date

This required parameter accepts the date. It should not be linked and can be in any format accepted by #time.

category

This required parameter accepts the category of the update. This is generally at the top of the update article on the MCSlime website.

link

The template will attempt to automatically generate the link to the MCSlime news article. This optional parameter can be used to provide the link to article on the MCSlime.LT website in the case where the template cannot automatically generate it.

rev

This optional parameter accepts the revision date. MCSlime occasionally adds additional system updates and hot fixes to patch notes that have already been published. The date should not be linked and can be in any format accepted by #time.

time

This optional parameter is meant for maintenance categorization of historical pre-osrs updates. This should not be used for updates after 10 August 2007

article

Specify this parameter if the newspost title corresponds (almost) exactly with an article, and specify which article it should refer to. This will add a large notice at the top of the update page informing people that they are reading a transcript of the newspost.

Categories

  • Behind the Scenes: bts, behind the scenes
  • Community: comm, community
  • Developers' Blog: dev, blog, devblog, dev blog
  • Events: event, events
  • Your Feedback: yourfeedback
  • Future Update: future
  • Mobile: mobile
  • Game Updates: game
  • Patch Notes: patch, patch notes, patch note
  • Shop: shop
  • Support: support
  • Technical: tech, technical
  • Website: site, ws, website

--<nowiki>

-- IMPORTS
local pt = require('Module:Paramtest')
local hc = pt.has_content
local dt = pt.default_to
local top_icons -- [[Module:Top icons]]
local contains -- [[Module:Array]]
local ordinal -- [[Module:Ordinal]]

-- exposed table
local p = {}

--[=[
--  
-- HELPER TABLES AND FUNCTIONS
-- 
--]=]

-- replacement before calling encode
-- as lua patterns
local repl_before = {
	['%('] = '',
	['%)'] = '',
	['%!'] = '',
}

-- replacements after calling encode
-- as lua patterns
local repl_after = {
	['%+'] = '-',
	['%%2C'] = '',
	['%%2F'] = '',
	['%%3F'] = '',
	['%%26%%2338%%3B'] = '',
	['%%E2%%80%%93'] = '',
	['%.'] = '',
	['%%26quot%%3B'] = '',
	['%%E2%%80%%99'] = '',
	['%%26%%2339%%3B'] = '',
	['%%C3%%B6'] = 'o',
	['%%3A'] = '',
}

-- converting month names to hex for sortkeys
local hexmonthconv = {
	January = '1',
	February = '2',
	March = '3',
	April = '4',
	May = '5',
	June = '6',
	July = '7',
	August = '8',
	September = '9',
	October = 'A',
	November = 'B',
	December = 'C',
}

-- used by year func
local looporder = {
	{ 'December', 31 },
	{ 'November', 30 },
	{ 'October', 31 },
	{ 'September', 30 },
	{ 'August', 31 },
	{ 'July', 31 },
	{ 'June', 30},
	{ 'May', 31 },
	{ 'April', 30 },
	{ 'March', 31 },
	{ 'February', 29 },
	{ 'January', 31 }
}

-- category mapping: {category name, type for use on date pages (eg [[28 November]])
local category_info = {
	bts = {'Behind the Scenes updates', 'Behind the Scenes'},
	community = {'Community updates', 'Community'},
	devblog = {'Developer Blogs', 'Developer Blog'},
	event = {'Event updates', 'Event update'},
	game = {'Game updates', 'Game update'},
	future = {'Future Updates', 'Future update'},
	forum = {'forum'},
	mobile = {'Mobile updates', 'Mobile update'},
	shop = {'Shop updates', 'Shop update'},
	support = {'Support updates', 'Support'},
	technical = {'Technical updates', 'Technical'},
	website = {'Website updates', 'Website update'},
	yourfeedback = {'Your Feedback updates', 'Your Feedback'},
	forum = {'Forum post updates', 'Forum post'},
	competitions = {'Competition updates', 'Competitions'},
	['#default'] = {'Missing update category', ''},
}
-- input mapping: accepted inputs -> keys for above table
local cat_switch = {
	bts = 'bts',
	['behind the scenes'] = 'bts',
	comm = 'community',
	community = 'community',
	dev = 'devblog',
	blog = 'devblog',
	['dev blog'] = 'devblog',
	devblog = 'devblog',
	['dev blogs'] = 'devblog',
	event = 'event',
	events = 'event',
	game = 'game',
	feedback= 'yourfeedback',
	forum = 'forum',
	future = 'future',
	mobile = 'mobile',
	shop = 'shop',
	cs = 'support',
	competitions = 'competitions',
	customer = 'support',
	['customer support'] = 'support',
	support = 'support',
	tech = 'technical',
	technical = 'technical',
	th = 'th',
	site = 'website',
	ws = 'website',
	website = 'website',
	yourfeedback= 'yourfeedback',
	['your feedback'] = 'yourfeedback',
	['#default'] = '#default'
}

-- given a supported 'category' code, return the name of the category
function get_update_category(catarg)
	if hc(catarg) then
		catarg = string.gsub(string.lower(catarg), ' ?updates?', '')
		if cat_switch[catarg] and category_info[cat_switch[catarg]] then
			return category_info[cat_switch[catarg]][1]
		else
			return category_info[cat_switch['#default']][1]
		end
	else
		return category_info[cat_switch['#default']][1]
	end
end

-- given d,m,y, return the relevant time-based categories (with sorting)
function get_time_categories(day, month, year)
	local ret = {}
	local hexmonth, dayzero
		
	if not day or not month or not hexmonthconv[month] or not year then
		table.insert(ret, '[[Category:Missing update date]]')
	else
		dayzero = ((tonumber(day) < 10 and '0'..day) or day)
		hexmonth = hexmonthconv[month]
		-- [[Category:28 November updates]], sorted by year (eg 2015)
		table.insert(ret, string.format('[[Category:%s %s updates|%s%s%s]]', day, month, year, hexmonth, dayzero))
		
		-- [[Category:2015 updates]], sorted by monthday, months converted to hex, eg B28 (28 November)
		table.insert(ret, string.format('[[Category:%s updates|%s%s]]', year, hexmonth, dayzero))
	
		-- [[Category:Updates by date]], sorted year month day
		table.insert(ret, string.format('[[Category:Updates by date|%s%s%s]]', year, hexmonth, dayzero))
	
	end

	local external = {}
	hexmonthnr = tonumber(hexmonthconv[month], 16)
	-- Historical or OSRS updates
	if tonumber(year) < 2008 then
		table.insert(ret, '[[Category:Historical updates]]')
		table.insert(external, 'rs')
		if tonumber(year) < 2004 or (tonumber(year) == 2004 and (hexmonthnr < 3 or (hexmonthnr == 3 and tonumber(day) <= 29))) then
			table.insert(external, 'rsc')
		end
	else
		table.insert(ret, '[[Category:Updates]]')
	end
	if #external then
		top_icons = require('Module:Top icons')._main
		table.insert(ret, top_icons(external))
	end
	
	return table.concat(ret)
end

-- lang for formatting date
local lang = mw.getContentLanguage()
-- current title
local title = mw.title.getCurrentTitle()

--[=[
-- 
-- TEMPLATES
-- 
--]=]

-- [[Template:Update]]
function p.update(frame)
	local a = frame:getParent().args
	
	local div = mw.html.create('div')
		:addClass('update')
		:done()
		
	local link
	local url = a.link or a.url
	local postDateInfo
	
	if hc(url) then
		if url == 'no' then
			link = 'oficialus pranešimas'
		else
			link = '[' .. url .. ' oficialus pranešimas]'
		end
	else
		link = string.lower(title.baseText)
		for i,v in pairs(repl_before) do
			link = string.gsub(link, i, v)
		end
		link = mw.uri.encode(link)
		for i,v in pairs(repl_after) do
			link = string.gsub(link, i, v)
		end
		
		link = '[https://wiki.mcslime.lt/' .. link .. ' oficialus pranešimas]'
		
	end
	
	local date_link, day, month, year
	if hc(a.date) then
		day = lang:formatDate('j', a.date)
		month = lang:formatDate('F', a.date)
		year = lang:formatDate('Y', a.date)
		date_link = '[[' .. day .. ' ' .. month .. ']] [[' .. year .. ']]'
	else
		date_link = '(nenurodyta)'
	end
	
	if hc(a.rev) then
		date_link = date_link .. ' ir paskutinį kartą atnaujintas ' .. lang:formatDate('[[Y-m-d]]', a.rev)
	end
	
	if hc(a.author) then
		date_link = date_link .. ' by ' .. a.author
	end
	
	if url == 'no' then
		postDateInfo = 'Buvo pridėtas ' .. date_link .. ', bet vėliau buvo panaikintas.'
	else
		postDateInfo = 'Buvo pridėtas ' .. date_link .. '.'
	end
	
	-- Determine whether message is historical (pre-osrs), osrs.
	local message = ''
	local website = ''
	
	if hc(a.time) then
		--Historical updates
		if a.time == 'historical' then
			message = ' yra prieš paleidžiant <b>MCSlime</b> projektą. '
			website = '[https://www.mcslime.lt/ <i>MCSlime.LT</i>]'
		end
	--OSRS updates	
	else
		message = ' ir priklauso MCSlime.LT projektui -'
		website = '[https://mcslime.lt/ <i>MCSlime</i>]'
	end
	
	div:wikitext('Šis ' .. link .. message)
		:tag('span')
			:addClass('plainlinks')
			:wikitext(website)
		:done()
		:wikitext('. Visos autorinės teisės priklauso [[MCSlime.LT]].')
		:tag('br'):done()
		:wikitext(postDateInfo)
	:done()
	
	local div2 = ''

	if hc(a.article) then
		div2 = mw.html.create('div')
			:addClass('update-redirect')
			:addClass('tile')
			-- css was previously at common.css but now here because it was unused
			:cssText('text-align:center;font-weight:bold;font-size:2em;line-height:1.5em;padding:1em;margin-left:auto;margin-right:auto;')
			:wikitext('This is a newspost. For the wiki article, see [[' .. a.article .. ']]')
			:done()
		
		if hc(a.nuke) then
			if a.nuke == 'yes' then
				div2:addClass('nuke'):cssText('margin-bottom:20%;')
			end
		end
	end
	
	local cat = ''
	-- cats only in update namespace
	if title.namespace == 112 then
		cat = '[[Category:' .. get_update_category(a.category) .. '|' .. title.text .. ']]'
		cat = cat .. get_time_categories(day, month, year)
	end
	
	local ret = '__NOTOC__ __NOEDITSECTION__' .. tostring(div2) .. tostring(div) .. cat
	
	return ret
end

-- [[Template:Patch Notes]] no links available as Patch Note Archive have been removed from MCSlime.LT's website
function p.patchnotes(frame)
	local a = frame:getParent().args
	local cat = ''
	
	local div = mw.html.create('div')
		:addClass('update')
		:done()
		
	local date_link
	local day, month, year = '', '', ''
	if hc(a.date) then
	    day = lang:formatDate('d', a.date)       -- Day with leading zeros
	    month = lang:formatDate('m', a.date)     -- Month with leading zeros
	    year = lang:formatDate('Y', a.date)      -- Four-digit year
	    date_link = string.format('[[%s-%s-%s]]', year, month, day)  -- Format as yyyy-MM-dd
	else
	    date_link = '(nenurodyta)'  -- If no date is provided
	end
	
	if hc(a.rev) then
		date_link = date_link .. ', ir paskutinį kartą atnaujintas ' .. lang:formatDate('[[Y-m-d]]', a.rev)
	end
	
	div:wikitext('These official [[Patch Notes]] are copied verbatim from the Patch Notes Archive which is no longer available. Visos autorinės teisės priklauso [[MCSlime.LT]].')
		:done()
		:tag('br'):done()
		:wikitext('Pranešimas buvo paskelbtas ' .. date_link .. '.')
	:done()
	
	cat = cat .. '[[Category:Patch Notes|*' .. lang:formatDate('md', day .. ' ' .. month) .. ']]'
	cat = cat .. get_time_categories(day, month, year)
	
	-- not update namespace, remove cat
	if title.namespace ~= 112 then
		cat = ''
	end
	
	local ret = frame:getParent():preprocess(string.format('{{Parentitle override|Update:Patch Notes|(%s %s %s)}}', day, month, year)) .. '__NOEDITSECTION__' .. tostring(div) .. cat .. '<div style="float:right">__TOC__</div>'
	
	return ret
end


--[=[
-- 
-- CATEGORY FORMATTERS
-- 
--]=]

-- [[Category:28 November updates]] etc
function p.date_cat(frame)
	local f = frame:getParent()
	local d
	if hc(f.args[1]) then
		d = f.args[1]
	else
		-- assumes 2016 so that leap years work
		d = string.gsub(title.text, ' ?updates?', '') .. ' 2016'
	end
	
	local ret = 'This category contains updates posted on ' .. lang:formatDate('[[j F]]', d) .. ', sorted chronologically.'
	-- cats only in category namespace
	if title.namespace == 14 then
		--updates by day, sorted by hexmonth,day: B28 (28 November)
		ret = ret .. '[[Category:Updates by day|' .. hexmonthconv[lang:formatDate('F', d)] .. lang:formatDate('d', d) .. ']]'
		--updates by month, sorted by [space]day
		ret = ret .. '[[Category:' .. lang:formatDate('F', d) .. ' updates| ' .. lang:formatDate('d', d) .. ']]'
	end
	
	return ret
end

-- [[Category:2015 updates]] etc
function p.year_cat(frame)
	local f = frame:getParent()
	local d
	if hc(f.args[1]) then
		d = f.args[1]
	else
		d = string.gsub(title.text, ' ?updates?', '')
	end
	
	local ret = 'This category contains updates posted in [[' .. d .. ']], sorted chronologically.'
	-- cats only in category namespace
	if title.namespace == 14 then
		--updates by year, sorted by [space]year
		ret = ret .. '[[Category:Updates by year| ' .. d .. ']]'
	end
	
	return ret
end


--[=[
-- 
-- DATE DPL HANDLERS
-- 
--]=]

function p.datedpl(frame)
	local a = frame:getParent().args
	local year
	local cat
	local page = a['%TITLE%']
	if hc(a.year) then
		year = a.year
	else
		year = lang:formatDate('Y', a.date)
	end
	
	if hc(a.category) then
		-- if it has category, {{Update}}
		cat = category_info[cat_switch[string.gsub(string.lower(a.category), ' ?updates?', '')]][2]
	else
		-- missing both probably means {{Patch Notes}}
		cat = 'Patch Notes'
	end
	
	return string.format("'''%s''' – %s: [[Update:%s|%s]]",year,cat,page,page)
end


--[=[
-- 
-- YEAR DPL HANDLERS
-- 
--]=]

local function sortFunc(a,b)
	return a[2] < b[2]
end

local function lookup(cat)
	local r = mw.getCurrentFrame():preprocess(string.format([=[
{{#dpl:
|namespace=Update
|category=%s
|include={Update}:date,{Patch Notes}:date,{DevBlog}:date
|format=,¦UD¦%%PAGE%%@D@,,
|ordermethod=sortkey
}}
]=], cat))
	local ret = { }
	local keys = {}
	for v in mw.text.gsplit(r, '|UD|', true) do
		if v:find('@') then
			local u,_d = unpack(mw.text.split(v, '@D@'))
			u = mw.text.trim(u)
			u = string.sub(u, 8, -1)
			_d = mw.text.trim(_d)
			local y,m,d = unpack(mw.text.split(lang:formatDate('Y-F-j', _d), '-', true))
			y = tonumber(y)
			d = tonumber(d)
			if not ret[y] then
				ret[y] = {}
			end
			if not ret[y][m] then
				ret[y][m] = {}
			end
			if not ret[y][m][d] then
				ret[y][m][d] = {u}
			else
				table.insert(ret[y][m][d], u)
			end
		end
	end
	return ret
end

function p.year(frame)
	return p._year(frame:getParent().args)
end

function p._year(args)
	local year = args[1] or mw.title.getCurrentTitle().text
	local data = lookup(year..' updates')
	data = data[tonumber(year)]
	local gameUpdQ = mw.smw.ask{ '[[Category:' .. year .. ' updates]][[Category:Game updates]]', '?#-'}
	local gameUpdates = {}
	if gameUpdQ == nil then
		return '\n\'\'No updates have been released this year so far. If you believe this is a mistake, leave a message in [[Module talk:Updates|this talk page]].\'\''
	end
	for _,v in ipairs(gameUpdQ) do
		table.insert(gameUpdates, v[1])
	end
	local ret = {'\'\'\'Note:\'\'\' Titles in bold indicate a [[Game updates|game update]].'}
	local data_m, data_d
	
	contains = require('Module:Array').contains
	ordinal = require('Module:Ordinal')._main
	
	for _,m in ipairs(looporder) do
		data_m = data[m[1]]
		if data_m then
			table.insert(ret, '\n\n=='..m[1]..'==')
			for d = m[2], 1, -1 do
				data_d = data_m[d]
				if data_d then
					table.sort(data_d)
					local patchDay = false
					local addedPatch = false
					local gameUpdDay = false
					local otherUpdDay = false
					local patchNote = 'Patch Notes (' .. d .. ' ' .. m[1] .. ' ' .. year .. ')'
					local patchLink = string.format('\'\'([[Update:%s|Patch Notes]])\'\'', patchNote)
					if ( contains(data_d, patchNote) ) then patchDay = true end
					for _,u in ipairs(data_d) do
						if( contains(gameUpdates, 'Update:' .. u) ) then
							gameUpdDay = true
						elseif( u ~= patchNote ) then
							otherUpdDay = true
						end
					end
					for _,u in ipairs(data_d) do
						if( contains(gameUpdates, 'Update:' .. u) ) then
							-- bold game updates
							local updBullet = string.format('\'\'\'[[Update:%s|%s]]\'\'\'', u, u)
							if (patchDay == true and addedPatch == false) then
								updBullet = updBullet .. ' ' .. patchLink
								addedPatch = true
							end
							table.insert(ret, string.format('\n* %s%s – %s', tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))
						elseif( u ~= patchNote ) then
							-- add normal updates
							local updBullet = string.format('[[Update:%s|%s]]', u, u)
							if (patchDay == true and addedPatch == false and gameUpdDay == false) then
								updBullet = updBullet .. ' ' .. patchLink
								addedPatch = true
							end
							table.insert(ret, string.format('\n* %s%s – %s', tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))
						elseif( u == patchNote and gameUpdDay == false and otherUpdDay == false ) then
							-- add patches as standalone updates
							local updBullet = string.format('\'\'([[Update:%s|Patch Notes]])\'\'', u)
							table.insert(ret, string.format('\n* %s%s – %s', tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))
						end
					end
				end
			end
		end
	end
	return mw.text.trim(table.concat(ret, ''))
end

--TODO
--p.updatedpl
--p.patchnotesdpl
--etc

return p