@nekosuneprojects/gaming-infos 2.2.0 → 3.0.1

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 (277) hide show
  1. package/CHANGELOG.md +77 -3
  2. package/README.md +62 -495
  3. package/index.js +3 -223
  4. package/package.json +53 -46
  5. package/src/providers/vrchat.js +11 -0
  6. package/src/providers/warframe.js +7 -0
  7. package/src/registry.js +23 -0
  8. package/.github/workflows/npm-publish-github-packages.yml +0 -56
  9. package/.github/workflows/npm-publish.yml +0 -71
  10. package/.github/workflows/sync-api-cache.yml +0 -72
  11. package/CACHE_SYNC.md +0 -172
  12. package/CONTRIBUTING.md +0 -217
  13. package/DATA.md +0 -292
  14. package/data/arknightsendfield/meta.json +0 -14
  15. package/data/fortnite/meta.json +0 -14
  16. package/data/game-codes/.gitkeep +0 -0
  17. package/data/genshinimpact/characters/albedo.json +0 -11
  18. package/data/genshinimpact/characters/alhaitham.json +0 -12
  19. package/data/genshinimpact/characters/aloy.json +0 -11
  20. package/data/genshinimpact/characters/amber.json +0 -12
  21. package/data/genshinimpact/characters/aratakiitto.json +0 -12
  22. package/data/genshinimpact/characters/arlecchino.json +0 -12
  23. package/data/genshinimpact/characters/baizhu.json +0 -12
  24. package/data/genshinimpact/characters/barbara.json +0 -11
  25. package/data/genshinimpact/characters/beidou.json +0 -12
  26. package/data/genshinimpact/characters/bennett.json +0 -11
  27. package/data/genshinimpact/characters/candace.json +0 -12
  28. package/data/genshinimpact/characters/charlotte.json +0 -11
  29. package/data/genshinimpact/characters/chasca.json +0 -11
  30. package/data/genshinimpact/characters/chevreuse.json +0 -11
  31. package/data/genshinimpact/characters/chiori.json +0 -11
  32. package/data/genshinimpact/characters/chongyun.json +0 -12
  33. package/data/genshinimpact/characters/citlali.json +0 -11
  34. package/data/genshinimpact/characters/clorinde.json +0 -11
  35. package/data/genshinimpact/characters/collei.json +0 -12
  36. package/data/genshinimpact/characters/cyno.json +0 -12
  37. package/data/genshinimpact/characters/dahlia.json +0 -10
  38. package/data/genshinimpact/characters/dehya.json +0 -11
  39. package/data/genshinimpact/characters/diluc.json +0 -11
  40. package/data/genshinimpact/characters/diona.json +0 -11
  41. package/data/genshinimpact/characters/dori.json +0 -11
  42. package/data/genshinimpact/characters/durin.json +0 -11
  43. package/data/genshinimpact/characters/emilie.json +0 -11
  44. package/data/genshinimpact/characters/escoffier.json +0 -12
  45. package/data/genshinimpact/characters/eula.json +0 -11
  46. package/data/genshinimpact/characters/faruzan.json +0 -12
  47. package/data/genshinimpact/characters/fischl.json +0 -12
  48. package/data/genshinimpact/characters/freminet.json +0 -11
  49. package/data/genshinimpact/characters/furina.json +0 -12
  50. package/data/genshinimpact/characters/gaming.json +0 -11
  51. package/data/genshinimpact/characters/ganyu.json +0 -11
  52. package/data/genshinimpact/characters/gorou.json +0 -12
  53. package/data/genshinimpact/characters/hutao.json +0 -12
  54. package/data/genshinimpact/characters/iansan.json +0 -11
  55. package/data/genshinimpact/characters/ineffa.json +0 -11
  56. package/data/genshinimpact/characters/jean.json +0 -11
  57. package/data/genshinimpact/characters/kachina.json +0 -11
  58. package/data/genshinimpact/characters/kaedeharakazuha.json +0 -12
  59. package/data/genshinimpact/characters/kaeya.json +0 -11
  60. package/data/genshinimpact/characters/kamisatoayaka.json +0 -11
  61. package/data/genshinimpact/characters/kamisatoayato.json +0 -11
  62. package/data/genshinimpact/characters/kaveh.json +0 -12
  63. package/data/genshinimpact/characters/keqing.json +0 -11
  64. package/data/genshinimpact/characters/kinich.json +0 -11
  65. package/data/genshinimpact/characters/kirara.json +0 -11
  66. package/data/genshinimpact/characters/klee.json +0 -11
  67. package/data/genshinimpact/characters/kujousara.json +0 -11
  68. package/data/genshinimpact/characters/kukishinobu.json +0 -12
  69. package/data/genshinimpact/characters/lanyan.json +0 -11
  70. package/data/genshinimpact/characters/layla.json +0 -11
  71. package/data/genshinimpact/characters/lisa.json +0 -12
  72. package/data/genshinimpact/characters/lohen.json +0 -11
  73. package/data/genshinimpact/characters/lynette.json +0 -11
  74. package/data/genshinimpact/characters/lyney.json +0 -11
  75. package/data/genshinimpact/characters/mavuika.json +0 -11
  76. package/data/genshinimpact/characters/mikaschmidt.json +0 -11
  77. package/data/genshinimpact/characters/mona.json +0 -12
  78. package/data/genshinimpact/characters/mualani.json +0 -11
  79. package/data/genshinimpact/characters/nahida.json +0 -12
  80. package/data/genshinimpact/characters/navia.json +0 -11
  81. package/data/genshinimpact/characters/neuvillette.json +0 -11
  82. package/data/genshinimpact/characters/nilou.json +0 -11
  83. package/data/genshinimpact/characters/ningguang.json +0 -11
  84. package/data/genshinimpact/characters/noelle.json +0 -12
  85. package/data/genshinimpact/characters/ororon.json +0 -11
  86. package/data/genshinimpact/characters/prune.json +0 -10
  87. package/data/genshinimpact/characters/qiqi.json +0 -12
  88. package/data/genshinimpact/characters/raidenshogun.json +0 -12
  89. package/data/genshinimpact/characters/razor.json +0 -11
  90. package/data/genshinimpact/characters/rosaria.json +0 -12
  91. package/data/genshinimpact/characters/sangonomiyakokomi.json +0 -12
  92. package/data/genshinimpact/characters/sayu.json +0 -11
  93. package/data/genshinimpact/characters/sethos.json +0 -11
  94. package/data/genshinimpact/characters/shenhe.json +0 -12
  95. package/data/genshinimpact/characters/shikanoinheizou.json +0 -12
  96. package/data/genshinimpact/characters/sigewinne.json +0 -11
  97. package/data/genshinimpact/characters/skirk.json +0 -11
  98. package/data/genshinimpact/characters/sucrose.json +0 -12
  99. package/data/genshinimpact/characters/thoma.json +0 -11
  100. package/data/genshinimpact/characters/tighnari.json +0 -12
  101. package/data/genshinimpact/characters/varesa.json +0 -11
  102. package/data/genshinimpact/characters/varka.json +0 -10
  103. package/data/genshinimpact/characters/venti.json +0 -12
  104. package/data/genshinimpact/characters/wanderer.json +0 -11
  105. package/data/genshinimpact/characters/wriothesley.json +0 -12
  106. package/data/genshinimpact/characters/xiangling.json +0 -12
  107. package/data/genshinimpact/characters/xianyun.json +0 -11
  108. package/data/genshinimpact/characters/xiao.json +0 -11
  109. package/data/genshinimpact/characters/xilonen.json +0 -11
  110. package/data/genshinimpact/characters/xingqiu.json +0 -12
  111. package/data/genshinimpact/characters/xinyan.json +0 -12
  112. package/data/genshinimpact/characters/yaemiko.json +0 -12
  113. package/data/genshinimpact/characters/yanfei.json +0 -12
  114. package/data/genshinimpact/characters/yaoyao.json +0 -12
  115. package/data/genshinimpact/characters/yelan.json +0 -11
  116. package/data/genshinimpact/characters/yoimiya.json +0 -12
  117. package/data/genshinimpact/characters/yumemizukimizuki.json +0 -11
  118. package/data/genshinimpact/characters/yunjin.json +0 -11
  119. package/data/genshinimpact/characters/zhongli.json +0 -11
  120. package/data/genshinimpact/characters/zibai.json +0 -11
  121. package/data/genshinimpact/meta.json +0 -14
  122. package/data/honkaistarrail/characters/acheron.json +0 -12
  123. package/data/honkaistarrail/characters/aglaea.json +0 -12
  124. package/data/honkaistarrail/characters/anaxa.json +0 -12
  125. package/data/honkaistarrail/characters/argenti.json +0 -12
  126. package/data/honkaistarrail/characters/arlan.json +0 -12
  127. package/data/honkaistarrail/characters/ashveil.json +0 -12
  128. package/data/honkaistarrail/characters/asta.json +0 -12
  129. package/data/honkaistarrail/characters/aventurine.json +0 -12
  130. package/data/honkaistarrail/characters/bailu.json +0 -12
  131. package/data/honkaistarrail/characters/blackswan.json +0 -12
  132. package/data/honkaistarrail/characters/blade.json +0 -12
  133. package/data/honkaistarrail/characters/boothill.json +0 -12
  134. package/data/honkaistarrail/characters/bronya.json +0 -12
  135. package/data/honkaistarrail/characters/castorice.json +0 -12
  136. package/data/honkaistarrail/characters/cerydra.json +0 -12
  137. package/data/honkaistarrail/characters/cipher.json +0 -12
  138. package/data/honkaistarrail/characters/clara.json +0 -12
  139. package/data/honkaistarrail/characters/constance.json +0 -12
  140. package/data/honkaistarrail/characters/cyrene.json +0 -12
  141. package/data/honkaistarrail/characters/danheng.json +0 -12
  142. package/data/honkaistarrail/characters/drratio.json +0 -12
  143. package/data/honkaistarrail/characters/feixiao.json +0 -12
  144. package/data/honkaistarrail/characters/firefly.json +0 -12
  145. package/data/honkaistarrail/characters/fuxuan.json +0 -12
  146. package/data/honkaistarrail/characters/gallagher.json +0 -12
  147. package/data/honkaistarrail/characters/gepard.json +0 -12
  148. package/data/honkaistarrail/characters/guinaifen.json +0 -12
  149. package/data/honkaistarrail/characters/hanya.json +0 -12
  150. package/data/honkaistarrail/characters/herta.json +0 -12
  151. package/data/honkaistarrail/characters/himeko.json +0 -13
  152. package/data/honkaistarrail/characters/hook.json +0 -12
  153. package/data/honkaistarrail/characters/huohuo.json +0 -12
  154. package/data/honkaistarrail/characters/hyacine.json +0 -12
  155. package/data/honkaistarrail/characters/hysilens.json +0 -12
  156. package/data/honkaistarrail/characters/jade.json +0 -12
  157. package/data/honkaistarrail/characters/jiaoqiu.json +0 -12
  158. package/data/honkaistarrail/characters/jingliu.json +0 -12
  159. package/data/honkaistarrail/characters/jingyuan.json +0 -12
  160. package/data/honkaistarrail/characters/kafka.json +0 -12
  161. package/data/honkaistarrail/characters/lingsha.json +0 -12
  162. package/data/honkaistarrail/characters/lisushang.json +0 -12
  163. package/data/honkaistarrail/characters/luka.json +0 -12
  164. package/data/honkaistarrail/characters/luocha.json +0 -12
  165. package/data/honkaistarrail/characters/lynx.json +0 -12
  166. package/data/honkaistarrail/characters/march7th.json +0 -12
  167. package/data/honkaistarrail/characters/misha.json +0 -12
  168. package/data/honkaistarrail/characters/moze.json +0 -12
  169. package/data/honkaistarrail/characters/mydei.json +0 -12
  170. package/data/honkaistarrail/characters/natasha.json +0 -12
  171. package/data/honkaistarrail/characters/pela.json +0 -12
  172. package/data/honkaistarrail/characters/phainon.json +0 -12
  173. package/data/honkaistarrail/characters/qingque.json +0 -12
  174. package/data/honkaistarrail/characters/rappa.json +0 -12
  175. package/data/honkaistarrail/characters/robin.json +0 -12
  176. package/data/honkaistarrail/characters/ruanmei.json +0 -12
  177. package/data/honkaistarrail/characters/sampo.json +0 -12
  178. package/data/honkaistarrail/characters/seele.json +0 -12
  179. package/data/honkaistarrail/characters/serval.json +0 -12
  180. package/data/honkaistarrail/characters/silverwolf.json +0 -12
  181. package/data/honkaistarrail/characters/sparkle.json +0 -12
  182. package/data/honkaistarrail/characters/tingyun.json +0 -12
  183. package/data/honkaistarrail/characters/topaz.json +0 -12
  184. package/data/honkaistarrail/characters/tribbie.json +0 -12
  185. package/data/honkaistarrail/characters/weltyang.json +0 -12
  186. package/data/honkaistarrail/characters/xueyi.json +0 -12
  187. package/data/honkaistarrail/characters/yanqing.json +0 -12
  188. package/data/honkaistarrail/characters/yaoguang.json +0 -12
  189. package/data/honkaistarrail/characters/yukong.json +0 -12
  190. package/data/honkaistarrail/characters/yunli.json +0 -12
  191. package/data/honkaistarrail/meta.json +0 -14
  192. package/data/nte/characters/adler.json +0 -14
  193. package/data/nte/characters/aurelia.json +0 -14
  194. package/data/nte/characters/baicang.json +0 -14
  195. package/data/nte/characters/chaos.json +0 -14
  196. package/data/nte/characters/chiz.json +0 -14
  197. package/data/nte/characters/daffodill.json +0 -14
  198. package/data/nte/characters/edgar.json +0 -14
  199. package/data/nte/characters/esperzero.json +0 -14
  200. package/data/nte/characters/fadia.json +0 -14
  201. package/data/nte/characters/haniel.json +0 -14
  202. package/data/nte/characters/hathor.json +0 -14
  203. package/data/nte/characters/hotori.json +0 -14
  204. package/data/nte/characters/iroi.json +0 -14
  205. package/data/nte/characters/jiuyuan.json +0 -14
  206. package/data/nte/characters/lacrimosa.json +0 -14
  207. package/data/nte/characters/mint.json +0 -14
  208. package/data/nte/characters/nanally.json +0 -14
  209. package/data/nte/characters/sakiri.json +0 -14
  210. package/data/nte/characters/shinku.json +0 -14
  211. package/data/nte/characters/skia.json +0 -14
  212. package/data/nte/meta.json +0 -14
  213. package/data/toweroffantasy/meta.json +0 -14
  214. package/data/vrchat/avatars/.gitkeep +0 -0
  215. package/data/vrchat/groups/clubzodiac.json +0 -7
  216. package/data/vrchat/groups/dirtydancers.json +0 -7
  217. package/data/vrchat/groups/drumsynews.json +0 -7
  218. package/data/vrchat/groups/ebola20.json +0 -7
  219. package/data/vrchat/groups/internationaldancersassociation.json +0 -7
  220. package/data/vrchat/groups/kannagang.json +0 -6
  221. package/data/vrchat/groups/lolisquad.json +0 -7
  222. package/data/vrchat/groups/nekonightsnightclub.json +0 -7
  223. package/data/vrchat/groups/nekostudios.json +0 -7
  224. package/data/vrchat/groups/nekosunecommunity.json +0 -7
  225. package/data/vrchat/groups/voidclub.json +0 -7
  226. package/data/vrchat/groups/voltdanceclub.json +0 -7
  227. package/data/vrchat/groups/vrceventsgroup.json +0 -7
  228. package/data/vrchat/groups/vrchatcommunitydiscord.json +0 -6
  229. package/data/vrchat/meta.json +0 -13
  230. package/data/vrchat/players/alto.json +0 -9
  231. package/data/vrchat/players/arcadum.json +0 -10
  232. package/data/vrchat/players/chairhandler.json +0 -9
  233. package/data/vrchat/players/chipz.json +0 -9
  234. package/data/vrchat/players/hikarivr.json +0 -10
  235. package/data/vrchat/players/kimple.json +0 -10
  236. package/data/vrchat/players/linkzr.json +0 -8
  237. package/data/vrchat/players/nagzz21.json +0 -9
  238. package/data/vrchat/players/nebride.json +0 -10
  239. package/data/vrchat/players/nekosunevr.json +0 -10
  240. package/data/vrchat/players/pokelawls.json +0 -9
  241. package/data/vrchat/players/qwonk.json +0 -8
  242. package/data/vrchat/players/roflgator.json +0 -10
  243. package/data/vrchat/players/scifri.json +0 -7
  244. package/data/vrchat/players/sodapoppin.json +0 -9
  245. package/data/vrchat/players/woops.json +0 -9
  246. package/data/vrchat/players/zentreya.json +0 -10
  247. package/data/vrchat/worlds/ascensionacademy.json +0 -7
  248. package/data/vrchat/worlds/clubvgl.json +0 -8
  249. package/data/vrchat/worlds/fightfinder.json +0 -8
  250. package/data/vrchat/worlds/hangouthouse.json +0 -7
  251. package/data/vrchat/worlds/nekostudioshalloween.json +0 -9
  252. package/data/vrchat/worlds/nekostudiosnewyear.json +0 -9
  253. package/data/vrchat/worlds/nekostudiosxmas.json +0 -9
  254. package/data/vrchat/worlds/nekosunevranimations2023.json +0 -9
  255. package/data/vrchat/worlds/nekosunevranimations2024.json +0 -9
  256. package/data/vrchat/worlds/nekosunevranimations2025.json +0 -9
  257. package/data/vrchat/worlds/rumhamsavatarworld.json +0 -7
  258. package/data/vrchat/worlds/smewsranch.json +0 -7
  259. package/data/vrchat/worlds/smewsroom.json +0 -7
  260. package/data/vrchat/worlds/sunsetbar.json +0 -7
  261. package/data/vrchat/worlds/theblackcat.json +0 -9
  262. package/data/vrchat/worlds/thegreatpug.json +0 -8
  263. package/data/vrchat/worlds/themidnightbar.json +0 -7
  264. package/data/vrchat/worlds/voidclub.json +0 -7
  265. package/data/vrchat/worlds/voltdanceclub.json +0 -7
  266. package/data/vrchat/worlds/vrchathome.json +0 -8
  267. package/data/vrchat/worlds/whatalegend.json +0 -6
  268. package/data/warframe/meta.json +0 -14
  269. package/data/wutheringwaves/meta.json +0 -14
  270. package/data/zenlesszonezero/meta.json +0 -14
  271. package/gamecodes.js +0 -178
  272. package/scripts/cache-sync-smoke.js +0 -92
  273. package/scripts/game-code-cache-smoke.js +0 -85
  274. package/scripts/sync-all-cache.js +0 -18
  275. package/scripts/sync-api-cache.js +0 -319
  276. package/scripts/sync-game-code-cache.js +0 -244
  277. package/scripts/sync-gaming-info-cache.js +0 -46
