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 17:50, 14 April 2016. 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:Sandbox/ferret/Video game reviews')

local p = {}

local function printReviewRow(frame, gameId, 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
		if(not (reviewscore['references'][1]['snaks']['P854'] == nil or reviewscore['references'][1]['snaks']['P854'][1] == nil)) then
			reference = reviewscore['references'][1]['snaks']['P854'][1]['datavalue']['value'];	
		end;

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

			if(not (reviewscore['references'][1]['snaks']['P813'] == nil or reviewscore['references'][1]['snaks']['P813'][1] == nil)) then
				timestamp = reviewscore['references'][1]['snaks']['P813'][1]['datavalue']['value']['time'];
			end;
			if(not (reviewscore['references'][1]['snaks']['P123'] == nil or reviewscore['references'][1]['snaks']['P123'][1] == nil)) then
				publisher = mw.wikibase.label('Q'..reviewscore['references'][1]['snaks']['P123'][1]['datavalue']['value']['numeric-id']);
			end;
			if(not (reviewscore['references'][1]['snaks']['P1433'] == nil or reviewscore['references'][1]['snaks']['P1433'][1] == nil)) then
				work = mw.wikibase.label('Q'..reviewscore['references'][1]['snaks']['P1433'][1]['datavalue']['value']['numeric-id']);
			end;			
			if(not (reviewscore['references'][1]['snaks']['P1476'] == nil or reviewscore['references'][1]['snaks']['P1476'][1] == nil)) then
				title = reviewscore['references'][1]['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..'}}';
			cite = frame:extensionTag{ name = "ref", args = {name=name}, content=cite };
			ret = ret..cite;
		end;
	end;

	return ret;
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 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;

	-- 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, 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, reviewscores[i], df);
						end;
					end;
				end;
			else
				-- No system specified, so output each one found.
				ret = ret .. printReviewRow(frame, reviewscores[i], df);
				if(not(i == #reviewscores)) then
					ret = ret .. '<br/>';
				end;
			end;
		end;
	end;

	-- Add edit link at end.
	ret = ret..' <small>[[d:'..gameId..'#P444|&#91;±&#93;]]</small>';

	return ret;
end;

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'User:Ferret/sandbox/Video game aggregator'
	})
	return p._main(frame, args)
end

return p