Jump to content

Module:Changelog

From Deadlock Wiki
Revision as of 02:08, 3 November 2024 by Sur (talk | contribs) (write_tag_tree correct the asterisk handling)

Overview

Generates lines of changes for all data pages. See [[Category:Changelog Dates]] for the dates of all changelogs, and Changelogs for list of all the data pages that contain a Changelog.

Functions

All of these functions are callable by wikitext, i.e. {{#invoke|Changelog|invokable_name|param1|paramN}}

write_changelog_by_tag

The main invokable that will be used. Given a specific tag, it outputs all relevant changelogs from all dates in a Template:Update history table.

Parameters

  • tag - Tag to search relevant changelogs for. Should be localized, i.e. Abrams for hero_atlas in english.
  • num_dates - (OPTIONAL) Number of dates to add, recommend 3 for articles. If unprovided, defaults to all.

Examples

For use on Pocket/Update history: {{#invoke:Changelog|write_changelog_by_tag|Pocket}}

Outputs Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).


For use on Pocket#Update history: {{#invoke:Changelog|write_changelog_by_tag|Pocket|3}}

Outputs

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).

write_changelog_by_date_id

Write's a specific date's changelog, as opposed to a specific tag's changelog.

Parameters

  • date_id_to_write - Date-id to write, format yyyy-mm-dd, view all at [[Category:Changelog Dates]]

Examples

For a non-herolab patch page
{{#invoke:Changelog|write_changelog_by_date_id|2024-05-03}}

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).


For a herolab patch page
{{#invoke:Changelog|write_changelog_by_date_id|2024-12-06_HeroLab}}

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).

write_data_pages_list

Writes list of all changelog data pages using the list of patches at Data:ChangelogConfigs.json. Used on [[Category:Changelog Dates]].

Parameters

None

Examples

{{#invoke:Changelog|write_data_pages_list}}

Outputs

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).

get_last_updated

Retrieve the last (or first) date that a tag was updated on. Planned to be used on a given tag's page, i.e. Abrams's infobox could mention that it was last updated on 2024-05-03, or that Mirage was released on 2024-05-03, etc.

Parameters

  • tag - Tag to search
  • last_or_first - Named optional - Must be last or first - defaults to last - Retrieves last or first date

Examples

Example using last {{#invoke:Changelog|get_last_updated|Basic Magazine}}

Outputs

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).


Example using first {{#invoke:Changelog|get_last_updated|Basic Magazine|last_or_first=first}}

Outputs

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:Changelog Dates.json' is not a valid JSON page).


local p = {};
local date_module = require('Module:Date')
local changelog_dates = mw.loadJsonData("Data:Changelog Dates.json")
local tag_tree = mw.loadJsonData("Data:Changelog Tag Tree.json")
local dictionary_module = require('Module:Dictionary')

--Only Data:Changelog_05-03-2024.json is loaded right now, as it still needs work and for now it was uploaded manually, need an uploader script to handle it
--Returns all lines of a given date that has that tag
local function date_tag_to_lines(date, tag_to_filter) 
	-- Get the data for the respective line
	local changelog_data = mw.loadJsonData(date_to_changelog_data_page(date))
	local lines = ""
	for index, line in ipairs(changelog_data) do
		description = line["Description"]
		if tag_to_filter == 'All' then
			lines = lines .. description .. "<br>"
		else
			for index2, tag in ipairs(line["Tags"]) do
				if tag == tag_to_filter then
					lines = lines .. description .. "<br>"
				end
			end
		end
	end
	return lines
end

--Expand the Update history table/row template for 1 specific changelog
local function write_changelog(date, tag_to_filter)
	local template_title = "Update history table/row"
	local template_args = {}
	--05-03-2024 to May 3, 2024
	template_args["update"] = date_module.format_date(date)
	template_args["changes"] = date_tag_to_lines(date, tag_to_filter)
	if (template_args["changes"] ~= "") then
		return mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
	else
		return ""
	end
end

-- Write changelogs table
p.write_changelogs = function(frame)
	tag = frame.args[1]
	num_dates_str = frame.args[2]
	local num_dates
	if (tag == nil) then return "tag parameter must be provided" end
	if (num_dates_str ~= nil) then
		num_dates = tonumber(num_dates_str)
		if (num_dates == nil) then return "num_dates parameter must be numerical" end
	end
	
	local template_title = "Update history table"
	local template_args = {}
	local content = "\n"
	
	-- Write changelog for each date
	for index, date in ipairs(changelog_dates) do
		if (num_dates_str ~= nil and index > num_dates) then
			break
		else
			content = content .. write_changelog(date, tag) .. "\n"
		end
	end
	
	template_args["contents"] = content
	
	return mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
end

function date_to_changelog_data_page(date)
	return "Data:Changelog " .. date .. ".json"	
end

--Shows all changelog date data pages as a list of pages
p.write_data_pages_list = function(frame)
	local str = ""
	
	for index, date in ipairs(changelog_dates) do
		str = str .. "[[" .. date_to_changelog_data_page(date) .. "]]<br>"
	end
	
	return str
end

p.write_changelog_by_date = function(frame)
	local date_to_write = frame.args[1]
	
	-- Determine the previous and next update
	-- Find the index in dates list
	local previous_date = ''
	local the_date = ''
	local next_date = ''
	local date_found = false
	for index, date in ipairs(changelog_dates) do
		if date == date_to_write then
			--Date found
			the_date = date
			date_found = true
		elseif date_found and next_date == '' then --on next iteration, save the next date
			next_date = date
			break
		end
		
		if not date_found then
			previous_date = date -- only update previous date if the_date isnt found
		end
	end
	
	local template_title = 'Update layout'
	local template_args = {
		['prev_update'] = prev_date,
		['current_update'] = the_date,
		['next_update'] = next_date,
		['source'] = 'https://forums.playdeadlock.com/threads/09-26-2024-update.33015/',
		['source_title'] = the_date .. ' Update',
		['notes'] = date_tag_to_lines(the_date, 'All')
	}

	return mw.getCurrentFrame():expandTemplate{title = template_title, args = template_args}
end

p.get_last_updated = function(frame)
	local tag_to_search = frame.args[1]
	
	-- Iterate changelog dates
	for index, date in ipairs(changelog_dates) do
		local changelog_data = mw.loadJsonData(date_to_changelog_data_page(date))
		
		-- Iterate lines
		for _, line in ipairs(changelog_data) do
			local tags = line['Tags']
			
			-- Iterate tags
			for _, tag in ipairs(tags) do
				if tag_to_search == tag then
					return '[[Update:' .. date .. '|' .. date .. ']]'
				end
			end
		end
	end
	
	return dictionary_module.translate('N/A')
end
	
function p.write_tag_tree(depth)
	-- Handle both external invokes and internal calls
	if type(depth) == 'table' and depth.args then
		frame = depth
		depth = frame.args[1]
	end
	
	-- Start at depth 1
	if depth == nil then depth = 1 end
	
	local list_str = ""
	for parent, children in pairs(tag_tree) do
		list_str = list_str .. string.rep("*", depth) .. string.format("[[%s#Update history|%s]]\n", parent, parent)
		if children ~= nil then
			list_str = list_str .. p.write_tag_tree(depth+1)
		end
	end
	
	return list_str
end

return p