Jump to content

Module:Video game review score/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Ferret (talk | contribs) at 12:32, 20 April 2016 (Use system alias first if available, platform label only if not.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local Date = require('Module:Date')._Date
local vgwd = require('Module:Video game wikidata')
local yesno = require('Module:Yesno')

local p = {}

local function sortByPlatform(a,b) 
	local platformA = nil;
	local platformB = nil;
	if(not(a['qualifiers']['P400'] == nil or b['qualifiers']['P400'][1] == nil)) then
		platformA = vgwd.getSystemAlias(a['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
		if(platformA == nil) then
			platformA = mw.wikibase.label('Q'..a['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
		end;
	end;
	if(not(b['qualifiers']['P400'] == nil or b['qualifiers']['P400'][1] == nil)) then
		platformB = vgwd.getSystemAlias(b['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
		if(platformB == nil) then
			platformB = mw.wikibase.label('Q'..b['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
		end;
	end;		
		
	return platformA < platformB
end;

local function buildCiteWeb(reference, df) 
	local referenceUrl = nil;
	local cite = nil;
	
	if(not(reference['snaks']['P854'] == nil or reference['snaks']['P854'][1] == nil)) then
		referenceUrl = reference['snaks']['P854'][1]['datavalue']['value'];	
	end;

	if(not (referenceUrl == nil or referenceUrl == "")) then
		cite = "{{cite web|url="..referenceUrl;
			
		local timestamp = nil;
		local publisher = nil;
		local work = nil;
		local title = nil;

		if(not (reference['snaks']['P813'] == nil or reference['snaks']['P813'][1] == nil)) then
			timestamp = reference['snaks']['P813'][1]['datavalue']['value']['time'];
		end;
		if(not (reference['snaks']['P123'] == nil or reference['snaks']['P123'][1] == nil)) then
			publisher = mw.wikibase.label('Q'..reference['snaks']['P123'][1]['datavalue']['value']['numeric-id']);
		end;
		if(not (reference['snaks']['P1433'] == nil or reference['snaks']['P1433'][1] == nil)) then
			work = mw.wikibase.label('Q'..reference['snaks']['P1433'][1]['datavalue']['value']['numeric-id']);
		end;			
		if(not (reference['snaks']['P1476'] == nil or reference['snaks']['P1476'][1] == nil)) then
			title = reference['snaks']['P1476'][1]['datavalue']['value']['text'];
		end;

		if(not(title == nil or title == "")) then
			cite = cite .. "|title="..title;
		end;
		if(not(publisher == nil or publisher == "")) then
			cite = cite .. "|publisher="..publisher;
		end;
		if(not(work == nil or work == "")) then
			cite = cite .. "|work="..work;
		end;			
		if(not(timestamp == nil or timestamp == "")) then
			local year = string.sub(timestamp,2,5);
			local month = string.sub(timestamp,7,8);
			local day = string.sub(timestamp,10,11);
			local accessdate = Date(year, month, day):text(df);

			cite = cite .. "|accessdate="..accessdate;
		end;
		
		cite = cite..'}}';	
	end;
	
	return cite;
end;

local function printReviewRow(frame, gameName, reviewscore, df, showRefs, proseScore)
	local ret = ""

	local system = nil;
	local score = nil;
	local reference = nil;

	if(not(reviewscore['qualifiers']['P400'] == nil or reviewscore['qualifiers']['P400'][1] == nil)) then
		system = vgwd.getSystemAlias(reviewscore['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
	end	
	if(not (system == nil or system == "") and not(proseScore)) then
		ret = ret.."("..system..") ";
	end;

	score = reviewscore['mainsnak']['datavalue']['value'];	
	if(not (score == nil or score == "")) then
		ret = ret..score;
	end;

	if(not (reviewscore['references'] == nil or reviewscore['references'][1] == nil) and showRefs and not(proseScore)) then
		local cite = buildCiteWeb(reviewscore['references'][1], df);
		
		if(not(cite == nil)) then
			local scoreBy = vgwd.getAggregatorAlias(reviewscore['qualifiers']['P447'][1]['datavalue']['value']['numeric-id']);
			if(scoreBy == nil) then
				scoreBy = vgwd.getReviewerAlias(reviewscore['qualifiers']['P447'][1]['datavalue']['value']['numeric-id']);
			end;

			local name = gameName..'-'..scoreBy;
			if(not (system == nil or system == "")) then
				name = name..system;
			end;

			cite = frame:extensionTag{ name = "ref", args = {name=name}, content=cite };
			ret = ret..cite;
		end;
	end;

	return ret.."<br />";
end

function p._main(frame, args)
	local reviewer = args["reviewer"];

	-- No reviewer, stop. Must have reviewer at least.
	if(reviewer == nil or reviewer == "") then
		return "Missing reviewer";
	end;
	
	-- See if supplied reviewer is in the aggregator table.
	reviewer = vgwd.getAggregatorID(string.upper(args["reviewer"]));
	if(reviewer == nil or reviewer == "") then
		-- No? Maybe in the reviewer table.
		reviewer = vgwd.getReviewerID(string.upper(args["reviewer"]));
		if(reviewer == nil or reviewer == "") then
			return "Invalid reviewer";
		end;
	end;	

	-- Check for a date format parameter. Default to mdy if missing.
	local df = args["df"];
	if(df == nil or df == "") then
		df = "mdy";
	end;
	df = string.lower(df);
		
	-- Check for a game parameter. If missing, default to current article.
	local game = args["game"];
	local entity = nil;
	if(game == nil or game == "") then
		entity = mw.wikibase.getEntity();
	else
		entity = mw.wikibase.getEntity(game);
	end;
	
	if(not entity) then
		return "No matching wikidata entity found";
	end

	-- Reference suppression.
	local showRefs = true;
	if(args['showRefs']) then
		showRefs = yesno(args['showRefs'], true);
	end;
	
	-- Prose score formatting.
	local proseScore = false;
	if(args['proseScore']) then
		proseScore = yesno(args['proseScore'], false);
	end;

	-- Check for system parameter, and resolve it's QID if possible.
	local system = args["system"];
	local systemId = nil;
	if(not(system == nil or system == "")) then
		system = string.upper(system);
		systemId = vgwd.getSystemID(system);
	elseif(proseScore) then
		-- If no system was specified, force proseScore off.
		proseScore = false;
	end;
	
	-- Loop all of "review scores" for this title
	local ret = "";	
	local reviewscores = entity['claims']['P444'];	
	if(reviewscores) then
		-- Find reviews that qualify for printing and insert into array.
		local reviewsToPrint = {}
    	for i,review in pairs(reviewscores) do
			local scoreBy = nil 
			if(not(review['qualifiers']['P447'] == nil or review['qualifiers']['P447'][1] == nil)) then
				scoreBy = review['qualifiers']['P447'][1]['datavalue']['value']['numeric-id'];
			end;
			if(scoreBy == reviewer) then
				-- If template specified a system, we need to check for the specific system and only output that one.
				if(system == nil or system == "") then
					-- No system specified, so output each one found.
					table.insert(reviewsToPrint,review);
				else
					-- Get platform if it exists.
					if(not(review['qualifiers']['P400'] == nil or review['qualifiers']['P400'][1] == nil)) then
						-- Try to match based on QID.
						local reviewSysId = review['qualifiers']['P400'][1]['datavalue']['value']['numeric-id'];
						if(systemId == reviewSysId) then
							table.insert(reviewsToPrint,review);
						else 
							-- If that failed, try to match based on label.
							local systemName = mw.wikibase.label('Q'..reviewSysId);
							if(not(systemName == nil) and string.upper(systemName) == system) then
								table.insert(reviewsToPrint,review);
							end;
						end;
					end;
				end;
			end;    		
		end
	
		-- Sort the array by platform label.
    	table.sort(reviewsToPrint, sortByPlatform)

		-- Print the reviews
    	for i,review in ipairs(reviewsToPrint) do
    		ret = ret .. printReviewRow(frame, entity:getLabel(), review, df, showRefs, proseScore);
		end;
	end;

	-- Add edit link at end. If proseScore is set, suppress.
	if(not(proseScore)) then 
		ret = string.sub(ret, 1, -7)..'<sub>[[d:'..entity['id']..'#P444|&#91;±&#93;]]</sub>';
		--ret = ret..'<sup>[[d:'..entity['id']..'#P444|&#91;±&#93;]]</sup>';
	else
		ret = string.sub(ret, 1, -7);
	end;

	return ret;
end;

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Video game review score'
	})
	return p._main(frame, args)
end

return p