beatsaber-bot-core 0.2.0-rc.10 → 0.2.0-rc.12

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 (193) hide show
  1. package/dist/cjs/cmd/deprecated/tmp.js +2 -2
  2. package/dist/cjs/cmd/deprecated/tmp.js.map +1 -1
  3. package/dist/cjs/cmd/score.js.map +1 -1
  4. package/dist/cjs/config.js.map +1 -1
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/infra/i18n/default.js +10 -0
  7. package/dist/cjs/infra/i18n/default.js.map +1 -0
  8. package/dist/cjs/infra/i18n/index.js +29 -104
  9. package/dist/cjs/infra/i18n/index.js.map +1 -1
  10. package/dist/cjs/infra/i18n/util.js +76 -0
  11. package/dist/cjs/infra/i18n/util.js.map +1 -0
  12. package/dist/cjs/infra/i18n/zh-cn.json +1 -1
  13. package/dist/cjs/infra/index.js +8 -3
  14. package/dist/cjs/infra/index.js.map +1 -1
  15. package/dist/cjs/infra/support/render/index.js +4 -2
  16. package/dist/cjs/infra/support/render/index.js.map +1 -1
  17. package/dist/cjs/interface/bot.js.map +1 -1
  18. package/dist/cjs/interface/cmd/type.js.map +1 -1
  19. package/dist/cjs/interface/db/index.js +0 -6
  20. package/dist/cjs/interface/db/index.js.map +1 -1
  21. package/dist/cjs/interface/index.js.map +1 -1
  22. package/dist/cjs/schedules/index.js +2 -2
  23. package/dist/cjs/schedules/index.js.map +1 -1
  24. package/dist/cjs/schedules/interface.js.map +1 -1
  25. package/dist/cjs/schedules/temp.js.map +1 -1
  26. package/dist/cjs/service/api/index.js +1 -1
  27. package/dist/cjs/service/api/index.js.map +1 -1
  28. package/dist/cjs/service/index.js +15 -0
  29. package/dist/cjs/service/index.js.map +1 -1
  30. package/dist/cjs/service/preference.js.map +1 -1
  31. package/dist/cjs/service/render/index.js +12 -2
  32. package/dist/cjs/service/render/index.js.map +1 -1
  33. package/dist/cjs/ws/beatleader.js.map +1 -1
  34. package/dist/cjs/ws/beatsaver.js.map +1 -1
  35. package/dist/cjs/ws/index.js +0 -2
  36. package/dist/cjs/ws/index.js.map +1 -1
  37. package/dist/esm/cmd/deprecated/tmp.js +2 -2
  38. package/dist/esm/cmd/deprecated/tmp.js.map +1 -1
  39. package/dist/esm/cmd/score.js.map +1 -1
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/infra/i18n/default.js +10 -0
  42. package/dist/esm/infra/i18n/default.js.map +1 -0
  43. package/dist/esm/infra/i18n/index.js +29 -92
  44. package/dist/esm/infra/i18n/index.js.map +1 -1
  45. package/dist/esm/infra/i18n/util.js +51 -0
  46. package/dist/esm/infra/i18n/util.js.map +1 -0
  47. package/dist/esm/infra/index.js +5 -2
  48. package/dist/esm/infra/index.js.map +1 -1
  49. package/dist/esm/infra/support/render/index.js +4 -2
  50. package/dist/esm/infra/support/render/index.js.map +1 -1
  51. package/dist/esm/interface/db/index.js +0 -1
  52. package/dist/esm/interface/db/index.js.map +1 -1
  53. package/dist/esm/interface/index.js.map +1 -1
  54. package/dist/esm/schedules/index.js +2 -2
  55. package/dist/esm/schedules/index.js.map +1 -1
  56. package/dist/esm/schedules/temp.js.map +1 -1
  57. package/dist/esm/service/api/index.js +1 -1
  58. package/dist/esm/service/api/index.js.map +1 -1
  59. package/dist/esm/service/index.js +6 -0
  60. package/dist/esm/service/index.js.map +1 -1
  61. package/dist/esm/service/preference.js.map +1 -1
  62. package/dist/esm/service/render/index.js +12 -2
  63. package/dist/esm/service/render/index.js.map +1 -1
  64. package/dist/esm/ws/beatleader.js.map +1 -1
  65. package/dist/esm/ws/beatsaver.js.map +1 -1
  66. package/dist/esm/ws/index.js +0 -1
  67. package/dist/esm/ws/index.js.map +1 -1
  68. package/dist/types/index.d.ts +1030 -44
  69. package/package.json +7 -7
  70. package/dist/cjs/ws/scoresaber.js +0 -75
  71. package/dist/cjs/ws/scoresaber.js.map +0 -1
  72. package/dist/esm/ws/scoresaber.js +0 -53
  73. package/dist/esm/ws/scoresaber.js.map +0 -1
  74. package/dist/types/cmd/bind/bind-beatleader.d.ts +0 -34
  75. package/dist/types/cmd/bind/bind-beatsaver.d.ts +0 -34
  76. package/dist/types/cmd/bind/bind-id-beatleader.d.ts +0 -34
  77. package/dist/types/cmd/bind/bind-id-beatsaver.d.ts +0 -34
  78. package/dist/types/cmd/bind/bind-scoresaber.d.ts +0 -34
  79. package/dist/types/cmd/bind/index.d.ts +0 -41
  80. package/dist/types/cmd/bsmap/id-search.d.ts +0 -41
  81. package/dist/types/cmd/bsmap/key-search.d.ts +0 -41
  82. package/dist/types/cmd/bsmap/latest.d.ts +0 -41
  83. package/dist/types/cmd/config/index.d.ts +0 -2
  84. package/dist/types/cmd/deprecated/tmp.d.ts +0 -41
  85. package/dist/types/cmd/index.d.ts +0 -34
  86. package/dist/types/cmd/rank.d.ts +0 -41
  87. package/dist/types/cmd/score.d.ts +0 -41
  88. package/dist/types/cmd/subscribe/beatleader.d.ts +0 -34
  89. package/dist/types/cmd/subscribe/beatsaver.d.ts +0 -34
  90. package/dist/types/cmd/subscribe/id-beatleader-score.d.ts +0 -34
  91. package/dist/types/cmd/subscribe/id-beatsaver-mapper.d.ts +0 -34
  92. package/dist/types/cmd/subscribe/index.d.ts +0 -41
  93. package/dist/types/cmd/subscribe/subjoin.d.ts +0 -41
  94. package/dist/types/cmd/subscribe/subleave.d.ts +0 -41
  95. package/dist/types/cmd/subscribe/unsubscribe.d.ts +0 -41
  96. package/dist/types/components/components/RankDifficulty.d.ts +0 -10
  97. package/dist/types/components/components/base/avatar.d.ts +0 -10
  98. package/dist/types/components/components/bl-rank-score-item.d.ts +0 -21
  99. package/dist/types/components/components/bl-score-item.d.ts +0 -10
  100. package/dist/types/components/components/characteristic.d.ts +0 -9
  101. package/dist/types/components/components/flag.d.ts +0 -9
  102. package/dist/types/components/components/icons/BeatLeader.d.ts +0 -6
  103. package/dist/types/components/components/icons/RankIcon.d.ts +0 -8
  104. package/dist/types/components/components/icons/ScoreSaberIcon.d.ts +0 -6
  105. package/dist/types/components/components/progressbar.d.ts +0 -8
  106. package/dist/types/components/components/scoreItem.d.ts +0 -8
  107. package/dist/types/components/components/scoregraph.d.ts +0 -15
  108. package/dist/types/components/components/skill-graph.d.ts +0 -9
  109. package/dist/types/components/components/socre-badge.d.ts +0 -9
  110. package/dist/types/components/components/ss-rank-score-item.d.ts +0 -21
  111. package/dist/types/components/components/ss-score-item.d.ts +0 -8
  112. package/dist/types/components/index.d.ts +0 -5
  113. package/dist/types/components/pages/bl-player.d.ts +0 -11
  114. package/dist/types/components/pages/bl-score-with-rank.d.ts +0 -18
  115. package/dist/types/components/pages/bl-score.d.ts +0 -15
  116. package/dist/types/components/pages/bs-map.d.ts +0 -11
  117. package/dist/types/components/pages/index.d.ts +0 -14
  118. package/dist/types/components/pages/ss-player.d.ts +0 -13
  119. package/dist/types/components/utils/bl/beatleader.d.ts +0 -15
  120. package/dist/types/components/utils/bl/blheadset.d.ts +0 -275
  121. package/dist/types/components/utils/bl/bsorDecoder.d.ts +0 -189
  122. package/dist/types/components/utils/bl/bsorReplayAcc.d.ts +0 -38
  123. package/dist/types/components/utils/bl/getPart.d.ts +0 -9
  124. package/dist/types/components/utils/bl/stastic.d.ts +0 -3
  125. package/dist/types/components/utils/canvas.d.ts +0 -2
  126. package/dist/types/components/utils/format.d.ts +0 -8
  127. package/dist/types/components/utils/getMods.d.ts +0 -5
  128. package/dist/types/components/utils/index.d.ts +0 -6
  129. package/dist/types/components/utils/qrcode.d.ts +0 -3
  130. package/dist/types/components/utils/sleep.d.ts +0 -3
  131. package/dist/types/components/utils/tag-format.d.ts +0 -3
  132. package/dist/types/components/utils/tw-join.d.ts +0 -5
  133. package/dist/types/config.d.ts +0 -30
  134. package/dist/types/index-Dagy_c8G.d.ts +0 -74
  135. package/dist/types/infra/errors/index.d.ts +0 -69
  136. package/dist/types/infra/i18n/index.d.ts +0 -4
  137. package/dist/types/infra/i18n/parser.d.ts +0 -16
  138. package/dist/types/infra/index.d.ts +0 -6
  139. package/dist/types/infra/s3/index.d.ts +0 -20
  140. package/dist/types/infra/support/cache.d.ts +0 -6
  141. package/dist/types/infra/support/fetch/error.d.ts +0 -11
  142. package/dist/types/infra/support/fetch/index.d.ts +0 -7
  143. package/dist/types/infra/support/fetch/ofetch.d.ts +0 -24
  144. package/dist/types/infra/support/render/index.d.ts +0 -38
  145. package/dist/types/infra/support/render/puppeteer.d.ts +0 -43
  146. package/dist/types/interface/bot.d.ts +0 -22
  147. package/dist/types/interface/cmd/builder.d.ts +0 -53
  148. package/dist/types/interface/cmd/type.d.ts +0 -30
  149. package/dist/types/interface/db/index.d.ts +0 -45
  150. package/dist/types/interface/db/models.d.ts +0 -41
  151. package/dist/types/interface/index.d.ts +0 -30
  152. package/dist/types/interface/logger.d.ts +0 -8
  153. package/dist/types/schedules/index.d.ts +0 -40
  154. package/dist/types/schedules/interface.d.ts +0 -45
  155. package/dist/types/schedules/temp.d.ts +0 -35
  156. package/dist/types/service/api/base/aioclient.d.ts +0 -13
  157. package/dist/types/service/api/base/blclient.d.ts +0 -28
  158. package/dist/types/service/api/base/bsclient.d.ts +0 -29
  159. package/dist/types/service/api/base/index.d.ts +0 -19
  160. package/dist/types/service/api/base/ssclient.d.ts +0 -17
  161. package/dist/types/service/api/index.d.ts +0 -59
  162. package/dist/types/service/api/interfaces/aiosaber/index.d.ts +0 -9
  163. package/dist/types/service/api/interfaces/beatleader/bsor.d.ts +0 -113
  164. package/dist/types/service/api/interfaces/beatleader/index.d.ts +0 -5
  165. package/dist/types/service/api/interfaces/beatleader/req.d.ts +0 -22
  166. package/dist/types/service/api/interfaces/beatleader/score.d.ts +0 -164
  167. package/dist/types/service/api/interfaces/beatleader/user.d.ts +0 -173
  168. package/dist/types/service/api/interfaces/beatleader/ws.d.ts +0 -90
  169. package/dist/types/service/api/interfaces/beatsaver/alert.d.ts +0 -20
  170. package/dist/types/service/api/interfaces/beatsaver/bsmap.d.ts +0 -70
  171. package/dist/types/service/api/interfaces/beatsaver/index.d.ts +0 -13
  172. package/dist/types/service/api/interfaces/beatsaver/resp.d.ts +0 -11
  173. package/dist/types/service/api/interfaces/beatsaver/user.d.ts +0 -10
  174. package/dist/types/service/api/interfaces/beatsaver/ws.d.ts +0 -13
  175. package/dist/types/service/api/interfaces/index.d.ts +0 -14
  176. package/dist/types/service/api/interfaces/scoresaber/index.d.ts +0 -3
  177. package/dist/types/service/api/interfaces/scoresaber/item.d.ts +0 -67
  178. package/dist/types/service/api/interfaces/scoresaber/leaderboard.d.ts +0 -13
  179. package/dist/types/service/api/interfaces/scoresaber/resp.d.ts +0 -12
  180. package/dist/types/service/api/interfaces/scoresaber/user.d.ts +0 -35
  181. package/dist/types/service/api/interfaces/scoresaber/ws.d.ts +0 -80
  182. package/dist/types/service/api/sortScore.d.ts +0 -5
  183. package/dist/types/service/index.d.ts +0 -30
  184. package/dist/types/service/preference.d.ts +0 -38
  185. package/dist/types/service/render/index.d.ts +0 -43
  186. package/dist/types/service/render/interfaces.d.ts +0 -30
  187. package/dist/types/utils/index.d.ts +0 -5
  188. package/dist/types/ws/beatleader.d.ts +0 -47
  189. package/dist/types/ws/beatsaver.d.ts +0 -52
  190. package/dist/types/ws/bl-filter.d.ts +0 -2
  191. package/dist/types/ws/handler.d.ts +0 -8
  192. package/dist/types/ws/index.d.ts +0 -36
  193. package/dist/types/ws/scoresaber.d.ts +0 -47
