Jump to content

Module:Video game review score

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Ferret (talk | contribs) at 21:46, 14 April 2016 (Keep last line break in front of edit link. As limited testing is only with aggregators, this should be fine. May need to revisit if used with more individual reviewers.). 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 p = {}

local function buildCiteWeb(reference) 
	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)
	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 == "")) 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)) then
		local cite = buildCiteWeb(reviewscore['references'][1]);
		
		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"];
	local df = args["df"];

	-- 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(reviewer));
	if(reviewer == nil or reviewer == "") then
		-- No? Maybe in the reviewer table.
		reviewer = vgwd.getReviewerID(string.upper(reviewer));
		if(reviewer == nil or reviewer == "") then
			return "Invalid reviewer";
		end;
	end;	

	if(df == nil or df == "") then
		df = "mdy";
	end;
	df = string.lower(df);
		
	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

	local gameName = entity:getLabel();
	
	local ret = "";	
	local reviewscores = entity['claims']['P444'];
	local system = args["system"];
	local systemId = nil;
	if(not(system == nil or system == "")) then
		system = string.upper(system);
		systemId = vgwd.getSystemID(system);
	end;
	
	if not reviewscores then
		return "No reviews";
	end;

	-- Loop all of "score by" for this title
	for i = 1, #reviewscores do
		local scoreBy = nil 
		if(not(reviewscores[i]['qualifiers']['P447'] == nil or reviewscores[i]['qualifiers']['P447'][1] == nil)) then
			scoreBy = reviewscores[i]['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(not(system == nil or system == "")) then
				if(not(reviewscores[i]['qualifiers']['P400'] == nil or reviewscores[i]['qualifiers']['P400'][1] == nil)) then
					local reviewSysId = reviewscores[i]['qualifiers']['P400'][1]['datavalue']['value']['numeric-id'];

					if(systemId == reviewSysId) then
						ret = ret .. printReviewRow(frame, gameName, reviewscores[i], df);
					else 
						local systemName = mw.wikibase.label('Q'..reviewSysId);
						if(not(systemName == nil) and string.upper(systemName) == system) then
							ret = ret .. printReviewRow(frame, gameName, reviewscores[i], df);
						end;
					end;
				end;
			else
				-- No system specified, so output each one found.
				ret = ret .. printReviewRow(frame, gameName, reviewscores[i], df);
			end;
		end;
	end;

	-- Add edit link at end.
	--ret = string.sub(ret, 1, -7)..'<sup>[[d:'..entity['id']..'#P444|&#91;±&#93;]]</sup>';
	ret = ret..'<sup>[[d:'..entity['id']..'#P444|&#91;±&#93;]]</sup>';
	
	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