package/README.md CHANGED
@@ -1,535 +1,102 @@
1
- # 🌐 @nekosuneprojects/gaming-infos
1
+ # @nekosuneprojects/gaming-infos
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/@nekosuneprojects/gaming-infos.svg)](https://www.npmjs.com/package/@nekosuneprojects/gaming-infos)
3
+ Modular multi-game information toolkit for Node.js 18+. **Version 3.0.1 continues the clean-break 3.x rebuild** of the old monolithic data-mirror package, using independent npm packages for each game. The previous embedded datasets, API cache syncs and legacy add-on implementation have been removed.
4
4
 
5
- A Node.js data package for **game information, VRChat community data, characters, redeem codes, and creator codes**.
5
+ The rebuilt package now includes **Warframe and VRChat**, backed by `@nekosuneprojects/warframe-api@1.0.1` and `@nekosuneprojects/vrchat-api@1.0.0` respectively. Additional games can be added later without reintroducing the old monolithic cache.
6
6
 
7
- The package is **API-first**: it reads from the NekoSuneVR V5 API whenever possible, then automatically falls back to bundled JSON when the API is unavailable. The fallback data in this repository is mirrored from APINODE once per day using an atomic add/change/remove synchronization system.
8
-
9
- Current package version: **2.2.0**
10
-
11
- ---
12
-
13
- ## ✨ What it provides
14
-
15
- - 🎮 Multi-game metadata and character data
16
- - 🌐 Live NekoSuneVR V5 API lookups
17
- - 💾 Automatic local JSON fallback when the API is unavailable
18
- - 🔄 Daily APINODE → repository cache synchronization
19
- - 🧹 Add/change/remove mirroring so deleted API entries disappear from the next successful fallback snapshot
20
- - 🛡️ Last-good-cache protection if APINODE is down or a sync only partially succeeds
21
- - 👤 VRChat players
22
- - 👥 VRChat groups
23
- - 🌍 VRChat worlds
24
- - 🧍 VRChat avatars
25
- - 🧝 Character/roster datasets for supported games
26
- - 🎁 Redeem-code and creator-code helpers
27
- - 📊 Game-code directory, counts, aliases, status, and source-cache information
28
- - 🧪 Offline smoke tests for cache replacement and failure recovery
29
-
30
- ---
31
-
32
- ## 🎮 Gaming Infos coverage
33
-
34
- | Game | Slug | Data |
35
- |---|---|---|
36
- | VRChat | `vrchat` | players, groups, worlds, avatars |
37
- | Genshin Impact | `genshinimpact` | characters |
38
- | Honkai: Star Rail | `honkaistarrail` | characters |
39
- | Neverness to Everness | `nte` | characters |
40
- | Wuthering Waves | `wutheringwaves` | Resonators under `characters` |
41
- | Warframe | `warframe` | Warframes under `characters` |
42
- | Fortnite | `fortnite` | current/released Battle Royale characters |
43
- | Zenless Zone Zero | `zenlesszonezero` | Agents under `characters` |
44
- | Tower of Fantasy | `toweroffantasy` | Simulacra under `characters` |
45
- | Arknights: Endfield | `arknightsendfield` | Operators under `characters` |
46
-
47
- The Game Codes system is separate and its supported game list is returned dynamically by the APINODE `/codes` directory endpoint.
48
-
49
- ---
50
-
51
- ## 📦 Installation
7
+ ## Installation
52
8
 
53
9
  ```bash
54
10
  npm install @nekosuneprojects/gaming-infos
55
11
  ```
56
12
 
57
- Requires **Node.js 18 or newer**.
58
-
59
- ---
60
-
61
- # 🚀 Quick start
62
-
63
- ```js
64
- const gamingInfos = require('@nekosuneprojects/gaming-infos');
65
-
66
- async function main() {
67
- const games = await gamingInfos.Games();
68
- const vrchat = await gamingInfos.Game('vrchat');
69
-
70
- const worlds = await gamingInfos.List('vrchat', 'worlds');
71
- const avatars = await gamingInfos.List('vrchat', 'avatars');
72
- const genshinCharacters = await gamingInfos.List('genshinimpact', 'characters');
73
- const wuwaCharacters = await gamingInfos.List('wutheringwaves', 'characters');
74
-
75
- console.log({
76
- gameCount: games.length,
77
- vrchat,
78
- worlds: worlds.length,
79
- avatars: avatars.length,
80
- genshinCharacters: genshinCharacters.length,
81
- wuwaCharacters: wuwaCharacters.length
82
- });
83
- }
84
-
85
- main();
86
- ```
87
-
88
- ---
89
-
90
- # 🧠 Gaming Infos API
91
-
92
- ## `Games()`
93
-
94
- Returns every game with bundled/API Gaming Infos metadata.
95
-
96
- ```js
97
- const games = await gamingInfos.Games();
98
- ```
99
-
100
- Live endpoint:
101
-
102
- ```http
103
- GET /v5/games/api/gaming-infos
104
- ```
105
-
106
- ## `Game(game)`
107
-
108
- Returns game-level metadata.
109
-
110
- ```js
111
- const game = await gamingInfos.Game('warframe');
112
- ```
113
-
114
- ## `List(game, type)`
115
-
116
- Returns every entity for a game/type.
117
-
118
- ```js
119
- const resonators = await gamingInfos.List('wutheringwaves', 'characters');
120
- const agents = await gamingInfos.List('zenlesszonezero', 'characters');
121
- const operators = await gamingInfos.List('arknightsendfield', 'characters');
122
- const vrchatGroups = await gamingInfos.List('vrchat', 'groups');
123
- ```
124
-
125
- Live endpoint:
126
-
127
- ```http
128
- GET /v5/games/api/gaming-infos/:game/:type
129
- ```
130
-
131
- ## Single-entity helpers
13
+ To use an individual game package directly:
132
14
 
133
- ```js
134
- await gamingInfos.Worlds('vrchat', 'world-slug');
135
- await gamingInfos.Groups('vrchat', 'group-slug');
136
- await gamingInfos.Players('vrchat', 'player-slug');
137
- await gamingInfos.Avatars('vrchat', 'avatar-slug');
138
- await gamingInfos.Characters('warframe', 'warframe-slug');
139
- ```
140
-
141
- Generic lookup:
142
-
143
- ```js
144
- await gamingInfos.Get('vrchat', 'worlds', 'world-slug');
145
- ```
146
-
147
- Live endpoint:
148
-
149
- ```http
150
- GET /v5/games/api/gaming-infos/:game/:type/:name
151
- ```
152
-
153
- The V5 API returns stable `slug` values for list entries. Use those slugs for detail lookups instead of trying to generate filenames from display names yourself.
154
-
155
- ## `CacheInfo()`
156
-
157
- Reads information about the last mirrored Gaming Infos fallback snapshot.
158
-
159
- ```js
160
- const cache = await gamingInfos.CacheInfo();
161
- console.log(cache?.syncedAt, cache?.contentHash);
162
- ```
163
-
164
- ---
165
-
166
- # 🎁 Game Codes API
167
-
168
- Version 2.2.0 adds API-first redeem-code and creator-code support using the same fallback model.
169
-
170
- APINODE endpoints:
171
-
172
- ```http
173
- GET /v5/games/api/codes
174
- GET /v5/games/api/codes/status
175
- GET /v5/games/api/codes/:game
176
- GET /v5/games/api/codes/:game/:code
15
+ ```bash
16
+ npm install @nekosuneprojects/warframe-api@1.0.1
17
+ npm install @nekosuneprojects/vrchat-api@1.0.0
177
18
  ```
178
19
 
179
- `/codes/status` is cache/status data only and does **not** trigger website scraping or a source refresh.
20
+ Node.js 18+ is required. Pushes to `main` run build/tests and attempt to publish the package to npmjs and GitHub Packages when the exact version is not already available. Pull requests build/test only.
180
21
 
181
- ## `Codes()`
182
-
183
- Returns the Game Codes directory, including supported games, aliases, metadata, counters, source counts, and endpoint information.
22
+ ## Warframe
184
23
 
185
24
  ```js
186
- const directory = await gamingInfos.Codes();
25
+ const gaming = require('@nekosuneprojects/gaming-infos');
187
26
 
188
- console.log(directory.games);
189
- console.log(directory.aliases);
27
+ const warframe = gaming.createClient('warframe', { platform: 'pc', language: 'en' });
28
+ const about = await warframe.About();
29
+ const matches = await warframe.search('Ash');
30
+ const codes = await warframe.codes.active({ hasCode: true });
31
+ const alerts = await warframe.api.alerts();
32
+ console.log(about.name, matches.total, codes.length, alerts.length);
190
33
  ```
191
34
 
192
- ## `CodesStatus()`
193
-
194
- Returns the cached source-refresh state.
35
+ ## VRChat
195
36
 
196
37
  ```js
197
- const status = await gamingInfos.CodesStatus();
198
- ```
38
+ const gaming = require('@nekosuneprojects/gaming-infos');
199
39
 
200
- ## `GameCodes(game, options)`
201
-
202
- Returns code lists using the existing APINODE response shape:
203
-
204
- ```js
205
- const fortniteCodes = await gamingInfos.GameCodes('fortnite');
206
-
207
- console.log(fortniteCodes.Active);
208
- console.log(fortniteCodes.Expired);
209
- ```
210
-
211
- Default shape:
212
-
213
- ```json
214
- {
215
- "Active": [],
216
- "Expired": []
217
- }
218
- ```
219
-
220
- Include queued/unknown records:
221
-
222
- ```js
223
- const allFortniteCodes = await gamingInfos.GameCodes('fortnite', {
224
- includeUnknown: true
40
+ // Local-first bundled VRChat JSON, no VRChat login needed:
41
+ const vrchat = gaming.createClient('vrchat', {
42
+ cacheDir: './storage/vrchat'
225
43
  });
226
- ```
227
-
228
- Which can return:
44
+ const game = await vrchat.About();
45
+ const localWorld = await vrchat.world('theblackcat');
46
+ const localGroups = await vrchat.groups.search('club');
229
47
 
230
- ```json
231
- {
232
- "Active": [],
233
- "Expired": [],
234
- "Unknown": []
235
- }
236
- ```
48
+ // Live online NekoSune APIs:
49
+ const worlds = await vrchat.worlds.browse({sort:'popular',page:1});
50
+ const foundWorlds = await vrchat.worlds.searchOnline('Mirror',{platform:'pc'});
51
+ const groups = await vrchat.groups.searchOnline('Dance',{page:1});
237
52
 
238
- Filtering is supported:
53
+ // Public third-party avatar-search providers (availability varies):
54
+ const avatars = await vrchat.avatars.searchOnline('Rindo');
239
55
 
240
- ```js
241
- const creatorCodes = await gamingInfos.GameCodes('fortnite', {
242
- category: 'creator-code',
243
- includeUnknown: true
244
- });
245
-
246
- const freeCodes = await gamingInfos.GameCodes('genshin-impact', {
247
- claimType: 'free'
248
- });
56
+ console.log(game.name, localWorld.name, localGroups.total);
57
+ console.log(worlds.meta, foundWorlds.meta, groups.meta, avatars.successful);
249
58
  ```
250
59
 
251
- Timezone can also be passed through to the live API:
60
+ The `vrchat-api` provider bundles local JSON for worlds, groups, players and game metadata; online methods make on-demand HTTP calls. It does **not** fetch private VRChat account data or bypass authentication. The upstream JSON currently contains no local avatar catalog, so `avatars.searchOnline` uses external providers.
252
61
 
253
- ```js
254
- const codes = await gamingInfos.GameCodes('fortnite', {
255
- timezone: 'Europe/London',
256
- includeUnknown: true
257
- });
258
- ```
62
+ ### World browsing
259
63
 
260
- Cached aliases from the `/codes` directory are resolved during API outages as well, so aliases such as `fn`, `genshin`, `hsr`, or `wuwa` can still map to their canonical cached game dataset.
261
-
262
- ## `GameCode(game, code, options)`
263
-
264
- Looks up one specific code.
64
+ The online world browser supports `updated`, `newest`, `oldest` and `popular`, using the remote API's 24-world pagination:
265
65
 
266
66
  ```js
267
- const creator = await gamingInfos.GameCode('fortnite', 'NEKOSUNEVR');
268
- console.log(creator);
269
- ```
270
-
271
- Live endpoint:
272
-
273
- ```http
274
- GET /v5/games/api/codes/:game/:code
275
- ```
276
-
277
- When APINODE is unavailable, the package searches the locally mirrored Active, Expired, and Unknown code buckets.
278
-
279
- ## `CodeCacheInfo()`
280
-
281
- Returns the local Game Codes cache manifest.
282
-
283
- ```js
284
- const codeCache = await gamingInfos.CodeCacheInfo();
285
- console.log(codeCache?.syncedAt, codeCache?.stats);
286
- ```
287
-
288
- ---
289
-
290
- # 📚 Function reference
291
-
292
- | Function | Purpose |
293
- |---|---|
294
- | `Games()` | List Gaming Infos games |
295
- | `Game(game)` | Get game metadata |
296
- | `List(game, type)` | List every entry for one game/type |
297
- | `Worlds(game, name)` | Get one world |
298
- | `Groups(game, name)` | Get one group |
299
- | `Players(game, name)` | Get one player |
300
- | `Avatars(game, name)` | Get one avatar |
301
- | `Characters(game, name)` | Get one character/Warframe/Agent/etc. |
302
- | `Get(game, type, name)` | Generic entity lookup |
303
- | `CacheInfo()` | Gaming Infos fallback manifest |
304
- | `Codes()` | Game Codes directory |
305
- | `CodesStatus()` | Cached Game Codes source status |
306
- | `GameCodes(game, options)` | Active/Expired/Unknown code lists |
307
- | `GameCode(game, code, options)` | One specific redeem/creator code |
308
- | `CodeCacheInfo()` | Game Codes fallback manifest |
309
-
310
- ---
311
-
312
- # 💾 API-first fallback behavior
313
-
314
- Normal reads follow this path:
315
-
316
- ```text
317
- Application
318
- │
319
- ▼
320
- NekoSuneVR V5 API
321
- │
322
- ├── available ──► return live data
323
- │
324
- └── unavailable
325
- │
326
- ▼
327
- bundled data/
328
- │
329
- ▼
330
- return last-good fallback
331
- ```
332
-
333
- The package does not need an API key for the public read endpoints documented above.
334
-
335
- Set this to force local-only reads:
336
-
337
- ```bash
338
- GAMING_INFOS_DISABLE_API=1
339
- ```
340
-
341
- ---
342
-
343
- # 🔄 Daily fallback synchronization
344
-
345
- The repository automatically runs the cache mirror **once every day at 03:23 UTC** through GitHub Actions.
346
-
347
- The combined command is:
348
-
349
- ```bash
350
- npm run sync:cache
351
- ```
352
-
353
- That performs both:
354
-
355
- ```bash
356
- npm run sync:gaming-infos-cache
357
- npm run sync:game-codes-cache
358
- ```
359
-
360
- The synchronization process is designed to be authoritative and failure-safe:
361
-
362
- 1. Download the complete configured API snapshot into a temporary directory.
363
- 2. Validate all required responses.
364
- 3. Calculate content hashes and add/change/remove statistics.
365
- 4. Replace the old fallback only after the new snapshot succeeds completely.
366
- 5. Keep the previous fallback untouched if the API fails, times out, returns an error, or produces an incomplete snapshot.
367
- 6. Commit actual fallback changes back to the repository.
368
-
369
- Successful syncs mirror **additions, modifications, and removals**. If APINODE removes an entry, that entry is removed from the fallback during the next successful mirror.
370
-
371
- Gaming Infos and Game Codes use independent atomic caches so a failure in one dataset cannot destroy the last-good snapshot of the other.
372
-
373
- See [CACHE_SYNC.md](CACHE_SYNC.md) for the detailed cache architecture.
374
-
375
- ---
376
-
377
- # 🧪 Cache tests
378
-
379
- Run all cache safety tests:
380
-
381
- ```bash
382
- npm run test:all-cache
383
- ```
384
-
385
- Or individually:
386
-
387
- ```bash
388
- npm run test:cache-sync
389
- npm run test:game-code-cache
390
- ```
391
-
392
- The tests cover scenarios including:
393
-
394
- - new entries appearing
395
- - existing entries changing
396
- - upstream entries being removed
397
- - duplicate/invalid data protection
398
- - partial API failures
399
- - simulated HTTP 5xx outages
400
- - preserving the last-good fallback after a failed sync
401
-
402
- ---
403
-
404
- # 📁 Fallback data structure
405
-
406
- ```text
407
- data/
408
- ├── genshinimpact/
409
- │ ├── meta.json
410
- │ └── characters/
411
- ├── honkaistarrail/
412
- ├── nte/
413
- ├── wutheringwaves/
414
- ├── warframe/
415
- ├── fortnite/
416
- ├── zenlesszonezero/
417
- ├── toweroffantasy/
418
- ├── arknightsendfield/
419
- ├── vrchat/
420
- │ ├── meta.json
421
- │ ├── players/
422
- │ ├── groups/
423
- │ ├── worlds/
424
- │ └── avatars/
425
- ├── .cache-manifest.json
426
- └── game-codes/
427
- ├── directory.json
428
- ├── status.json
429
- ├── .cache-manifest.json
430
- └── games/
431
- └── <game>.json
432
- ```
433
-
434
- An entity with no verified image can use:
435
-
436
- ```json
437
- {
438
- "image": ""
439
- }
440
- ```
441
-
442
- Consumers should treat a blank image string as "no verified image available".
443
-
444
- ---
445
-
446
- # ⚙️ Environment variables
447
-
448
- ## Runtime API reads
449
-
450
- | Variable | Default | Purpose |
451
- |---|---|---|
452
- | `GAMING_INFOS_API_BASE` | `https://api.nekosunevr.co.uk` | NekoSuneVR APINODE base URL |
453
- | `GAMING_INFOS_API_PATH` | `/v5/games/api/gaming-infos` | Gaming Infos path |
454
- | `GAME_CODES_API_PATH` | `/v5/games/api/codes` | Game Codes path |
455
- | `GAMING_INFOS_DISABLE_API` | unset | `1`/`true` forces local-only operation |
456
- | `GAMING_INFOS_TIMEOUT_MS` | `4000` | Runtime API timeout before fallback |
457
-
458
- ## Cache mirror
459
-
460
- | Variable | Default | Purpose |
461
- |---|---|---|
462
- | `GAMING_INFOS_CACHE_TIMEOUT_MS` | `15000` | Gaming Infos sync request timeout |
463
- | `GAMING_INFOS_CACHE_RETRIES` | `2` | Gaming Infos retry count |
464
- | `GAMING_INFOS_CACHE_RETRY_DELAY_MS` | `750` | Gaming Infos retry delay |
465
- | `GAME_CODES_CACHE_TIMEOUT_MS` | `15000` | Game Codes sync request timeout |
466
- | `GAME_CODES_CACHE_RETRIES` | `2` | Game Codes retry count |
467
- | `GAME_CODES_CACHE_RETRY_DELAY_MS` | `750` | Game Codes retry delay |
468
- | `GAME_CODES_CACHE_GAME_DELAY_MS` | small delay | Delay between per-game code snapshots |
469
-
470
- ---
471
-
472
- # 📝 Example character entry
473
-
474
- Different games expose different fields. Consumers should use the fields relevant to that game rather than assuming every title has the same schema.
475
-
476
- ```json
477
- {
478
- "name": "Example Character",
479
- "slug": "examplecharacter",
480
- "rarity": "5-star",
481
- "element": "Electro",
482
- "weapon": "Sword",
483
- "description": "Public character information.",
484
- "image": "https://example.com/character.webp",
485
- "url": "https://example.com/source",
486
- "source": {
487
- "provider": "Public source",
488
- "publicDataOnly": true
489
- }
490
- }
67
+ const { createVRChat } = require('@nekosuneprojects/gaming-infos');
68
+ const vrchat = createVRChat();
69
+ const page2 = await vrchat.worlds.browse({sort:'updated',page:2});
70
+ console.log(page2.data, page2.meta);
491
71
  ```
492
72
 
493
- ---
494
-
495
- # 🤝 Contributions
496
-
497
- Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
498
-
499
- Please follow these rules:
500
-
501
- - Only include publicly available data or data you have permission to publish.
502
- - Do not include private profiles, private Discord messages, DMs, private logs, authentication data, or personal information.
503
- - Do not add leaks, datamined/unreleased content, hidden APIs, memory-inspection data, or client-extracted private data.
504
- - Respect each game's Terms of Service and community rules.
505
- - Keep sources clear and verifiable.
506
- - Do not submit harassment, defamation, doxxing, or invasive profile information.
507
-
508
- ---
509
-
510
- # ⚠️ Package fallback note
511
-
512
- GitHub repository cache snapshots update automatically, but published npm packages are immutable.
513
-
514
- An already-installed npm release keeps the fallback JSON bundled with that release until you update the package. While APINODE is online, live API reads still provide current data without requiring a package release.
515
-
516
- ---
517
-
518
- # ⚠️ Disclaimer
73
+ ## Module layout
519
74
 
520
- This project is not affiliated with or endorsed by VRChat Inc., HoYoverse, Kuro Games, Digital Extremes, Epic Games, Hotta Studio, Hypergryph/GRYPHLINE, or any other game publisher represented by the data.
75
+ - `index.js` — public entrypoint
76
+ - `src/registry.js` — provider registry and selection
77
+ - `src/providers/warframe.js` — Warframe npm adapter
78
+ - `src/providers/vrchat.js` — VRChat npm adapter
79
+ - `test/registry.test.js` — provider smoke tests
80
+ - `.github/workflows/npm-publish.yml` — npmjs release publishing
81
+ - `.github/workflows/npm-publish-github-packages.yml` — GitHub Packages release publishing
521
82
 
522
- Game names, logos, characters, and related trademarks belong to their respective owners.
83
+ ## API surface
523
84
 
524
- ---
85
+ | Export | Purpose |
86
+ | --- | --- |
87
+ | `createClient(game, options)` | Instantiate the game provider |
88
+ | `createWarframe(options)` | Shortcut to the Warframe provider |
89
+ | `createVRChat(options)` | Shortcut to the VRChat provider |
90
+ | `listProviders()` | List installed game IDs |
91
+ | `providers.warframe` | Warframe provider adapter |
92
+ | `providers.vrchat` | VRChat provider adapter |
525
93
 
526
- # 🧠 Credits
94
+ Read the standalone packages' documentation for complete features: [Warframe API](https://www.npmjs.com/package/@nekosuneprojects/warframe-api) and [VRChat API](https://www.npmjs.com/package/@nekosuneprojects/vrchat-api).
527
95
 
528
- Maintained by **NekoSune Projects**.
96
+ ## Migration from 2.x
529
97
 
530
- Contributions are welcome — keep the data public, accurate, and game-friendly.
98
+ The 2.x `gaming-infos` API-first caches, embedded JSON catalogs, `gamecodes`, and sync scripts are **not available** in 3.0.0. Previous consumers must migrate explicitly. Old releases remain accessible through Git history and npm.
531
99
 
532
- <!-- GitAds-Verify: 2XHQSF1IKOWF4FH8P2TRI5GRWIJG2TJP -->
100
+ ## Publishing
533
101
 
534
- ## GitAds Sponsored
535
- [![Sponsored by GitAds](https://gitads.dev/v1/ad-serve?source=nekosuneprojects/gaming-infos@github)](https://gitads.dev/v1/ad-track?source=nekosuneprojects/gaming-infos@github)
102
+ The source version is `3.0.1`; package publication is manual through GitHub Actions. Before publishing, confirm both exact dependency versions exist on npmjs.org, run `npm ci`, `npm run check`, `npm test`, and `npm pack --dry-run`. The consolidated `Build and publish gaming-infos` workflow builds/tests on every `main` push and pull request. After a successful build on `main`, it also attempts **both** registry publications, skipping any version already published. The manual **Run workflow** action still supports `registry=both`, `npmjs`, or `github`. On automatic pushes, npmjs uses **Trusted Publisher OIDC only**, not the existing `npm_token` (which caused EOTP). Configure npm's Trusted Publisher for the exact `NekoSuneProjectsNPM/gaming-infos` repository and `build-publish.yml` workflow, and enable direct `npm publish`. Manual dispatch still permits a token if it is eligible to publish without an interactive OTP (which must be configured for repository `NekoSuneProjectsNPM/gaming-infos`, workflow `build-publish.yml`). Manual dispatch uses the selected `npm_auth` setting. GitHub Packages publishes as `@nekosuneprojectsnpm/gaming-infos`. Each new npm release still requires incrementing the package version in both package files.