@@ -46,13 +46,13 @@ var tmp_default = () => new import_builder.CommandBuilder().setName("lb").addAli
46
46
  c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/hitcnt", {
47
47
  selector: "#render-result",
48
48
  onRenderStart: () => {
49
- c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u780D\u51FB\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
49
+ c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u780D\u51FB\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85");
50
50
  }
51
51
  }),
52
52
  c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/score", {
53
53
  selector: "#render-result",
54
54
  onRenderStart: () => {
55
- c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u5206\u6570\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
55
+ c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u5206\u6570\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85");
56
56
  }
57
57
  })
58
58
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cmd/deprecated/tmp.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\n\nexport default () =>\n new CommandBuilder()\n .setName('lb')\n .addAlias('/lb')\n .addAlias('bblb')\n .addAlias('乐团新赛季')\n .addAlias('乐团榜单')\n .setExecutor(async (c) => {\n const [hit, score] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n onRenderStart:() => {\n c.session.sendQueued('开始渲染砍击榜了,请耐心等待 10s')\n },\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n onRenderStart: () => {\n c.session.sendQueued('开始渲染分数榜了,请耐心等待 10s')\n }\n }),\n ])\n c.session.sendImgBuffer(hit, 'image/png')\n c.session.sendImgBuffer(score, 'image/png')\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAE7B,IAAO,cAAQ,MACb,IAAI,8BAAe,EAChB,QAAQ,IAAI,EACZ,SAAS,KAAK,EACd,SAAS,MAAM,EACf,SAAS,gCAAO,EAChB,SAAS,0BAAM,EACf,YAAY,CAAO,MAAM;AACxB,QAAM,CAAC,KAAK,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrC,EAAE,SAAS,OAAO,UAAU,wCAAwC;AAAA,MAClE,UAAU;AAAA,MACV,eAAc,MAAM;AAClB,UAAE,QAAQ,WAAW,0FAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,IACD,EAAE,SAAS,OAAO,UAAU,uCAAuC;AAAA,MACjE,UAAU;AAAA,MACV,eAAe,MAAM;AACnB,UAAE,QAAQ,WAAW,0FAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,IAAE,QAAQ,cAAc,KAAK,WAAW;AACxC,IAAE,QAAQ,cAAc,OAAO,WAAW;AAC5C,EAAC;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cmd/deprecated/tmp.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\n\nexport default () =>\n new CommandBuilder()\n .setName('lb')\n .addAlias('/lb')\n .addAlias('bblb')\n .addAlias('乐团新赛季')\n .addAlias('乐团榜单')\n .setExecutor(async (c) => {\n const [hit, score] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n onRenderStart:() => {\n c.session.sendQueued('开始渲染砍击榜了,请耐心等待')\n },\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n onRenderStart: () => {\n c.session.sendQueued('开始渲染分数榜了,请耐心等待')\n }\n }),\n ])\n c.session.sendImgBuffer(hit, 'image/png')\n c.session.sendImgBuffer(score, 'image/png')\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAE7B,IAAO,cAAQ,MACb,IAAI,8BAAe,EAChB,QAAQ,IAAI,EACZ,SAAS,KAAK,EACd,SAAS,MAAM,EACf,SAAS,gCAAO,EAChB,SAAS,0BAAM,EACf,YAAY,CAAO,MAAM;AACxB,QAAM,CAAC,KAAK,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrC,EAAE,SAAS,OAAO,UAAU,wCAAwC;AAAA,MAClE,UAAU;AAAA,MACV,eAAc,MAAM;AAClB,UAAE,QAAQ,WAAW,sFAAgB;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,IACD,EAAE,SAAS,OAAO,UAAU,uCAAuC;AAAA,MACjE,UAAU;AAAA,MACV,eAAe,MAAM;AACnB,UAAE,QAAQ,WAAW,sFAAgB;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,IAAE,QAAQ,cAAc,KAAK,WAAW;AACxC,IAAE,QAAQ,cAAc,OAAO,WAAW;AAC5C,EAAC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cmd/score.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\nimport {parsePlatform, Platform} from '@/interface'\nimport { convertDiff } from '@/utils'\nimport {\n AccountBindingNotFoundError,\n ScoreNotFoundError,\n} from '@/infra/errors'\nimport {NotFoundError} from \"@/infra/support/fetch/error\";\nexport default () =>\n new CommandBuilder()\n .setName('score') // <uid:text>\n // .addOption('p', 'platform:string')\n .addOption('d', 'difficulty:string')\n .addOption('m', 'mode:string')\n .addAlias('bbscore')\n .addAlias('/score')\n .setExecutor(async (c) => {\n let uid = c.session.u.id\n // let preference = c.userPreference\n if (c.session.mentions && c.session.mentions.length > 0) {\n uid = c.session.mentions[0].id\n // preference = await c.userPreference.getUserPreference(uid)\n }\n\n const { blAccount, ssAccount } = await c.services.db.getUserAccountsByUid(uid)\n let account = Platform.BL && blAccount\n account ||= Platform.SS && ssAccount\n if (!account) {\n throw new AccountBindingNotFoundError()\n }\n\n let diffOption\n if (c.options.d || c.options.m) {\n diffOption = {\n difficulty: convertDiff(c.options.d),\n mode: c.options.m,\n }\n }\n const mapId = c.input\n const score = await c.services.api.getScoreByPlayerIdAndMapId(\n account.platformUid,\n mapId,\n diffOption\n ).catch((e) => {\n if (e instanceof NotFoundError) {\n throw new ScoreNotFoundError({\n user: account.platformUname,\n id: mapId,\n diff: diffOption?.difficulty,\n mode: c.options.m,\n })\n }\n throw e\n })\n // const platform = parsePlatform(c.options.p)\n const img = await c.services.render.renderScore(score.id?.toString())\n await c.session.sendImgBuffer(img)\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAC7B,uBAAsC;AACtC,mBAA4B;AAC5B,oBAGO;AACP,mBAA4B;AAC5B,IAAO,gBAAQ,MACb,IAAI,8BAAe,EAChB,QAAQ,OAAO,EAEf,UAAU,KAAK,mBAAmB,EAClC,UAAU,KAAK,aAAa,EAC5B,SAAS,SAAS,EAClB,SAAS,QAAQ,EACjB,YAAY,CAAO,MAAM;AAhB9B;AAiBM,MAAI,MAAM,EAAE,QAAQ,EAAE;AAEtB,MAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,GAAG;AACvD,UAAM,EAAE,QAAQ,SAAS,CAAC,EAAE;AAAA,EAE9B;AAEA,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,EAAE,SAAS,GAAG,qBAAqB,GAAG;AAC7E,MAAI,UAAU,0BAAS,MAAM;AAC7B,wBAAY,0BAAS,MAAM;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,0CAA4B;AAAA,EACxC;AAEA,MAAI;AACJ,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,GAAG;AAC9B,iBAAa;AAAA,MACX,gBAAY,0BAAY,EAAE,QAAQ,CAAC;AAAA,MACnC,MAAM,EAAE,QAAQ;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,EAAE;AAChB,QAAM,QAAQ,MAAM,EAAE,SAAS,IAAI;AAAA,IACjC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,EAAE,MAAM,CAAC,MAAM;AACb,QAAI,aAAa,4BAAe;AAC9B,YAAM,IAAI,iCAAmB;AAAA,QAC3B,MAAM,QAAQ;AAAA,QACd,IAAI;AAAA,QACJ,MAAM,yCAAY;AAAA,QAClB,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AACA,UAAM;AAAA,EACR,CAAC;AAED,QAAM,MAAM,MAAM,EAAE,SAAS,OAAO,aAAY,WAAM,OAAN,mBAAU,UAAU;AACpE,QAAM,EAAE,QAAQ,cAAc,GAAG;AACnC,EAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/cmd/score.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\nimport {parsePlatform, Platform} from '@/interface'\nimport { convertDiff } from '@/utils'\nimport {\n AccountBindingNotFoundError,\n ScoreNotFoundError,\n} from '@/infra/errors'\nimport {NotFoundError} from \"@/infra/support/fetch/error\";\nexport default () =>\n new CommandBuilder()\n .setName('score')\n .addOption('d', 'difficulty:string')\n .addOption('m', 'mode:string')\n .addAlias('bbscore')\n .addAlias('/score')\n .setExecutor(async (c) => {\n let uid = c.session.u.id\n // let preference = c.userPreference\n if (c.session.mentions && c.session.mentions.length > 0) {\n uid = c.session.mentions[0].id\n // preference = await c.userPreference.getUserPreference(uid)\n }\n\n const { blAccount, ssAccount } = await c.services.db.getUserAccountsByUid(uid)\n let account = Platform.BL && blAccount\n account ||= Platform.SS && ssAccount\n if (!account) {\n throw new AccountBindingNotFoundError()\n }\n\n let diffOption\n if (c.options.d || c.options.m) {\n diffOption = {\n difficulty: convertDiff(c.options.d),\n mode: c.options.m,\n }\n }\n const mapId = c.input\n const score = await c.services.api.getScoreByPlayerIdAndMapId(\n account.platformUid,\n mapId,\n diffOption\n ).catch((e) => {\n if (e instanceof NotFoundError) {\n throw new ScoreNotFoundError({\n user: account.platformUname,\n id: mapId,\n diff: diffOption?.difficulty,\n mode: c.options.m,\n })\n }\n throw e\n })\n const img = await c.services.render.renderScore(score.id?.toString())\n await c.session.sendImgBuffer(img)\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAC7B,uBAAsC;AACtC,mBAA4B;AAC5B,oBAGO;AACP,mBAA4B;AAC5B,IAAO,gBAAQ,MACb,IAAI,8BAAe,EAChB,QAAQ,OAAO,EACf,UAAU,KAAK,mBAAmB,EAClC,UAAU,KAAK,aAAa,EAC5B,SAAS,SAAS,EAClB,SAAS,QAAQ,EACjB,YAAY,CAAO,MAAM;AAf9B;AAgBM,MAAI,MAAM,EAAE,QAAQ,EAAE;AAEtB,MAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,GAAG;AACvD,UAAM,EAAE,QAAQ,SAAS,CAAC,EAAE;AAAA,EAE9B;AAEA,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,EAAE,SAAS,GAAG,qBAAqB,GAAG;AAC7E,MAAI,UAAU,0BAAS,MAAM;AAC7B,wBAAY,0BAAS,MAAM;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,0CAA4B;AAAA,EACxC;AAEA,MAAI;AACJ,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,GAAG;AAC9B,iBAAa;AAAA,MACX,gBAAY,0BAAY,EAAE,QAAQ,CAAC;AAAA,MACnC,MAAM,EAAE,QAAQ;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,EAAE;AAChB,QAAM,QAAQ,MAAM,EAAE,SAAS,IAAI;AAAA,IACjC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,EAAE,MAAM,CAAC,MAAM;AACb,QAAI,aAAa,4BAAe;AAC9B,YAAM,IAAI,iCAAmB;AAAA,QAC3B,MAAM,QAAQ;AAAA,QACd,IAAI;AAAA,QACJ,MAAM,yCAAY;AAAA,QAClB,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AACA,UAAM;AAAA,EACR,CAAC;AACD,QAAM,MAAM,MAAM,EAAE,SAAS,OAAO,aAAY,WAAM,OAAN,mBAAU,UAAU;AACpE,QAAM,EAAE,QAAQ,cAAc,GAAG;AACnC,EAAC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config.ts"],"sourcesContent":["import type { S3Config } from \"@/infra/s3\";\nimport {RenderConfig} from \"@/infra\";\n\n\nexport interface Config {\n s3: {\n enabled: boolean\n } & S3Config\n render: {\n\n } & RenderConfig\n minRawMatchMapIdLength: number\n beatSaverHost: string\n beatSaverWSURL: string\n bsOauthClientId: string\n bsOauthClientSecret: string\n blOauthClientId: string\n blOauthClientSecret: string\n bsNotifyMonitorCron: ScheduleTaskConfig\n tokenRefreshCron: ScheduleTaskConfig\n tempCron: ScheduleTaskConfig\n BLScoreFilters: any\n}\n\ninterface ScheduleTaskConfig {\n cron: string\n enable: boolean\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/config.ts"],"sourcesContent":["import type { S3Config, RenderConfig } from \"@/infra\";\n\n\nexport interface Config {\n s3: {\n enabled: boolean\n } & S3Config\n render: RenderConfig\n minRawMatchMapIdLength: number\n\n beatSaverHost: string\n beatSaverWSURL: string\n bsOauthClientId: string\n bsOauthClientSecret: string\n\n blOauthClientId: string\n blOauthClientSecret: string\n bsNotifyMonitorCron: ScheduleTaskConfig\n tokenRefreshCron: ScheduleTaskConfig\n tempCron: ScheduleTaskConfig\n}\n\ninterface ScheduleTaskConfig {\n cron: string\n enabled: boolean\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import {botCommands} from \"@/cmd\";\nimport {getScheduleTasks} from \"@/schedules\";\nimport {Config} from \"@/config\";\n\nexport * from './interface'\nexport * from './schedules'\nexport * from './config'\nexport * from './cmd'\nexport * from './ws'\nexport * from './utils'\nexport * from './service'\nexport * from './infra'\n\nexport const getBot = <T>(config: Config) => ({\n commands: botCommands<T>(),\n schedule: getScheduleTasks(config),\n})\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA0B;AAC1B,uBAA+B;AAG/B,0BAAc,wBAJd;AAKA,0BAAc,wBALd;AAMA,0BAAc,qBANd;AAOA,0BAAc,kBAPd;AAQA,0BAAc,iBARd;AASA,0BAAc,oBATd;AAUA,0BAAc,sBAVd;AAWA,0BAAc,oBAXd;AAaO,MAAM,SAAS,CAAI,YAAoB;AAAA,EAC5C,cAAU,wBAAe;AAAA,EACzB,cAAU,mCAAiB,MAAM;AACnC;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import {botCommands} from \"./cmd\";\nimport {getScheduleTasks} from \"./schedules\";\nimport {Config} from \"./config\";\n\nexport * from './interface'\nexport * from './schedules'\nexport * from './config'\nexport * from './cmd'\nexport * from './ws'\nexport * from './utils'\nexport * from './service'\nexport * from './infra'\n\nexport const getBot = <T>(config: Config) => ({\n commands: botCommands<T>(),\n schedule: getScheduleTasks(config),\n})\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA0B;AAC1B,uBAA+B;AAG/B,0BAAc,wBAJd;AAKA,0BAAc,wBALd;AAMA,0BAAc,qBANd;AAOA,0BAAc,kBAPd;AAQA,0BAAc,iBARd;AASA,0BAAc,oBATd;AAUA,0BAAc,sBAVd;AAWA,0BAAc,oBAXd;AAaO,MAAM,SAAS,CAAI,YAAoB;AAAA,EAC5C,cAAU,wBAAe;AAAA,EACzB,cAAU,mCAAiB,MAAM;AACnC;","names":[]}
@@ -0,0 +1,10 @@
1
+ const i18n = {
2
+ common: {
3
+ hello: "",
4
+ ping: "",
5
+ render: {
6
+ wait: ""
7
+ }
8
+ }
9
+ };
10
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/infra/i18n/default.ts"],"sourcesContent":["const i18n: any = {\n common: {\n hello: \"\",\n ping: \"\",\n render: {\n wait: \"\",\n },\n },\n\n}\n"],"mappings":"AAAA,MAAM,OAAY;AAAA,EAChB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEF;","names":[]}
@@ -1,9 +1,8 @@
1
- var __create = Object.create;
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
6
  var __export = (target, all) => {
8
7
  for (var name in all)
9
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,122 +15,48 @@ var __copyProps = (to, from, except, desc) => {
16
15
  }
17
16
  return to;
18
17
  };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
