Module:Video game wikidata: Difference between revisions

Content deleted Content added
More systems
Latest rewrite as we continue to learn and grow.
Line 1:
local Date = require('Module:Date')._Date
local yesno = require('Module:Yesno')
 
local p = {}
 
-- Local variables.
local reviewer = nil;
local df = "mdy";
local entity = nil;
local genRefs = true;
local showSystem = true;
local showUpdateLink = true;
local system = nil;
local systemId = nil;
 
-- Translation table for converting numeric-IDs to shorthand aliases.
Line 76 ⟶ 89:
-- List of accepted reviewer arguments and their related QID.
local reviewerAliases = {
[591573] = 'FAM',
}
 
-- List of accepted reviewer arguments and their related QID.
local reviewerIDs = {
['FAM'] = 591573
}
 
local function sortByPlatform(a,b)
local platformA = nil;
local platformB = nil;
if(a['qualifiers']['P400'] ~= nil and b['qualifiers']['P400'][1] ~= nil) then
platformA = p.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(b['qualifiers']['P400'] ~= nil and b['qualifiers']['P400'][1] ~= nil) then
platformB = p.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 buildCite(reference)
local referenceUrl = nil;
local cite = nil;
if(reference['snaks']['P854'] ~= nil and reference['snaks']['P854'][1] ~= nil) then
referenceUrl = reference['snaks']['P854'][1]['datavalue']['value'];
end;
 
if(referenceUrl ~= nil and referenceUrl ~= "") then
cite = "{{cite web|url="..referenceUrl;
local timestamp = nil;
local publisher = nil;
local work = nil;
local title = nil;
 
if(reference['snaks']['P813'] ~= nil and reference['snaks']['P813'][1] ~= nil) then
timestamp = reference['snaks']['P813'][1]['datavalue']['value']['time'];
end;
if(reference['snaks']['P123'] ~= nil and reference['snaks']['P123'][1] ~= nil) then
publisher = mw.wikibase.label('Q'..reference['snaks']['P123'][1]['datavalue']['value']['numeric-id']);
end;
if(reference['snaks']['P1433'] ~= nil and reference['snaks']['P1433'][1] ~= nil) then
work = mw.wikibase.label('Q'..reference['snaks']['P1433'][1]['datavalue']['value']['numeric-id']);
end;
if(reference['snaks']['P1476'] ~= nil and reference['snaks']['P1476'][1] ~= nil) then
title = reference['snaks']['P1476'][1]['datavalue']['value']['text'];
end;
 
if(title ~= nil and title ~= "") then
cite = cite .. "|title="..title;
end;
if(publisher ~= nil and publisher ~= "") then
cite = cite .. "|publisher="..publisher;
end;
if(work ~= nil and work ~= "") then
cite = cite .. "|work="..work;
end;
if(timestamp ~= nil and 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, reviewscore)
local ret = ""
 
local system = nil;
local score = nil;
local reference = nil;
 
if(reviewscore['qualifiers']['P400'] ~= nil and reviewscore['qualifiers']['P400'][1] ~= nil) then
system = p.getSystemAlias(reviewscore['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
end
if(system ~= nil and system ~= "" and showSystem) then
ret = ret.."("..system..") ";
end;
 
score = reviewscore['mainsnak']['datavalue']['value'];
if(score ~= nil and score ~= "") then
ret = ret..score;
end;
 
if(reviewscore['references'] ~= nil and reviewscore['references'][1] ~= nil and genRefs) then
local cite = buildCite(reviewscore['references'][1], df);
if(cite ~= nil) then
local scoreBy = p.getAggregatorAlias(reviewscore['qualifiers']['P447'][1]['datavalue']['value']['numeric-id']);
if(scoreBy == nil) then
scoreBy = p.getReviewerAlias(reviewscore['qualifiers']['P447'][1]['datavalue']['value']['numeric-id']);
end;
 
local name = entity:getLabel()..'-'..scoreBy;
if(system ~= nil and 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.getSystemAlias(numericId)
Line 97 ⟶ 225:
return aggregatorIDs[system];
end
 
 
function p.getReviewerAlias(numericId)
Line 106 ⟶ 233:
return reviewerIDs[system];
end
 
function p.setReviewer(iReviewer)
-- No reviewer, stop. Must have reviewer at least.
if(iReviewer == nil or iReviewer == "") then
return "Missing reviewer";
end;
-- See if supplied reviewer is in the aggregator table.
iReviewer = string.upper(iReviewer)
reviewer = p.getAggregatorID(iReviewer);
if(reviewer == nil or reviewer == "") then
-- No? Maybe in the reviewer table.
reviewer = p.getReviewerID(iReviewer);
if(reviewer == nil or reviewer == "") then
return "Invalid reviewer";
end;
end;
 
return nil;
end;
 
function p.setDateFormat(iDf)
-- Check for a date format parameter. Default to mdy if missing.
if(iDf ~= nil and iDf ~= "") then
df = string.lower(iDf);
end;
end;
 
function p.setGame(iGame)
-- Check for a game parameter. If missing, default to current article.
if(iGame ~= nil and iGame ~= "") then
entity = mw.wikibase.getEntity(iGame);
else
entity = mw.wikibase.getEntity();
end;
if(entity == nil) then
return "No matching wikidata entity found";
end;
return nil;
end;
 
function p.setSystem(iSystem)
-- Check for system parameter, and resolve it's QID if possible.
if(iSystem ~= nil and iSystem ~= "") then
system = string.upper(iSystem);
systemId = p.getSystemID(system);
elseif(not showSystem) then
-- If no system was specified, force showSystem on.
showSystem = true;
end;
end;
 
function p.setGenerateReferences(iGenRefs)
-- Reference suppression.
if(iGenRefs ~= nil and iGenRefs ~= "") then
genRefs = yesno(iGenRefs, true);
end;
end;
 
function p.setShowSystem(iShowSystem)
-- Suppression of system aliases in front of score, i.e. (XBOX) xx/100.
if(iShowSystem ~= nil and iShowSystem ~= "") then
showSystem = yesno(iShowSystem, false);
end;
if(system == nil or system == '') then
-- If no system was specified, force showSystem on.
showSystem = true;
end;
end;
 
function p.setShowUpdateLink(iShowUpdateLink)
-- Suppression of update link to Wikidata at the end of the score, i.e. (XBOX) xx/100[+].
if(iShowUpdateLink ~= nil and iShowUpdateLink ~= "") then
showUpdateLink = yesno(iShowUpdateLink, false);
end;
end;
 
function p.getUpdateLink()
return '<sub>[[d:'..entity['id']..'#P444|&#91;±&#93;]]</sub>';
end;
 
function p.printReviewScores(frame)
local ret = "";
-- Loop all of "review scores" for this title
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(review['qualifiers']['P447'] ~= nil and 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(review['qualifiers']['P400'] ~= nil and 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(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, review);
end;
end;
 
if(ret ~= "") then
ret = string.sub(ret, 1, -7);
-- Add edit link at end if showUpdateLink is on.
if(showUpdateLink) then
ret = ret .. p.getUpdateLink();
end;
else
ret = nil;
end;
 
return ret;
end;
 
return p