From 1da19ecfb81f29fa200814f9fcbcc4ed510bc173 Mon Sep 17 00:00:00 2001 From: chris062689 Date: Wed, 7 Jun 2017 03:32:12 -0400 Subject: [PATCH] Games now pull issues from Github. --- scripts/games/app.js | 289 +++++++++++------- scripts/games/package.json | 2 + .../citra-bs-theme/layouts/game/single.html | 99 ++++-- 3 files changed, 245 insertions(+), 145 deletions(-) diff --git a/scripts/games/app.js b/scripts/games/app.js index 9edc7c0..8aac7fa 100644 --- a/scripts/games/app.js +++ b/scripts/games/app.js @@ -6,6 +6,7 @@ const logger = require('winston'); const sanitizeHtml = require('sanitize-html'); +const request = require('request-promise'); const toml = require('toml'); const tomlify = require('tomlify-j0.4'); const blackfriday = require('./blackfriday.js'); @@ -38,125 +39,189 @@ function getDirectories (srcpath) { .filter(file => fs.lstatSync(path.join(srcpath, file)).isDirectory()) } +async function getGithubIssues() { + var results = []; + + // Force the while loop out after 10 calls. + for (var page = 0; page <= 3; page++) { + let options = { + url: `https://api.github.com/repos/citra-emu/citra/issues?per_page=99&page=${page}&client_id=fca88d03a8f4e3ae45f8&client_secret=97c8f5633b5f03a78bfa84f0ab50659db1303035`, + headers: { 'User-Agent': 'citrabot' } + }; + + logger.verbose(`Requesting Github Issue Page ${page}.`); + var body = await request.get(options); + var obj = JSON.parse(body); + + if (obj == null || obj.length == 0) { + logger.verbose(`No more Github issues found -- on page ${page}.`); + break; + } else { + results = results.concat(obj); + } + } + + return results; +} + // Fetch game information stored in Github repository. gitPull(fsPathCode, 'https://github.com/citra-emu/citra-games-wiki.git'); // Fetch game articles stored in Github wiki. gitPull(fsPathWiki, 'https://github.com/citra-emu/citra-games-wiki.wiki.git'); -// Make sure the output directories in Hugo exist. -[fsPathHugoContent, fsPathHugoBoxart, fsPathHugoIcon, fsPathHugoSavefiles, fsPathHugoScreenshots].forEach(function (path) { - if (fs.existsSync(path) == false) { - logger.info(`Creating Hugo output directory: ${path}`); - fs.mkdirSync(path); - } -}); +// Fetch all issues from Github. +var githubIssues = null; -try { - // Loop through each game folder. - getDirectories(fsPathCode).forEach(function(game) { - try { - if (game == '.git') { return; } - - logger.info(`Processing game: ${game}`); - - // Copy the boxart for the game. - fsextra.copySync(`${fsPathCode}/${game}/boxart.png`, `${fsPathHugoBoxart}/${game}.png`); - - // Copy the icon for the game. - fsextra.copySync(`${fsPathCode}/${game}/icon.png`, `${fsPathHugoIcon}/${game}.png`); - - var model = toml.parse(fs.readFileSync(`${fsPathCode}/${game}/game.dat`, 'utf8')); - let currentDate = new Date(); - model.date = `${currentDate.toISOString()}`; - - // SHORTCUTS BLOCK - // Parse testcase information out of the dat to reinject as shortcut values. - if (model.testcases == null || model.testcases.length == 0) { - model.compatibility = "99"; - model.testcase_date = "2000-01-01"; - } else { - let recent = model.testcases[0]; - model.compatibility = recent.compatibility; - model.testcase_date = recent.date; - } - // END SHORTCUTS BLOCK - - // SAVEFILE BLOCK - var fsPathCodeSavefilesGame = `${fsPathCode}/${game}/savefiles/`; - var fsPathHugoSavefilesGame = `${fsPathHugoSavefiles}/${game}/`; - if (fs.existsSync(fsPathCodeSavefilesGame)) { - // Create the savefile directory for the game. - if (fs.existsSync(fsPathHugoSavefilesGame) == false) { - fs.mkdirSync(fsPathHugoSavefilesGame); - } - - // Copy all savefiles into the output folder, and read their data. - model.savefiles = []; - fs.readdirSync(fsPathCodeSavefilesGame).forEach(file => { - if (path.extname(file) == '.zip') { - fsextra.copySync(`${fsPathCodeSavefilesGame}/${file}`, `${fsPathHugoSavefilesGame}/${file}`); - } else if (path.extname(file) == '.dat') { - // Read the data file into an object. - let savefile = toml.parse(fs.readFileSync(`${fsPathCodeSavefilesGame}/${file}`, 'utf8')); - - let stats = fs.statSync(`${fsPathCodeSavefilesGame}/${file}`); - - // Store the contents of the file in memory for adding it into the markdown later. - model.savefiles.push({ - date: new Date(util.inspect(stats.mtime)), - filename: file.replace('.dat', '.zip'), - title: savefile.title, - description: savefile.description, - author: savefile.author, - title_id: savefile.title_id - }); - } - }); - // Finished copying all savefiles into the output folder, and reading their data. - } - // END SAVEFILE BLOCK - - // Copy the screenshots for the game. - let fsPathScreenshotInputGame = `${fsPathCode}/${game}/screenshots/`; - let fsPathScreenshotOutputGame = `${fsPathHugoScreenshots}/${game}/`; - if (fs.existsSync(fsPathScreenshotInputGame)) { - // Create the savefile directory for each game. - if (fs.existsSync(fsPathScreenshotOutputGame) == false) { - fs.mkdirSync(fsPathScreenshotOutputGame); - } - - // Copy all screenshots into the output folder. - fs.readdirSync(fsPathScreenshotInputGame).forEach(file => { - if (path.extname(file) == '.png') { - fsextra.copySync(`${fsPathScreenshotInputGame}/${file}`, `${fsPathScreenshotOutputGame}/${file}`); - } - }); - } - - // WIKI BLOCK - var wikiText = ""; - let fsPathWikiGame = `${fsPathWiki}/${game}.md`; - if (fs.existsSync(fsPathWikiGame)) { - wikiText = fs.readFileSync(fsPathWikiGame, 'utf8'); - - // Fix Blackfriday markdown rendering differences. - wikiText = blackfriday.fixLists(wikiText); - wikiText = blackfriday.fixLinks(wikiText); - } else { - wikiText = "## No wiki exists yet for this game."; - } - // END WIKI BLOCK - - let modelText = tomlify(model, null, 2); - - let contentOutput = `+++\r\n${modelText}\r\n+++\r\n\r\n${wikiText}\r\n`; - fs.writeFileSync(`${fsPathHugoContent}/${game}.md`, contentOutput); - } catch (ex) { - logger.warn(`${game} failed to generate: ${ex}`); - logger.error(ex); +getGithubIssues() +.then(function(issues) { + logger.info(`Imported ${issues.length} issues from Github.`); + githubIssues = issues; +}) +.then(function() { + // Make sure the output directories in Hugo exist. + [fsPathHugoContent, fsPathHugoBoxart, fsPathHugoIcon, fsPathHugoSavefiles, fsPathHugoScreenshots].forEach(function (path) { + if (fs.existsSync(path) == false) { + logger.info(`Creating Hugo output directory: ${path}`); + fs.mkdirSync(path); } }); -} catch (ex) { - logger.error(ex); +}) +.then(function() { + // Loop through each game and process it. + getDirectories(fsPathCode).forEach(function(game) { + processGame(game); + }); +}) +.catch(function(err) { + logger.error(err); +}); + +function processGame(game) { + try { + if (game == '.git' || game == '_validation') { return; } + + logger.info(`Processing game: ${game}`); + + // Copy the boxart for the game. + fsextra.copySync(`${fsPathCode}/${game}/boxart.png`, `${fsPathHugoBoxart}/${game}.png`); + + // Copy the icon for the game. + fsextra.copySync(`${fsPathCode}/${game}/icon.png`, `${fsPathHugoIcon}/${game}.png`); + + var model = toml.parse(fs.readFileSync(`${fsPathCode}/${game}/game.dat`, 'utf8')); + let currentDate = new Date(); + model.date = `${currentDate.toISOString()}`; + + // SHORTCUTS BLOCK + // Parse testcase information out of the dat to reinject as shortcut values. + if (model.testcases == null || model.testcases.length == 0) { + model.compatibility = "99"; + model.testcase_date = "2000-01-01"; + } else { + let recent = model.testcases[0]; + model.compatibility = recent.compatibility; + model.testcase_date = recent.date; + } + // END SHORTCUTS BLOCK + + // SAVEFILE BLOCK + var fsPathCodeSavefilesGame = `${fsPathCode}/${game}/savefiles/`; + var fsPathHugoSavefilesGame = `${fsPathHugoSavefiles}/${game}/`; + if (fs.existsSync(fsPathCodeSavefilesGame)) { + // Create the savefile directory for the game. + if (fs.existsSync(fsPathHugoSavefilesGame) == false) { + fs.mkdirSync(fsPathHugoSavefilesGame); + } + + // Copy all savefiles into the output folder, and read their data. + model.savefiles = []; + fs.readdirSync(fsPathCodeSavefilesGame).forEach(file => { + if (path.extname(file) == '.zip') { + fsextra.copySync(`${fsPathCodeSavefilesGame}/${file}`, `${fsPathHugoSavefilesGame}/${file}`); + } else if (path.extname(file) == '.dat') { + // Read the data file into an object. + let savefile = toml.parse(fs.readFileSync(`${fsPathCodeSavefilesGame}/${file}`, 'utf8')); + + let stats = fs.statSync(`${fsPathCodeSavefilesGame}/${file}`); + + // Store the contents of the file in memory for adding it into the markdown later. + model.savefiles.push({ + date: new Date(util.inspect(stats.mtime)), + filename: file.replace('.dat', '.zip'), + title: savefile.title, + description: savefile.description, + author: savefile.author, + title_id: savefile.title_id + }); + } + }); + // Finished copying all savefiles into the output folder, and reading their data. + } + // END SAVEFILE BLOCK + + // GITHUB ISSUES BLOCK + if (model.github_issues != null && model.github_issues.length > 0) { + model.issues = []; + model.closed_issues = []; + + model.github_issues.forEach(function(number) { + let issue = githubIssues.find(x => x.number == number); + if (issue == null) { + model.closed_issues.push(number); + } else { + model.issues.push({ + number: issue.number.toString(), + title: issue.title, + state: issue.state, + created_at: issue.created_at, + updated_at: issue.updated_at, + labels: issue.labels.map(function(x) { return { name: x.name, color: x.color } }) + }); + } + }); + + github_issues = null; + } + // END GITHUB ISSUES BLOCK + + // Copy the screenshots for the game. + let fsPathScreenshotInputGame = `${fsPathCode}/${game}/screenshots/`; + let fsPathScreenshotOutputGame = `${fsPathHugoScreenshots}/${game}/`; + if (fs.existsSync(fsPathScreenshotInputGame)) { + // Create the savefile directory for each game. + if (fs.existsSync(fsPathScreenshotOutputGame) == false) { + fs.mkdirSync(fsPathScreenshotOutputGame); + } + + // Copy all screenshots into the output folder. + fs.readdirSync(fsPathScreenshotInputGame).forEach(file => { + if (path.extname(file) == '.png') { + fsextra.copySync(`${fsPathScreenshotInputGame}/${file}`, `${fsPathScreenshotOutputGame}/${file}`); + } + }); + } + + // WIKI BLOCK + var wikiText = ""; + let fsPathWikiGame = `${fsPathWiki}/${game}.md`; + if (fs.existsSync(fsPathWikiGame)) { + wikiText = fs.readFileSync(fsPathWikiGame, 'utf8'); + + // Fix Blackfriday markdown rendering differences. + wikiText = blackfriday.fixLists(wikiText); + wikiText = blackfriday.fixLinks(wikiText); + } else { + wikiText = "## No wiki exists yet for this game."; + } + // END WIKI BLOCK + + let modelText = tomlify(model, null, 2); + + let contentOutput = `+++\r\n${modelText}\r\n+++\r\n\r\n${wikiText}\r\n`; + fs.writeFileSync(`${fsPathHugoContent}/${game}.md`, contentOutput); + } catch (ex) { + logger.warn(`${game} failed to generate: ${ex}`); + logger.error(ex); + } } diff --git a/scripts/games/package.json b/scripts/games/package.json index 1d62f9c..b78fb9d 100644 --- a/scripts/games/package.json +++ b/scripts/games/package.json @@ -8,6 +8,8 @@ "dependencies": { "delete": "^0.3.2", "fs-extra": "^3.0.1", + "request": "^2.81.0", + "request-promise": "^4.2.1", "rimraf": "^2.6.1", "sanitize-html": "^1.14.1", "sync-exec": "^0.6.2", diff --git a/site/themes/citra-bs-theme/layouts/game/single.html b/site/themes/citra-bs-theme/layouts/game/single.html index b02893a..de2039e 100644 --- a/site/themes/citra-bs-theme/layouts/game/single.html +++ b/site/themes/citra-bs-theme/layouts/game/single.html @@ -99,38 +99,70 @@ {{ end }} {{ end }} - {{ if (where (readDir "/static/savefiles") "Name" .File.BaseFileName) }} -
-
-

Savefiles

- - - - - - - - - - - {{ range .Params.savefiles }} - - - - - - - {{ end }} - -
NameDescriptionUploaded ByDate
{{ .title }}{{ .description }}{{ .author }}{{ dateFormat "January 2, 2006" .date }}
-
+ +
+
+

Known Issues

+ {{- if isset .Params "issues" }} + + + + + + + + + + {{- range .Params.issues }} + + + + + + {{- end }} + +
TitleCreatedLast Updated
{{ .title }}{{ dateFormat "January 2, 2006" .created_at }}{{ dateFormat "January 2, 2006" .updated_at }}
+ {{- else }} +

No issues have been reported for this game.

+ {{- end }}
- {{ end }} +
- {{ if (where (readDir "/static/images/screenshots0") "Name" .File.BaseFileName) }} -
-
-

Screenshots

+ +
+
+

Savefiles

+ {{ if (where (readDir "/static/savefiles") "Name" .File.BaseFileName) }} + + + + + + + + + + + {{ range .Params.savefiles }} + + + + + + + {{ end }} + +
NameDescriptionUploaded ByDate
{{ .title }}{{ .description }}{{ .author }}{{ dateFormat "January 2, 2006" .date }}
+ {{ else }} +

No savefiles have been uploaded for this game.

+ {{ end }} +
+
+ +
+
+

Screenshots

+ {{ if (where (readDir "/static/images/screenshots0") "Name" .File.BaseFileName) }} {{ $files := readDir (printf "/static/images/screenshots0/%s/" .File.BaseFileName) }} {{ range $index, $element := $files }} {{ end }} -
+ {{ else }} +

No screenshots have been uploaded for this game.

+ {{ end }}
- {{ end }} - +
{{ end }} {{ define "scripts" }}