- var __async = (__this, __arguments, generator) => {
29
- return new Promise((resolve, reject) => {
30
- var fulfilled = (value) => {
31
- try {
32
- step(generator.next(value));
33
- } catch (e) {
34
- reject(e);
35
- }
36
- };
37
- var rejected = (value) => {
38
- try {
39
- step(generator.throw(value));
40
- } catch (e) {
41
- reject(e);
42
- }
43
- };
44
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
45
- step((generator = generator.apply(__this, __arguments)).next());
46
- });
47
- };
19
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
48
20
  var i18n_exports = {};
49
21
  __export(i18n_exports, {
50
- loadI18nConfig: () => loadI18nConfig,
51
- tran: () => tran
22
+ I18nService: () => I18nService
52
23
  });
53
24
  module.exports = __toCommonJS(i18n_exports);
54
25
  var import_parser = require("./parser");
55
- const i18nObj = {};
56
- init().then((_) => console.log("i18n loaded")).catch((err) => console.error(err));
57
- function init() {
58
- return __async(this, null, function* () {
59
- const zh = yield import("./zh-cn.json");
60
- i18nObj["zh-cn"] = zh;
61
- });
62
- }
63
- function isObject(item) {
64
- return item && typeof item === "object" && !Array.isArray(item);
65
- }
66
- function merge(target, ...sources) {
67
- if (!sources.length) return target;
68
- const source = sources.shift();
69
- if (isObject(target) && isObject(source)) {
70
- for (const key in source) {
71
- if (isObject(source[key])) {
72
- if (!target[key]) Object.assign(target, { [key]: {} });
73
- merge(target[key], source[key]);
74
- } else {
75
- Object.assign(target, { [key]: source[key] });
76
- }
77
- }
26
+ var import_util = require("./util");
27
+ class I18nService {
28
+ constructor(config) {
29
+ __publicField(this, "obj", {});
78
30
  }
79
- return merge(target, ...sources);
80
- }
81
- function loadI18nConfig(lang, obj) {
82
- const raw = i18nObj[lang];
83
- i18nObj[lang] = merge(raw, obj);
84
- console.log(`overwrite i18n ${lang} `);
85
- }
86
- function tran(path, params = {}, lang = "zh-cn") {
87
- const keys = path.split(".");
88
- let result = i18nObj[lang];
89
- for (const key of keys) {
90
- if (result[key] !== void 0) {
91
- result = result[key];
92
- } else {
31
+ mergeConfig(lang, obj) {
32
+ }
33
+ loadLang(lang) {
34
+ }
35
+ tran(path, params = {}, lang = "zh-cn") {
36
+ const keys = path.split(".");
37
+ let result = this.obj[lang];
38
+ if (!result) {
93
39
  return null;
94
40
  }
95
- }
96
- try {
97
- if (typeof result === "string") {
98
- return (0, import_parser.interpolate)(result, params);
41
+ for (const key of keys) {
42
+ if (result[key] !== void 0) {
43
+ result = result[key];
44
+ } else {
45
+ return null;
46
+ }
99
47
  }
100
- } catch (e) {
101
- return interpolateString(result, params);
102
- }
103
- return null;
104
- }
105
- function interpolateString(str, context) {
106
- const regex = /\{\{(.*?)\?\s*'(.*?)'\s*:\s*'(.*?)'\s*\}\}/;
107
- let match;
108
- while ((match = regex.exec(str)) !== null) {
109
- const [fullMatch, condition, trueValue, falseValue] = match;
110
- const resolvedTrueValue = interpolateString(trueValue, context);
111
- const resolvedFalseValue = interpolateString(falseValue, context);
112
- let result = safeEval(condition, context);
113
- if (typeof result === "string") {
114
- result = false;
48
+ try {
49
+ if (typeof result === "string") {
50
+ return (0, import_parser.interpolate)(result, params);
51
+ }
52
+ } catch (e) {
53
+ return (0, import_util.interpolateString)(result, params);
115
54
  }
116
- const replacement = result ? resolvedTrueValue : resolvedFalseValue;
117
- str = str.replace(fullMatch, replacement);
118
- }
119
- const variableRegex = /\{\{(.*?)\}\}/g;
120
- str = str.replace(variableRegex, (match2, expr) => safeEval(expr, context));
121
- return str;
122
- }
123
- function safeEval(expr, context) {
124
- try {
125
- const fn = new Function(...Object.keys(context), `return ${expr}`);
126
- return fn(...Object.values(context));
127
- } catch (e) {
128
- console.error(expr, context, e);
129
- return expr;
55
+ return null;
130
56
  }
131
57
  }
132
58
  // Annotate the CommonJS export names for ESM import in node:
133
59
  0 && (module.exports = {
134
- loadI18nConfig,
135
- tran
60
+ I18nService
136
61
  });
137
62
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/infra/i18n/index.ts"],"sourcesContent":["import { interpolate } from './parser'\n\nconst i18nObj = {}\n\ninit().then((_) => console.log('i18n loaded'))\n .catch((err) => console.error(err))\n\nasync function init() {\n // @ts-ignore\n const zh = await import('./zh-cn.json', { with: { type: 'json' } })\n i18nObj['zh-cn'] = zh\n}\n\n// export async function loadI18N() {\n// const zh = await import('./zh-cn.json')\n// }\n\nfunction isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item)\n}\n\nfunction merge(target, ...sources) {\n if (!sources.length) return target\n const source = sources.shift()\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} })\n merge(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n return merge(target, ...sources)\n}\n\nexport function loadI18nConfig(lang: string, obj: any) {\n const raw = i18nObj[lang]\n i18nObj[lang] = merge(raw, obj)\n console.log(`overwrite i18n ${lang} `)\n}\n\nexport function tran(path: string, params = {}, lang = 'zh-cn'): string {\n const keys = path.split('.')\n let result = i18nObj[lang]\n\n for (const key of keys) {\n if (result[key] !== undefined) {\n result = result[key]\n } else {\n return null\n }\n }\n try {\n if (typeof result === 'string') {\n return interpolate(result, params)\n }\n } catch (e) {\n return interpolateString(result, params)\n }\n\n return null\n}\n\nfunction interpolateString(str, context) {\n // 正则表达式匹配三元表达式\n const regex = /\\{\\{(.*?)\\?\\s*'(.*?)'\\s*:\\s*'(.*?)'\\s*\\}\\}/\n let match\n\n // 递归解析\n while ((match = regex.exec(str)) !== null) {\n const [fullMatch, condition, trueValue, falseValue] = match\n\n // 递归解析 trueValue 和 falseValue 以处理嵌套情况\n const resolvedTrueValue = interpolateString(trueValue, context)\n const resolvedFalseValue = interpolateString(falseValue, context)\n\n // 计算条件表达式\n let result = safeEval(condition, context)\n if (typeof result === 'string') {\n result = false\n }\n const replacement = result ? resolvedTrueValue : resolvedFalseValue\n\n // 替换匹配到的三元表达式\n str = str.replace(fullMatch, replacement)\n }\n\n // 替换变量插值\n const variableRegex = /\\{\\{(.*?)\\}\\}/g\n str = str.replace(variableRegex, (match, expr) => safeEval(expr, context))\n\n return str\n}\nfunction safeEval(expr, context) {\n try {\n const fn = new Function(...Object.keys(context), `return ${expr}`)\n return fn(...Object.values(context))\n } catch (e) {\n console.error(expr, context, e)\n return expr\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4B;AAE5B,MAAM,UAAU,CAAC;AAEjB,KAAK,EAAE,KAAK,CAAC,MAAM,QAAQ,IAAI,aAAa,CAAC,EAC1C,MAAM,CAAC,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAEpC,SAAe,OAAO;AAAA;AAEpB,UAAM,KAAK,MAAM,OAAO,cAA2C;AACnE,YAAQ,OAAO,IAAI;AAAA,EACrB;AAAA;AAMA,SAAS,SAAS,MAAM;AACtB,SAAO,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI;AAChE;AAEA,SAAS,MAAM,WAAW,SAAS;AACjC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,SAAS,MAAM,KAAK,SAAS,MAAM,GAAG;AACxC,eAAW,OAAO,QAAQ;AACxB,UAAI,SAAS,OAAO,GAAG,CAAC,GAAG;AACzB,YAAI,CAAC,OAAO,GAAG,EAAG,QAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AACrD,cAAM,OAAO,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,MAChC,OAAO;AACL,eAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,QAAQ,GAAG,OAAO;AACjC;AAEO,SAAS,eAAe,MAAc,KAAU;AACrD,QAAM,MAAM,QAAQ,IAAI;AACxB,UAAQ,IAAI,IAAI,MAAM,KAAK,GAAG;AAC9B,UAAQ,IAAI,kBAAkB,IAAI,GAAG;AACvC;AAEO,SAAS,KAAK,MAAc,SAAS,CAAC,GAAG,OAAO,SAAiB;AACtE,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,SAAS,QAAQ,IAAI;AAEzB,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,GAAG,MAAM,QAAW;AAC7B,eAAS,OAAO,GAAG;AAAA,IACrB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI;AACF,QAAI,OAAO,WAAW,UAAU;AAC9B,iBAAO,2BAAY,QAAQ,MAAM;AAAA,IACnC;AAAA,EACF,SAAS,GAAG;AACV,WAAO,kBAAkB,QAAQ,MAAM;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAK,SAAS;AAEvC,QAAM,QAAQ;AACd,MAAI;AAGJ,UAAQ,QAAQ,MAAM,KAAK,GAAG,OAAO,MAAM;AACzC,UAAM,CAAC,WAAW,WAAW,WAAW,UAAU,IAAI;AAGtD,UAAM,oBAAoB,kBAAkB,WAAW,OAAO;AAC9D,UAAM,qBAAqB,kBAAkB,YAAY,OAAO;AAGhE,QAAI,SAAS,SAAS,WAAW,OAAO;AACxC,QAAI,OAAO,WAAW,UAAU;AAC9B,eAAS;AAAA,IACX;AACA,UAAM,cAAc,SAAS,oBAAoB;AAGjD,UAAM,IAAI,QAAQ,WAAW,WAAW;AAAA,EAC1C;AAGA,QAAM,gBAAgB;AACtB,QAAM,IAAI,QAAQ,eAAe,CAACA,QAAO,SAAS,SAAS,MAAM,OAAO,CAAC;AAEzE,SAAO;AACT;AACA,SAAS,SAAS,MAAM,SAAS;AAC/B,MAAI;AACF,UAAM,KAAK,IAAI,SAAS,GAAG,OAAO,KAAK,OAAO,GAAG,UAAU,IAAI,EAAE;AACjE,WAAO,GAAG,GAAG,OAAO,OAAO,OAAO,CAAC;AAAA,EACrC,SAAS,GAAG;AACV,YAAQ,MAAM,MAAM,SAAS,CAAC;AAC9B,WAAO;AAAA,EACT;AACF;","names":["match"]}
1
+ {"version":3,"sources":["../../../../src/infra/i18n/index.ts"],"sourcesContent":["import { interpolate } from './parser'\nimport { interpolateString } from './util'\n\nexport class I18nService {\n obj: any = {}\n constructor(config?: any) {\n\n }\n mergeConfig(lang: string, obj: any) {\n\n }\n\n loadLang(lang: string) {\n\n }\n\n tran(path: string, params = {}, lang = 'zh-cn'): string {\n const keys = path.split('.')\n let result = this.obj[lang]\n if(!result) {\n return null\n }\n for (const key of keys) {\n if (result[key] !== undefined) {\n result = result[key]\n } else {\n return null\n }\n }\n try {\n if (typeof result === 'string') {\n return interpolate(result, params)\n }\n } catch (e) {\n return interpolateString(result, params)\n }\n\n return null\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4B;AAC5B,kBAAkC;AAE3B,MAAM,YAAY;AAAA,EAEvB,YAAY,QAAc;AAD1B,+BAAW,CAAC;AAAA,EAGZ;AAAA,EACA,YAAY,MAAc,KAAU;AAAA,EAEpC;AAAA,EAEA,SAAS,MAAc;AAAA,EAEvB;AAAA,EAEA,KAAK,MAAc,SAAS,CAAC,GAAG,OAAO,SAAiB;AACtD,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,SAAS,KAAK,IAAI,IAAI;AAC1B,QAAG,CAAC,QAAQ;AACV,aAAO;AAAA,IACT;AACA,eAAW,OAAO,MAAM;AACtB,UAAI,OAAO,GAAG,MAAM,QAAW;AAC7B,iBAAS,OAAO,GAAG;AAAA,MACrB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI;AACF,UAAI,OAAO,WAAW,UAAU;AAC9B,mBAAO,2BAAY,QAAQ,MAAM;AAAA,MACnC;AAAA,IACF,SAAS,GAAG;AACV,iBAAO,+BAAkB,QAAQ,MAAM;AAAA,IACzC;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,76 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var util_exports = {};
19
+ __export(util_exports, {
20
+ interpolateString: () => interpolateString,
21
+ isObject: () => isObject,
22
+ merge: () => merge
23
+ });
24
+ module.exports = __toCommonJS(util_exports);
25
+ function isObject(item) {
26
+ return item && typeof item === "object" && !Array.isArray(item);
27
+ }
28
+ function merge(target, ...sources) {
29
+ if (!sources.length) return target;
30
+ const source = sources.shift();
31
+ if (isObject(target) && isObject(source)) {
32
+ for (const key in source) {
33
+ if (isObject(source[key])) {
34
+ if (!target[key]) Object.assign(target, { [key]: {} });
35
+ merge(target[key], source[key]);
36
+ } else {
37
+ Object.assign(target, { [key]: source[key] });
38
+ }
39
+ }
40
+ }
41
+ return merge(target, ...sources);
42
+ }
43
+ function interpolateString(str, context) {
44
+ const regex = /\{\{(.*?)\?\s*'(.*?)'\s*:\s*'(.*?)'\s*\}\}/;
45
+ let match;
46
+ while ((match = regex.exec(str)) !== null) {
47
+ const [fullMatch, condition, trueValue, falseValue] = match;
48
+ const resolvedTrueValue = interpolateString(trueValue, context);
49
+ const resolvedFalseValue = interpolateString(falseValue, context);
50
+ let result = safeEval(condition, context);
51
+ if (typeof result === "string") {
52
+ result = false;
53
+ }
54
+ const replacement = result ? resolvedTrueValue : resolvedFalseValue;
55
+ str = str.replace(fullMatch, replacement);
56
+ }
57
+ const variableRegex = /\{\{(.*?)\}\}/g;
58
+ str = str.replace(variableRegex, (match2, expr) => safeEval(expr, context));
59
+ return str;
60
+ }
61
+ function safeEval(expr, context) {
62
+ try {
63
+ const fn = new Function(...Object.keys(context), `return ${expr}`);
64
+ return fn(...Object.values(context));
65
+ } catch (e) {
66
+ console.error(expr, context, e);
67
+ return expr;
68
+ }
69
+ }
70
+ // Annotate the CommonJS export names for ESM import in node:
71
+ 0 && (module.exports = {
72
+ interpolateString,
73
+ isObject,
74
+ merge
75
+ });
76
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/infra/i18n/util.ts"],"sourcesContent":["\nexport function isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item)\n}\n\nexport function merge(target, ...sources) {\n if (!sources.length) return target\n const source = sources.shift()\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} })\n merge(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n return merge(target, ...sources)\n}\n\n\nexport function interpolateString(str, context) {\n // 正则表达式匹配三元表达式\n const regex = /\\{\\{(.*?)\\?\\s*'(.*?)'\\s*:\\s*'(.*?)'\\s*\\}\\}/\n let match\n\n // 递归解析\n while ((match = regex.exec(str)) !== null) {\n const [fullMatch, condition, trueValue, falseValue] = match\n\n // 递归解析 trueValue 和 falseValue 以处理嵌套情况\n const resolvedTrueValue = interpolateString(trueValue, context)\n const resolvedFalseValue = interpolateString(falseValue, context)\n\n // 计算条件表达式\n let result = safeEval(condition, context)\n if (typeof result === 'string') {\n result = false\n }\n const replacement = result ? resolvedTrueValue : resolvedFalseValue\n\n // 替换匹配到的三元表达式\n str = str.replace(fullMatch, replacement)\n }\n\n // 替换变量插值\n const variableRegex = /\\{\\{(.*?)\\}\\}/g\n str = str.replace(variableRegex, (match, expr) => safeEval(expr, context))\n\n return str\n}\nfunction safeEval(expr, context) {\n try {\n const fn = new Function(...Object.keys(context), `return ${expr}`)\n return fn(...Object.values(context))\n } catch (e) {\n console.error(expr, context, e)\n return expr\n }\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,SAAS,SAAS,MAAM;AAC7B,SAAO,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI;AAChE;AAEO,SAAS,MAAM,WAAW,SAAS;AACxC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,SAAS,MAAM,KAAK,SAAS,MAAM,GAAG;AACxC,eAAW,OAAO,QAAQ;AACxB,UAAI,SAAS,OAAO,GAAG,CAAC,GAAG;AACzB,YAAI,CAAC,OAAO,GAAG,EAAG,QAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AACrD,cAAM,OAAO,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,MAChC,OAAO;AACL,eAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,QAAQ,GAAG,OAAO;AACjC;AAGO,SAAS,kBAAkB,KAAK,SAAS;AAE9C,QAAM,QAAQ;AACd,MAAI;AAGJ,UAAQ,QAAQ,MAAM,KAAK,GAAG,OAAO,MAAM;AACzC,UAAM,CAAC,WAAW,WAAW,WAAW,UAAU,IAAI;AAGtD,UAAM,oBAAoB,kBAAkB,WAAW,OAAO;AAC9D,UAAM,qBAAqB,kBAAkB,YAAY,OAAO;AAGhE,QAAI,SAAS,SAAS,WAAW,OAAO;AACxC,QAAI,OAAO,WAAW,UAAU;AAC9B,eAAS;AAAA,IACX;AACA,UAAM,cAAc,SAAS,oBAAoB;AAGjD,UAAM,IAAI,QAAQ,WAAW,WAAW;AAAA,EAC1C;AAGA,QAAM,gBAAgB;AACtB,QAAM,IAAI,QAAQ,eAAe,CAACA,QAAO,SAAS,SAAS,MAAM,OAAO,CAAC;AAEzE,SAAO;AACT;AACA,SAAS,SAAS,MAAM,SAAS;AAC/B,MAAI;AACF,UAAM,KAAK,IAAI,SAAS,GAAG,OAAO,KAAK,OAAO,GAAG,UAAU,IAAI,EAAE;AACjE,WAAO,GAAG,GAAG,OAAO,OAAO,OAAO,CAAC;AAAA,EACrC,SAAS,GAAG;AACV,YAAQ,MAAM,MAAM,SAAS,CAAC;AAC9B,WAAO;AAAA,EACT;AACF;","names":["match"]}
@@ -1 +1 @@
1
- {"common":{"hello":"你好,我是 bsbot","ping":"pong","render":{"wait":"开始渲染啦,请耐心等待 {{sec}} s"}},"ws":{"subscribe":{"update":"Hello {{username}},你关注的谱师「{{mapperName}}」更新啦!✨"}},"commands":{"bsbot":{"ss":{"account":{"not-found":"☹️没有找到SS用户「{{accountId}}」"}},"bs":{"account":{"not-found":"☹️没有找到BeatSaver用户「{{accountId}}」"}},"bl":{"account":{"not-found":"☹️没有找到BL用户「{{accountId}}」"}},"common":{"error":{"not-implemented":"😳被发现了,这个功能还没实现...","reach-request-retry-limit":"🤕网络重试到达上限、看来 bot 的网络出了点问题","empty-prompt":"看来你什么都没输入,已取消操作"}},"config":{"clear":"成功清除设置:{{key}}","set":{"success":"👍成功设置:{{key}}","fail":"😶‍🌫️用户偏好设置失败,{{reason}}"},"prompt":"请在30s内输入配置值,类型 {{type}}","unknown-key":"🤨{{input}}是一个未知配置项,不可以设置","all-available-key":"所有可能配置项如下:\n- BLProfile背景图片(bl::profile::render::img)\n- SSProfile背景图片(ss::profile::render::img)\n- BLScore背景图片(bl::score::render::img)\n","show":{"not-implemented":"还没实现展示用户偏好...不过你可以先设置着先"}},"render":{"error":"图片渲染超时/出错...也许稍等一会就好了","request":{"error":"数据获取失败了☹️"}},"help":{"description":"查看帮助 (WIP)","usage":"bbhelp 查看使用方法","examples":"示例\nbbhelp\nbsbot.help"},"message":{"network-error":"☹️似乎发生了网络错误,请稍后重试吧"},"cmp":{"description":"compare 指令 (WIP)"},"who":{"description":"用于查询所@用户对应的 BeatLeader/ScoreSaber 面板","usage":"输入 bbwho 并@某人,如果他/她/它绑定了ScoreSaber Id(也就是 steam 的用户 Id),会查询该用户在对应平台的top 24 首 rank 谱面打分,并生成渲染图。","examples":"示例\nbbwho @someone\nbsbot.who @someone\nbsbot.who -p ss @someone","options":{"p":"查询的平台,ss 代表 scoresaber,默认为 beatleader"},"need-at":"谁?plz 重新执行指令并@ ta","not-bind":"你要查询的ta,还没有绑定哦"},"rank":{"description":"用于查询指定 scoreSaberID 对应用户的 BeatLeader/ScoreSaber 面板","usage":"输入 bbrank + scoreSaberId(也就是steamId)查询该用户在对应平台的top 24 首 rank 谱面打分,并生成渲染图。","examples":"示例\nbbrank 2169974796454690\nbsbot.rank 2169974796454690\nbsbot.rank -p ss 2169974796454690","options":{"p":"查询的平台,ss 代表 scoresaber,默认为 beatleader"}},"me":{"description":"用于查询自己绑定用户对应的 BeatLeader/ScoreSaber 面板","usage":"输入 bbme,如果已经绑定了ScoreSaber Id(也就是 steam 的用户 Id),会查询该用户在对应平台的top 24 首 rank 谱面打分,并生成渲染图。","examples":"示例\nbsbot.me\nbbme\nbbme -p ss","options":{"p":"查询的平台,ss 代表 scoresaber,默认为 beatleader"},"not-found":"Ops,似乎还没有绑定到 ScoreSaber 或 BeatLeader","score-not-found":"😯,没有找到用户「{{user}}」谱面「{{id}} ({{mode ? '{{mode}}' : '' }} {{diff ? '-{{diff}}' : '' }})」的BL打分数据"},"bind":{"description":"绑定自己的 ScoreSaberId(也就是 steam 的用户 Id,仅公开信息,无需验证)","usage":"输入 bbbind,后接 userId,按照提示即可绑定","examples":"示例\nbsbot.bind 76561198339986544\nbbbind 76561198339986544","bs":{"not-found":"☹️什么没有找到,这个 code 真的有效吗?","network-error":"☹️似乎发生了网络错误,请稍后重试吧","unknown-error":"☹️不知道发生了什么,暂时无法绑定,请稍后重试吧","invalid-token":"无效 token,请确认给出的 code 有效。","success":"成功绑定 BeatSaver 用户 {{name}}({{id}})"},"bl":{"not-found":"☹️什么没有找到,这个 code 真的有效吗?","network-error":"☹️似乎发生了网络错误,请稍后重试吧","unknown-error":"☹️不知道发生了什么,暂时无法绑定,请稍后重试吧","invalid-token":"无效 token,请确认给出的 code 有效。","success":"成功绑定 BeatLeader 用户 {{name}}({{id}})"},"network-error":"☹️似乎发生了网络错误,请稍后重试吧","exist":"另外,你已经绑定了「{{id}}」,继续绑定丢失当前绑定哦","cancel":"已取消","timeout":"已超时取消","not-found":"Ops,没有找到 id 为「{{id}}」的 {{platform]} 用户","ack-prompt":"确定要绑定「{{user}}」吗,30 秒内回复「y」或「yes」以确认,超时或回复其他内容取消操作","success":"🎉,成功绑定「{{user}}」啦"},"score":{"description":"查询用户在Beatleader 上的某次打分成绩,并生成渲染图。","usage":"1. bbscore 加上 beatleader 的 scoreId,即可生成渲染图。\n2. bbscore 加上 Beatsaver 的 mapId,即可查询自己绑定的Bealeader账号关于该谱面的最高打分,并生成渲染图\n3. bbscore 加上 Beatsaver 的 mapId 并@某人,即可查询该用户绑定的Bealeader账号关于该谱面的最高打分,并生成渲染图","examples":"示例\nbsbot.score 13887221\nbbscore 33b62\nbbscore 33b62@someone","not-a-score-id":"似乎不是一个 score ID","not-bind":"你还没有绑定哦,使用 bind 指令进行绑定吧","who-not-bind":"你要查询的ta,还没有绑定哦"},"search":{"description":"按关键词进行谱面搜索","usage":"通过关键字进行谱面搜索,会发送将最相关的 3 个谱面。","examples":"示例\nbsbot.search megalovania\nbbsou megalovania\nbbsearch megalovania","success":"为你奉上关于「{{key}}」的{{length}}首谱面 🎉","not-found":"Ops,关于「{{key}}」什么都没找到","too-long-key":"关键词长度不应该超过 15 哦,因为这样容易什么都找不到,较长的部分已经帮你截掉啦,正在搜索中「{{key}}」"},"id":{"description":"按谱面id查找谱面。","usage":"根据谱面ID查找谱面。","examples":"示例\nbsbot.id 36677\nbbid 36677\n!bsr 36677\n36677","error-map-id":"「{{input}}」似乎不是一个 mapId,正确的 mapId 是这样的哦(3877a)","not-found":"Ops! 似乎没有找到 id 为「{{input}}」的谱面"},"latest":{"description":"查找最新的三首谱面。","usage":"获取最新的三首谱面。","examples":"示例\nbsbot.latest\nbsbot.new\nbbnew","info":"为你奉上最新的 3 首谱面 🎉"},"subscribe":{"description":"订阅 BeatSaber 相关的事件,并主动推送。(RC)","usage":"通过 bbsub 订阅 BeatSaber 相关的事件,当特定事件发生时会进行主动推送。","examples":"示例\nbsbot.subscribe\nbbsub","alert":{"no-bind-bs-id":"你还未绑定 beatsaver,快使用 bbbindbs 进行绑定吧","not-success":"订阅失败,可能是因为凭证已经过期","success":"成功订阅BeatSaver通知,当新通知出现时,会主动推送给你。","invalid-token":"似乎token 已经失效了,快使用 bbbindbs 重新进行绑定吧"},"beatleader":{"exist":"当前群聊/频道已订阅 BeatLeader 打分更新事件","success":"成功订阅 BeatLeader 打分更新事件,当参与群员出现满足条件的打分事件时,会主动推送"},"beatsaver-mapper":{"exist":"当前群聊/频道已订阅 BeatSaver 谱面更新事件","success":"成功订阅 BeatSaver 谱面更新事件,当「{{name}}」发布新谱面时,会主动推送"},"beatsaver":{"exist":"当前群聊/频道已订阅 BeatSaver 谱面更新事件","success":"成功订阅 BeatSaver 谱面更新事件,当参与群员发布新谱面时,会主动推送"},"info":{"none":"当前群聊/频道没有任何 BeatSaber 事件订阅。","header":"当前群聊/频道 BeatSaber 订阅如下:","group-body-item":"订阅类型「{{type}}」","body-item":"订阅类型「{{type}}」{{enable ? '' : '(已禁用)' }}, 共 {{cnt}} 名参与成员","body-item-include-you":"(包括你哦)"},"join":{"description":"加入本群聊订阅的 BeatSaber 相关的事件","usage":"","examples":"示例\nbsbot.subscribe\nbbsub","success":{"beatleader":"成功加入本群Beatleader订阅组,当你打出高分时,会在本群推送","beatsaver":"成功加入本群订阅组,当你发布新谱面时,会在本群推送"},"nosub":{"beatleader":"当前群组/频道未启用 beatleader 打分订阅","beatsaver":"当前群组/频道未启用 beatsaver 谱师订阅"}},"leave":{"description":"离开本群 BeatSaber 相关事件订阅组","usage":"","examples":"示例\nbsbot.subscribe 查看当前会话的订阅信息\nbbsub\nbbsub --type beatsaver 为当前会话订阅 beatsaver 新谱面事件,当特定新谱面出现,会主动推送\nbbsub --type beatleader 为当前会话订阅 beatleader 打分事件,当满足要求的打分事件出现,会主动推送\nbbsub --type alert 订阅个人 BeatSaver 通知,当 beatsaver 新通知出现,会主动推送","not-exist":{"beatleader":"你还未加入当前群组/频道的 beatleader 打分订阅,无需离开","beatsaver":null},"success":{"beatleader":"成功离开本群「beatleader」订阅组,当你打出高分时,不会再在本群推送了","beatsaver":"成功离开本群「beatsaver」订阅组,当你发布新谱面时,不会再在本群推送了"}}},"unsubscribe":{"description":"取消订阅 BeatSaber 相关的事件。(RC)","usage":"取消通过 bbsub 订阅的 BeatSaber 相关的事件,当特定事件发生时不会进行主动推送。","examples":"示例\nbsbot.unsubscribe\nbbunsub","nosub":{"beatleader":"当前群组/频道未启用 beatleader 打分订阅","beatsaver-mapper":"当前群组/频道未订阅 谱师「{{name}}」的更新,无需取消","beatsaver":"当前群组/频道未启用 beatsaver 谱师订阅"},"success":{"beatleader":"成功禁用 beatleader 打分订阅","beatsaver":"成功禁用 beatsaver 谱师订阅","beatsaver-mapper":"成功禁用谱师「{{name}}」的更新订阅"},"cancel-all":"已成功取消所有更新订阅","cancel":"已取消对谱师「{id}」的更新订阅"}}},"_config":{"beatSaverHost":"BeatSaverOrigin,例如:https://api.beatsaver.com","beatSaverWSHost":"BeatSaverWebSocketOrigin,用于实时监听谱面更新,例如wss://ws.beatsaver.com/maps","renderMode":"谱面图是由插件本地生成/远程获取"}}
1
+ {"common":{"hello":"你好,我是 bsbot","ping":"pong","render":{"wait":"开始渲染啦,请耐心等待 {{sec}} s"}},"ws":{"subscribe":{"update":"Hello {{username}},你关注的谱师「{{mapperName}}」更新啦!✨"}},"commands":{"bsbot":{"ss":{"account":{"not-found":"☹️没有找到SS用户「{{accountId}}」"}},"bs":{"account":{"not-found":"☹️没有找到BeatSaver用户「{{accountId}}」"}},"bl":{"account":{"not-found":"☹️没有找到BL用户「{{accountId}}」"}},"common":{"error":{"not-implemented":"😳被发现了,这个功能还没实现...","reach-request-retry-limit":"🤕网络重试到达上限、看来 bot 的网络出了点问题","empty-prompt":"看来你什么都没输入,已取消操作"}},"config":{"clear":"成功清除设置:{{key}}","set":{"success":"👍成功设置:{{key}}","fail":"😶‍🌫️用户偏好设置失败,{{reason}}"},"prompt":"请在30s内输入配置值,类型 {{type}}","unknown-key":"🤨{{input}}是一个未知配置项,不可以设置","all-available-key":"所有可能配置项如下:\n- BLProfile背景图片(bl::profile::render::img)\n- SSProfile背景图片(ss::profile::render::img)\n- BLScore背景图片(bl::score::render::img)\n","show":{"not-implemented":"还没实现展示用户偏好...不过你可以先设置着先"}},"render":{"error":"图片渲染超时/出错...也许稍等一会就好了","request":{"error":"数据获取失败了☹️"}},"help":{"description":"查看帮助 (WIP)","usage":"bbhelp 查看使用方法","examples":"示例\nbbhelp\nbsbot.help"},"message":{"network-error":"☹️似乎发生了网络错误,请稍后重试吧"},"cmp":{"description":"compare 指令 (WIP)"},"who":{"description":"用于查询所@用户对应的 BeatLeader/ScoreSaber 面板","usage":"输入 bbwho 并@某人,如果他/她/它绑定了ScoreSaber Id(也就是 steam 的用户 Id),会查询该用户在对应平台的top 24 首 rank 谱面打分,并生成渲染图。","examples":"示例\nbbwho @someone\nbsbot.who @someone\nbsbot.who -p ss @someone","options":{"p":"查询的平台,ss 代表 scoresaber,默认为 beatleader"},"need-at":"谁?plz 重新执行指令并@ ta","not-bind":"你要查询的ta,还没有绑定哦"},"rank":{"description":"用于查询指定 scoreSaberID 对应用户的 BeatLeader/ScoreSaber 面板","usage":"输入 bbrank + scoreSaberId(也就是steamId)查询该用户在对应平台的top 24 首 rank 谱面打分,并生成渲染图。","examples":"示例\nbbrank 2169974796454690\nbsbot.rank 2169974796454690\nbsbot.rank -p ss 2169974796454690","options":{"p":"查询的平台,ss 代表 scoresaber,默认为 beatleader"}},"me":{"description":"用于查询自己绑定用户对应的 BeatLeader/ScoreSaber 面板","usage":"输入 bbme,如果已经绑定了ScoreSaber Id(也就是 steam 的用户 Id),会查询该用户在对应平台的top 24 首 rank 谱面打分,并生成渲染图。","examples":"示例\nbsbot.me\nbbme\nbbme -p ss","options":{"p":"查询的平台,ss 代表 scoresaber,默认为 beatleader"},"not-found":"Ops,似乎还没有绑定到 ScoreSaber 或 BeatLeader","score-not-found":"😯,没有找到用户「{{user}}」谱面「{{id}} ({{mode ? '{{mode}}' : '' }} {{diff ? '-{{diff}}' : '' }})」的BL打分数据"},"bind":{"description":"绑定自己的 ScoreSaberId(也就是 steam 的用户 Id,仅公开信息,无需验证)","usage":"输入 bbbind,后接 userId,按照提示即可绑定","examples":"示例\nbsbot.bind 76561198339986544\nbbbind 76561198339986544","bs":{"not-found":"☹️什么没有找到,这个 code 真的有效吗?","network-error":"☹️似乎发生了网络错误,请稍后重试吧","unknown-error":"☹️不知道发生了什么,暂时无法绑定,请稍后重试吧","invalid-token":"无效 token,请确认给出的 code 有效。","success":"成功绑定 BeatSaver 用户 {{name}}({{id}})"},"bl":{"not-found":"☹️什么没有找到,这个 code 真的有效吗?","network-error":"☹️似乎发生了网络错误,请稍后重试吧","unknown-error":"☹️不知道发生了什么,暂时无法绑定,请稍后重试吧","invalid-token":"无效 token,请确认给出的 code 有效。","success":"成功绑定 BeatLeader 用户 {{name}}({{id}})"},"network-error":"☹️似乎发生了网络错误,请稍后重试吧","exist":"另外,你已经绑定了「{{id}}」,继续绑定丢失当前绑定哦","cancel":"已取消","timeout":"已超时取消","not-found":"Ops,没有找到 id 为「{{id}}」的 {{platform]} 用户","ack-prompt":"确定要绑定「{{user}}」吗,30 秒内回复「y」或「yes」以确认,超时或回复其他内容取消操作","success":"🎉,成功绑定「{{user}}」啦"},"score":{"description":"查询用户在Beatleader 上的某次打分成绩,并生成渲染图。","usage":"1. bbscore 加上 beatleader 的 scoreId,即可生成渲染图。\n2. bbscore 加上 Beatsaver 的 mapId,即可查询自己绑定的Bealeader账号关于该谱面的最高打分,并生成渲染图\n3. bbscore 加上 Beatsaver 的 mapId 并@某人,即可查询该用户绑定的Bealeader账号关于该谱面的最高打分,并生成渲染图","examples":"示例\nbsbot.score 13887221\nbbscore 33b62\nbbscore 33b62@someone","not-a-score-id":"似乎不是一个 score ID","not-bind":"你还没有绑定哦,使用 bind 指令进行绑定吧","who-not-bind":"你要查询的ta,还没有绑定哦"},"search":{"description":"按关键词进行谱面搜索","usage":"通过关键字进行谱面搜索,会发送将最相关的 3 个谱面。","examples":"示例\nbsbot.search megalovania\nbbsou megalovania\nbbsearch megalovania","success":"为你奉上关于「{{key}}」的{{length}}首谱面 🎉","not-found":"Ops,关于「{{key}}」什么都没找到","too-long-key":"关键词长度不应该超过 15 哦,因为这样容易什么都找不到,较长的部分已经帮你截掉啦,正在搜索中「{{key}}」"},"id":{"description":"按谱面id查找谱面。","usage":"根据谱面ID查找谱面。","examples":"示例\nbsbot.id 36677\nbbid 36677\n!bsr 36677\n36677","error-map-id":"「{{input}}」似乎不是一个 mapId,正确的 mapId 是这样的哦(3877a)","not-found":"Ops! 似乎没有找到 id 为「{{input}}」的谱面"},"latest":{"description":"查找最新的三首谱面。","usage":"获取最新的三首谱面。","examples":"示例\nbsbot.latest\nbsbot.new\nbbnew","info":"为你奉上最新的 3 首谱面 🎉"},"subscribe":{"description":"订阅 BeatSaber 相关的事件,并主动推送。(RC)","usage":"通过 bbsub 订阅 BeatSaber 相关的事件,当特定事件发生时会进行主动推送。","examples":"示例\nbsbot.subscribe\nbbsub","alert":{"no-bind-bs-id":"你还未绑定 beatsaver,快使用 bbbindbs 进行绑定吧","not-success":"订阅失败,可能是因为凭证已经过期","success":"成功订阅BeatSaver通知,当新通知出现时,会主动推送给你。","invalid-token":"似乎token 已经失效了,快使用 bbbindbs 重新进行绑定吧"},"beatleader":{"exist":"当前群聊/频道已订阅 BeatLeader 打分更新事件","success":"成功订阅 BeatLeader 打分更新事件,当参与群员出现满足条件的打分事件时,会主动推送"},"beatsaver-mapper":{"exist":"当前群聊/频道已订阅 BeatSaver 谱面更新事件","success":"成功订阅 BeatSaver 谱面更新事件,当「{{name}}」发布新谱面时,会主动推送"},"beatsaver":{"exist":"当前群聊/频道已订阅 BeatSaver 谱面更新事件","success":"成功订阅 BeatSaver 谱面更新事件,当参与群员发布新谱面时,会主动推送"},"info":{"none":"当前群聊/频道没有任何 BeatSaber 事件订阅。","header":"当前群聊/频道 BeatSaber 订阅如下:","group-body-item":"订阅类型「{{type}}」","body-item":"订阅类型「{{type}}」{{enable ? '' : '(已禁用)' }}, 共 {{cnt}} 名参与成员","body-item-include-you":"(包括你哦)"},"join":{"description":"加入本群聊订阅的 BeatSaber 相关的事件","usage":"","examples":"示例\nbsbot.subscribe\nbbsub","success":{"beatleader":"成功加入本群Beatleader订阅组,当你打出高分时,会在本群推送","beatsaver":"成功加入本群订阅组,当你发布新谱面时,会在本群推送"},"nosub":{"beatleader":"当前群组/频道未启用 beatleader 打分订阅","beatsaver":"当前群组/频道未启用 beatsaver 谱师订阅"}},"leave":{"description":"离开本群 BeatSaber 相关事件订阅组","usage":"","examples":"示例\nbsbot.subscribe 查看当前会话的订阅信息\nbbsub\nbbsub --type beatsaver 为当前会话订阅 beatsaver 新谱面事件,当特定新谱面出现,会主动推送\nbbsub --type beatleader 为当前会话订阅 beatleader 打分事件,当满足要求的打分事件出现,会主动推送\nbbsub --type alert 订阅个人 BeatSaver 通知,当 beatsaver 新通知出现,会主动推送","not-exist":{"beatleader":"你还未加入当前群组/频道的 beatleader 打分订阅,无需离开","beatsaver":null},"success":{"beatleader":"已离开本群「beatleader」订阅组,当你打出高分时,不会再在本群推送了","beatsaver":"已离开本群「beatsaver」订阅组,当你发布新谱面时,不会再在本群推送了"}}},"unsubscribe":{"description":"取消订阅 BeatSaber 相关的事件。(RC)","usage":"取消通过 bbsub 订阅的 BeatSaber 相关的事件,当特定事件发生时不会进行主动推送。","examples":"示例\nbsbot.unsubscribe\nbbunsub","nosub":{"beatleader":"当前群组/频道未启用 beatleader 打分订阅","beatsaver-mapper":"当前群组/频道未订阅 谱师「{{name}}」的更新,无需取消","beatsaver":"当前群组/频道未启用 beatsaver 谱师订阅"},"success":{"beatleader":"成功禁用 beatleader 打分订阅","beatsaver":"成功禁用 beatsaver 谱师订阅","beatsaver-mapper":"成功禁用谱师「{{name}}」的更新订阅"},"cancel-all":"已成功取消所有更新订阅","cancel":"已取消对谱师「{id}」的更新订阅"}}},"_config":{"beatSaverHost":"BeatSaverOrigin,例如:https://api.beatsaver.com","beatSaverWSHost":"BeatSaverWebSocketOrigin,用于实时监听谱面更新,例如wss://ws.beatsaver.com/maps","renderMode":"谱面图是由插件本地生成/远程获取"}}
@@ -18,14 +18,19 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var infra_exports = {};
20
20
  __export(infra_exports, {
21
- tran: () => import_i18n.tran
21
+ I18nService: () => import_i18n.I18nService,
22
+ S3Config: () => import_s3.S3Config,
23
+ S3Service: () => import_s3.S3Service
22
24
  });
23
25
  module.exports = __toCommonJS(infra_exports);
24
26
  __reExport(infra_exports, require("./support/render"), module.exports);
25
- var import_i18n = require("./i18n/index");
27
+ var import_i18n = require("./i18n");
28
+ var import_s3 = require("./s3");
26
29
  // Annotate the CommonJS export names for ESM import in node:
27
30
  0 && (module.exports = {
28
- tran,
31
+ I18nService,
32
+ S3Config,
33
+ S3Service,
29
34
  ...require("./support/render")
30
35
  });
31
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/infra/index.ts"],"sourcesContent":["export * from './support/render'\nexport { tran } from './i18n/index'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,6BAAd;AACA,kBAAqB;","names":[]}
1
+ {"version":3,"sources":["../../../src/infra/index.ts"],"sourcesContent":["export * from './support/render'\nexport { I18nService } from './i18n'\nexport { S3Service, S3Config } from './s3'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,6BAAd;AACA,kBAA4B;AAC5B,gBAAoC;","names":[]}
@@ -67,8 +67,6 @@ var import_puppeteer_core = require("puppeteer-core");
67
67
  var import_fetch = require("../../../infra/support/fetch");
68
68
  class CFBrowserRendering {
69
69
  constructor(accountId, cfAPIKey) {
70
- this.accountId = accountId;
71
- this.cfAPIKey = cfAPIKey;
72
70
  __publicField(this, "f");
73
71
  this.f = new import_fetch.Fetch().baseUrl(`https://api.cloudflare.com/client/v4/accounts/${accountId}`).extend({
74
72
  headers: {
@@ -134,6 +132,10 @@ const getImageRender = (cfg) => {
134
132
  if (cfg.mode === "cf") {
135
133
  return new CFBrowserRendering(cfg.cfAccountId, cfg.cfAPIKey);
136
134
  }
135
+ if (cfg.mode === "custom") {
136
+ if (!cfg.render) throw new Error("please provide custom img render");
137
+ return cfg.render;
138
+ }
137
139
  if (cfg.puppeteerURL) {
138
140
  return new PuppeteerRendering(RemoteBrowserGetter(cfg.puppeteerURL));
139
141
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/infra/support/render/index.ts"],"sourcesContent":["import {html2imgBuffer, RenderOptions, url2imgBuffer} from \"./puppeteer\";\nimport {Browser, Puppeteer} from \"puppeteer-core\";\nimport {Fetch} from \"@/infra/support/fetch\";\nexport {RenderOptions as PuppeteerOptions}\nexport interface ImageRender {\n html2img: (html: string, opt: RenderOptions) => Promise<Buffer>\n url2img: (url: string, opt: RenderOptions) => Promise<Buffer>\n}\n\nexport type RenderConfig = {\n mode: 'cf' | 'puppeteer'\n puppeteerURL?: string\n defaultWaitTimeout?: number\n waitTimeout?: number\n cfAccountId?: string,\n cfAPIKey?: string,\n}\n\nexport class CFBrowserRendering implements ImageRender {\n f: Fetch\n constructor(private accountId: string, private cfAPIKey: string) {\n this.f = new Fetch()\n .baseUrl(`https://api.cloudflare.com/client/v4/accounts/${accountId}`)\n .extend({\n headers: {\n Authorization: `Bearer ${cfAPIKey}`\n },\n })\n }\n private post(body) {\n return this.f.post('/browser-rendering/screenshot', {\n responseType: 'arrayBuffer',\n body: {\n ...body,\n \"viewport\": {\n \"width\": 3840,\n \"height\": 2160,\n \"deviceScaleFactor\": 2,\n },\n \"gotoOptions\": {\n \"waitUntil\": \"networkidle0\",\n \"timeout\": 30000\n },\n }\n })\n }\n\n\n\n async html2img (html: string, opt: RenderOptions) {\n const buf = await this.post({html: html, ...opt})\n return Buffer.from(buf)\n }\n async url2img (url: string, opt: RenderOptions) {\n const buf = await this.post({url: url, ...opt})\n return Buffer.from(buf)\n }\n}\n\nexport class PuppeteerRendering implements ImageRender {\n constructor(private browserGetter: () => Promise<Browser>) {\n }\n async html2img (html: string, opt: RenderOptions) {\n return html2imgBuffer(this.browserGetter, html, opt)\n }\n async url2img (html: string, opt: RenderOptions) {\n return url2imgBuffer(this.browserGetter, html, opt)\n }\n}\n\n\nexport const RemoteBrowserGetter = (addr: string) => {\n const p = new Puppeteer()\n let opt = {}\n if(addr.startsWith('ws')) {\n opt = { browserWSEndpoint: addr }\n }else if(addr.startsWith('http')) {\n opt = { browserURL: addr }\n }\n return () => p.connect(opt)\n}\n\n\nexport const getImageRender = (cfg: RenderConfig & {browserGetter?: () => Promise<Browser>}) => {\n if(cfg.mode === 'cf') {\n return new CFBrowserRendering(cfg.cfAccountId, cfg.cfAPIKey)\n }\n if(cfg.puppeteerURL) {\n return new PuppeteerRendering(RemoteBrowserGetter(cfg.puppeteerURL))\n }\n if(cfg.browserGetter) {\n return new PuppeteerRendering(cfg.browserGetter)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA2D;AAC3D,4BAAiC;AACjC,mBAAoB;AAgBb,MAAM,mBAA0C;AAAA,EAErD,YAAoB,WAA2B,UAAkB;AAA7C;AAA2B;AAD/C;AAEE,SAAK,IAAI,IAAI,mBAAM,EAChB,QAAQ,iDAAiD,SAAS,EAAE,EACpE,OAAO;AAAA,MACN,SAAS;AAAA,QACP,eAAe,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EACQ,KAAK,MAAM;AACjB,WAAO,KAAK,EAAE,KAAK,iCAAiC;AAAA,MAClD,cAAc;AAAA,MACd,MAAM,iCACD,OADC;AAAA,QAEJ,YAAY;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB;AAAA,QACA,eAAe;AAAA,UACb,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAIM,SAAU,MAAc,KAAoB;AAAA;AAChD,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,QAAe,IAAI;AAChD,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AAAA,EACM,QAAS,KAAa,KAAoB;AAAA;AAC9C,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,OAAa,IAAI;AAC9C,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AACF;AAEO,MAAM,mBAA0C;AAAA,EACrD,YAAoB,eAAuC;AAAvC;AAAA,EACpB;AAAA,EACM,SAAU,MAAc,KAAoB;AAAA;AAChD,iBAAO,iCAAe,KAAK,eAAe,MAAM,GAAG;AAAA,IACrD;AAAA;AAAA,EACM,QAAS,MAAc,KAAoB;AAAA;AAC/C,iBAAO,gCAAc,KAAK,eAAe,MAAM,GAAG;AAAA,IACpD;AAAA;AACF;AAGO,MAAM,sBAAsB,CAAC,SAAiB;AACnD,QAAM,IAAI,IAAI,gCAAU;AACxB,MAAI,MAAM,CAAC;AACX,MAAG,KAAK,WAAW,IAAI,GAAG;AACxB,UAAM,EAAE,mBAAmB,KAAK;AAAA,EAClC,WAAS,KAAK,WAAW,MAAM,GAAG;AAChC,UAAM,EAAE,YAAY,KAAK;AAAA,EAC3B;AACA,SAAO,MAAM,EAAE,QAAQ,GAAG;AAC5B;AAGO,MAAM,iBAAiB,CAAC,QAAiE;AAC9F,MAAG,IAAI,SAAS,MAAM;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa,IAAI,QAAQ;AAAA,EAC7D;AACA,MAAG,IAAI,cAAc;AACnB,WAAO,IAAI,mBAAmB,oBAAoB,IAAI,YAAY,CAAC;AAAA,EACrE;AACA,MAAG,IAAI,eAAe;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa;AAAA,EACjD;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/infra/support/render/index.ts"],"sourcesContent":["import {html2imgBuffer, RenderOptions, url2imgBuffer} from \"./puppeteer\";\nimport {Browser, Puppeteer} from \"puppeteer-core\";\nimport {Fetch} from \"@/infra/support/fetch\";\nexport {RenderOptions as PuppeteerOptions}\nexport interface ImageRender {\n html2img: (html: string, opt: RenderOptions) => Promise<Buffer>\n url2img: (url: string, opt: RenderOptions) => Promise<Buffer>\n}\n\nexport type RenderConfig = {\n mode: 'cf' | 'puppeteer' | 'custom'\n puppeteerURL?: string\n defaultWaitTimeout?: number\n waitTimeout?: number\n cfAccountId?: string,\n cfAPIKey?: string,\n}\n\nexport class CFBrowserRendering implements ImageRender {\n f: Fetch\n constructor(accountId: string, cfAPIKey: string) {\n this.f = new Fetch()\n .baseUrl(`https://api.cloudflare.com/client/v4/accounts/${accountId}`)\n .extend({\n headers: {\n Authorization: `Bearer ${cfAPIKey}`\n },\n })\n }\n private post(body) {\n return this.f.post('/browser-rendering/screenshot', {\n responseType: 'arrayBuffer',\n body: {\n ...body,\n \"viewport\": {\n \"width\": 3840,\n \"height\": 2160,\n \"deviceScaleFactor\": 2,\n },\n \"gotoOptions\": {\n \"waitUntil\": \"networkidle0\",\n \"timeout\": 30000\n },\n }\n })\n }\n\n\n\n async html2img (html: string, opt: RenderOptions) {\n const buf = await this.post({html: html, ...opt})\n return Buffer.from(buf)\n }\n async url2img (url: string, opt: RenderOptions) {\n const buf = await this.post({url: url, ...opt})\n return Buffer.from(buf)\n }\n}\n\nexport class PuppeteerRendering implements ImageRender {\n constructor(private browserGetter: () => Promise<Browser>) {\n }\n async html2img (html: string, opt: RenderOptions) {\n return html2imgBuffer(this.browserGetter, html, opt)\n }\n async url2img (html: string, opt: RenderOptions) {\n return url2imgBuffer(this.browserGetter, html, opt)\n }\n}\n\n\nexport const RemoteBrowserGetter = (addr: string) => {\n const p = new Puppeteer()\n let opt = {}\n if(addr.startsWith('ws')) {\n opt = { browserWSEndpoint: addr }\n }else if(addr.startsWith('http')) {\n opt = { browserURL: addr }\n }\n return () => p.connect(opt)\n}\n\n\n\nexport const getImageRender = (cfg: RenderConfig & {render?: ImageRender,browserGetter?: () => Promise<Browser>}) => {\n if(cfg.mode === 'cf') {\n return new CFBrowserRendering(cfg.cfAccountId, cfg.cfAPIKey)\n }\n if(cfg.mode === 'custom') {\n if(!cfg.render) throw new Error(\"please provide custom img render\")\n return cfg.render\n }\n if(cfg.puppeteerURL) {\n return new PuppeteerRendering(RemoteBrowserGetter(cfg.puppeteerURL))\n }\n if(cfg.browserGetter) {\n return new PuppeteerRendering(cfg.browserGetter)\n }\n}\n\nexport type CreateImageRenderOption = Parameters<typeof getImageRender>[0]\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA2D;AAC3D,4BAAiC;AACjC,mBAAoB;AAgBb,MAAM,mBAA0C;AAAA,EAErD,YAAY,WAAmB,UAAkB;AADjD;AAEE,SAAK,IAAI,IAAI,mBAAM,EAChB,QAAQ,iDAAiD,SAAS,EAAE,EACpE,OAAO;AAAA,MACN,SAAS;AAAA,QACP,eAAe,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EACQ,KAAK,MAAM;AACjB,WAAO,KAAK,EAAE,KAAK,iCAAiC;AAAA,MAClD,cAAc;AAAA,MACd,MAAM,iCACD,OADC;AAAA,QAEJ,YAAY;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB;AAAA,QACA,eAAe;AAAA,UACb,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAIM,SAAU,MAAc,KAAoB;AAAA;AAChD,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,QAAe,IAAI;AAChD,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AAAA,EACM,QAAS,KAAa,KAAoB;AAAA;AAC9C,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,OAAa,IAAI;AAC9C,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AACF;AAEO,MAAM,mBAA0C;AAAA,EACrD,YAAoB,eAAuC;AAAvC;AAAA,EACpB;AAAA,EACM,SAAU,MAAc,KAAoB;AAAA;AAChD,iBAAO,iCAAe,KAAK,eAAe,MAAM,GAAG;AAAA,IACrD;AAAA;AAAA,EACM,QAAS,MAAc,KAAoB;AAAA;AAC/C,iBAAO,gCAAc,KAAK,eAAe,MAAM,GAAG;AAAA,IACpD;AAAA;AACF;AAGO,MAAM,sBAAsB,CAAC,SAAiB;AACnD,QAAM,IAAI,IAAI,gCAAU;AACxB,MAAI,MAAM,CAAC;AACX,MAAG,KAAK,WAAW,IAAI,GAAG;AACxB,UAAM,EAAE,mBAAmB,KAAK;AAAA,EAClC,WAAS,KAAK,WAAW,MAAM,GAAG;AAChC,UAAM,EAAE,YAAY,KAAK;AAAA,EAC3B;AACA,SAAO,MAAM,EAAE,QAAQ,GAAG;AAC5B;AAIO,MAAM,iBAAiB,CAAC,QAAsF;AACnH,MAAG,IAAI,SAAS,MAAM;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa,IAAI,QAAQ;AAAA,EAC7D;AACA,MAAG,IAAI,SAAS,UAAU;AACxB,QAAG,CAAC,IAAI,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAClE,WAAQ,IAAI;AAAA,EACd;AACA,MAAG,IAAI,cAAc;AACnB,WAAO,IAAI,mBAAmB,oBAAoB,IAAI,YAAY,CAAC;AAAA,EACrE;AACA,MAAG,IAAI,eAAe;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa;AAAA,EACjD;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/interface/bot.ts"],"sourcesContent":["import {RelateChannelInfo, UserPreference} from '@/interface/db'\n\ntype ChannelInfo = any\n\n// now it's only for initiative message\nexport interface BotService<T extends ChannelInfo, S extends Session<T>> {\n getSessionByChannelInfo(channelInfo: T): S\n}\n\nexport interface Session<T extends any = any> {\n u: RelateChannelInfo<T>\n g: RelateChannelInfo<T>\n mentions: (RelateChannelInfo<T> | undefined)[]\n getSessionInfo(): T\n sendImgBuffer(content: any, mimeType?: string): Promise<void>\n sendImgByUrl(url: string): Promise<void>\n sendAudioByUrl(url: string): Promise<void>\n send(msg: string): Promise<void>\n sendQueued(msg: string): Promise<void>\n sendQuote(msg: string): Promise<void>\n text(path: string, args?): string\n prompt(timeout?: number): Promise<string | undefined>\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/interface/bot.ts"],"sourcesContent":["import { RelateChannelInfo } from '@/interface/db'\n\ntype ChannelInfo = any\n\n// now it's only for initiative message\nexport interface BotService<T extends ChannelInfo, S extends Session<T>> {\n getSessionByChannelInfo(channelInfo: T): S\n}\n\nexport interface Session<T extends any = any> {\n u: RelateChannelInfo<T>\n g: RelateChannelInfo<T>\n mentions: (RelateChannelInfo<T> | undefined)[]\n getSessionInfo(): T\n sendImgBuffer(content: any, mimeType?: string): Promise<void>\n sendImgByUrl(url: string): Promise<void>\n sendAudioByUrl(url: string): Promise<void>\n send(msg: string): Promise<void>\n sendQueued(msg: string): Promise<void>\n sendQuote(msg: string): Promise<void>\n text(path: string, args?): string\n prompt(timeout?: number): Promise<string | undefined>\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/interface/cmd/type.ts"],"sourcesContent":["// import { ImgRender } from './render'\n// import { Session } from './bot'\n\nimport { DB } from '@/interface/db'\nimport { Config } from '@/config'\nimport {Logger, Session} from \"@/interface\";\nimport {Services} from \"@/service\";\n\nexport interface CmdContext<CHANNEL, OPT> {\n logger: Logger\n config: Config\n session: Session\n options: OPT\n services: Services<CHANNEL>\n input: string\n}\n\ntype SessionContext<OPT> = {\n session: any\n user: any\n input: {\n options: OPT\n text?: string\n }\n}\n\n// di framework\n\nexport type CmdExecutor<CHANNEL, OPT extends object = object> = (\n c: CmdContext<CHANNEL, OPT>\n) => Promise<void>\n\nexport interface CmdOption {\n type: 'boolean' | 'number' | 'string'\n name: string\n short?: string\n description?: string\n required?: boolean\n}\n\nexport type CmdAlias = {\n alias: string\n option?: object\n}\n\nexport interface Command<CHANNEL> {\n name: string\n description: string\n aliases: CmdAlias[]\n options: CmdOption[]\n callback: CmdExecutor<CHANNEL>\n children: Command<CHANNEL>[]\n}\n\nexport type Extend<BASE extends {}, N extends string, D> = {\n [P in N | keyof BASE]?: (P extends keyof BASE ? BASE[P] : unknown) &\n (P extends N ? D : unknown)\n}\n\ntype ExtractType<T extends string> = T extends 'string'\n ? string\n : T extends 'boolean'\n ? boolean\n : T extends 'number'\n ? number\n : any\n\ntype Nullable<T> = T | null\n\ntype ExtractNullSafeType<T extends string> = T extends `${infer Type}?`\n ? Nullable<ExtractType<Type>>\n : ExtractType<T>\n// paramName:typename?\n// eg: online:boolean?\nexport type OptionType<T extends string> = T extends `${infer L}:${infer R}`\n ? ExtractNullSafeType<R>\n : unknown\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../../src/interface/cmd/type.ts"],"sourcesContent":["import { Config } from '@/config'\nimport {Logger, Session} from \"@/interface\";\nimport {Services} from \"@/interface\";\n\nexport interface CmdContext<CHANNEL, OPT> {\n logger: Logger\n config: Config\n session: Session\n options: OPT\n services: Services<CHANNEL>\n input: string\n}\n\ntype SessionContext<OPT> = {\n session: any\n user: any\n input: {\n options: OPT\n text?: string\n }\n}\n\n// di framework\n\nexport type CmdExecutor<CHANNEL, OPT extends object = object> = (\n c: CmdContext<CHANNEL, OPT>\n) => Promise<void>\n\nexport interface CmdOption {\n type: 'boolean' | 'number' | 'string'\n name: string\n short?: string\n description?: string\n required?: boolean\n}\n\nexport type CmdAlias = {\n alias: string\n option?: object\n}\n\nexport interface Command<CHANNEL> {\n name: string\n description: string\n aliases: CmdAlias[]\n options: CmdOption[]\n callback: CmdExecutor<CHANNEL>\n children: Command<CHANNEL>[]\n}\n\nexport type Extend<BASE extends {}, N extends string, D> = {\n [P in N | keyof BASE]?: (P extends keyof BASE ? BASE[P] : unknown) &\n (P extends N ? D : unknown)\n}\n\ntype ExtractType<T extends string> = T extends 'string'\n ? string\n : T extends 'boolean'\n ? boolean\n : T extends 'number'\n ? number\n : any\n\ntype Nullable<T> = T | null\n\ntype ExtractNullSafeType<T extends string> = T extends `${infer Type}?`\n ? Nullable<ExtractType<Type>>\n : ExtractType<T>\n// paramName:typename?\n// eg: online:boolean?\nexport type OptionType<T extends string> = T extends `${infer L}:${infer R}`\n ? ExtractNullSafeType<R>\n : unknown\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -10,13 +10,7 @@ var __copyProps = (to, from, except, desc) => {
10
10
  }
11
11
  return to;
12
12
  };
13
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
14
13
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
14
  var db_exports = {};
16
15
  module.exports = __toCommonJS(db_exports);
17
- __reExport(db_exports, require("./models"), module.exports);
18
- // Annotate the CommonJS export names for ESM import in node:
19
- 0 && (module.exports = {
20
- ...require("./models")
21
- });
22
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/interface/db/index.ts"],"sourcesContent":["import {\n RelateAccount,\n RelateChannelInfo,\n Subscribe,\n SubscribeMember,\n} from './models'\n\nexport * from './models'\n\nexport interface SubInfoRes {\n subscribe: Subscribe\n memberCount: number\n me: any\n}\n\nexport interface SubInfoRes {\n subscribe: Subscribe\n memberCount: number\n me: any\n}\n\nexport interface SubDetailWithGroupRes<T> {\n account: RelateAccount\n accountChannel: RelateChannelInfo<T>\n subscribeMember: SubscribeMember\n subscribe: Subscribe\n groupChannel: RelateChannelInfo<T>\n}\n\nexport interface SubWithGroupRes<T> {\n subscribe: Subscribe\n groupChannel: RelateChannelInfo<T>\n}\n\nexport interface DB<T> {\n storeUserPreference<V = any>(\n uid: number,\n // channelId: string | undefined,\n value: V\n ): Promise<boolean>\n getUserPreference<V = any>(\n uid: number\n // channelId: string | undefined,\n // value: V\n ): Promise<V>\n getUserAccountsByUid(id: number): Promise<Record<string, RelateAccount>>\n\n batchGetOrCreateUBySessionInfo(s: T[]): Promise<RelateChannelInfo<T>[]>\n getUAndGBySessionInfo(\n s: T\n ): Promise<[RelateChannelInfo<T>, RelateChannelInfo<T>]>\n\n // binding\n addUserBindingInfo(account: Partial<RelateAccount>): Promise<void>\n\n // subscription\n upsertSubscription(data: Partial<Subscribe>): Promise<void>\n\n getSubscriptionInfoByUGID(gid: number, uid: number): Promise<SubInfoRes[]>\n getSubscriptionsByGID(gid: number): Promise<Record<string, Subscribe>>\n // group subscription\n getIDSubscriptionByGID(gid: number): Promise<Subscribe[]>\n getIDSubscriptionByType(type: string): Promise<SubWithGroupRes<T>[]>\n removeIDSubscriptionByID(id: number): Promise<void>\n getIDSubscriptionByGIDAndType(gid: number, type: string): Promise<Subscribe[]>\n getAllSubscriptionByUIDAndPlatform(\n id: string | number,\n type: string\n ): Promise<SubDetailWithGroupRes<T>[]>\n\n getSubscriptionsByType(type: string): Promise<SubDetailWithGroupRes<T>[]>\n addSubscribeMember(data: Partial<SubscribeMember>): Promise<void>\n removeFromSubGroupBySubAndUid(subId: number, id: number): Promise<void>\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;AAOA,uBAAc,qBAPd;","names":[]}
1
+ {"version":3,"sources":["../../../../src/interface/db/index.ts"],"sourcesContent":["import type {\n RelateAccount,\n RelateChannelInfo,\n Subscribe,\n SubscribeMember,\n} from './models'\n\nexport type {\n RelateAccount,\n RelateChannelInfo,\n Subscribe,\n SubscribeMember,\n UserPreference\n} from './models'\n\nexport interface SubInfoRes {\n subscribe: Subscribe\n memberCount: number\n me: any\n}\n\nexport interface SubInfoRes {\n subscribe: Subscribe\n memberCount: number\n me: any\n}\n\nexport interface SubDetailWithGroupRes<T> {\n account: RelateAccount\n accountChannel: RelateChannelInfo<T>\n subscribeMember: SubscribeMember\n subscribe: Subscribe\n groupChannel: RelateChannelInfo<T>\n}\n\nexport interface SubWithGroupRes<T> {\n subscribe: Subscribe\n groupChannel: RelateChannelInfo<T>\n}\n\nexport interface DB<T> {\n storeUserPreference<V = any>(\n uid: number,\n // channelId: string | undefined,\n value: V\n ): Promise<boolean>\n getUserPreference<V = any>(\n uid: number\n // channelId: string | undefined,\n // value: V\n ): Promise<V>\n getUserAccountsByUid(id: number): Promise<Record<string, RelateAccount>>\n\n batchGetOrCreateUBySessionInfo(s: T[]): Promise<RelateChannelInfo<T>[]>\n getUAndGBySessionInfo(\n s: T\n ): Promise<[RelateChannelInfo<T>, RelateChannelInfo<T>]>\n\n // binding\n addUserBindingInfo(account: Partial<RelateAccount>): Promise<void>\n\n // subscription\n upsertSubscription(data: Partial<Subscribe>): Promise<void>\n\n getSubscriptionInfoByUGID(gid: number, uid: number): Promise<SubInfoRes[]>\n getSubscriptionsByGID(gid: number): Promise<Record<string, Subscribe>>\n // group subscription\n getIDSubscriptionByGID(gid: number): Promise<Subscribe[]>\n getIDSubscriptionByType(type: string): Promise<SubWithGroupRes<T>[]>\n removeIDSubscriptionByID(id: number): Promise<void>\n getIDSubscriptionByGIDAndType(gid: number, type: string): Promise<Subscribe[]>\n getAllSubscriptionByUIDAndPlatform(\n id: string | number,\n type: string\n ): Promise<SubDetailWithGroupRes<T>[]>\n\n getSubscriptionsByType(type: string): Promise<SubDetailWithGroupRes<T>[]>\n addSubscribeMember(data: Partial<SubscribeMember>): Promise<void>\n removeFromSubGroupBySubAndUid(subId: number, id: number): Promise<void>\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/interface/index.ts"],"sourcesContent":["export * from './db'\nexport * from './logger'\nexport * from './bot'\nexport enum Platform {\n SS = 'scoresaber',\n BS = 'beatsaver',\n BL = 'beatleader',\n}\n\nexport const parsePlatform = (p: string) => {\n return p == 'ss' ? Platform.SS : Platform.BL\n}\n\nexport * from './cmd/type'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAc,iBAAd;AACA,8BAAc,qBADd;AAEA,8BAAc,kBAFd;AAaA,8BAAc,uBAbd;AAGO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,UAAA,QAAK;AACL,EAAAA,UAAA,QAAK;AACL,EAAAA,UAAA,QAAK;AAHK,SAAAA;AAAA,GAAA;AAML,MAAM,gBAAgB,CAAC,MAAc;AAC1C,SAAO,KAAK,OAAO,wBAAc;AACnC;","names":["Platform"]}
1
+ {"version":3,"sources":["../../../src/interface/index.ts"],"sourcesContent":["import type {APIService, RenderService} from \"@/service\";\n\nimport type { DB } from \"@/interface\";\nexport * from './db'\nexport * from './logger'\nexport * from './bot'\nexport enum Platform {\n SS = 'scoresaber',\n BS = 'beatsaver',\n BL = 'beatleader',\n}\n\nexport const parsePlatform = (p: string) => {\n return p == 'ss' ? Platform.SS : Platform.BL\n}\nexport type Services<T> = {\n render: RenderService,\n api: APIService,\n db: DB<T>\n}\nexport * from './cmd/type'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,8BAAc,iBAHd;AAIA,8BAAc,qBAJd;AAKA,8BAAc,kBALd;AAoBA,8BAAc,uBApBd;AAMO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,UAAA,QAAK;AACL,EAAAA,UAAA,QAAK;AACL,EAAAA,UAAA,QAAK;AAHK,SAAAA;AAAA,GAAA;AAML,MAAM,gBAAgB,CAAC,MAAc;AAC1C,SAAO,KAAK,OAAO,wBAAc;AACnC;","names":["Platform"]}
@@ -20,14 +20,14 @@ __export(schedules_exports, {
20
20
  getScheduleTasks: () => getScheduleTasks
21
21
  });
22
22
  module.exports = __toCommonJS(schedules_exports);
23
- var import_temp = require("../schedules/temp");
23
+ var import_temp = require("./temp");
24
24
  const getScheduleTasks = (config) => {
25
25
  return [
26
26
  {
27
27
  name: "lb-rank-notifier",
28
28
  handler: import_temp.LBScoreMonitor,
29
29
  cron: config.tempCron.cron,
30
- enable: config.tempCron.enable
30
+ enabled: config.tempCron.enabled
31
31
  }
32
32
  ];
33
33
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/schedules/index.ts"],"sourcesContent":["import { Config } from '@/config'\nimport { LBScoreMonitor } from '@/schedules/temp'\n\n\nexport const getScheduleTasks = (config: Config) => {\n return [\n {\n name: 'lb-rank-notifier',\n handler: LBScoreMonitor,\n cron: config.tempCron.cron,\n enable: config.tempCron.enable,\n },\n ]\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAA+B;AAGxB,MAAM,mBAAmB,CAAC,WAAmB;AAClD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,OAAO,SAAS;AAAA,MACtB,QAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/schedules/index.ts"],"sourcesContent":["import { Config } from '@/config'\nimport { LBScoreMonitor } from './temp'\n\n\nexport const getScheduleTasks = (config: Config) => {\n return [\n {\n name: 'lb-rank-notifier',\n handler: LBScoreMonitor,\n cron: config.tempCron.cron,\n enabled: config.tempCron.enabled,\n },\n ]\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAA+B;AAGxB,MAAM,mBAAmB,CAAC,WAAmB;AAClD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,OAAO,SAAS;AAAA,MACtB,SAAS,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/schedules/interface.ts"],"sourcesContent":["import { Config } from '@/config'\nimport {BotService, DB, Logger, Session} from '@/interface'\nimport {Services} from \"@/service\";\n\nexport type ScheduleTaskCtx<T> = {\n config: Config\n logger: Logger\n services: Services<T>\n botService: BotService<T, Session<T>>\n}\n\nexport type ScheduleTask = {\n name: string\n cron: string\n handler: <T>(c: ScheduleTaskCtx<T>) => Promise<void>\n enable: boolean\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/schedules/interface.ts"],"sourcesContent":["import { Config } from '@/config'\nimport {Services, BotService, Logger, Session} from '@/interface'\n\nexport type ScheduleTaskCtx<T> = {\n config: Config\n logger: Logger\n services: Services<T>\n botService: BotService<T, Session<T>>\n}\n\nexport type ScheduleTask = {\n name: string\n cron: string\n handler: <T>(c: ScheduleTaskCtx<T>) => Promise<void>\n enabled: boolean\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/schedules/temp.ts"],"sourcesContent":["import { ScheduleTaskCtx } from '@/schedules/interface'\n\nexport const LBScoreMonitor = async <T>(c: ScheduleTaskCtx<T>) => {\n const channels = await c.services.db.getSubscriptionsByType('lb-rank')\n if (channels.length <= 0) {\n return\n }\n const [hitbuf, scorebuf] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt'),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score'),\n ])\n for (const group of channels) {\n const session = c.botService.getSessionByChannelInfo(group.groupChannel)\n if (!session) {\n continue\n }\n await session.sendImgBuffer(hitbuf, 'image/png')\n await session.sendImgBuffer(scorebuf, 'image/png')\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,iBAAiB,CAAU,MAA0B;AAChE,QAAM,WAAW,MAAM,EAAE,SAAS,GAAG,uBAAuB,SAAS;AACrE,MAAI,SAAS,UAAU,GAAG;AACxB;AAAA,EACF;AACA,QAAM,CAAC,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,EAAE,SAAS,OAAO,UAAU,sCAAsC;AAAA,IAClE,EAAE,SAAS,OAAO,UAAU,qCAAqC;AAAA,EACnE,CAAC;AACD,aAAW,SAAS,UAAU;AAC5B,UAAM,UAAU,EAAE,WAAW,wBAAwB,MAAM,YAAY;AACvE,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,QAAQ,WAAW;AAC/C,UAAM,QAAQ,cAAc,UAAU,WAAW;AAAA,EACnD;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/schedules/temp.ts"],"sourcesContent":["import { ScheduleTaskCtx } from './interface'\n\nexport const LBScoreMonitor = async <T>(c: ScheduleTaskCtx<T>) => {\n const channels = await c.services.db.getSubscriptionsByType('lb-rank')\n if (channels.length <= 0) {\n return\n }\n const [hitbuf, scorebuf] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt'),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score'),\n ])\n for (const group of channels) {\n const session = c.botService.getSessionByChannelInfo(group.groupChannel)\n if (!session) {\n continue\n }\n await session.sendImgBuffer(hitbuf, 'image/png')\n await session.sendImgBuffer(scorebuf, 'image/png')\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,iBAAiB,CAAU,MAA0B;AAChE,QAAM,WAAW,MAAM,EAAE,SAAS,GAAG,uBAAuB,SAAS;AACrE,MAAI,SAAS,UAAU,GAAG;AACxB;AAAA,EACF;AACA,QAAM,CAAC,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,EAAE,SAAS,OAAO,UAAU,sCAAsC;AAAA,IAClE,EAAE,SAAS,OAAO,UAAU,qCAAqC;AAAA,EACnE,CAAC;AACD,aAAW,SAAS,UAAU;AAC5B,UAAM,UAAU,EAAE,WAAW,wBAAwB,MAAM,YAAY;AACvE,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,QAAQ,WAAW;AAC/C,UAAM,QAAQ,cAAc,UAAU,WAAW;AAAA,EACnD;AACF;","names":[]}
@@ -58,7 +58,7 @@ module.exports = __toCommonJS(api_exports);
58
58
  var import_base = require("./base");
59
59
  var import_errors = require("../../infra/errors");
60
60
  var import_error = require("../../infra/support/fetch/error");
61
- var import_sortScore = require("../../service/api/sortScore");
61
+ var import_sortScore = require("./sortScore");
62
62
  var import_bsorDecoder = require("../../components/utils/bl/bsorDecoder");
63
63
  class APIService {
64
64
  constructor(cfg, logger) {