beatsaber-bot-core 0.2.0-rc.11 → 0.2.0-rc.13

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 +9 -3
  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 +9 -3
  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
@@ -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) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/service/api/index.ts"],"sourcesContent":["import {AIOSaberClient, BeatLeaderClient, BeatSaverClient, ScoreSaberClient} from \"./base\";\nimport {Config} from \"@/config\";\nimport {Logger} from \"@/interface\";\nimport {BLIDNotFoundError, MapIdNotFoundError, SSIDNotFoundError} from \"@/infra/errors\";\nimport {BSMap, HashResponse} from \"@/service/api/interfaces/beatsaver\";\nimport {ScoreSaberItem} from \"@/service/api/interfaces/scoresaber\";\nimport {Leaderboard} from \"@/service/api/interfaces/beatleader\";\nimport {NotFoundError} from \"@/infra/support/fetch/error\";\nimport {sortScore} from \"@/service/api/sortScore\";\nimport {decode} from \"@/components/utils/bl/bsorDecoder\";\n\ntype MapDiffOption = {\n difficulty?: string\n mode?: string\n}\n\n\nexport class APIService {\n BeatLeader: BeatLeaderClient\n ScoreSaber: ScoreSaberClient\n BeatSaver: BeatSaverClient\n AIOSaber: AIOSaberClient\n constructor(cfg: Config, logger: Logger) {\n this.BeatSaver = new BeatSaverClient({logger})\n this.BeatLeader = new BeatLeaderClient({logger})\n this.ScoreSaber = new ScoreSaberClient(logger)\n this.AIOSaber = new AIOSaberClient(logger)\n }\n async getBLPlayerScoresWithUserInfo(accountId: string) {\n const [userInfo, playerScores, pinnedScores] = await Promise.all([\n this.BeatLeader.getPlayerInfo(accountId),\n this.BeatLeader.getPlayerScores(accountId),\n this.BeatLeader.getPlayerPinnedScores(accountId),\n ])\n if (!(userInfo && playerScores)) {\n throw new BLIDNotFoundError({ accountId })\n }\n const filteredScores = playerScores.data.filter(\n (item) => !pinnedScores.some((pinned) => pinned.id === item.id)\n )\n const scores = pinnedScores.concat(filteredScores).slice(0, 24)\n return {\n scores: scores,\n userInfo: userInfo,\n }\n }\n async getSSPlayerScoresWithUserInfo(accountId: string) {\n\n }\n async getScoreByPlayerIdAndMapId(\n playerId: string,\n mapId: string,\n option?: MapDiffOption\n ): Promise<Leaderboard> {\n const map = await this.BeatSaver.searchMapById(mapId)\n if (!map) {\n throw new MapIdNotFoundError()\n }\n const hash = map.versions[0].hash\n let reqs = map.versions[0].diffs.map((it) => ({\n diff: it.difficulty,\n mode: it.characteristic,\n hash: hash,\n playerID: playerId,\n leaderboardContext: 'general',\n }))\n if (option && option.difficulty) {\n reqs = reqs.filter((item) => item.diff == option.difficulty)\n }\n if (option && option.mode) {\n reqs = reqs.filter((item) => item.mode == option.mode)\n }\n const res = await Promise.allSettled(reqs.map(\n (it) => this.BeatLeader.getPlayerScore(it)))\n const scores = res\n .filter((item) => item.status === 'fulfilled')\n .map(<T>(it: PromiseFulfilledResult<T>) => it.value)\n if (scores.length < 1) {\n throw new NotFoundError()\n }\n scores.sort(sortScore)\n return scores[0]\n }\n\n async getAroundScoreAndRegionScoreByRankAndPage(\n leaderboardId: string,\n rank: number,\n regionCode: string\n ) {\n const page = Math.ceil(rank / 10)\n const rest = rank % 10\n let startIndex = 0\n if (rest > 7) {\n startIndex = 2\n }\n const [regionScore, aroundScore] = await Promise.all([\n this.BeatLeader.getLeaderboard(leaderboardId, {\n leaderboardContext: 'general',\n page: 1,\n sortBy: 'rank',\n order: 'desc',\n countries: regionCode,\n }),\n this.BeatLeader.getLeaderboard(leaderboardId, {\n leaderboardContext: 'general',\n page: page,\n sortBy: 'rank',\n order: 'desc',\n }),\n ])\n const difficulties = regionScore.song.difficulties\n return {\n difficulties: difficulties,\n aroundScores: aroundScore.scores.slice(startIndex, startIndex + 7),\n regionTopScores: regionScore.scores,\n }\n }\n async getScoreAndBSMapByScoreId(scoreId: string) {\n const res = await this.BeatLeader.getBeatScore(scoreId)\n const bsorLink = res.replay\n const bsorContent = await fetch(bsorLink)\n const bsor = await new Promise((resolve, reject) => {\n bsorContent.arrayBuffer().then((res) => decode(res, resolve))\n setTimeout(() => reject('timeout exceed'), 5000)\n })\n const statistic = await fetch(\n `https://cdn.scorestats.beatleader.xyz/${scoreId}.json`\n ).then((res) => res.json())\n const id = res.song.id.split('x')?.[0]\n const bsMap = await this.BeatSaver.searchMapById(id)\n return {\n score: res,\n bsMap: bsMap,\n statistic: statistic,\n bsor: bsor,\n }\n }\n async getSSPlayerRecentScoreWithUserInfo(uid: string) {\n const [userInfo, scores] = await Promise.all([\n this.ScoreSaber.getScoreUserById(uid),\n this.ScoreSaber.getScoreItemsById(uid, 1, 24)\n .then((res) => res?.playerScores),\n ])\n if (!scores || !userInfo) {\n throw new SSIDNotFoundError({ accountId: uid })\n }\n const hashes = scores.map((it) => it.leaderboard.songHash)\n\n let hashInfo = await this.BeatSaver.getMapsByHashes(hashes)\n if (hashInfo.id) {\n const map = hashInfo as BSMap\n hashInfo = {} as HashResponse\n hashInfo[map.versions[0].hash] = map\n }\n const res = scores.map(\n (it) =>\n ({\n mapId: (hashInfo as HashResponse)[\n it.leaderboard.songHash.toLowerCase()\n ]?.id,\n ...it,\n }) as ScoreSaberItem\n )\n return {\n scores: res,\n userInfo: userInfo,\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAkF;AAGlF,oBAAuE;AAIvE,mBAA4B;AAC5B,uBAAwB;AACxB,yBAAqB;AAQd,MAAM,WAAW;AAAA,EAKtB,YAAY,KAAa,QAAgB;AAJzC;AACA;AACA;AACA;AAEE,SAAK,YAAY,IAAI,4BAAgB,EAAC,OAAM,CAAC;AAC7C,SAAK,aAAa,IAAI,6BAAiB,EAAC,OAAM,CAAC;AAC/C,SAAK,aAAa,IAAI,6BAAiB,MAAM;AAC7C,SAAK,WAAW,IAAI,2BAAe,MAAM;AAAA,EAC3C;AAAA,EACM,8BAA8B,WAAmB;AAAA;AACrD,YAAM,CAAC,UAAU,cAAc,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,KAAK,WAAW,cAAc,SAAS;AAAA,QACvC,KAAK,WAAW,gBAAgB,SAAS;AAAA,QACzC,KAAK,WAAW,sBAAsB,SAAS;AAAA,MACjD,CAAC;AACD,UAAI,EAAE,YAAY,eAAe;AAC/B,cAAM,IAAI,gCAAkB,EAAE,UAAU,CAAC;AAAA,MAC3C;AACA,YAAM,iBAAiB,aAAa,KAAK;AAAA,QACvC,CAAC,SAAS,CAAC,aAAa,KAAK,CAAC,WAAW,OAAO,OAAO,KAAK,EAAE;AAAA,MAChE;AACA,YAAM,SAAS,aAAa,OAAO,cAAc,EAAE,MAAM,GAAG,EAAE;AAC9D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EACM,8BAA8B,WAAmB;AAAA;AAAA,IAEvD;AAAA;AAAA,EACM,2BACJ,UACA,OACA,QACsB;AAAA;AACtB,YAAM,MAAM,MAAM,KAAK,UAAU,cAAc,KAAK;AACpD,UAAI,CAAC,KAAK;AACR,cAAM,IAAI,iCAAmB;AAAA,MAC/B;AACA,YAAM,OAAO,IAAI,SAAS,CAAC,EAAE;AAC7B,UAAI,OAAO,IAAI,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,QAAQ;AAAA,QAC5C,MAAM,GAAG;AAAA,QACT,MAAM,GAAG;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,oBAAoB;AAAA,MACtB,EAAE;AACF,UAAI,UAAU,OAAO,YAAY;AAC/B,eAAO,KAAK,OAAO,CAAC,SAAS,KAAK,QAAQ,OAAO,UAAU;AAAA,MAC7D;AACA,UAAI,UAAU,OAAO,MAAM;AACzB,eAAO,KAAK,OAAO,CAAC,SAAS,KAAK,QAAQ,OAAO,IAAI;AAAA,MACvD;AACA,YAAM,MAAM,MAAM,QAAQ,WAAW,KAAK;AAAA,QACxC,CAAC,OAAO,KAAK,WAAW,eAAe,EAAE;AAAA,MAAC,CAAC;AAC7C,YAAM,SAAS,IACZ,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAC5C,IAAI,CAAI,OAAkC,GAAG,KAAK;AACrD,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,IAAI,2BAAc;AAAA,MAC1B;AACA,aAAO,KAAK,0BAAS;AACrB,aAAO,OAAO,CAAC;AAAA,IACjB;AAAA;AAAA,EAEM,0CACJ,eACA,MACA,YACA;AAAA;AACA,YAAM,OAAO,KAAK,KAAK,OAAO,EAAE;AAChC,YAAM,OAAO,OAAO;AACpB,UAAI,aAAa;AACjB,UAAI,OAAO,GAAG;AACZ,qBAAa;AAAA,MACf;AACA,YAAM,CAAC,aAAa,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QACnD,KAAK,WAAW,eAAe,eAAe;AAAA,UAC5C,oBAAoB;AAAA,UACpB,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,WAAW;AAAA,QACb,CAAC;AAAA,QACD,KAAK,WAAW,eAAe,eAAe;AAAA,UAC5C,oBAAoB;AAAA,UACpB;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AACD,YAAM,eAAe,YAAY,KAAK;AACtC,aAAO;AAAA,QACL;AAAA,QACA,cAAc,YAAY,OAAO,MAAM,YAAY,aAAa,CAAC;AAAA,QACjE,iBAAiB,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA;AAAA,EACM,0BAA0B,SAAiB;AAAA;AArHnD;AAsHI,YAAM,MAAM,MAAM,KAAK,WAAW,aAAa,OAAO;AACtD,YAAM,WAAW,IAAI;AACrB,YAAM,cAAc,MAAM,MAAM,QAAQ;AACxC,YAAM,OAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAClD,oBAAY,YAAY,EAAE,KAAK,CAACA,aAAQ,2BAAOA,MAAK,OAAO,CAAC;AAC5D,mBAAW,MAAM,OAAO,gBAAgB,GAAG,GAAI;AAAA,MACjD,CAAC;AACD,YAAM,YAAY,MAAM;AAAA,QACtB,yCAAyC,OAAO;AAAA,MAClD,EAAE,KAAK,CAACA,SAAQA,KAAI,KAAK,CAAC;AAC1B,YAAM,MAAK,SAAI,KAAK,GAAG,MAAM,GAAG,MAArB,mBAAyB;AACpC,YAAM,QAAQ,MAAM,KAAK,UAAU,cAAc,EAAE;AACnD,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EACM,mCAAmC,KAAa;AAAA;AACpD,YAAM,CAAC,UAAU,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3C,KAAK,WAAW,iBAAiB,GAAG;AAAA,QACpC,KAAK,WAAW,kBAAkB,KAAK,GAAG,EAAE,EACzC,KAAK,CAACA,SAAQA,QAAA,gBAAAA,KAAK,YAAY;AAAA,MACpC,CAAC;AACD,UAAI,CAAC,UAAU,CAAC,UAAU;AACxB,cAAM,IAAI,gCAAkB,EAAE,WAAW,IAAI,CAAC;AAAA,MAChD;AACA,YAAM,SAAS,OAAO,IAAI,CAAC,OAAO,GAAG,YAAY,QAAQ;AAEzD,UAAI,WAAW,MAAM,KAAK,UAAU,gBAAgB,MAAM;AAC1D,UAAI,SAAS,IAAI;AACf,cAAM,MAAM;AACZ,mBAAW,CAAC;AACZ,iBAAS,IAAI,SAAS,CAAC,EAAE,IAAI,IAAI;AAAA,MACnC;AACA,YAAM,MAAM,OAAO;AAAA,QACjB,CAAC,OAAI;AA3JX;AA4JS;AAAA,YACC,QAAQ,cACN,GAAG,YAAY,SAAS,YAAY,CACpC,MAFM,mBAEH;AAAA,aACF;AAAA;AAAA,MAET;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA;AACF;","names":["res"]}
1
+ {"version":3,"sources":["../../../../src/service/api/index.ts"],"sourcesContent":["import {AIOSaberClient, BeatLeaderClient, BeatSaverClient, ScoreSaberClient} from \"./base\";\nimport {Config} from \"@/config\";\nimport {Logger} from \"@/interface\";\nimport {BLIDNotFoundError, MapIdNotFoundError, SSIDNotFoundError} from \"@/infra/errors\";\nimport {BSMap, HashResponse} from \"./interfaces/beatsaver\";\nimport {ScoreSaberItem} from \"./interfaces/scoresaber\";\nimport {Leaderboard} from \"./interfaces/beatleader\";\nimport {NotFoundError} from \"@/infra/support/fetch/error\";\nimport {sortScore} from \"./sortScore\";\nimport {decode} from \"@/components/utils/bl/bsorDecoder\";\n\ntype MapDiffOption = {\n difficulty?: string\n mode?: string\n}\n\n\nexport class APIService {\n BeatLeader: BeatLeaderClient\n ScoreSaber: ScoreSaberClient\n BeatSaver: BeatSaverClient\n AIOSaber: AIOSaberClient\n constructor(cfg: Config, logger: Logger) {\n this.BeatSaver = new BeatSaverClient({logger})\n this.BeatLeader = new BeatLeaderClient({logger})\n this.ScoreSaber = new ScoreSaberClient(logger)\n this.AIOSaber = new AIOSaberClient(logger)\n }\n async getBLPlayerScoresWithUserInfo(accountId: string) {\n const [userInfo, playerScores, pinnedScores] = await Promise.all([\n this.BeatLeader.getPlayerInfo(accountId),\n this.BeatLeader.getPlayerScores(accountId),\n this.BeatLeader.getPlayerPinnedScores(accountId),\n ])\n if (!(userInfo && playerScores)) {\n throw new BLIDNotFoundError({ accountId })\n }\n const filteredScores = playerScores.data.filter(\n (item) => !pinnedScores.some((pinned) => pinned.id === item.id)\n )\n const scores = pinnedScores.concat(filteredScores).slice(0, 24)\n return {\n scores: scores,\n userInfo: userInfo,\n }\n }\n async getSSPlayerScoresWithUserInfo(accountId: string) {\n\n }\n async getScoreByPlayerIdAndMapId(\n playerId: string,\n mapId: string,\n option?: MapDiffOption\n ): Promise<Leaderboard> {\n const map = await this.BeatSaver.searchMapById(mapId)\n if (!map) {\n throw new MapIdNotFoundError()\n }\n const hash = map.versions[0].hash\n let reqs = map.versions[0].diffs.map((it) => ({\n diff: it.difficulty,\n mode: it.characteristic,\n hash: hash,\n playerID: playerId,\n leaderboardContext: 'general',\n }))\n if (option && option.difficulty) {\n reqs = reqs.filter((item) => item.diff == option.difficulty)\n }\n if (option && option.mode) {\n reqs = reqs.filter((item) => item.mode == option.mode)\n }\n const res = await Promise.allSettled(reqs.map(\n (it) => this.BeatLeader.getPlayerScore(it)))\n const scores = res\n .filter((item) => item.status === 'fulfilled')\n .map(<T>(it: PromiseFulfilledResult<T>) => it.value)\n if (scores.length < 1) {\n throw new NotFoundError()\n }\n scores.sort(sortScore)\n return scores[0]\n }\n\n async getAroundScoreAndRegionScoreByRankAndPage(\n leaderboardId: string,\n rank: number,\n regionCode: string\n ) {\n const page = Math.ceil(rank / 10)\n const rest = rank % 10\n let startIndex = 0\n if (rest > 7) {\n startIndex = 2\n }\n const [regionScore, aroundScore] = await Promise.all([\n this.BeatLeader.getLeaderboard(leaderboardId, {\n leaderboardContext: 'general',\n page: 1,\n sortBy: 'rank',\n order: 'desc',\n countries: regionCode,\n }),\n this.BeatLeader.getLeaderboard(leaderboardId, {\n leaderboardContext: 'general',\n page: page,\n sortBy: 'rank',\n order: 'desc',\n }),\n ])\n const difficulties = regionScore.song.difficulties\n return {\n difficulties: difficulties,\n aroundScores: aroundScore.scores.slice(startIndex, startIndex + 7),\n regionTopScores: regionScore.scores,\n }\n }\n async getScoreAndBSMapByScoreId(scoreId: string) {\n const res = await this.BeatLeader.getBeatScore(scoreId)\n const bsorLink = res.replay\n const bsorContent = await fetch(bsorLink)\n const bsor = await new Promise((resolve, reject) => {\n bsorContent.arrayBuffer().then((res) => decode(res, resolve))\n setTimeout(() => reject('timeout exceed'), 5000)\n })\n const statistic = await fetch(\n `https://cdn.scorestats.beatleader.xyz/${scoreId}.json`\n ).then((res) => res.json())\n const id = res.song.id.split('x')?.[0]\n const bsMap = await this.BeatSaver.searchMapById(id)\n return {\n score: res,\n bsMap: bsMap,\n statistic: statistic,\n bsor: bsor,\n }\n }\n async getSSPlayerRecentScoreWithUserInfo(uid: string) {\n const [userInfo, scores] = await Promise.all([\n this.ScoreSaber.getScoreUserById(uid),\n this.ScoreSaber.getScoreItemsById(uid, 1, 24)\n .then((res) => res?.playerScores),\n ])\n if (!scores || !userInfo) {\n throw new SSIDNotFoundError({ accountId: uid })\n }\n const hashes = scores.map((it) => it.leaderboard.songHash)\n\n let hashInfo = await this.BeatSaver.getMapsByHashes(hashes)\n if (hashInfo.id) {\n const map = hashInfo as BSMap\n hashInfo = {} as HashResponse\n hashInfo[map.versions[0].hash] = map\n }\n const res = scores.map(\n (it) =>\n ({\n mapId: (hashInfo as HashResponse)[\n it.leaderboard.songHash.toLowerCase()\n ]?.id,\n ...it,\n }) as ScoreSaberItem\n )\n return {\n scores: res,\n userInfo: userInfo,\n }\n }\n}\n"],"mappings":"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","names":["res"]}
@@ -2,6 +2,10 @@ var __defProp = Object.defineProperty;
2
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
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
+ };
5
9
  var __copyProps = (to, from, except, desc) => {
6
10
  if (from && typeof from === "object" || typeof from === "function") {
7
11
  for (let key of __getOwnPropNames(from))
@@ -12,5 +16,16 @@ var __copyProps = (to, from, except, desc) => {
12
16
  };
13
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
18
  var service_exports = {};
19
+ __export(service_exports, {
20
+ APIService: () => import_api.APIService,
21
+ RenderService: () => import_render.RenderService
22
+ });
15
23
  module.exports = __toCommonJS(service_exports);
24
+ var import_api = require("./api");
25
+ var import_render = require("./render");
26
+ // Annotate the CommonJS export names for ESM import in node:
27
+ 0 && (module.exports = {
28
+ APIService,
29
+ RenderService
30
+ });
16
31
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/service/index.ts"],"sourcesContent":["import {APIService} from \"@/service/api\";\nimport { DB } from \"@/interface\";\nimport {IRenderService} from \"@/service/render/interfaces\";\n\nexport type Services<T> = {\n render: IRenderService,\n api: APIService,\n db: DB<T>\n}\n\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/service/index.ts"],"sourcesContent":["export { APIService } from './api'\nexport { RenderService } from './render'\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA2B;AAC3B,oBAA8B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/service/preference.ts"],"sourcesContent":["import { DB } from '@/interface'\nimport { LRUCache } from 'lru-cache'\n\n// uid is key currently\n\nconst cache = new LRUCache({\n max: 500,\n maxSize: 500,\n sizeCalculation: () => 1,\n ttl: 1000 * 60 * 60 * 24 * 7,\n allowStale: false,\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n})\n\nexport class UserPreferenceStore {\n v: any = undefined\n constructor(\n private db: DB<any>,\n private uid: number\n ) {}\n async getUserPreference(uid: number) {\n return new UserPreferenceStore(this.db, uid)\n }\n async set<T extends string | number | boolean>(\n key: string,\n value: T\n ): Promise<boolean> {\n if (!this.v) {\n this.v = (await this.db.getUserPreference(this.uid)) ?? {}\n }\n const cacheKey = `${this.uid}`\n const v = {\n ...this.v,\n [key]: value,\n }\n await this.db.storeUserPreference(this.uid, v)\n cache.set(cacheKey, v)\n this.v = v\n return true\n }\n async get<T extends string | number | boolean>(\n key: string\n ): Promise<T | undefined> {\n const cacheKey = `${this.uid}`\n const has = cache.has(cacheKey)\n if (has) {\n const v = cache.get(cacheKey) as T\n return v?.[key] ?? preferenceSchema[key]?.default\n }\n const value = (await this.db.getUserPreference(this.uid)) ?? {}\n cache.set(cacheKey, value)\n return (value?.[key] as T) ?? preferenceSchema[key]?.default\n }\n async configEntries(): Promise<Record<string, any>> {\n await this.get('')\n return cache.get(this.uid) as Record<string, any>\n }\n}\n\ntype PreferenceItem = {\n key: string\n i18nName: string\n valueType: 'img-url' | 'string' | 'number' | 'boolean'\n default: any\n}\nexport const preferenceKey = {\n blProfileRenderImg: {\n key: 'bl::profile::render::img',\n i18nName: 'BLProfile背景图片',\n },\n ssProfileRenderImg: {\n key: 'ss::profile::render::img',\n i18nName: 'SSProfile背景图片',\n },\n blScoreImg: {\n key: 'bl::score::render::img',\n i18nName: 'BLScore背景图片',\n },\n}\n\nexport const preferenceSchema: Record<string, PreferenceItem> = {\n 'bl::profile::render::img': {\n key: 'bl::profile::render::img',\n i18nName: 'BLProfile背景图片',\n valueType: 'img-url',\n default: 'https://www.loliapi.com/acg/pc/',\n },\n 'ss::profile::render::img': {\n key: 'ss::profile::render::img',\n i18nName: 'SSProfile背景图片',\n valueType: 'img-url',\n default: 'https://www.loliapi.com/acg/pc/',\n },\n 'bl::score::render::img': {\n key: 'bl::score::render::img',\n i18nName: 'BLScore背景图片',\n valueType: 'img-url',\n default: 'https://www.loliapi.com/acg/pc/',\n },\n}\n\nconst preferenceMap = new Map<string, PreferenceItem>()\n\nObject.entries(preferenceSchema).forEach(([key, value]) => {\n preferenceMap.set(value.i18nName, value)\n})\n\nexport const hasPreferenceSchemaByKeyOrName = (key: string) => {\n if (key in preferenceSchema) {\n return true\n }\n return preferenceMap.has(key)\n}\nexport const getPreferenceSchemaByKeyOrName = (key: string) => {\n if (key in preferenceSchema) {\n return preferenceSchema[key]\n }\n return preferenceMap.get(key)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,uBAAyB;AAIzB,MAAM,QAAQ,IAAI,0BAAS;AAAA,EACzB,KAAK;AAAA,EACL,SAAS;AAAA,EACT,iBAAiB,MAAM;AAAA,EACvB,KAAK,MAAO,KAAK,KAAK,KAAK;AAAA,EAC3B,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAClB,CAAC;AAEM,MAAM,oBAAoB;AAAA,EAE/B,YACU,IACA,KACR;AAFQ;AACA;AAHV;AAAA,EAIG;AAAA,EACG,kBAAkB,KAAa;AAAA;AACnC,aAAO,IAAI,oBAAoB,KAAK,IAAI,GAAG;AAAA,IAC7C;AAAA;AAAA,EACM,IACJ,KACA,OACkB;AAAA;AA3BtB;AA4BI,UAAI,CAAC,KAAK,GAAG;AACX,aAAK,KAAK,WAAM,KAAK,GAAG,kBAAkB,KAAK,GAAG,MAAxC,YAA8C,CAAC;AAAA,MAC3D;AACA,YAAM,WAAW,GAAG,KAAK,GAAG;AAC5B,YAAM,IAAI,iCACL,KAAK,IADA;AAAA,QAER,CAAC,GAAG,GAAG;AAAA,MACT;AACA,YAAM,KAAK,GAAG,oBAAoB,KAAK,KAAK,CAAC;AAC7C,YAAM,IAAI,UAAU,CAAC;AACrB,WAAK,IAAI;AACT,aAAO;AAAA,IACT;AAAA;AAAA,EACM,IACJ,KACwB;AAAA;AA3C5B;AA4CI,YAAM,WAAW,GAAG,KAAK,GAAG;AAC5B,YAAM,MAAM,MAAM,IAAI,QAAQ;AAC9B,UAAI,KAAK;AACP,cAAM,IAAI,MAAM,IAAI,QAAQ;AAC5B,gBAAO,4BAAI,SAAJ,aAAY,sBAAiB,GAAG,MAApB,mBAAuB;AAAA,MAC5C;AACA,YAAM,SAAS,WAAM,KAAK,GAAG,kBAAkB,KAAK,GAAG,MAAxC,YAA8C,CAAC;AAC9D,YAAM,IAAI,UAAU,KAAK;AACzB,cAAQ,oCAAQ,SAAR,aAAsB,sBAAiB,GAAG,MAApB,mBAAuB;AAAA,IACvD;AAAA;AAAA,EACM,gBAA8C;AAAA;AAClD,YAAM,KAAK,IAAI,EAAE;AACjB,aAAO,MAAM,IAAI,KAAK,GAAG;AAAA,IAC3B;AAAA;AACF;AAQO,MAAM,gBAAgB;AAAA,EAC3B,oBAAoB;AAAA,IAClB,KAAK;AAAA,IACL,UAAU;AAAA,EACZ;AAAA,EACA,oBAAoB;AAAA,IAClB,KAAK;AAAA,IACL,UAAU;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACZ;AACF;AAEO,MAAM,mBAAmD;AAAA,EAC9D,4BAA4B;AAAA,IAC1B,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,4BAA4B;AAAA,IAC1B,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,0BAA0B;AAAA,IACxB,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAEA,MAAM,gBAAgB,oBAAI,IAA4B;AAEtD,OAAO,QAAQ,gBAAgB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,gBAAc,IAAI,MAAM,UAAU,KAAK;AACzC,CAAC;AAEM,MAAM,iCAAiC,CAAC,QAAgB;AAC7D,MAAI,OAAO,kBAAkB;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,cAAc,IAAI,GAAG;AAC9B;AACO,MAAM,iCAAiC,CAAC,QAAgB;AAC7D,MAAI,OAAO,kBAAkB;AAC3B,WAAO,iBAAiB,GAAG;AAAA,EAC7B;AACA,SAAO,cAAc,IAAI,GAAG;AAC9B;","names":[]}
1
+ {"version":3,"sources":["../../../src/service/preference.ts"],"sourcesContent":["import { DB } from '@/interface'\nimport { LRUCache } from 'lru-cache'\n\nconst cache = new LRUCache({\n max: 500,\n maxSize: 500,\n sizeCalculation: () => 1,\n ttl: 1000 * 60 * 60 * 24 * 7,\n allowStale: false,\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n})\n\nexport class UserPreferenceStore {\n v: any = undefined\n constructor(\n private db: DB<any>,\n private uid: number\n ) {}\n async getUserPreference(uid: number) {\n return new UserPreferenceStore(this.db, uid)\n }\n async set<T extends string | number | boolean>(\n key: string,\n value: T\n ): Promise<boolean> {\n if (!this.v) {\n this.v = (await this.db.getUserPreference(this.uid)) ?? {}\n }\n const cacheKey = `${this.uid}`\n const v = {\n ...this.v,\n [key]: value,\n }\n await this.db.storeUserPreference(this.uid, v)\n cache.set(cacheKey, v)\n this.v = v\n return true\n }\n async get<T extends string | number | boolean>(\n key: string\n ): Promise<T | undefined> {\n const cacheKey = `${this.uid}`\n const has = cache.has(cacheKey)\n if (has) {\n const v = cache.get(cacheKey) as T\n return v?.[key] ?? preferenceSchema[key]?.default\n }\n const value = (await this.db.getUserPreference(this.uid)) ?? {}\n cache.set(cacheKey, value)\n return (value?.[key] as T) ?? preferenceSchema[key]?.default\n }\n async configEntries(): Promise<Record<string, any>> {\n await this.get('')\n return cache.get(this.uid) as Record<string, any>\n }\n}\n\ntype PreferenceItem = {\n key: string\n i18nName: string\n valueType: 'img-url' | 'string' | 'number' | 'boolean'\n default: any\n}\nexport const preferenceKey = {\n blProfileRenderImg: {\n key: 'bl::profile::render::img',\n i18nName: 'BLProfile背景图片',\n },\n ssProfileRenderImg: {\n key: 'ss::profile::render::img',\n i18nName: 'SSProfile背景图片',\n },\n blScoreImg: {\n key: 'bl::score::render::img',\n i18nName: 'BLScore背景图片',\n },\n}\n\nexport const preferenceSchema: Record<string, PreferenceItem> = {\n 'bl::profile::render::img': {\n key: 'bl::profile::render::img',\n i18nName: 'BLProfile背景图片',\n valueType: 'img-url',\n default: 'https://www.loliapi.com/acg/pc/',\n },\n 'ss::profile::render::img': {\n key: 'ss::profile::render::img',\n i18nName: 'SSProfile背景图片',\n valueType: 'img-url',\n default: 'https://www.loliapi.com/acg/pc/',\n },\n 'bl::score::render::img': {\n key: 'bl::score::render::img',\n i18nName: 'BLScore背景图片',\n valueType: 'img-url',\n default: 'https://www.loliapi.com/acg/pc/',\n },\n}\n\nconst preferenceMap = new Map<string, PreferenceItem>()\n\nObject.entries(preferenceSchema).forEach(([key, value]) => {\n preferenceMap.set(value.i18nName, value)\n})\n\nexport const hasPreferenceSchemaByKeyOrName = (key: string) => {\n if (key in preferenceSchema) {\n return true\n }\n return preferenceMap.has(key)\n}\nexport const getPreferenceSchemaByKeyOrName = (key: string) => {\n if (key in preferenceSchema) {\n return preferenceSchema[key]\n }\n return preferenceMap.get(key)\n}\n"],"mappings":"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","names":[]}
@@ -68,9 +68,10 @@ var import_components = require("../../components");
68
68
  var import_puppeteer_core = require("puppeteer-core");
69
69
  var import_interface = require("../../interface");
70
70
  var import_pages = require("../../components/pages");
71
- var import_preference = require("../../service/preference");
71
+ var import_preference = require("../preference");
72
72
  var import_errors = require("../../infra/errors");
73
73
  var import_qrcode = __toESM(require("../../components/utils/qrcode"));
74
+ var import_render = require("../../infra/support/render");
74
75
  const getPreferenceKey = (platform) => {
75
76
  return platform == import_interface.Platform.SS ? import_preference.preferenceKey.ssProfileRenderImg.key : import_preference.preferenceKey.blProfileRenderImg.key;
76
77
  };
@@ -79,6 +80,9 @@ class RenderService {
79
80
  this.api = api;
80
81
  this.imageRender = imageRender;
81
82
  }
83
+ static create(imgRenderConfig, api) {
84
+ return new RenderService(api, (0, import_render.getImageRender)(imgRenderConfig));
85
+ }
82
86
  renderRank(accountId, platform, renderOpts) {
83
87
  return __async(this, null, function* () {
84
88
  var _a;
@@ -143,7 +147,13 @@ class RenderService {
143
147
  }
144
148
  renderUrl(url, renderOption) {
145
149
  return __async(this, null, function* () {
146
- return this.imageRender.url2img(url, renderOption);
150
+ var _a, _b;
151
+ (_a = renderOption.onRenderStart) == null ? void 0 : _a.call(renderOption);
152
+ try {
153
+ return this.imageRender.url2img(url, renderOption);
154
+ } catch (e) {
155
+ (_b = renderOption == null ? void 0 : renderOption.onRenderError) == null ? void 0 : _b.call(renderOption, e);
156
+ }
147
157
  });
148
158
  }
149
159
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/service/render/index.ts"],"sourcesContent":["import {IRenderService, RenderOption} from './interfaces'\nimport { getHtml } from '@/components'\nimport { PuppeteerError, TimeoutError } from 'puppeteer-core'\nimport { Platform } from '@/interface'\nimport {getBLPlayerComp, getBLRankScoreComp, getBSMapComp, getSSPlayerComp} from '@/components/pages'\nimport {preferenceKey} from \"@/service/preference\";\nimport {ImageRenderError, RequestError} from \"@/infra/errors\";\nimport createQrcode from \"@/components/utils/qrcode\";\nimport {APIService} from \"@/service/api\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {ImageRender} from \"@/infra/support/render\";\n\n\nconst getPreferenceKey = (platform: string) => {\n return platform == Platform.SS\n ? preferenceKey.ssProfileRenderImg.key\n : preferenceKey.blProfileRenderImg.key\n}\n\nexport class RenderService implements IRenderService {\n constructor(\n private api: APIService,\n private imageRender: ImageRender\n ) {}\n async renderRank(\n accountId: string,\n platform: Platform,\n renderOpts?: RenderOption\n ) {\n try {\n let bg = (await renderOpts?.userPreference?.get<string>(getPreferenceKey(platform)))\n bg = bg || 'https://www.loliapi.com/acg/pc/'\n let html: string\n if (platform == Platform.BL) {\n const { scores, userInfo } = await this.api.getBLPlayerScoresWithUserInfo(accountId)\n html = getHtml(getBLPlayerComp(scores, userInfo, bg))\n } else {\n const { scores, userInfo } = await this.api.getSSPlayerRecentScoreWithUserInfo(accountId)\n html = getHtml(getSSPlayerComp(scores, userInfo, bg))\n }\n return this.imageRender.html2img(html, {selector: '#render-result', ...renderOpts})\n }catch (e) {\n if (e instanceof TimeoutError || e instanceof PuppeteerError) {\n throw new ImageRenderError()\n }\n throw e\n }\n }\n\n async renderScore(\n scoreId: string,\n renderOpts?: RenderOption\n ) {\n const bg = (await renderOpts?.userPreference?.get<string>(preferenceKey.blScoreImg.key))\n ?? 'https://www.loliapi.com/acg/pc/'\n try {\n const { score, statistic, bsor, bsMap } =\n await this.api.getScoreAndBSMapByScoreId(scoreId)\n\n const { aroundScores, regionTopScores, difficulties } =\n await this.api.getAroundScoreAndRegionScoreByRankAndPage(\n score.leaderboardId,\n score.rank,\n score.player.country\n )\n return this.imageRender.html2img(\n getHtml(getBLRankScoreComp(score, aroundScores, regionTopScores, difficulties, bsMap, statistic, bsor, bg)),\n {selector: '#render-result', ...renderOpts}\n )\n }catch (e) {\n if (e instanceof RequestError) {\n throw e\n }\n throw new ImageRenderError()\n }\n }\n\n async renderMapById(\n mapId: string,\n renderOption: RenderOption\n ) {\n const map = await this.api.BeatSaver.searchMapById(mapId)\n return this.renderMap(map, renderOption)\n }\n\n async renderMap(\n bsMap: BSMap,\n renderOption?: RenderOption\n ) {\n const previewQrUrl = await createQrcode(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`)\n const bsMapQrUrl = await createQrcode(`https://beatsaver.com/maps/${bsMap.id}`)\n return this.imageRender.html2img(\n getHtml(getBSMapComp(bsMap, bsMapQrUrl, previewQrUrl)), {selector: '#render-result', ...renderOption}\n )\n }\n\n async renderUrl(url: string, renderOption?: RenderOption) {\n return this.imageRender.url2img(url, renderOption)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAwB;AACxB,4BAA6C;AAC7C,uBAAyB;AACzB,mBAAiF;AACjF,wBAA4B;AAC5B,oBAA6C;AAC7C,oBAAyB;AAMzB,MAAM,mBAAmB,CAAC,aAAqB;AAC7C,SAAO,YAAY,0BAAS,KACxB,gCAAc,mBAAmB,MACjC,gCAAc,mBAAmB;AACvC;AAEO,MAAM,cAAwC;AAAA,EACnD,YACU,KACA,aACR;AAFQ;AACA;AAAA,EACP;AAAA,EACG,WACJ,WACA,UACA,YACA;AAAA;AA5BJ;AA6BI,UAAI;AACF,YAAI,KAAM,OAAM,8CAAY,mBAAZ,mBAA4B,IAAY,iBAAiB,QAAQ;AACjF,aAAK,MAAM;AACX,YAAI;AACJ,YAAI,YAAY,0BAAS,IAAI;AAC3B,gBAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK,IAAI,8BAA8B,SAAS;AACnF,qBAAO,+BAAQ,8BAAgB,QAAQ,UAAU,EAAE,CAAC;AAAA,QACtD,OAAO;AACL,gBAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK,IAAI,mCAAmC,SAAS;AACxF,qBAAO,+BAAQ,8BAAgB,QAAQ,UAAU,EAAE,CAAC;AAAA,QACtD;AACA,eAAO,KAAK,YAAY,SAAS,MAAM,iBAAC,UAAU,oBAAqB,WAAW;AAAA,MACpF,SAAQ,GAAG;AACT,YAAI,aAAa,sCAAgB,aAAa,sCAAgB;AAC5D,gBAAM,IAAI,+BAAiB;AAAA,QAC7B;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA,EAEM,YACJ,SACA,YACA;AAAA;AApDJ;AAqDI,YAAM,MAAM,YAAM,8CAAY,mBAAZ,mBAA4B,IAAY,gCAAc,WAAW,SAAvE,YACP;AACL,UAAI;AACF,cAAM,EAAE,OAAO,WAAW,MAAM,MAAM,IACpC,MAAM,KAAK,IAAI,0BAA0B,OAAO;AAElD,cAAM,EAAE,cAAc,iBAAiB,aAAa,IAClD,MAAM,KAAK,IAAI;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,QACf;AACF,eAAO,KAAK,YAAY;AAAA,cACtB,+BAAQ,iCAAmB,OAAO,cAAc,iBAAiB,cAAc,OAAO,WAAW,MAAM,EAAE,CAAC;AAAA,UAC1G,iBAAC,UAAU,oBAAqB;AAAA,QAClC;AAAA,MACF,SAAQ,GAAG;AACT,YAAI,aAAa,4BAAc;AAC7B,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,+BAAiB;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA,EAEM,cACJ,OACA,cACA;AAAA;AACA,YAAM,MAAM,MAAM,KAAK,IAAI,UAAU,cAAc,KAAK;AACxD,aAAO,KAAK,UAAU,KAAK,YAAY;AAAA,IACzC;AAAA;AAAA,EAEM,UACJ,OACA,cACA;AAAA;AACA,YAAM,eAAe,UAAM,cAAAA,SAAa,6CAA6C,MAAM,EAAE,EAAE;AAC/F,YAAM,aAAa,UAAM,cAAAA,SAAa,8BAA8B,MAAM,EAAE,EAAE;AAC9E,aAAO,KAAK,YAAY;AAAA,YACtB,+BAAQ,2BAAa,OAAO,YAAY,YAAY,CAAC;AAAA,QAAG,iBAAC,UAAU,oBAAqB;AAAA,MAC1F;AAAA,IACF;AAAA;AAAA,EAEM,UAAU,KAAa,cAA6B;AAAA;AACxD,aAAO,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,IACnD;AAAA;AACF;","names":["createQrcode"]}
1
+ {"version":3,"sources":["../../../../src/service/render/index.ts"],"sourcesContent":["import {IRenderService, RenderOption} from './interfaces'\nimport { getHtml } from '@/components'\nimport { PuppeteerError, TimeoutError } from 'puppeteer-core'\nimport { Platform } from '@/interface'\nimport {getBLPlayerComp, getBLRankScoreComp, getBSMapComp, getSSPlayerComp} from '@/components/pages'\nimport {preferenceKey} from \"../preference\";\nimport {ImageRenderError, RequestError} from \"@/infra/errors\";\nimport createQrcode from \"@/components/utils/qrcode\";\nimport {APIService} from \"../api\";\nimport {BSMap} from \"../api/interfaces/beatsaver\";\nimport {CreateImageRenderOption, getImageRender, ImageRender} from \"@/infra/support/render\";\n\n\nconst getPreferenceKey = (platform: string) => {\n return platform == Platform.SS\n ? preferenceKey.ssProfileRenderImg.key\n : preferenceKey.blProfileRenderImg.key\n}\n\nexport class RenderService implements IRenderService {\n constructor(\n private api: APIService,\n private imageRender: ImageRender\n ) {}\n\n static create(imgRenderConfig: CreateImageRenderOption, api: APIService) {\n return new RenderService(api, getImageRender(imgRenderConfig))\n }\n\n async renderRank(\n accountId: string,\n platform: Platform,\n renderOpts?: RenderOption\n ) {\n try {\n let bg = (await renderOpts?.userPreference?.get<string>(getPreferenceKey(platform)))\n bg = bg || 'https://www.loliapi.com/acg/pc/'\n let html: string\n if (platform == Platform.BL) {\n const { scores, userInfo } = await this.api.getBLPlayerScoresWithUserInfo(accountId)\n html = getHtml(getBLPlayerComp(scores, userInfo, bg))\n } else {\n const { scores, userInfo } = await this.api.getSSPlayerRecentScoreWithUserInfo(accountId)\n html = getHtml(getSSPlayerComp(scores, userInfo, bg))\n }\n return this.imageRender.html2img(html, {selector: '#render-result', ...renderOpts})\n }catch (e) {\n if (e instanceof TimeoutError || e instanceof PuppeteerError) {\n throw new ImageRenderError()\n }\n throw e\n }\n }\n\n async renderScore(\n scoreId: string,\n renderOpts?: RenderOption\n ) {\n const bg = (await renderOpts?.userPreference?.get<string>(preferenceKey.blScoreImg.key))\n ?? 'https://www.loliapi.com/acg/pc/'\n try {\n const { score, statistic, bsor, bsMap } =\n await this.api.getScoreAndBSMapByScoreId(scoreId)\n\n const { aroundScores, regionTopScores, difficulties } =\n await this.api.getAroundScoreAndRegionScoreByRankAndPage(\n score.leaderboardId,\n score.rank,\n score.player.country\n )\n return this.imageRender.html2img(\n getHtml(getBLRankScoreComp(score, aroundScores, regionTopScores, difficulties, bsMap, statistic, bsor, bg)),\n {selector: '#render-result', ...renderOpts}\n )\n }catch (e) {\n if (e instanceof RequestError) {\n throw e\n }\n throw new ImageRenderError()\n }\n }\n\n async renderMapById(\n mapId: string,\n renderOption: RenderOption\n ) {\n const map = await this.api.BeatSaver.searchMapById(mapId)\n return this.renderMap(map, renderOption)\n }\n\n async renderMap(\n bsMap: BSMap,\n renderOption?: RenderOption\n ) {\n const previewQrUrl = await createQrcode(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`)\n const bsMapQrUrl = await createQrcode(`https://beatsaver.com/maps/${bsMap.id}`)\n return this.imageRender.html2img(\n getHtml(getBSMapComp(bsMap, bsMapQrUrl, previewQrUrl)), {selector: '#render-result', ...renderOption}\n )\n }\n\n async renderUrl(url: string, renderOption?: RenderOption) {\n renderOption.onRenderStart?.()\n try {\n return this.imageRender.url2img(url, renderOption)\n }catch (e) {\n renderOption?.onRenderError?.(e)\n }\n }\n}\n"],"mappings":"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","names":["createQrcode"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ws/beatleader.ts"],"sourcesContent":["import { WSHandler } from '@/ws/handler'\nimport { Logger } from '@/interface/logger'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { BotService, Session } from '@/interface'\nimport {RenderService} from \"@/service/render\";\nimport {BeatLeaderWSEvent} from \"@/service/api/interfaces/beatleader\";\n\nexport class BeatleaderWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private botService: BotService<T, Session<T>>\n wsUrl: string = 'wss://sockets.api.beatleader.xyz/scores'\n private db: DB<T>\n config: Config\n constructor(\n db: DB<T>,\n render: RenderService,\n logger: Logger,\n config: Config,\n botService: BotService<T, Session<T>>\n ) {\n this.logger = logger\n this.render = render\n this.botService = botService\n this.config = config\n this.db = db\n }\n\n onOpen() {\n this.logger.info('BeatleaderWS opened')\n }\n\n onClose() {\n this.logger.info('BeatleaderWS closed')\n }\n\n async onEvent(event: any) {\n const data = JSON.parse(event.toString()) as BeatLeaderWSEvent\n const playerId = data.player.id\n // const ok = BeatLeaderFilter(data, ...this.config.BLScoreFilters)\n // if (!ok) {\n // return\n // }\n // logger.info('Received beatleader message',data.id, data.player.id);\n // cache all playerId\n const subscriptions = await this.db.getAllSubscriptionByUIDAndPlatform(playerId, 'beatleader')\n // .filter(item=> {\n // const channelFilters = item.sub.data as BLScoreFilter[]\n // const memberFilters = item.member.subscribeData\n // return BeatLeaderFilter(data, ...channelFilters, ...memberFilters)\n // })\n const restSub = subscriptions.filter((it) =>\n it.subscribe.type == 'beatleader-score' && it.subscribe.enable == true\n )\n // cacheService\n if (restSub.length === 0) return\n const img = await this.render.renderScore(data.id.toString())\n for (const item of restSub) {\n const session = this.botService.getSessionByChannelInfo(item.groupChannel)\n if (!session) {\n continue\n }\n await session.send(\n `恭喜 <at id=\"${item.account.uid}\"/> 刚刚在谱面「${data.leaderboard.song.name}」中打出了 ${(data.accuracy * 100).toFixed(2)}% 的好成绩`\n )\n await session.sendImgBuffer(img)\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,oBAA4C;AAAA,EAOvD,YACE,IACA,QACA,QACA,QACA,YACA;AAZF,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,iCAAgB;AAChB,wBAAQ;AACR;AAQE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,qBAAqB;AAAA,EACxC;AAAA,EAEA,UAAU;AACR,SAAK,OAAO,KAAK,qBAAqB;AAAA,EACxC;AAAA,EAEM,QAAQ,OAAY;AAAA;AACxB,YAAM,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AACxC,YAAM,WAAW,KAAK,OAAO;AAO7B,YAAM,gBAAgB,MAAM,KAAK,GAAG,mCAAmC,UAAU,YAAY;AAM7F,YAAM,UAAU,cAAc;AAAA,QAAO,CAAC,OACpC,GAAG,UAAU,QAAQ,sBAAsB,GAAG,UAAU,UAAU;AAAA,MACpE;AAEA,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,MAAM,MAAM,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,CAAC;AAC5D,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,WAAW,wBAAwB,KAAK,YAAY;AACzE,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,wBAAc,KAAK,QAAQ,GAAG,2CAAa,KAAK,YAAY,KAAK,IAAI,mCAAU,KAAK,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,QAChH;AACA,cAAM,QAAQ,cAAc,GAAG;AAAA,MACjC;AAAA,IACF;AAAA;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/ws/beatleader.ts"],"sourcesContent":["import { WSHandler } from '@/ws/handler'\nimport { Logger } from '@/interface/logger'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { BotService, Session } from '@/interface'\nimport {RenderService} from \"@/service\";\nimport {BeatLeaderWSEvent} from \"@/service/api/interfaces/beatleader\";\n\nexport class BeatleaderWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private botService: BotService<T, Session<T>>\n wsUrl: string = 'wss://sockets.api.beatleader.xyz/scores'\n private db: DB<T>\n config: Config\n constructor(\n db: DB<T>,\n render: RenderService,\n logger: Logger,\n config: Config,\n botService: BotService<T, Session<T>>\n ) {\n this.logger = logger\n this.render = render\n this.botService = botService\n this.config = config\n this.db = db\n }\n\n onOpen() {\n this.logger.info('BeatleaderWS opened')\n }\n\n onClose() {\n this.logger.info('BeatleaderWS closed')\n }\n\n async onEvent(event: any) {\n const data = JSON.parse(event.toString()) as BeatLeaderWSEvent\n const playerId = data.player.id\n // const ok = BeatLeaderFilter(data, ...this.config.BLScoreFilters)\n // if (!ok) {\n // return\n // }\n // logger.info('Received beatleader message',data.id, data.player.id);\n // cache all playerId\n const subscriptions = await this.db.getAllSubscriptionByUIDAndPlatform(playerId, 'beatleader')\n // .filter(item=> {\n // const channelFilters = item.sub.data as BLScoreFilter[]\n // const memberFilters = item.member.subscribeData\n // return BeatLeaderFilter(data, ...channelFilters, ...memberFilters)\n // })\n const restSub = subscriptions.filter((it) =>\n it.subscribe.type == 'beatleader-score' && it.subscribe.enable == true\n )\n // cacheService\n if (restSub.length === 0) return\n const img = await this.render.renderScore(data.id.toString())\n for (const item of restSub) {\n const session = this.botService.getSessionByChannelInfo(item.groupChannel)\n if (!session) {\n continue\n }\n await session.send(\n `恭喜 <at id=\"${item.account.uid}\"/> 刚刚在谱面「${data.leaderboard.song.name}」中打出了 ${(data.accuracy * 100).toFixed(2)}% 的好成绩`\n )\n await session.sendImgBuffer(img)\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,oBAA4C;AAAA,EAOvD,YACE,IACA,QACA,QACA,QACA,YACA;AAZF,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,iCAAgB;AAChB,wBAAQ;AACR;AAQE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,qBAAqB;AAAA,EACxC;AAAA,EAEA,UAAU;AACR,SAAK,OAAO,KAAK,qBAAqB;AAAA,EACxC;AAAA,EAEM,QAAQ,OAAY;AAAA;AACxB,YAAM,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AACxC,YAAM,WAAW,KAAK,OAAO;AAO7B,YAAM,gBAAgB,MAAM,KAAK,GAAG,mCAAmC,UAAU,YAAY;AAM7F,YAAM,UAAU,cAAc;AAAA,QAAO,CAAC,OACpC,GAAG,UAAU,QAAQ,sBAAsB,GAAG,UAAU,UAAU;AAAA,MACpE;AAEA,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,MAAM,MAAM,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,CAAC;AAC5D,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,WAAW,wBAAwB,KAAK,YAAY;AACzE,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,wBAAc,KAAK,QAAQ,GAAG,2CAAa,KAAK,YAAY,KAAK,IAAI,mCAAU,KAAK,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,QAChH;AACA,cAAM,QAAQ,cAAc,GAAG;AAAA,MACjC;AAAA,IACF;AAAA;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ws/beatsaver.ts"],"sourcesContent":["import { WSHandler } from '@/ws/handler'\nimport { Logger } from '@/interface/logger'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { BotService, Session } from '@/interface'\nimport { handleWSEventWithCache } from '@/utils'\nimport {BeatSaverWSEvent, BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {RenderService} from \"@/service/render\";\n\nexport class BeatSaverWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private botService: BotService<T, Session<T>>\n wsUrl: string = 'wss://ws.beatsaver.com/maps'\n private db: DB<T>\n config: Config\n constructor(\n db: DB<T>,\n render: RenderService,\n logger: Logger,\n config: Config,\n botService: BotService<T, Session<T>>\n ) {\n this.logger = logger\n this.render = render\n this.botService = botService\n this.config = config\n this.db = db\n }\n\n onOpen() {\n this.logger.info('BeatsaverWS opened')\n }\n\n onClose() {\n this.logger.info('BeatsaverWS closed')\n }\n\n eventParser(event) {\n return JSON.parse(event.toString()) as BeatSaverWSEvent\n }\n\n eventFilter = (data: BeatSaverWSEvent) => {\n return (\n data.type === 'MAP_UPDATE' &&\n data.msg.versions.some((it) => it.state == 'Published') &&\n data.msg.declaredAi === 'None'\n )\n }\n eventIdSelector = (data: BeatSaverWSEvent) =>\n `ws.bs.${data.type === 'MAP_DELETE' ? data.msg : data.msg.id}.${data.type}`\n\n async BSWSHandler(data: BeatSaverWSEvent) {\n // this.logger.info('Beatsaver message received', data.type, data?.msg?.id)\n\n const bsmap = data.msg as BSMap\n const userId = bsmap.uploader.id\n const subscriptions = await this.db.getAllSubscriptionByUIDAndPlatform(\n userId,\n 'beatsaver'\n )\n\n const restSub = subscriptions.filter(\n (it) =>\n it.subscribe.type == 'beatsaver-map' && it.subscribe.enable == true\n )\n const gids = restSub.map((it) => it.groupChannel.id)\n const groupSubs = await this.db.getIDSubscriptionByType('id-beatsaver-map')\n const restGroupSubs = groupSubs.filter(\n (it) =>\n !gids.includes(it.groupChannel.id) &&\n it.subscribe.data?.mapperId?.toString() === userId.toString()\n )\n\n // cacheService\n if (restSub.length === 0 && restGroupSubs) return\n const image = this.render.renderMap(bsmap)\n for (const item of restSub) {\n const session = this.botService.getSessionByChannelInfo(item.groupChannel)\n if (!session) {\n continue\n }\n await session.send(\n `本群谱师 「<at id=\"${item.account.uid}\"/> (${bsmap.uploader.name})」刚刚发布了新谱面,「${bsmap.name}」`\n )\n // text + mention element\n await session.sendImgBuffer(await image)\n await session.sendAudioByUrl(bsmap.versions[0].previewURL)\n }\n for (const item of restGroupSubs) {\n const session = this.botService.getSessionByChannelInfo(item.groupChannel)\n if (!session) {\n continue\n }\n await session.send(\n `谱师「${bsmap.uploader.name}」刚刚发布了新谱面,「${bsmap.name}」`\n )\n // text + mention element\n await session.sendImgBuffer(await image)\n await session.sendAudioByUrl(bsmap.versions[0].previewURL)\n }\n }\n\n onEvent = handleWSEventWithCache(\n this,\n this.BSWSHandler,\n 1000 * 60 * 15,\n this.eventParser,\n this.eventFilter,\n this.eventIdSelector\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,mBAAuC;AAIhC,MAAM,mBAA2C;AAAA,EAOtD,YACE,IACA,QACA,QACA,QACA,YACA;AAZF,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,iCAAgB;AAChB,wBAAQ;AACR;AA2BA,uCAAc,CAAC,SAA2B;AACxC,aACE,KAAK,SAAS,gBACd,KAAK,IAAI,SAAS,KAAK,CAAC,OAAO,GAAG,SAAS,WAAW,KACtD,KAAK,IAAI,eAAe;AAAA,IAE5B;AACA,2CAAkB,CAAC,SACjB,SAAS,KAAK,SAAS,eAAe,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI;AAqD3E,uCAAU;AAAA,MACR;AAAA,MACA,KAAK;AAAA,MACL,MAAO,KAAK;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAvFE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,UAAU;AACR,SAAK,OAAO,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,YAAY,OAAO;AACjB,WAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAAA,EACpC;AAAA,EAYM,YAAY,MAAwB;AAAA;AAGxC,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,MAAM,SAAS;AAC9B,YAAM,gBAAgB,MAAM,KAAK,GAAG;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,cAAc;AAAA,QAC5B,CAAC,OACC,GAAG,UAAU,QAAQ,mBAAmB,GAAG,UAAU,UAAU;AAAA,MACnE;AACA,YAAM,OAAO,QAAQ,IAAI,CAAC,OAAO,GAAG,aAAa,EAAE;AACnD,YAAM,YAAY,MAAM,KAAK,GAAG,wBAAwB,kBAAkB;AAC1E,YAAM,gBAAgB,UAAU;AAAA,QAC9B,CAAC,OAAI;AArEX;AAsEQ,kBAAC,KAAK,SAAS,GAAG,aAAa,EAAE,OACjC,cAAG,UAAU,SAAb,mBAAmB,aAAnB,mBAA6B,gBAAe,OAAO,SAAS;AAAA;AAAA,MAChE;AAGA,UAAI,QAAQ,WAAW,KAAK,cAAe;AAC3C,YAAM,QAAQ,KAAK,OAAO,UAAU,KAAK;AACzC,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,WAAW,wBAAwB,KAAK,YAAY;AACzE,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,0CAAiB,KAAK,QAAQ,GAAG,QAAQ,MAAM,SAAS,IAAI,sEAAe,MAAM,IAAI;AAAA,QACvF;AAEA,cAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,cAAM,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,UAAU;AAAA,MAC3D;AACA,iBAAW,QAAQ,eAAe;AAChC,cAAM,UAAU,KAAK,WAAW,wBAAwB,KAAK,YAAY;AACzE,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,qBAAM,MAAM,SAAS,IAAI,qEAAc,MAAM,IAAI;AAAA,QACnD;AAEA,cAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,cAAM,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA;AAUF;","names":[]}
1
+ {"version":3,"sources":["../../../src/ws/beatsaver.ts"],"sourcesContent":["import { WSHandler } from '@/ws/handler'\nimport { Logger } from '@/interface/logger'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { BotService, Session } from '@/interface'\nimport { handleWSEventWithCache } from '@/utils'\nimport {BeatSaverWSEvent, BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {RenderService} from \"@/service\";\n\nexport class BeatSaverWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private botService: BotService<T, Session<T>>\n wsUrl: string = 'wss://ws.beatsaver.com/maps'\n private db: DB<T>\n config: Config\n constructor(\n db: DB<T>,\n render: RenderService,\n logger: Logger,\n config: Config,\n botService: BotService<T, Session<T>>\n ) {\n this.logger = logger\n this.render = render\n this.botService = botService\n this.config = config\n this.db = db\n }\n\n onOpen() {\n this.logger.info('BeatsaverWS opened')\n }\n\n onClose() {\n this.logger.info('BeatsaverWS closed')\n }\n\n eventParser(event) {\n return JSON.parse(event.toString()) as BeatSaverWSEvent\n }\n\n eventFilter = (data: BeatSaverWSEvent) => {\n return (\n data.type === 'MAP_UPDATE' &&\n data.msg.versions.some((it) => it.state == 'Published') &&\n data.msg.declaredAi === 'None'\n )\n }\n eventIdSelector = (data: BeatSaverWSEvent) =>\n `ws.bs.${data.type === 'MAP_DELETE' ? data.msg : data.msg.id}.${data.type}`\n\n async BSWSHandler(data: BeatSaverWSEvent) {\n // this.logger.info('Beatsaver message received', data.type, data?.msg?.id)\n\n const bsmap = data.msg as BSMap\n const userId = bsmap.uploader.id\n const subscriptions = await this.db.getAllSubscriptionByUIDAndPlatform(\n userId,\n 'beatsaver'\n )\n\n const restSub = subscriptions.filter(\n (it) =>\n it.subscribe.type == 'beatsaver-map' && it.subscribe.enable == true\n )\n const gids = restSub.map((it) => it.groupChannel.id)\n const groupSubs = await this.db.getIDSubscriptionByType('id-beatsaver-map')\n const restGroupSubs = groupSubs.filter(\n (it) =>\n !gids.includes(it.groupChannel.id) &&\n it.subscribe.data?.mapperId?.toString() === userId.toString()\n )\n\n // cacheService\n if (restSub.length === 0 && restGroupSubs) return\n const image = this.render.renderMap(bsmap)\n for (const item of restSub) {\n const session = this.botService.getSessionByChannelInfo(item.groupChannel)\n if (!session) {\n continue\n }\n await session.send(\n `本群谱师 「<at id=\"${item.account.uid}\"/> (${bsmap.uploader.name})」刚刚发布了新谱面,「${bsmap.name}」`\n )\n // text + mention element\n await session.sendImgBuffer(await image)\n await session.sendAudioByUrl(bsmap.versions[0].previewURL)\n }\n for (const item of restGroupSubs) {\n const session = this.botService.getSessionByChannelInfo(item.groupChannel)\n if (!session) {\n continue\n }\n await session.send(\n `谱师「${bsmap.uploader.name}」刚刚发布了新谱面,「${bsmap.name}」`\n )\n // text + mention element\n await session.sendImgBuffer(await image)\n await session.sendAudioByUrl(bsmap.versions[0].previewURL)\n }\n }\n\n onEvent = handleWSEventWithCache(\n this,\n this.BSWSHandler,\n 1000 * 60 * 15,\n this.eventParser,\n this.eventFilter,\n this.eventIdSelector\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,mBAAuC;AAIhC,MAAM,mBAA2C;AAAA,EAOtD,YACE,IACA,QACA,QACA,QACA,YACA;AAZF,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,iCAAgB;AAChB,wBAAQ;AACR;AA2BA,uCAAc,CAAC,SAA2B;AACxC,aACE,KAAK,SAAS,gBACd,KAAK,IAAI,SAAS,KAAK,CAAC,OAAO,GAAG,SAAS,WAAW,KACtD,KAAK,IAAI,eAAe;AAAA,IAE5B;AACA,2CAAkB,CAAC,SACjB,SAAS,KAAK,SAAS,eAAe,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI;AAqD3E,uCAAU;AAAA,MACR;AAAA,MACA,KAAK;AAAA,MACL,MAAO,KAAK;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAvFE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,UAAU;AACR,SAAK,OAAO,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,YAAY,OAAO;AACjB,WAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAAA,EACpC;AAAA,EAYM,YAAY,MAAwB;AAAA;AAGxC,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,MAAM,SAAS;AAC9B,YAAM,gBAAgB,MAAM,KAAK,GAAG;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,cAAc;AAAA,QAC5B,CAAC,OACC,GAAG,UAAU,QAAQ,mBAAmB,GAAG,UAAU,UAAU;AAAA,MACnE;AACA,YAAM,OAAO,QAAQ,IAAI,CAAC,OAAO,GAAG,aAAa,EAAE;AACnD,YAAM,YAAY,MAAM,KAAK,GAAG,wBAAwB,kBAAkB;AAC1E,YAAM,gBAAgB,UAAU;AAAA,QAC9B,CAAC,OAAI;AArEX;AAsEQ,kBAAC,KAAK,SAAS,GAAG,aAAa,EAAE,OACjC,cAAG,UAAU,SAAb,mBAAmB,aAAnB,mBAA6B,gBAAe,OAAO,SAAS;AAAA;AAAA,MAChE;AAGA,UAAI,QAAQ,WAAW,KAAK,cAAe;AAC3C,YAAM,QAAQ,KAAK,OAAO,UAAU,KAAK;AACzC,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,WAAW,wBAAwB,KAAK,YAAY;AACzE,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,0CAAiB,KAAK,QAAQ,GAAG,QAAQ,MAAM,SAAS,IAAI,sEAAe,MAAM,IAAI;AAAA,QACvF;AAEA,cAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,cAAM,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,UAAU;AAAA,MAC3D;AACA,iBAAW,QAAQ,eAAe;AAChC,cAAM,UAAU,KAAK,WAAW,wBAAwB,KAAK,YAAY;AACzE,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,qBAAM,MAAM,SAAS,IAAI,qEAAc,MAAM,IAAI;AAAA,QACnD;AAEA,cAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,cAAM,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA;AAUF;","names":[]}
@@ -15,13 +15,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
15
15
  var ws_exports = {};
16
16
  module.exports = __toCommonJS(ws_exports);
17
17
  __reExport(ws_exports, require("./beatleader"), module.exports);
18
- __reExport(ws_exports, require("./scoresaber"), module.exports);
19
18
  __reExport(ws_exports, require("./beatsaver"), module.exports);
20
19
  __reExport(ws_exports, require("./handler"), module.exports);
21
20
  // Annotate the CommonJS export names for ESM import in node:
22
21
  0 && (module.exports = {
23
22
  ...require("./beatleader"),
24
- ...require("./scoresaber"),
25
23
  ...require("./beatsaver"),
26
24
  ...require("./handler")
27
25
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ws/index.ts"],"sourcesContent":["export * from './beatleader'\nexport * from './scoresaber'\nexport * from './beatsaver'\nexport * from './handler'\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;AAAA,uBAAc,yBAAd;AACA,uBAAc,yBADd;AAEA,uBAAc,wBAFd;AAGA,uBAAc,sBAHd;","names":[]}
1
+ {"version":3,"sources":["../../../src/ws/index.ts"],"sourcesContent":["export * from './beatleader'\nexport * from './beatsaver'\nexport * from './handler'\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;AAAA,uBAAc,yBAAd;AACA,uBAAc,wBADd;AAEA,uBAAc,sBAFd;","names":[]}
@@ -24,13 +24,13 @@ var tmp_default = () => new CommandBuilder().setName("lb").addAlias("/lb").addAl
24
24
  c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/hitcnt", {
25
25
  selector: "#render-result",
26
26
  onRenderStart: () => {
27
- c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u780D\u51FB\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
27
+ c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u780D\u51FB\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85");
28
28
  }
29
29
  }),
30
30
  c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/score", {
31
31
  selector: "#render-result",
32
32
  onRenderStart: () => {
33
- c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u5206\u6570\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
33
+ c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u5206\u6570\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85");
34
34
  }
35
35
  })
36
36
  ]);
@@ -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,SAAQ,sBAAqB;AAE7B,IAAO,cAAQ,MACb,IAAI,eAAe,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,SAAQ,sBAAqB;AAE7B,IAAO,cAAQ,MACb,IAAI,eAAe,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,SAAQ,sBAAqB;AAC7B,SAAuB,gBAAe;AACtC,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAQ,qBAAoB;AAC5B,IAAO,gBAAQ,MACb,IAAI,eAAe,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,SAAS,MAAM;AAC7B,wBAAY,SAAS,MAAM;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,4BAA4B;AAAA,EACxC;AAEA,MAAI;AACJ,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,GAAG;AAC9B,iBAAa;AAAA,MACX,YAAY,YAAY,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,eAAe;AAC9B,YAAM,IAAI,mBAAmB;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,SAAQ,sBAAqB;AAC7B,SAAuB,gBAAe;AACtC,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAQ,qBAAoB;AAC5B,IAAO,gBAAQ,MACb,IAAI,eAAe,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,SAAS,MAAM;AAC7B,wBAAY,SAAS,MAAM;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,4BAA4B;AAAA,EACxC;AAEA,MAAI;AACJ,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,GAAG;AAC9B,iBAAa;AAAA,MACX,YAAY,YAAY,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,eAAe;AAC9B,YAAM,IAAI,mBAAmB;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/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,SAAQ,mBAAkB;AAC1B,SAAQ,wBAAuB;AAG/B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEP,MAAM,SAAS,CAAI,YAAoB;AAAA,EAC5C,UAAU,YAAe;AAAA,EACzB,UAAU,iBAAiB,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,SAAQ,mBAAkB;AAC1B,SAAQ,wBAAuB;AAG/B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEP,MAAM,SAAS,CAAI,YAAoB;AAAA,EAC5C,UAAU,YAAe;AAAA,EACzB,UAAU,iBAAiB,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,103 +1,40 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
21
4
  import { interpolate } from "./parser";
22
- const i18nObj = {};
23
- init().then((_) => console.log("i18n loaded")).catch((err) => console.error(err));
24
- function init() {
25
- return __async(this, null, function* () {
26
- const zh = yield import("./zh-cn.json");
27
- i18nObj["zh-cn"] = zh;
28
- });
29
- }
30
- function isObject(item) {
31
- return item && typeof item === "object" && !Array.isArray(item);
32
- }
33
- function merge(target, ...sources) {
34
- if (!sources.length) return target;
35
- const source = sources.shift();
36
- if (isObject(target) && isObject(source)) {
37
- for (const key in source) {
38
- if (isObject(source[key])) {
39
- if (!target[key]) Object.assign(target, { [key]: {} });
40
- merge(target[key], source[key]);
41
- } else {
42
- Object.assign(target, { [key]: source[key] });
43
- }
44
- }
5
+ import { interpolateString } from "./util";
6
+ class I18nService {
7
+ constructor(config) {
8
+ __publicField(this, "obj", {});
45
9
  }
46
- return merge(target, ...sources);
47
- }
48
- function loadI18nConfig(lang, obj) {
49
- const raw = i18nObj[lang];
50
- i18nObj[lang] = merge(raw, obj);
51
- console.log(`overwrite i18n ${lang} `);
52
- }
53
- function tran(path, params = {}, lang = "zh-cn") {
54
- const keys = path.split(".");
55
- let result = i18nObj[lang];
56
- for (const key of keys) {
57
- if (result[key] !== void 0) {
58
- result = result[key];
59
- } else {
10
+ mergeConfig(lang, obj) {
11
+ }
12
+ loadLang(lang) {
13
+ }
14
+ tran(path, params = {}, lang = "zh-cn") {
15
+ const keys = path.split(".");
16
+ let result = this.obj[lang];
17
+ if (!result) {
60
18
  return null;
61
19
  }
62
- }
63
- try {
64
- if (typeof result === "string") {
65
- return interpolate(result, params);
20
+ for (const key of keys) {
21
+ if (result[key] !== void 0) {
22
+ result = result[key];
23
+ } else {
24
+ return null;
25
+ }
66
26
  }
67
- } catch (e) {
68
- return interpolateString(result, params);
69
- }
70
- return null;
71
- }
72
- function interpolateString(str, context) {
73
- const regex = /\{\{(.*?)\?\s*'(.*?)'\s*:\s*'(.*?)'\s*\}\}/;
74
- let match;
75
- while ((match = regex.exec(str)) !== null) {
76
- const [fullMatch, condition, trueValue, falseValue] = match;
77
- const resolvedTrueValue = interpolateString(trueValue, context);
78
- const resolvedFalseValue = interpolateString(falseValue, context);
79
- let result = safeEval(condition, context);
80
- if (typeof result === "string") {
81
- result = false;
27
+ try {
28
+ if (typeof result === "string") {
29
+ return interpolate(result, params);
30
+ }
31
+ } catch (e) {
32
+ return interpolateString(result, params);
82
33
  }
83
- const replacement = result ? resolvedTrueValue : resolvedFalseValue;
84
- str = str.replace(fullMatch, replacement);
85
- }
86
- const variableRegex = /\{\{(.*?)\}\}/g;
87
- str = str.replace(variableRegex, (match2, expr) => safeEval(expr, context));
88
- return str;
89
- }
90
- function safeEval(expr, context) {
91
- try {
92
- const fn = new Function(...Object.keys(context), `return ${expr}`);
93
- return fn(...Object.values(context));
94
- } catch (e) {
95
- console.error(expr, context, e);
96
- return expr;
34
+ return null;
97
35
  }
98
36
  }
99
37
  export {
100
- loadI18nConfig,
101
- tran
38
+ I18nService
102
39
  };
103
40
  //# 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,SAAS,mBAAmB;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,aAAO,YAAY,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,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;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,eAAO,YAAY,QAAQ,MAAM;AAAA,MACnC;AAAA,IACF,SAAS,GAAG;AACV,aAAO,kBAAkB,QAAQ,MAAM;AAAA,IACzC;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,51 @@
1
+ function isObject(item) {
2
+ return item && typeof item === "object" && !Array.isArray(item);
3
+ }
4
+ function merge(target, ...sources) {
5
+ if (!sources.length) return target;
6
+ const source = sources.shift();
7
+ if (isObject(target) && isObject(source)) {
8
+ for (const key in source) {
9
+ if (isObject(source[key])) {
10
+ if (!target[key]) Object.assign(target, { [key]: {} });
11
+ merge(target[key], source[key]);
12
+ } else {
13
+ Object.assign(target, { [key]: source[key] });
14
+ }
15
+ }
16
+ }
17
+ return merge(target, ...sources);
18
+ }
19
+ function interpolateString(str, context) {
20
+ const regex = /\{\{(.*?)\?\s*'(.*?)'\s*:\s*'(.*?)'\s*\}\}/;
21
+ let match;
22
+ while ((match = regex.exec(str)) !== null) {
23
+ const [fullMatch, condition, trueValue, falseValue] = match;
24
+ const resolvedTrueValue = interpolateString(trueValue, context);
25
+ const resolvedFalseValue = interpolateString(falseValue, context);
26
+ let result = safeEval(condition, context);
27
+ if (typeof result === "string") {
28
+ result = false;
29
+ }
30
+ const replacement = result ? resolvedTrueValue : resolvedFalseValue;
31
+ str = str.replace(fullMatch, replacement);
32
+ }
33
+ const variableRegex = /\{\{(.*?)\}\}/g;
34
+ str = str.replace(variableRegex, (match2, expr) => safeEval(expr, context));
35
+ return str;
36
+ }
37
+ function safeEval(expr, context) {
38
+ try {
39
+ const fn = new Function(...Object.keys(context), `return ${expr}`);
40
+ return fn(...Object.values(context));
41
+ } catch (e) {
42
+ console.error(expr, context, e);
43
+ return expr;
44
+ }
45
+ }
46
+ export {
47
+ interpolateString,
48
+ isObject,
49
+ merge
50
+ };
51
+ //# 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":"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,6 +1,9 @@
1
1
  export * from "./support/render";
2
- import { tran } from "./i18n/index";
2
+ import { I18nService } from "./i18n";
3
+ import { S3Service, S3Config } from "./s3";
3
4
  export {
4
- tran
5
+ I18nService,
6
+ S3Config,
7
+ S3Service
5
8
  };
6
9
  //# 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,cAAc;AACd,SAAS,YAAY;","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,cAAc;AACd,SAAS,mBAAmB;AAC5B,SAAS,WAAW,gBAAgB;","names":[]}
@@ -43,8 +43,6 @@ import { Puppeteer } from "puppeteer-core";
43
43
  import { Fetch } from "../../../infra/support/fetch";
44
44
  class CFBrowserRendering {
45
45
  constructor(accountId, cfAPIKey) {
46
- this.accountId = accountId;
47
- this.cfAPIKey = cfAPIKey;
48
46
  __publicField(this, "f");
49
47
  this.f = new Fetch().baseUrl(`https://api.cloudflare.com/client/v4/accounts/${accountId}`).extend({
50
48
  headers: {
@@ -55,7 +53,11 @@ class CFBrowserRendering {
55
53
  post(body) {
56
54
  return this.f.post("/browser-rendering/screenshot", {
57
55
  responseType: "arrayBuffer",
58
- body: __spreadProps(__spreadValues({}, body), {
56
+ body: __spreadProps(__spreadValues({
57
+ "screenshotOptions": {
58
+ quality: 90
59
+ }
60
+ }, body), {
59
61
  "viewport": {
60
62
  "width": 3840,
61
63
  "height": 2160,
@@ -110,6 +112,10 @@ const getImageRender = (cfg) => {
110
112
  if (cfg.mode === "cf") {
111
113
  return new CFBrowserRendering(cfg.cfAccountId, cfg.cfAPIKey);
112
114
  }
115
+ if (cfg.mode === "custom") {
116
+ if (!cfg.render) throw new Error("please provide custom img render");
117
+ return cfg.render;
118
+ }
113
119
  if (cfg.puppeteerURL) {
114
120
  return new PuppeteerRendering(RemoteBrowserGetter(cfg.puppeteerURL));
115
121
  }