Add game endpoints

This commit is contained in:
Sam Carlton 2020-11-20 15:30:37 -06:00
parent 474c06738d
commit 61268576e1
4 changed files with 241 additions and 2 deletions

1
.gitignore vendored
View file

@ -84,3 +84,4 @@ dist
# Other
/app-list.json
/README-temp.md
/game-list.json

123
helpers/build-game-list.js Normal file
View file

@ -0,0 +1,123 @@
import { promises as fs } from 'fs'
import slugify from 'slugify'
import axios from 'axios'
import { statuses } from './build-app-list'
// console.log('process.env.GAMES_SOURCE', process.env.GAMES_SOURCE)
// export const statuses = {
// '✅': 'native',
// '✳️': 'rosetta',
// '⏹': 'no-in-progress',
// '🚫': 'no'
// }
const statusesTranslations = {
'Native': 'native',
'Rosetta': 'rosetta',
// '': 'no'
}
const statusesMessages = {
'native': '✅ Yes, Full Native Apple Silicon Support',
'rosetta': '✳️ Yes, works via Rosetta 2',
'no': '🚫 No, not yet supported only works on Intel-based Macs'
}
function parseStatus(game) {
if (game.Playable === 'no') return 'no'
// Match status to Sheet Status
return statusesTranslations[game['Native/Rosetta']]
// for (const statusKey in statusesTranslations) {
// console.log("game['Native/Rosetta']", game['Native/Rosetta'])
// console.log('statuses[statusKey]', statusesTranslations[game['Native/Rosetta']])
// if (game['Native/Rosetta'].includes(statusKey)) {
// return statusesTranslations[statusKey]
// }
// }
}
export default async function () {
// Fetch Sheet data
const gamesSheet = await axios
.get(process.env.GAMES_SOURCE)
.then(function (response) {
// handle success
return response.data.records
})
.catch(function (error) {
// handle error
console.log(error);
})
const gameList = []
// console.log('gamesSheet', gamesSheet)
for (const game of gamesSheet) {
// If there's no title
// then stop
if (game.Games.length === 0) continue
// If there's no 'Native/Rosetta' status
// then stop
if (game['Native/Rosetta'].length === 0) continue
// Generate slug
const slug = slugify(game.Games, {
lower: true,
strict: true
})
// Find index of game is list so far
const gameIndex = gameList.findIndex(game => {
return game.slug === slug
})
// Game already has entry
if (gameIndex !== -1) continue
const status = parseStatus(game)
// console.log('status', status)
gameList.push({
name: game.Games,
status,
url: `https://rawg.io/search?query=${encodeURIComponent(game.Games)}`,
text: statusesMessages[status],
slug,
section: {
label: 'Games',
slug: 'games'
},
content: '',
relatedLinks: [],
reports: [
game
]
})
}
// console.log('gameList', gameList)
return gameList
// fs.readFile('../README.md', 'utf8')
// .then((err, data) => {
// const result = md.parse(data)
// console.log('result', result)
// return result
// })
}

View file

@ -3,22 +3,35 @@ import path from 'path'
import pkg from './package'
import buildAppList from './helpers/build-app-list.js'
import buildGamesList from './helpers/build-game-list.js'
const storeAppList = async function (builder) {
// TODO: Make DRY
const appListPath = path.join(
// builder.nuxt.options.buildDir,
builder.nuxt.options.srcDir,
'/app-list.json'
)
const gamesListPath = path.join(
// builder.nuxt.options.buildDir,
builder.nuxt.options.srcDir,
'/game-list.json'
)
const appList = await buildAppList()
const gamesList = await buildGamesList()
// console.log('builder.nuxt.options', builder.nuxt.options)
await fs.writeFile(appListPath, JSON.stringify(appList))
await fs.writeFile(gamesListPath, JSON.stringify(gamesList))
}
// console.log('process.env.GAMES_SOURCE', process.env.GAMES_SOURCE)
export default {
target: 'static',
@ -43,9 +56,16 @@ export default {
]
},
routes() {
return import('./app-list.json')//buildAppList()
.then((importedAppList) => {
return Promise.all([
import('./app-list.json'),
import('./game-list.json')
])
.then(([
importedAppList,
importedGameList
]) => {
const appList = importedAppList.default
const gameList = importedGameList.default
// console.log('appList', appList)
const appRoutes = appList.map(app => ({
@ -53,6 +73,11 @@ export default {
// payload: appList
}))
const gameRoutes = gameList.map(game => ({
route: '/game/' + game.slug,
// payload: appList
}))
const sectionList = []
appList.forEach(app => {
@ -68,6 +93,7 @@ export default {
return [
...appRoutes,
...gameRoutes,
...sectionRoutes
]
})

89
pages/game/_slug.vue Normal file
View file

@ -0,0 +1,89 @@
<template>
<section class="container py-32">
<div class="flex flex-col items-center text-center">
<h1 class="title text-sm md:text-2xl font-semibold">
Does {{ app.name }} work on Apple Silicon?
</h1>
<h2 class="subtitle text-2xl md:text-5xl font-bold py-6">
{{ app.text }}
</h2>
<!-- <div class="subscribe space-y-6 sm:space-x-6 mb-4">
<EmailSubscribe
:app-name="app.name"
/>
</div> -->
<div class="links space-y-6 sm:space-x-6">
<LinkButton
v-for="(link, i) in app.relatedLinks"
:key="i"
:href="link.href"
target="_blank"
class=""
>{{ (i === 0) ? 'View' : link.label }}</LinkButton>
</div>
<small>
<span>Data generously provided by </span>
<span>
<a
href="https://twitter.com/__tosh"
class="font-bold"
>Thomas Schranz</a>
</span>
<span>via</span>
<span>
<a
href="https://docs.google.com/spreadsheets/d/1er-NivvuIheDmIKBVRu3S_BzA_lZT5z3Z-CxQZ-uPVs/edit#gid=0"
class="font-bold"
>Games and Apps on Apple Silicon</a>
</span>
</small>
<div class="report-links py-24 shadow-none">
<!-- https://eric.blog/2016/01/08/prefilling-github-issues/ -->
<a
:href="`https://docs.google.com/spreadsheets/d/1er-NivvuIheDmIKBVRu3S_BzA_lZT5z3Z-CxQZ-uPVs/edit#gid=0`"
target="_blank"
class="text-xs"
rel="noopener"
>Report Update</a>
</div>
</div>
</section>
</template>
<script>
import LinkButton from '~/components/link-button.vue'
import EmailSubscribe from '~/components/email-subscribe.vue'
import gameList from '~/game-list.json'
// import buildAppList from '~/helpers/build-app-list'
export default {
components: {
LinkButton,
EmailSubscribe
},
async asyncData ({ params: { slug } }) {
return {
slug,
app: gameList.find(app => (app.slug === slug))
}
},
head() {
return {
title: `Does ${this.app.name} work on Apple Silicon?`,
// meta: [
// // hid is used as unique identifier. Do not use `vmid` for it as it will not work
// {
// hid: 'description',
// name: 'description',
// content: 'My custom description'
// }
// ]
}
}
}
</script>