@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.
Files changed (257) hide show
  1. package/.github/workflows/npm-publish-github-packages.yml +56 -0
  2. package/.github/workflows/npm-publish.yml +71 -0
  3. package/CHANGELOG.md +36 -0
  4. package/CONTRIBUTING.md +217 -0
  5. package/DATA.md +292 -0
  6. package/README.md +206 -0
  7. package/data/genshinimpact/characters/albedo.json +11 -0
  8. package/data/genshinimpact/characters/alhaitham.json +12 -0
  9. package/data/genshinimpact/characters/aloy.json +11 -0
  10. package/data/genshinimpact/characters/amber.json +12 -0
  11. package/data/genshinimpact/characters/aratakiitto.json +12 -0
  12. package/data/genshinimpact/characters/arlecchino.json +12 -0
  13. package/data/genshinimpact/characters/baizhu.json +12 -0
  14. package/data/genshinimpact/characters/barbara.json +11 -0
  15. package/data/genshinimpact/characters/beidou.json +12 -0
  16. package/data/genshinimpact/characters/bennett.json +11 -0
  17. package/data/genshinimpact/characters/candace.json +12 -0
  18. package/data/genshinimpact/characters/charlotte.json +11 -0
  19. package/data/genshinimpact/characters/chasca.json +11 -0
  20. package/data/genshinimpact/characters/chevreuse.json +11 -0
  21. package/data/genshinimpact/characters/chiori.json +11 -0
  22. package/data/genshinimpact/characters/chongyun.json +12 -0
  23. package/data/genshinimpact/characters/citlali.json +11 -0
  24. package/data/genshinimpact/characters/clorinde.json +11 -0
  25. package/data/genshinimpact/characters/collei.json +12 -0
  26. package/data/genshinimpact/characters/cyno.json +12 -0
  27. package/data/genshinimpact/characters/dahlia.json +10 -0
  28. package/data/genshinimpact/characters/dehya.json +11 -0
  29. package/data/genshinimpact/characters/diluc.json +11 -0
  30. package/data/genshinimpact/characters/diona.json +11 -0
  31. package/data/genshinimpact/characters/dori.json +11 -0
  32. package/data/genshinimpact/characters/durin.json +11 -0
  33. package/data/genshinimpact/characters/emilie.json +11 -0
  34. package/data/genshinimpact/characters/escoffier.json +12 -0
  35. package/data/genshinimpact/characters/eula.json +11 -0
  36. package/data/genshinimpact/characters/faruzan.json +12 -0
  37. package/data/genshinimpact/characters/fischl.json +12 -0
  38. package/data/genshinimpact/characters/freminet.json +11 -0
  39. package/data/genshinimpact/characters/furina.json +12 -0
  40. package/data/genshinimpact/characters/gaming.json +11 -0
  41. package/data/genshinimpact/characters/ganyu.json +11 -0
  42. package/data/genshinimpact/characters/gorou.json +12 -0
  43. package/data/genshinimpact/characters/hutao.json +12 -0
  44. package/data/genshinimpact/characters/iansan.json +11 -0
  45. package/data/genshinimpact/characters/ineffa.json +11 -0
  46. package/data/genshinimpact/characters/jean.json +11 -0
  47. package/data/genshinimpact/characters/kachina.json +11 -0
  48. package/data/genshinimpact/characters/kaedeharakazuha.json +12 -0
  49. package/data/genshinimpact/characters/kaeya.json +11 -0
  50. package/data/genshinimpact/characters/kamisatoayaka.json +11 -0
  51. package/data/genshinimpact/characters/kamisatoayato.json +11 -0
  52. package/data/genshinimpact/characters/kaveh.json +12 -0
  53. package/data/genshinimpact/characters/keqing.json +11 -0
  54. package/data/genshinimpact/characters/kinich.json +11 -0
  55. package/data/genshinimpact/characters/kirara.json +11 -0
  56. package/data/genshinimpact/characters/klee.json +11 -0
  57. package/data/genshinimpact/characters/kujousara.json +11 -0
  58. package/data/genshinimpact/characters/kukishinobu.json +12 -0
  59. package/data/genshinimpact/characters/lanyan.json +11 -0
  60. package/data/genshinimpact/characters/layla.json +11 -0
  61. package/data/genshinimpact/characters/lisa.json +12 -0
  62. package/data/genshinimpact/characters/lohen.json +11 -0
  63. package/data/genshinimpact/characters/lynette.json +11 -0
  64. package/data/genshinimpact/characters/lyney.json +11 -0
  65. package/data/genshinimpact/characters/mavuika.json +11 -0
  66. package/data/genshinimpact/characters/mikaschmidt.json +11 -0
  67. package/data/genshinimpact/characters/mona.json +12 -0
  68. package/data/genshinimpact/characters/mualani.json +11 -0
  69. package/data/genshinimpact/characters/nahida.json +12 -0
  70. package/data/genshinimpact/characters/navia.json +11 -0
  71. package/data/genshinimpact/characters/neuvillette.json +11 -0
  72. package/data/genshinimpact/characters/nilou.json +11 -0
  73. package/data/genshinimpact/characters/ningguang.json +11 -0
  74. package/data/genshinimpact/characters/noelle.json +12 -0
  75. package/data/genshinimpact/characters/ororon.json +11 -0
  76. package/data/genshinimpact/characters/prune.json +10 -0
  77. package/data/genshinimpact/characters/qiqi.json +12 -0
  78. package/data/genshinimpact/characters/raidenshogun.json +12 -0
  79. package/data/genshinimpact/characters/razor.json +11 -0
  80. package/data/genshinimpact/characters/rosaria.json +12 -0
  81. package/data/genshinimpact/characters/sangonomiyakokomi.json +12 -0
  82. package/data/genshinimpact/characters/sayu.json +11 -0
  83. package/data/genshinimpact/characters/sethos.json +11 -0
  84. package/data/genshinimpact/characters/shenhe.json +12 -0
  85. package/data/genshinimpact/characters/shikanoinheizou.json +12 -0
  86. package/data/genshinimpact/characters/sigewinne.json +11 -0
  87. package/data/genshinimpact/characters/skirk.json +11 -0
  88. package/data/genshinimpact/characters/sucrose.json +12 -0
  89. package/data/genshinimpact/characters/thoma.json +11 -0
  90. package/data/genshinimpact/characters/tighnari.json +12 -0
  91. package/data/genshinimpact/characters/varesa.json +11 -0
  92. package/data/genshinimpact/characters/varka.json +10 -0
  93. package/data/genshinimpact/characters/venti.json +12 -0
  94. package/data/genshinimpact/characters/wanderer.json +11 -0
  95. package/data/genshinimpact/characters/wriothesley.json +12 -0
  96. package/data/genshinimpact/characters/xiangling.json +12 -0
  97. package/data/genshinimpact/characters/xianyun.json +11 -0
  98. package/data/genshinimpact/characters/xiao.json +11 -0
  99. package/data/genshinimpact/characters/xilonen.json +11 -0
  100. package/data/genshinimpact/characters/xingqiu.json +12 -0
  101. package/data/genshinimpact/characters/xinyan.json +12 -0
  102. package/data/genshinimpact/characters/yaemiko.json +12 -0
  103. package/data/genshinimpact/characters/yanfei.json +12 -0
  104. package/data/genshinimpact/characters/yaoyao.json +12 -0
  105. package/data/genshinimpact/characters/yelan.json +11 -0
  106. package/data/genshinimpact/characters/yoimiya.json +12 -0
  107. package/data/genshinimpact/characters/yumemizukimizuki.json +11 -0
  108. package/data/genshinimpact/characters/yunjin.json +11 -0
  109. package/data/genshinimpact/characters/zhongli.json +11 -0
  110. package/data/genshinimpact/characters/zibai.json +11 -0
  111. package/data/genshinimpact/meta.json +14 -0
  112. package/data/honkaistarrail/characters/acheron.json +12 -0
  113. package/data/honkaistarrail/characters/aglaea.json +12 -0
  114. package/data/honkaistarrail/characters/anaxa.json +12 -0
  115. package/data/honkaistarrail/characters/argenti.json +12 -0
  116. package/data/honkaistarrail/characters/arlan.json +12 -0
  117. package/data/honkaistarrail/characters/ashveil.json +12 -0
  118. package/data/honkaistarrail/characters/asta.json +12 -0
  119. package/data/honkaistarrail/characters/aventurine.json +12 -0
  120. package/data/honkaistarrail/characters/bailu.json +12 -0
  121. package/data/honkaistarrail/characters/blackswan.json +12 -0
  122. package/data/honkaistarrail/characters/blade.json +12 -0
  123. package/data/honkaistarrail/characters/boothill.json +12 -0
  124. package/data/honkaistarrail/characters/bronya.json +12 -0
  125. package/data/honkaistarrail/characters/castorice.json +12 -0
  126. package/data/honkaistarrail/characters/cerydra.json +12 -0
  127. package/data/honkaistarrail/characters/cipher.json +12 -0
  128. package/data/honkaistarrail/characters/clara.json +12 -0
  129. package/data/honkaistarrail/characters/constance.json +12 -0
  130. package/data/honkaistarrail/characters/cyrene.json +12 -0
  131. package/data/honkaistarrail/characters/danheng.json +12 -0
  132. package/data/honkaistarrail/characters/drratio.json +12 -0
  133. package/data/honkaistarrail/characters/feixiao.json +12 -0
  134. package/data/honkaistarrail/characters/firefly.json +12 -0
  135. package/data/honkaistarrail/characters/fuxuan.json +12 -0
  136. package/data/honkaistarrail/characters/gallagher.json +12 -0
  137. package/data/honkaistarrail/characters/gepard.json +12 -0
  138. package/data/honkaistarrail/characters/guinaifen.json +12 -0
  139. package/data/honkaistarrail/characters/hanya.json +12 -0
  140. package/data/honkaistarrail/characters/herta.json +12 -0
  141. package/data/honkaistarrail/characters/himeko.json +13 -0
  142. package/data/honkaistarrail/characters/hook.json +12 -0
  143. package/data/honkaistarrail/characters/huohuo.json +12 -0
  144. package/data/honkaistarrail/characters/hyacine.json +12 -0
  145. package/data/honkaistarrail/characters/hysilens.json +12 -0
  146. package/data/honkaistarrail/characters/jade.json +12 -0
  147. package/data/honkaistarrail/characters/jiaoqiu.json +12 -0
  148. package/data/honkaistarrail/characters/jingliu.json +12 -0
  149. package/data/honkaistarrail/characters/jingyuan.json +12 -0
  150. package/data/honkaistarrail/characters/kafka.json +12 -0
  151. package/data/honkaistarrail/characters/lingsha.json +12 -0
  152. package/data/honkaistarrail/characters/lisushang.json +12 -0
  153. package/data/honkaistarrail/characters/luka.json +12 -0
  154. package/data/honkaistarrail/characters/luocha.json +12 -0
  155. package/data/honkaistarrail/characters/lynx.json +12 -0
  156. package/data/honkaistarrail/characters/march7th.json +12 -0
  157. package/data/honkaistarrail/characters/misha.json +12 -0
  158. package/data/honkaistarrail/characters/moze.json +12 -0
  159. package/data/honkaistarrail/characters/mydei.json +12 -0
  160. package/data/honkaistarrail/characters/natasha.json +12 -0
  161. package/data/honkaistarrail/characters/pela.json +12 -0
  162. package/data/honkaistarrail/characters/phainon.json +12 -0
  163. package/data/honkaistarrail/characters/qingque.json +12 -0
  164. package/data/honkaistarrail/characters/rappa.json +12 -0
  165. package/data/honkaistarrail/characters/robin.json +12 -0
  166. package/data/honkaistarrail/characters/ruanmei.json +12 -0
  167. package/data/honkaistarrail/characters/sampo.json +12 -0
  168. package/data/honkaistarrail/characters/seele.json +12 -0
  169. package/data/honkaistarrail/characters/serval.json +12 -0
  170. package/data/honkaistarrail/characters/silverwolf.json +12 -0
  171. package/data/honkaistarrail/characters/sparkle.json +12 -0
  172. package/data/honkaistarrail/characters/tingyun.json +12 -0
  173. package/data/honkaistarrail/characters/topaz.json +12 -0
  174. package/data/honkaistarrail/characters/tribbie.json +12 -0
  175. package/data/honkaistarrail/characters/weltyang.json +12 -0
  176. package/data/honkaistarrail/characters/xueyi.json +12 -0
  177. package/data/honkaistarrail/characters/yanqing.json +12 -0
  178. package/data/honkaistarrail/characters/yaoguang.json +12 -0
  179. package/data/honkaistarrail/characters/yukong.json +12 -0
  180. package/data/honkaistarrail/characters/yunli.json +12 -0
  181. package/data/honkaistarrail/meta.json +14 -0
  182. package/data/nte/characters/adler.json +14 -0
  183. package/data/nte/characters/aurelia.json +14 -0
  184. package/data/nte/characters/baicang.json +14 -0
  185. package/data/nte/characters/chaos.json +14 -0
  186. package/data/nte/characters/chiz.json +14 -0
  187. package/data/nte/characters/daffodill.json +14 -0
  188. package/data/nte/characters/edgar.json +14 -0
  189. package/data/nte/characters/esperzero.json +14 -0
  190. package/data/nte/characters/fadia.json +14 -0
  191. package/data/nte/characters/haniel.json +14 -0
  192. package/data/nte/characters/hathor.json +14 -0
  193. package/data/nte/characters/hotori.json +14 -0
  194. package/data/nte/characters/iroi.json +14 -0
  195. package/data/nte/characters/jiuyuan.json +14 -0
  196. package/data/nte/characters/lacrimosa.json +14 -0
  197. package/data/nte/characters/mint.json +14 -0
  198. package/data/nte/characters/nanally.json +14 -0
  199. package/data/nte/characters/sakiri.json +14 -0
  200. package/data/nte/characters/shinku.json +14 -0
  201. package/data/nte/characters/skia.json +14 -0
  202. package/data/nte/meta.json +14 -0
  203. package/data/vrchat/groups/clubzodiac.json +7 -0
  204. package/data/vrchat/groups/dirtydancers.json +7 -0
  205. package/data/vrchat/groups/drumsynews.json +7 -0
  206. package/data/vrchat/groups/ebola20.json +7 -0
  207. package/data/vrchat/groups/internationaldancersassociation.json +7 -0
  208. package/data/vrchat/groups/kannagang.json +6 -0
  209. package/data/vrchat/groups/lolisquad.json +7 -0
  210. package/data/vrchat/groups/nekonightsnightclub.json +7 -0
  211. package/data/vrchat/groups/nekostudios.json +7 -0
  212. package/data/vrchat/groups/nekosunecommunity.json +7 -0
  213. package/data/vrchat/groups/voidclub.json +7 -0
  214. package/data/vrchat/groups/voltdanceclub.json +7 -0
  215. package/data/vrchat/groups/vrceventsgroup.json +7 -0
  216. package/data/vrchat/groups/vrchatcommunitydiscord.json +6 -0
  217. package/data/vrchat/meta.json +13 -0
  218. package/data/vrchat/players/alto.json +9 -0
  219. package/data/vrchat/players/arcadum.json +10 -0
  220. package/data/vrchat/players/chairhandler.json +9 -0
  221. package/data/vrchat/players/chipz.json +9 -0
  222. package/data/vrchat/players/hikarivr.json +10 -0
  223. package/data/vrchat/players/kimple.json +10 -0
  224. package/data/vrchat/players/linkzr.json +8 -0
  225. package/data/vrchat/players/nagzz21.json +9 -0
  226. package/data/vrchat/players/nebride.json +10 -0
  227. package/data/vrchat/players/nekosunevr.json +10 -0
  228. package/data/vrchat/players/pokelawls.json +9 -0
  229. package/data/vrchat/players/qwonk.json +8 -0
  230. package/data/vrchat/players/roflgator.json +10 -0
  231. package/data/vrchat/players/scifri.json +7 -0
  232. package/data/vrchat/players/sodapoppin.json +9 -0
  233. package/data/vrchat/players/woops.json +9 -0
  234. package/data/vrchat/players/zentreya.json +10 -0
  235. package/data/vrchat/worlds/ascensionacademy.json +7 -0
  236. package/data/vrchat/worlds/clubvgl.json +8 -0
  237. package/data/vrchat/worlds/fightfinder.json +8 -0
  238. package/data/vrchat/worlds/hangouthouse.json +7 -0
  239. package/data/vrchat/worlds/nekostudioshalloween.json +9 -0
  240. package/data/vrchat/worlds/nekostudiosnewyear.json +9 -0
  241. package/data/vrchat/worlds/nekostudiosxmas.json +9 -0
  242. package/data/vrchat/worlds/nekosunevranimations2023.json +9 -0
  243. package/data/vrchat/worlds/nekosunevranimations2024.json +9 -0
  244. package/data/vrchat/worlds/nekosunevranimations2025.json +9 -0
  245. package/data/vrchat/worlds/rumhamsavatarworld.json +7 -0
  246. package/data/vrchat/worlds/smewsranch.json +7 -0
  247. package/data/vrchat/worlds/smewsroom.json +7 -0
  248. package/data/vrchat/worlds/sunsetbar.json +7 -0
  249. package/data/vrchat/worlds/theblackcat.json +9 -0
  250. package/data/vrchat/worlds/thegreatpug.json +8 -0
  251. package/data/vrchat/worlds/themidnightbar.json +7 -0
  252. package/data/vrchat/worlds/voidclub.json +7 -0
  253. package/data/vrchat/worlds/voltdanceclub.json +7 -0
  254. package/data/vrchat/worlds/vrchathome.json +8 -0
  255. package/data/vrchat/worlds/whatalegend.json +6 -0
  256. package/index.js +207 -0
  257. 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
+
@@ -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
+ ```