@nekosuneprojects/gaming-infos 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/npm-publish-github-packages.yml +56 -0
- package/.github/workflows/npm-publish.yml +71 -0
- package/CHANGELOG.md +36 -0
- package/CONTRIBUTING.md +217 -0
- package/DATA.md +292 -0
- package/README.md +206 -0
- package/data/genshinimpact/characters/albedo.json +11 -0
- package/data/genshinimpact/characters/alhaitham.json +12 -0
- package/data/genshinimpact/characters/aloy.json +11 -0
- package/data/genshinimpact/characters/amber.json +12 -0
- package/data/genshinimpact/characters/aratakiitto.json +12 -0
- package/data/genshinimpact/characters/arlecchino.json +12 -0
- package/data/genshinimpact/characters/baizhu.json +12 -0
- package/data/genshinimpact/characters/barbara.json +11 -0
- package/data/genshinimpact/characters/beidou.json +12 -0
- package/data/genshinimpact/characters/bennett.json +11 -0
- package/data/genshinimpact/characters/candace.json +12 -0
- package/data/genshinimpact/characters/charlotte.json +11 -0
- package/data/genshinimpact/characters/chasca.json +11 -0
- package/data/genshinimpact/characters/chevreuse.json +11 -0
- package/data/genshinimpact/characters/chiori.json +11 -0
- package/data/genshinimpact/characters/chongyun.json +12 -0
- package/data/genshinimpact/characters/citlali.json +11 -0
- package/data/genshinimpact/characters/clorinde.json +11 -0
- package/data/genshinimpact/characters/collei.json +12 -0
- package/data/genshinimpact/characters/cyno.json +12 -0
- package/data/genshinimpact/characters/dahlia.json +10 -0
- package/data/genshinimpact/characters/dehya.json +11 -0
- package/data/genshinimpact/characters/diluc.json +11 -0
- package/data/genshinimpact/characters/diona.json +11 -0
- package/data/genshinimpact/characters/dori.json +11 -0
- package/data/genshinimpact/characters/durin.json +11 -0
- package/data/genshinimpact/characters/emilie.json +11 -0
- package/data/genshinimpact/characters/escoffier.json +12 -0
- package/data/genshinimpact/characters/eula.json +11 -0
- package/data/genshinimpact/characters/faruzan.json +12 -0
- package/data/genshinimpact/characters/fischl.json +12 -0
- package/data/genshinimpact/characters/freminet.json +11 -0
- package/data/genshinimpact/characters/furina.json +12 -0
- package/data/genshinimpact/characters/gaming.json +11 -0
- package/data/genshinimpact/characters/ganyu.json +11 -0
- package/data/genshinimpact/characters/gorou.json +12 -0
- package/data/genshinimpact/characters/hutao.json +12 -0
- package/data/genshinimpact/characters/iansan.json +11 -0
- package/data/genshinimpact/characters/ineffa.json +11 -0
- package/data/genshinimpact/characters/jean.json +11 -0
- package/data/genshinimpact/characters/kachina.json +11 -0
- package/data/genshinimpact/characters/kaedeharakazuha.json +12 -0
- package/data/genshinimpact/characters/kaeya.json +11 -0
- package/data/genshinimpact/characters/kamisatoayaka.json +11 -0
- package/data/genshinimpact/characters/kamisatoayato.json +11 -0
- package/data/genshinimpact/characters/kaveh.json +12 -0
- package/data/genshinimpact/characters/keqing.json +11 -0
- package/data/genshinimpact/characters/kinich.json +11 -0
- package/data/genshinimpact/characters/kirara.json +11 -0
- package/data/genshinimpact/characters/klee.json +11 -0
- package/data/genshinimpact/characters/kujousara.json +11 -0
- package/data/genshinimpact/characters/kukishinobu.json +12 -0
- package/data/genshinimpact/characters/lanyan.json +11 -0
- package/data/genshinimpact/characters/layla.json +11 -0
- package/data/genshinimpact/characters/lisa.json +12 -0
- package/data/genshinimpact/characters/lohen.json +11 -0
- package/data/genshinimpact/characters/lynette.json +11 -0
- package/data/genshinimpact/characters/lyney.json +11 -0
- package/data/genshinimpact/characters/mavuika.json +11 -0
- package/data/genshinimpact/characters/mikaschmidt.json +11 -0
- package/data/genshinimpact/characters/mona.json +12 -0
- package/data/genshinimpact/characters/mualani.json +11 -0
- package/data/genshinimpact/characters/nahida.json +12 -0
- package/data/genshinimpact/characters/navia.json +11 -0
- package/data/genshinimpact/characters/neuvillette.json +11 -0
- package/data/genshinimpact/characters/nilou.json +11 -0
- package/data/genshinimpact/characters/ningguang.json +11 -0
- package/data/genshinimpact/characters/noelle.json +12 -0
- package/data/genshinimpact/characters/ororon.json +11 -0
- package/data/genshinimpact/characters/prune.json +10 -0
- package/data/genshinimpact/characters/qiqi.json +12 -0
- package/data/genshinimpact/characters/raidenshogun.json +12 -0
- package/data/genshinimpact/characters/razor.json +11 -0
- package/data/genshinimpact/characters/rosaria.json +12 -0
- package/data/genshinimpact/characters/sangonomiyakokomi.json +12 -0
- package/data/genshinimpact/characters/sayu.json +11 -0
- package/data/genshinimpact/characters/sethos.json +11 -0
- package/data/genshinimpact/characters/shenhe.json +12 -0
- package/data/genshinimpact/characters/shikanoinheizou.json +12 -0
- package/data/genshinimpact/characters/sigewinne.json +11 -0
- package/data/genshinimpact/characters/skirk.json +11 -0
- package/data/genshinimpact/characters/sucrose.json +12 -0
- package/data/genshinimpact/characters/thoma.json +11 -0
- package/data/genshinimpact/characters/tighnari.json +12 -0
- package/data/genshinimpact/characters/varesa.json +11 -0
- package/data/genshinimpact/characters/varka.json +10 -0
- package/data/genshinimpact/characters/venti.json +12 -0
- package/data/genshinimpact/characters/wanderer.json +11 -0
- package/data/genshinimpact/characters/wriothesley.json +12 -0
- package/data/genshinimpact/characters/xiangling.json +12 -0
- package/data/genshinimpact/characters/xianyun.json +11 -0
- package/data/genshinimpact/characters/xiao.json +11 -0
- package/data/genshinimpact/characters/xilonen.json +11 -0
- package/data/genshinimpact/characters/xingqiu.json +12 -0
- package/data/genshinimpact/characters/xinyan.json +12 -0
- package/data/genshinimpact/characters/yaemiko.json +12 -0
- package/data/genshinimpact/characters/yanfei.json +12 -0
- package/data/genshinimpact/characters/yaoyao.json +12 -0
- package/data/genshinimpact/characters/yelan.json +11 -0
- package/data/genshinimpact/characters/yoimiya.json +12 -0
- package/data/genshinimpact/characters/yumemizukimizuki.json +11 -0
- package/data/genshinimpact/characters/yunjin.json +11 -0
- package/data/genshinimpact/characters/zhongli.json +11 -0
- package/data/genshinimpact/characters/zibai.json +11 -0
- package/data/genshinimpact/meta.json +14 -0
- package/data/honkaistarrail/characters/acheron.json +12 -0
- package/data/honkaistarrail/characters/aglaea.json +12 -0
- package/data/honkaistarrail/characters/anaxa.json +12 -0
- package/data/honkaistarrail/characters/argenti.json +12 -0
- package/data/honkaistarrail/characters/arlan.json +12 -0
- package/data/honkaistarrail/characters/ashveil.json +12 -0
- package/data/honkaistarrail/characters/asta.json +12 -0
- package/data/honkaistarrail/characters/aventurine.json +12 -0
- package/data/honkaistarrail/characters/bailu.json +12 -0
- package/data/honkaistarrail/characters/blackswan.json +12 -0
- package/data/honkaistarrail/characters/blade.json +12 -0
- package/data/honkaistarrail/characters/boothill.json +12 -0
- package/data/honkaistarrail/characters/bronya.json +12 -0
- package/data/honkaistarrail/characters/castorice.json +12 -0
- package/data/honkaistarrail/characters/cerydra.json +12 -0
- package/data/honkaistarrail/characters/cipher.json +12 -0
- package/data/honkaistarrail/characters/clara.json +12 -0
- package/data/honkaistarrail/characters/constance.json +12 -0
- package/data/honkaistarrail/characters/cyrene.json +12 -0
- package/data/honkaistarrail/characters/danheng.json +12 -0
- package/data/honkaistarrail/characters/drratio.json +12 -0
- package/data/honkaistarrail/characters/feixiao.json +12 -0
- package/data/honkaistarrail/characters/firefly.json +12 -0
- package/data/honkaistarrail/characters/fuxuan.json +12 -0
- package/data/honkaistarrail/characters/gallagher.json +12 -0
- package/data/honkaistarrail/characters/gepard.json +12 -0
- package/data/honkaistarrail/characters/guinaifen.json +12 -0
- package/data/honkaistarrail/characters/hanya.json +12 -0
- package/data/honkaistarrail/characters/herta.json +12 -0
- package/data/honkaistarrail/characters/himeko.json +13 -0
- package/data/honkaistarrail/characters/hook.json +12 -0
- package/data/honkaistarrail/characters/huohuo.json +12 -0
- package/data/honkaistarrail/characters/hyacine.json +12 -0
- package/data/honkaistarrail/characters/hysilens.json +12 -0
- package/data/honkaistarrail/characters/jade.json +12 -0
- package/data/honkaistarrail/characters/jiaoqiu.json +12 -0
- package/data/honkaistarrail/characters/jingliu.json +12 -0
- package/data/honkaistarrail/characters/jingyuan.json +12 -0
- package/data/honkaistarrail/characters/kafka.json +12 -0
- package/data/honkaistarrail/characters/lingsha.json +12 -0
- package/data/honkaistarrail/characters/lisushang.json +12 -0
- package/data/honkaistarrail/characters/luka.json +12 -0
- package/data/honkaistarrail/characters/luocha.json +12 -0
- package/data/honkaistarrail/characters/lynx.json +12 -0
- package/data/honkaistarrail/characters/march7th.json +12 -0
- package/data/honkaistarrail/characters/misha.json +12 -0
- package/data/honkaistarrail/characters/moze.json +12 -0
- package/data/honkaistarrail/characters/mydei.json +12 -0
- package/data/honkaistarrail/characters/natasha.json +12 -0
- package/data/honkaistarrail/characters/pela.json +12 -0
- package/data/honkaistarrail/characters/phainon.json +12 -0
- package/data/honkaistarrail/characters/qingque.json +12 -0
- package/data/honkaistarrail/characters/rappa.json +12 -0
- package/data/honkaistarrail/characters/robin.json +12 -0
- package/data/honkaistarrail/characters/ruanmei.json +12 -0
- package/data/honkaistarrail/characters/sampo.json +12 -0
- package/data/honkaistarrail/characters/seele.json +12 -0
- package/data/honkaistarrail/characters/serval.json +12 -0
- package/data/honkaistarrail/characters/silverwolf.json +12 -0
- package/data/honkaistarrail/characters/sparkle.json +12 -0
- package/data/honkaistarrail/characters/tingyun.json +12 -0
- package/data/honkaistarrail/characters/topaz.json +12 -0
- package/data/honkaistarrail/characters/tribbie.json +12 -0
- package/data/honkaistarrail/characters/weltyang.json +12 -0
- package/data/honkaistarrail/characters/xueyi.json +12 -0
- package/data/honkaistarrail/characters/yanqing.json +12 -0
- package/data/honkaistarrail/characters/yaoguang.json +12 -0
- package/data/honkaistarrail/characters/yukong.json +12 -0
- package/data/honkaistarrail/characters/yunli.json +12 -0
- package/data/honkaistarrail/meta.json +14 -0
- package/data/nte/characters/adler.json +14 -0
- package/data/nte/characters/aurelia.json +14 -0
- package/data/nte/characters/baicang.json +14 -0
- package/data/nte/characters/chaos.json +14 -0
- package/data/nte/characters/chiz.json +14 -0
- package/data/nte/characters/daffodill.json +14 -0
- package/data/nte/characters/edgar.json +14 -0
- package/data/nte/characters/esperzero.json +14 -0
- package/data/nte/characters/fadia.json +14 -0
- package/data/nte/characters/haniel.json +14 -0
- package/data/nte/characters/hathor.json +14 -0
- package/data/nte/characters/hotori.json +14 -0
- package/data/nte/characters/iroi.json +14 -0
- package/data/nte/characters/jiuyuan.json +14 -0
- package/data/nte/characters/lacrimosa.json +14 -0
- package/data/nte/characters/mint.json +14 -0
- package/data/nte/characters/nanally.json +14 -0
- package/data/nte/characters/sakiri.json +14 -0
- package/data/nte/characters/shinku.json +14 -0
- package/data/nte/characters/skia.json +14 -0
- package/data/nte/meta.json +14 -0
- package/data/vrchat/groups/clubzodiac.json +7 -0
- package/data/vrchat/groups/dirtydancers.json +7 -0
- package/data/vrchat/groups/drumsynews.json +7 -0
- package/data/vrchat/groups/ebola20.json +7 -0
- package/data/vrchat/groups/internationaldancersassociation.json +7 -0
- package/data/vrchat/groups/kannagang.json +6 -0
- package/data/vrchat/groups/lolisquad.json +7 -0
- package/data/vrchat/groups/nekonightsnightclub.json +7 -0
- package/data/vrchat/groups/nekostudios.json +7 -0
- package/data/vrchat/groups/nekosunecommunity.json +7 -0
- package/data/vrchat/groups/voidclub.json +7 -0
- package/data/vrchat/groups/voltdanceclub.json +7 -0
- package/data/vrchat/groups/vrceventsgroup.json +7 -0
- package/data/vrchat/groups/vrchatcommunitydiscord.json +6 -0
- package/data/vrchat/meta.json +13 -0
- package/data/vrchat/players/alto.json +9 -0
- package/data/vrchat/players/arcadum.json +10 -0
- package/data/vrchat/players/chairhandler.json +9 -0
- package/data/vrchat/players/chipz.json +9 -0
- package/data/vrchat/players/hikarivr.json +10 -0
- package/data/vrchat/players/kimple.json +10 -0
- package/data/vrchat/players/linkzr.json +8 -0
- package/data/vrchat/players/nagzz21.json +9 -0
- package/data/vrchat/players/nebride.json +10 -0
- package/data/vrchat/players/nekosunevr.json +10 -0
- package/data/vrchat/players/pokelawls.json +9 -0
- package/data/vrchat/players/qwonk.json +8 -0
- package/data/vrchat/players/roflgator.json +10 -0
- package/data/vrchat/players/scifri.json +7 -0
- package/data/vrchat/players/sodapoppin.json +9 -0
- package/data/vrchat/players/woops.json +9 -0
- package/data/vrchat/players/zentreya.json +10 -0
- package/data/vrchat/worlds/ascensionacademy.json +7 -0
- package/data/vrchat/worlds/clubvgl.json +8 -0
- package/data/vrchat/worlds/fightfinder.json +8 -0
- package/data/vrchat/worlds/hangouthouse.json +7 -0
- package/data/vrchat/worlds/nekostudioshalloween.json +9 -0
- package/data/vrchat/worlds/nekostudiosnewyear.json +9 -0
- package/data/vrchat/worlds/nekostudiosxmas.json +9 -0
- package/data/vrchat/worlds/nekosunevranimations2023.json +9 -0
- package/data/vrchat/worlds/nekosunevranimations2024.json +9 -0
- package/data/vrchat/worlds/nekosunevranimations2025.json +9 -0
- package/data/vrchat/worlds/rumhamsavatarworld.json +7 -0
- package/data/vrchat/worlds/smewsranch.json +7 -0
- package/data/vrchat/worlds/smewsroom.json +7 -0
- package/data/vrchat/worlds/sunsetbar.json +7 -0
- package/data/vrchat/worlds/theblackcat.json +9 -0
- package/data/vrchat/worlds/thegreatpug.json +8 -0
- package/data/vrchat/worlds/themidnightbar.json +7 -0
- package/data/vrchat/worlds/voidclub.json +7 -0
- package/data/vrchat/worlds/voltdanceclub.json +7 -0
- package/data/vrchat/worlds/vrchathome.json +8 -0
- package/data/vrchat/worlds/whatalegend.json +6 -0
- package/index.js +207 -0
- package/package.json +30 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: Node.js Package GitHub Mode
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types:
|
|
6
|
+
- published
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
issues: write
|
|
11
|
+
pull-requests: write
|
|
12
|
+
packages: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout repository
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Setup Node.js
|
|
22
|
+
uses: actions/setup-node@v4
|
|
23
|
+
with:
|
|
24
|
+
node-version: 24
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: npm ci
|
|
28
|
+
|
|
29
|
+
publish-gpr:
|
|
30
|
+
needs: build
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- name: Checkout repository
|
|
34
|
+
uses: actions/checkout@v4
|
|
35
|
+
|
|
36
|
+
- name: Setup Node.js for GitHub Packages
|
|
37
|
+
uses: actions/setup-node@v4
|
|
38
|
+
with:
|
|
39
|
+
node-version: 24
|
|
40
|
+
registry-url: https://npm.pkg.github.com/
|
|
41
|
+
|
|
42
|
+
- name: Install dependencies
|
|
43
|
+
run: npm ci
|
|
44
|
+
|
|
45
|
+
# Read version from package.json
|
|
46
|
+
- name: Read version from package.json
|
|
47
|
+
id: read_version
|
|
48
|
+
run: |
|
|
49
|
+
VERSION=$(node -p "require('./package.json').version")
|
|
50
|
+
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
|
51
|
+
|
|
52
|
+
# Publish package to GitHub Packages
|
|
53
|
+
- name: Publish to GitHub Packages
|
|
54
|
+
run: npm publish
|
|
55
|
+
env:
|
|
56
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: Node.js Package NPMJS
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types:
|
|
6
|
+
- published
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
issues: write
|
|
11
|
+
pull-requests: write
|
|
12
|
+
packages: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
release:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
# Checkout project repository
|
|
19
|
+
- name: Checkout
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
# Setup Node.js environment
|
|
23
|
+
- name: Setup Node.js
|
|
24
|
+
uses: actions/setup-node@v4
|
|
25
|
+
with:
|
|
26
|
+
node-version: '24'
|
|
27
|
+
registry-url: 'https://registry.npmjs.org/'
|
|
28
|
+
|
|
29
|
+
# Read current package version
|
|
30
|
+
- name: Read version from package.json
|
|
31
|
+
id: read_version
|
|
32
|
+
run: |
|
|
33
|
+
VERSION=$(node -p "require('./package.json').version")
|
|
34
|
+
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
|
35
|
+
|
|
36
|
+
# Publish version to npm
|
|
37
|
+
- name: Publish to npm
|
|
38
|
+
run: npm publish --access public
|
|
39
|
+
env:
|
|
40
|
+
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
|
|
41
|
+
|
|
42
|
+
# Read the release notes from the already-versioned changelog.
|
|
43
|
+
- id: get_changelog
|
|
44
|
+
name: Get version changelog
|
|
45
|
+
shell: bash
|
|
46
|
+
run: |
|
|
47
|
+
CHANGELOG=$(awk -v version="${VERSION}" '
|
|
48
|
+
$0 ~ "^## \\[?" version "\\]?([[:space:]]+-|$)" { found=1; next }
|
|
49
|
+
found && /^## / { exit }
|
|
50
|
+
found { print }
|
|
51
|
+
' CHANGELOG.md)
|
|
52
|
+
|
|
53
|
+
if [[ -z "${CHANGELOG}" ]]; then
|
|
54
|
+
echo "No changelog section found for version ${VERSION}" >&2
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
{
|
|
59
|
+
echo 'changelog<<CHANGELOG_EOF'
|
|
60
|
+
echo "${CHANGELOG}"
|
|
61
|
+
echo 'CHANGELOG_EOF'
|
|
62
|
+
} >> "${GITHUB_OUTPUT}"
|
|
63
|
+
|
|
64
|
+
# Update GitHub release
|
|
65
|
+
- name: Create or update GitHub Release
|
|
66
|
+
uses: softprops/action-gh-release@v2
|
|
67
|
+
with:
|
|
68
|
+
tag_name: v${{ env.VERSION }}
|
|
69
|
+
body: ${{ steps.get_changelog.outputs.changelog }}
|
|
70
|
+
env:
|
|
71
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## Unreleased
|
|
9
|
+
|
|
10
|
+
## 2.1.0 - 2026-08-02
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `List(game, type)` returns every entry of a type for a game, e.g. `List('genshinimpact', 'characters')` returns all 104 character objects. Tries the API's list endpoint first, falls back to reading the local folder.
|
|
14
|
+
- `Games()` returns every supported game's meta info in one call. Tries the API's root list endpoint first, falls back to reading every local `meta.json`.
|
|
15
|
+
- Added 68 Honkai: Star Rail character records, completing the bundled 69-character dataset alongside the existing Himeko record.
|
|
16
|
+
- Added 12 VRChat group records, 15 player records, and 20 world records.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- Character/entity entries that have no verified working image now use `"image": ""` instead of a `"TODO: ..."` placeholder string.
|
|
20
|
+
- Expanded the README with `Games()` and `List(game, type)` usage and documented how consumers should handle empty image values.
|
|
21
|
+
- Updated the API integration guide for the all-games, type-list, single-entity, and game-meta routes, including endpoint registration and response shapes.
|
|
22
|
+
- Split the combined NekoSuneVR Animations 2023-2024 world record into individual 2023 and 2024 records and added a 2025 record.
|
|
23
|
+
|
|
24
|
+
## 2.0.0 - 2026-08-02
|
|
25
|
+
|
|
26
|
+
### Changed (Breaking)
|
|
27
|
+
- Renamed package from `vrchat-infos` to `gaming-infos` to reflect multi-game support (VRChat today, Genshin Impact and more coming soon).
|
|
28
|
+
- `data/` is now scoped per game: `data/<game>/worlds`, `data/<game>/groups`, `data/<game>/players`, `data/<game>/meta.json`. VRChat data moved under `data/vrchat/`.
|
|
29
|
+
- Every lookup function now takes a `game` as its first argument, e.g. `Worlds('vrchat', 'theblackcat')` instead of `Worlds('theblackcat')`.
|
|
30
|
+
- Added `Game(game)` for game-level meta info, `Characters(game, name)` for character-based games, and a generic `Get(game, type, name)` escape hatch.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
- Lookups now try the NekoSuneVR V5 API first (`GAMING_INFOS_API_BASE`, default `https://api.nekosunevr.co.uk`) and fall back to the bundled local JSON if the API is unreachable, so data can be updated in real time without republishing this package. Set `GAMING_INFOS_DISABLE_API=1` to force local-only lookups.
|
|
34
|
+
- Added `genshinimpact`, `nte` (Neverness to Everness), and `honkaistarrail` games, each with `meta.json`.
|
|
35
|
+
- Added all 104 currently-released Genshin Impact characters, all 20 currently-playable NTE characters, and all 69 currently-released Honkai: Star Rail characters under their respective `data/<game>/characters/` folders.
|
|
36
|
+
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# 🤝 Contributing to @nekosuneprojects/gaming-infos
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to **@nekosuneprojects/gaming-infos**!
|
|
4
|
+
This project relies on community help to keep game data organized, accurate, and friendly — across every game it covers,
|
|
5
|
+
not just VRChat.
|
|
6
|
+
|
|
7
|
+
Please read this guide carefully **before submitting a Pull Request (PR)**.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 🦊 Overview
|
|
12
|
+
|
|
13
|
+
This project provides **community game info** — worlds, groups, players, characters, and more — in JSON format, used by
|
|
14
|
+
scripts and tools. Data lives in the `data/` folder, scoped per game:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
data/
|
|
18
|
+
└── <game>/
|
|
19
|
+
├── meta.json
|
|
20
|
+
├── worlds/
|
|
21
|
+
├── groups/
|
|
22
|
+
├── players/
|
|
23
|
+
└── characters/
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Each JSON file represents a public piece of info about a world, group, player, or character for that game.
|
|
27
|
+
Not every game uses every folder — e.g. VRChat uses `worlds`/`groups`/`players`, while a character-driven game like
|
|
28
|
+
Genshin Impact mainly uses `characters`. Use the `Get(game, type, name)` function for any entity type a new game
|
|
29
|
+
needs that isn't already listed above.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## ✅ Contribution Rules
|
|
34
|
+
|
|
35
|
+
### 1. Permission & Privacy
|
|
36
|
+
|
|
37
|
+
- Only include **publicly available data** or **data you have explicit permission** to share.
|
|
38
|
+
- If the data comes from **private profiles, Discord servers, or DMs**, **do not submit it**.
|
|
39
|
+
- You must **ask permission** from the world/group/player/character owner if the information is not publicly listed.
|
|
40
|
+
- Do **not** upload personal or sensitive details under any circumstance.
|
|
41
|
+
|
|
42
|
+
### 2. Accepted Public Sources
|
|
43
|
+
|
|
44
|
+
You may use:
|
|
45
|
+
- Official game wikis/fandoms (e.g. [VRChat Legends (Fandom)](https://vrchat-legends.fandom.com), official Genshin Impact wiki, etc.)
|
|
46
|
+
- Official game pages, group listings, or public user profiles.
|
|
47
|
+
- Other verified public sources (must be referenced in the PR description).
|
|
48
|
+
|
|
49
|
+
If the source is not verifiable or permission is unclear, your PR will be closed.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 🚫 Community & Safety Guidelines
|
|
54
|
+
|
|
55
|
+
All contributions must comply with the relevant game's Terms of Service and Community Guidelines, e.g. for VRChat:
|
|
56
|
+
|
|
57
|
+
- **VRChat's Terms of Service**:
|
|
58
|
+
[https://hello.vrchat.com/legal](https://hello.vrchat.com/legal)
|
|
59
|
+
|
|
60
|
+
- **VRChat's Community Guidelines**:
|
|
61
|
+
[https://hello.vrchat.com/community-guidelines](https://hello.vrchat.com/community-guidelines)
|
|
62
|
+
|
|
63
|
+
### Forbidden Content:
|
|
64
|
+
- Harassment, bullying, or targeted remarks.
|
|
65
|
+
- Doxxing or sharing private user data.
|
|
66
|
+
- Hate speech, NSFW content, or anything that violates a game's ToS or GitHub rules.
|
|
67
|
+
- False, misleading, or defamatory information.
|
|
68
|
+
|
|
69
|
+
Such PRs will be rejected and may result in a report to platform moderators.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 🖼️ Image Requirement
|
|
74
|
+
|
|
75
|
+
Every JSON file **must include an `image` field** linking to a **safe, representative image** (world thumbnail, group
|
|
76
|
+
logo, avatar/character art).
|
|
77
|
+
|
|
78
|
+
Example:
|
|
79
|
+
```json
|
|
80
|
+
"image": "https://example.com/images/world.png"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Images must not contain:
|
|
84
|
+
- Private or copyrighted art without permission.
|
|
85
|
+
- NSFW or offensive visuals.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 🧩 JSON Format Guidelines
|
|
90
|
+
|
|
91
|
+
Follow these formats exactly when adding files. New games should follow the same shape for whichever entity types
|
|
92
|
+
apply to them.
|
|
93
|
+
|
|
94
|
+
### 🌍 Worlds (`data/<game>/worlds/worldname.json`)
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"name": "The Black Cat",
|
|
98
|
+
"title": "Main Hall",
|
|
99
|
+
"creator": "spookyghostboo",
|
|
100
|
+
"aliases": "Black Cat",
|
|
101
|
+
"image": "https://example.com/images/world.jpg",
|
|
102
|
+
"description": "A cozy hangout world for friends.",
|
|
103
|
+
"url": "VRCHAT WORLD URL"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 👥 Groups (`data/<game>/groups/groupname.json`)
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"name": "NekoSune Community",
|
|
111
|
+
"owner": "NekoSuneVR",
|
|
112
|
+
"image": "https://example.com/images/group.png",
|
|
113
|
+
"description": "A friendly VRChat group for chill vibes and fun events.",
|
|
114
|
+
"url": "VRCHAT GROUP URL"
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 🧍 Players (`data/<game>/players/playername.json`)
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"name": "NekoSuneVR",
|
|
122
|
+
"title": "The Cutie Streamer",
|
|
123
|
+
"species": "half human - half catgirl",
|
|
124
|
+
"gender": "Male",
|
|
125
|
+
"aliases": "ChisdealHDYT, Chisdeal2013, Chisdeal2014, ChisdealHD, progamer-gr, DarkBlackWolfs",
|
|
126
|
+
"image": "https://media.discordapp.net/attachments/794229972490387496/794231249652678696/VRChat_1920x1080_2020-09-14_09-22-18.855.png",
|
|
127
|
+
"description": "A long time ago, Wild Player Chisdeal2013 (later known as ChisdealHDYT). He had been hanging out in a place called [The Black Cat](https://vrchat-legends.fandom.com/wiki/The_Black_Cat), [The Great Pug](https://vrchat-legends.fandom.com/wiki/The_Great_Pug) and [Japan Shrine (ITOAR)](https://vrchat-legends.fandom.com/wiki/Japan_Shrine_(ITOAR)). He had been talking about how he wanted to be Popular on [Twitch](https://twitch.tv/chisdealhdyt) and [TikTok](https://www.tiktok.com/@chisdealhd) / [YouTube](https://www.youtube.com/chisdealhd). Then he did started to streaming on Twitch and Upload Videos on TikTok / YouTube. He loves interest Cryptocurrency Money making and has lot support from [ZENZO Community](https://zenzo.io). He building Community with VRChat, Warframe and many more. He want become as VTuber as Twitch and doing a lot of VR Gaming. That dream is coming very soon in stage getting VR Headset and Brand new VR Ready PC.\n\nYou should Support this Cutie Streamer much on your Heart it can go.",
|
|
128
|
+
"url": "https://creator.nekosunevr.co.uk"
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 🧝 Characters (`data/<game>/characters/charactername.json`)
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"name": "Amber",
|
|
136
|
+
"quote": "Outrider Amber, at the ready!",
|
|
137
|
+
"cv": "Iwami Manaka",
|
|
138
|
+
"description": "A perky, straightforward girl, who is also the only Outrider of the Knights of Favonius.",
|
|
139
|
+
"image": "https://uploadstatic-sea.mihoyo.com/contentweb/20191009/2019100914372396510.png",
|
|
140
|
+
"city": "Mondstadt",
|
|
141
|
+
"url": "https://genshin.mihoyo.com/en/character/mondstadt?char=1",
|
|
142
|
+
"element": "Pyro",
|
|
143
|
+
"weapon": "Bow",
|
|
144
|
+
"rating": 4
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
`element` stays a plain string (icon mapping is a consumer-side concern, not stored here).
|
|
148
|
+
`rating` is the in-game star rarity (1-5) as a number. Include whatever fields apply to that
|
|
149
|
+
game's characters (`cv`, `city`, etc.) and drop what doesn't.
|
|
150
|
+
|
|
151
|
+
### 🎮 Game meta (`data/<game>/meta.json`)
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"name": "Genshin Impact",
|
|
155
|
+
"title": "An open-world action RPG developed by HoYoverse.",
|
|
156
|
+
"engine": "Unity",
|
|
157
|
+
"Platform": "PC, PlayStation, iOS, Android",
|
|
158
|
+
"Release date": "September 28, 2020",
|
|
159
|
+
"Genre": "Action RPG, Open World, Gacha",
|
|
160
|
+
"developers": "HoYoverse",
|
|
161
|
+
"aliases": "GI, Genshin",
|
|
162
|
+
"image": "https://example.com/images/genshin-logo.png",
|
|
163
|
+
"description": "Short factual description of the game.",
|
|
164
|
+
"url": "https://en.wikipedia.org/wiki/Genshin_Impact"
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 🪶 How to Submit a Pull Request
|
|
171
|
+
|
|
172
|
+
1. **Fork** this repository.
|
|
173
|
+
2. **Create a new branch** for your changes:
|
|
174
|
+
```bash
|
|
175
|
+
git checkout -b add-new-world
|
|
176
|
+
```
|
|
177
|
+
3. Add or update JSON files under `data/<game>/...`. If adding a **new game**, create `data/<newgame>/meta.json`
|
|
178
|
+
plus whichever entity folders apply (`worlds`, `groups`, `players`, `characters`, or a new type via `Get()`).
|
|
179
|
+
4. Ensure your files are valid JSON and properly formatted.
|
|
180
|
+
5. **Commit and push** your changes:
|
|
181
|
+
```bash
|
|
182
|
+
git commit -m "Add Example World info"
|
|
183
|
+
git push origin add-new-world
|
|
184
|
+
```
|
|
185
|
+
6. **Open a Pull Request** on GitHub with:
|
|
186
|
+
- A clear title (e.g., "Add Genshin Impact character Furina")
|
|
187
|
+
- A short explanation
|
|
188
|
+
- Source links or permissions if applicable
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 🔍 Before Submitting
|
|
193
|
+
|
|
194
|
+
✅ Validate your JSON syntax using:
|
|
195
|
+
```bash
|
|
196
|
+
npm run lint
|
|
197
|
+
```
|
|
198
|
+
(if available) or an online JSON validator.
|
|
199
|
+
|
|
200
|
+
✅ Make sure:
|
|
201
|
+
- You have **permission** to share the content.
|
|
202
|
+
- The **image link** works and is safe.
|
|
203
|
+
- The **file name matches the item name** (lowercase recommended).
|
|
204
|
+
- The file is in the correct `data/<game>/<type>/` folder.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 🧠 Final Notes
|
|
209
|
+
|
|
210
|
+
- This project is **game-friendly** and follows all relevant ToS and Community Guidelines.
|
|
211
|
+
- The maintainers reserve the right to remove or edit contributions that break policy.
|
|
212
|
+
- All content remains under the [MIT License](LICENSE) unless otherwise noted.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
🐾 Maintained by **NekoSune Projects**
|
|
217
|
+
💬 Community contributions are welcome — just keep it kind, safe, and respectful!
|
package/DATA.md
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# Gaming Infos — Data & API Spec
|
|
2
|
+
|
|
3
|
+
> **Forward this file into `V5_REBUILD_GREEN`.** It's the shared spec between the
|
|
4
|
+
> `@nekosuneprojects/gaming-infos` npm package and the V5 API. The npm package now calls the API
|
|
5
|
+
> first for live data and only falls back to its own bundled JSON if the API is unreachable — so
|
|
6
|
+
> once this is wired up here, the game/character list can be updated in real time by editing JSON
|
|
7
|
+
> in this repo, without ever needing to bump the npm package version.
|
|
8
|
+
|
|
9
|
+
## What this covers
|
|
10
|
+
|
|
11
|
+
Community info about games — worlds, groups, players, characters, and whatever else a future game
|
|
12
|
+
needs — as small JSON files. Today: VRChat. Coming soon: Genshin Impact, and more. Each game only
|
|
13
|
+
uses the entity types that make sense for it (VRChat: worlds/groups/players. A character-driven
|
|
14
|
+
game like Genshin Impact: mostly characters.).
|
|
15
|
+
|
|
16
|
+
This is **not** the same thing as the existing `src/routes/v5/games/*` routes (Destiny2, Fortnite,
|
|
17
|
+
Hypixel, VRChat profile lookup, etc.) — those pull *live player/account stats* from third-party
|
|
18
|
+
game APIs. `gaming-infos` is curated, hand-written community reference data (bios, lore, links),
|
|
19
|
+
served as static JSON.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Where the JSON lives
|
|
24
|
+
|
|
25
|
+
Create this folder structure under the API project root:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
V5_REBUILD_GREEN/
|
|
29
|
+
└── data/
|
|
30
|
+
└── gaming-infos/
|
|
31
|
+
└── <game>/
|
|
32
|
+
├── meta.json
|
|
33
|
+
├── worlds/<name>.json
|
|
34
|
+
├── groups/<name>.json
|
|
35
|
+
├── players/<name>.json
|
|
36
|
+
└── characters/<name>.json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Rules:
|
|
40
|
+
- `<game>` is lowercase, no spaces, e.g. `vrchat`, `genshinimpact`.
|
|
41
|
+
- `<name>` (the filename, minus `.json`) is lowercase, no spaces, e.g. `theblackcat.json`, `furina.json`.
|
|
42
|
+
- Only create the entity folders a game actually uses — don't create empty `worlds/` for a game with no worlds.
|
|
43
|
+
- `meta.json` holds game-level info (see schema below) and is required for every game.
|
|
44
|
+
|
|
45
|
+
This mirrors the npm package's own `data/<game>/...` layout 1:1, so JSON can be copied between the
|
|
46
|
+
two repos without any transformation.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 2. JSON schemas
|
|
51
|
+
|
|
52
|
+
### Game meta — `data/gaming-infos/<game>/meta.json`
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"name": "Genshin Impact",
|
|
56
|
+
"title": "An open-world action RPG developed by HoYoverse.",
|
|
57
|
+
"engine": "Unity",
|
|
58
|
+
"Platform": "PC, PlayStation, iOS, Android",
|
|
59
|
+
"Release date": "September 28, 2020",
|
|
60
|
+
"Genre": "Action RPG, Open World, Gacha",
|
|
61
|
+
"developers": "HoYoverse",
|
|
62
|
+
"aliases": "GI, Genshin",
|
|
63
|
+
"image": "https://example.com/images/genshin-logo.png",
|
|
64
|
+
"description": "Short factual description of the game.",
|
|
65
|
+
"url": "https://en.wikipedia.org/wiki/Genshin_Impact"
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### World — `data/gaming-infos/<game>/worlds/<name>.json`
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"name": "The Black Cat",
|
|
73
|
+
"title": "Main Hall",
|
|
74
|
+
"creator": "spookyghostboo",
|
|
75
|
+
"aliases": "Black Cat",
|
|
76
|
+
"image": "https://example.com/images/world.jpg",
|
|
77
|
+
"description": "A cozy hangout world for friends.",
|
|
78
|
+
"url": "VRCHAT WORLD URL"
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Group — `data/gaming-infos/<game>/groups/<name>.json`
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"name": "NekoSune Community",
|
|
86
|
+
"owner": "NekoSuneVR",
|
|
87
|
+
"image": "https://example.com/images/group.png",
|
|
88
|
+
"description": "A friendly VRChat group for chill vibes and fun events.",
|
|
89
|
+
"url": "VRCHAT GROUP URL"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Player — `data/gaming-infos/<game>/players/<name>.json`
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"name": "NekoSuneVR",
|
|
97
|
+
"title": "The Cutie Streamer",
|
|
98
|
+
"species": "half human - half catgirl",
|
|
99
|
+
"gender": "Male",
|
|
100
|
+
"aliases": "ChisdealHDYT, Chisdeal2013",
|
|
101
|
+
"image": "https://example.com/images/nekosunevr.png",
|
|
102
|
+
"description": "Bio text, markdown links allowed.",
|
|
103
|
+
"url": "https://creator.nekosunevr.co.uk"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Character — `data/gaming-infos/<game>/characters/<name>.json`
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"name": "Amber",
|
|
111
|
+
"quote": "Outrider Amber, at the ready!",
|
|
112
|
+
"cv": "Iwami Manaka",
|
|
113
|
+
"description": "A perky, straightforward girl, who is also the only Outrider of the Knights of Favonius.",
|
|
114
|
+
"image": "https://uploadstatic-sea.mihoyo.com/contentweb/20191009/2019100914372396510.png",
|
|
115
|
+
"city": "Mondstadt",
|
|
116
|
+
"url": "https://genshin.mihoyo.com/en/character/mondstadt?char=1",
|
|
117
|
+
"element": "Pyro",
|
|
118
|
+
"weapon": "Bow",
|
|
119
|
+
"rating": 4
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
- `element` is a plain string (Pyro/Hydro/Electro/Cryo/Anemo/Geo/Dendro) — no icon URL stored here;
|
|
123
|
+
element -> icon mapping is a consumer-side concern.
|
|
124
|
+
- `rating` is the in-game star rarity (1-5) as a number.
|
|
125
|
+
- `cv` (voice actor) and `city` are Genshin-specific; other character-driven games can drop/replace
|
|
126
|
+
them with whatever fields fit (e.g. a fighting game might use `moveset` instead of `city`).
|
|
127
|
+
|
|
128
|
+
Every entity JSON has an `image` field. When you have a verified, safe (non-NSFW, not privately
|
|
129
|
+
owned without permission) working URL, use it. When you don't, leave it as an **empty string**
|
|
130
|
+
(`"image": ""`) — never fill it with a placeholder/TODO string, since that gets treated as real
|
|
131
|
+
data by consumers.
|
|
132
|
+
|
|
133
|
+
If a game needs an entity type not listed above (e.g. `weapons`, `regions`, `guilds`), just add a
|
|
134
|
+
new folder following the same `data/gaming-infos/<game>/<type>/<name>.json` pattern — the npm
|
|
135
|
+
package's `Get(game, type, name)` function reads any type generically.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 3. Sourcing & safety rules
|
|
140
|
+
|
|
141
|
+
- Only use **publicly available** info, or info you have explicit permission to publish.
|
|
142
|
+
- Never include data from private profiles, private Discords, or DMs.
|
|
143
|
+
- No harassment, doxxing, defamation, or NSFW content.
|
|
144
|
+
- Respect each game's Terms of Service / Community Guidelines (e.g. VRChat's
|
|
145
|
+
[ToS](https://hello.vrchat.com/legal) and [Community Guidelines](https://hello.vrchat.com/community-guidelines)).
|
|
146
|
+
- Prefer official wikis/fandoms and official game pages as sources; note the source in your PR/commit if unclear.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 4. Wiring up the API route
|
|
151
|
+
|
|
152
|
+
Follow the existing pattern used by every other file in `src/routes/v5/games/*`
|
|
153
|
+
(`checkEndpointEnabled` + `requireApiKeyIfNeeded` middleware, mounted under `/v5/games/api/...`).
|
|
154
|
+
|
|
155
|
+
There are four routes: list all games, list all entries of a type for a game, a single entity, and
|
|
156
|
+
game meta (meta is just the single-entity route with `type` fixed to `meta`).
|
|
157
|
+
|
|
158
|
+
1. Create `src/routes/v5/games/gaminginfos.js`:
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
const express = require('express');
|
|
162
|
+
const fs = require('fs');
|
|
163
|
+
const path = require('path');
|
|
164
|
+
const { checkEndpointEnabled, requireApiKeyIfNeeded } = require('../../../middleware/apiAccess');
|
|
165
|
+
|
|
166
|
+
const router = express.Router({ strict: false });
|
|
167
|
+
const DATA_DIR = path.join(__dirname, '..', '..', '..', '..', 'data', 'gaming-infos');
|
|
168
|
+
|
|
169
|
+
function readJson(filePath) {
|
|
170
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// GET /v5/games/api/gaming-infos — list every game's meta info
|
|
174
|
+
router.get('/', checkEndpointEnabled, requireApiKeyIfNeeded, (req, res) => {
|
|
175
|
+
try {
|
|
176
|
+
const entries = fs.readdirSync(DATA_DIR, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
177
|
+
const gamesList = entries
|
|
178
|
+
.map((e) => path.join(DATA_DIR, e.name, 'meta.json'))
|
|
179
|
+
.filter((metaPath) => fs.existsSync(metaPath))
|
|
180
|
+
.map(readJson);
|
|
181
|
+
return res.status(200).json({ success: true, data: gamesList });
|
|
182
|
+
} catch (err) {
|
|
183
|
+
return res.status(500).json({ success: false, error: 'Failed to list games.' });
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// GET /v5/games/api/gaming-infos/:game/:type — list every entry of that type for a game
|
|
188
|
+
router.get('/:game/:type', checkEndpointEnabled, requireApiKeyIfNeeded, (req, res) => {
|
|
189
|
+
const { game, type } = req.params;
|
|
190
|
+
const dir = path.join(DATA_DIR, game.toLowerCase(), type.toLowerCase());
|
|
191
|
+
|
|
192
|
+
if (!dir.startsWith(DATA_DIR) || !fs.existsSync(dir)) {
|
|
193
|
+
return res.status(404).json({ success: false, error: `No ${type} data found for game "${game}"` });
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
const items = fs.readdirSync(dir).filter((f) => f.endsWith('.json')).map((f) => readJson(path.join(dir, f)));
|
|
198
|
+
return res.status(200).json({ success: true, data: items });
|
|
199
|
+
} catch (err) {
|
|
200
|
+
return res.status(500).json({ success: false, error: 'Failed to list gaming-infos entries.' });
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// GET /v5/games/api/gaming-infos/:game/:type/:name — a single entity, or game meta when type === "meta"
|
|
205
|
+
router.get('/:game/:type/:name', checkEndpointEnabled, requireApiKeyIfNeeded, (req, res) => {
|
|
206
|
+
const { game, type, name } = req.params;
|
|
207
|
+
const filePath = type.toLowerCase() === 'meta'
|
|
208
|
+
? path.join(DATA_DIR, game.toLowerCase(), 'meta.json')
|
|
209
|
+
: path.join(DATA_DIR, game.toLowerCase(), type.toLowerCase(), `${name.toLowerCase()}.json`);
|
|
210
|
+
|
|
211
|
+
if (!filePath.startsWith(DATA_DIR) || !fs.existsSync(filePath)) {
|
|
212
|
+
return res.status(404).json({ success: false, error: `${type} "${name}" not found for game "${game}"` });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
return res.status(200).json({ success: true, data: readJson(filePath) });
|
|
217
|
+
} catch (err) {
|
|
218
|
+
return res.status(500).json({ success: false, error: 'Failed to read gaming-infos data.' });
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
module.exports = router;
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
2. Register it in `src/app.js` next to the other game routes:
|
|
226
|
+
|
|
227
|
+
```js
|
|
228
|
+
const gamingInfosRoutes = require('./routes/v5/games/gaminginfos');
|
|
229
|
+
// ...
|
|
230
|
+
app.use('/v5/games/api/gaming-infos', gamingInfosRoutes);
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
3. Add the endpoint(s) to `DEFAULT_ENDPOINTS` in `src/services/bootstrap.js` so
|
|
234
|
+
`checkEndpointEnabled` accepts them (same convention as every other `games/api/*` entry):
|
|
235
|
+
|
|
236
|
+
```js
|
|
237
|
+
{
|
|
238
|
+
path: '/v5/games/api/gaming-infos',
|
|
239
|
+
method: 'GET',
|
|
240
|
+
isEnabled: true,
|
|
241
|
+
requiresApiKey: false,
|
|
242
|
+
description: 'List every game with gaming-infos data'
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
path: '/v5/games/api/gaming-infos/:game/:type',
|
|
246
|
+
method: 'GET',
|
|
247
|
+
isEnabled: true,
|
|
248
|
+
requiresApiKey: false,
|
|
249
|
+
description: 'List every gaming-infos entry of a type for a game'
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
path: '/v5/games/api/gaming-infos/:game/:type/:name',
|
|
253
|
+
method: 'GET',
|
|
254
|
+
isEnabled: true,
|
|
255
|
+
requiresApiKey: false,
|
|
256
|
+
description: 'Community gaming-infos single-entity lookup (worlds/groups/players/characters/meta/etc.)'
|
|
257
|
+
},
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
`bootstrapData()` (called on every app startup in `src/app.js`) runs `seedEndpoints()`, which
|
|
261
|
+
`findOrCreate`s each `DEFAULT_ENDPOINTS` row into the `EndpointToggle` table — so these three
|
|
262
|
+
entries go live (and show up on `/docs` automatically, since that page renders straight from
|
|
263
|
+
`EndpointToggle`) the next time the server restarts. No manual DB or docs-page edit needed.
|
|
264
|
+
|
|
265
|
+
The npm package expects responses shaped as `{ success: true, data: {...} }` (or a bare JSON object/array —
|
|
266
|
+
it accepts either) and defaults to `https://api.nekosunevr.co.uk/v5/games/api/gaming-infos` as the
|
|
267
|
+
base URL. If the real public host differs, override it per-consumer via the `GAMING_INFOS_API_BASE`
|
|
268
|
+
env var — nothing here needs to change either way. The npm package's `Games()` calls the root route,
|
|
269
|
+
`List(game, type)` calls the two-segment route, and everything else calls the three-segment route.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 5. Prompt template — adding/updating a game or entry
|
|
274
|
+
|
|
275
|
+
Copy-paste this (filling in the brackets) when asking an AI assistant to add or refresh gaming-infos
|
|
276
|
+
data in this repo:
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
Add/update gaming-infos data in this repo (data/gaming-infos/), following DATA.md:
|
|
280
|
+
|
|
281
|
+
- Game: <e.g. Genshin Impact>
|
|
282
|
+
- Entity type: <world|group|player|character|other>
|
|
283
|
+
- Name(s): <e.g. Furina, Nahida>
|
|
284
|
+
- Source(s): <official wiki/page URL(s) — public only, no private info>
|
|
285
|
+
|
|
286
|
+
Look up current, accurate public info for each name above, write one JSON file per entry at
|
|
287
|
+
data/gaming-infos/<game>/<type>/<lowercase-name>.json matching the schema in DATA.md section 2
|
|
288
|
+
(include a working, safe image URL), and create/update data/gaming-infos/<game>/meta.json if this
|
|
289
|
+
is a new game. Don't touch the API route code unless it doesn't exist yet for this game group —
|
|
290
|
+
DATA.md section 4 has the route setup if needed. Skip anything that isn't publicly sourced or
|
|
291
|
+
permissioned.
|
|
292
|
+
```
|