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.
- package/dist/cjs/cmd/deprecated/tmp.js +2 -2
- package/dist/cjs/cmd/deprecated/tmp.js.map +1 -1
- package/dist/cjs/cmd/score.js.map +1 -1
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/infra/i18n/default.js +10 -0
- package/dist/cjs/infra/i18n/default.js.map +1 -0
- package/dist/cjs/infra/i18n/index.js +29 -104
- package/dist/cjs/infra/i18n/index.js.map +1 -1
- package/dist/cjs/infra/i18n/util.js +76 -0
- package/dist/cjs/infra/i18n/util.js.map +1 -0
- package/dist/cjs/infra/i18n/zh-cn.json +1 -1
- package/dist/cjs/infra/index.js +8 -3
- package/dist/cjs/infra/index.js.map +1 -1
- package/dist/cjs/infra/support/render/index.js +9 -3
- package/dist/cjs/infra/support/render/index.js.map +1 -1
- package/dist/cjs/interface/bot.js.map +1 -1
- package/dist/cjs/interface/cmd/type.js.map +1 -1
- package/dist/cjs/interface/db/index.js +0 -6
- package/dist/cjs/interface/db/index.js.map +1 -1
- package/dist/cjs/interface/index.js.map +1 -1
- package/dist/cjs/schedules/index.js +2 -2
- package/dist/cjs/schedules/index.js.map +1 -1
- package/dist/cjs/schedules/interface.js.map +1 -1
- package/dist/cjs/schedules/temp.js.map +1 -1
- package/dist/cjs/service/api/index.js +1 -1
- package/dist/cjs/service/api/index.js.map +1 -1
- package/dist/cjs/service/index.js +15 -0
- package/dist/cjs/service/index.js.map +1 -1
- package/dist/cjs/service/preference.js.map +1 -1
- package/dist/cjs/service/render/index.js +12 -2
- package/dist/cjs/service/render/index.js.map +1 -1
- package/dist/cjs/ws/beatleader.js.map +1 -1
- package/dist/cjs/ws/beatsaver.js.map +1 -1
- package/dist/cjs/ws/index.js +0 -2
- package/dist/cjs/ws/index.js.map +1 -1
- package/dist/esm/cmd/deprecated/tmp.js +2 -2
- package/dist/esm/cmd/deprecated/tmp.js.map +1 -1
- package/dist/esm/cmd/score.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/infra/i18n/default.js +10 -0
- package/dist/esm/infra/i18n/default.js.map +1 -0
- package/dist/esm/infra/i18n/index.js +29 -92
- package/dist/esm/infra/i18n/index.js.map +1 -1
- package/dist/esm/infra/i18n/util.js +51 -0
- package/dist/esm/infra/i18n/util.js.map +1 -0
- package/dist/esm/infra/index.js +5 -2
- package/dist/esm/infra/index.js.map +1 -1
- package/dist/esm/infra/support/render/index.js +9 -3
- package/dist/esm/infra/support/render/index.js.map +1 -1
- package/dist/esm/interface/db/index.js +0 -1
- package/dist/esm/interface/db/index.js.map +1 -1
- package/dist/esm/interface/index.js.map +1 -1
- package/dist/esm/schedules/index.js +2 -2
- package/dist/esm/schedules/index.js.map +1 -1
- package/dist/esm/schedules/temp.js.map +1 -1
- package/dist/esm/service/api/index.js +1 -1
- package/dist/esm/service/api/index.js.map +1 -1
- package/dist/esm/service/index.js +6 -0
- package/dist/esm/service/index.js.map +1 -1
- package/dist/esm/service/preference.js.map +1 -1
- package/dist/esm/service/render/index.js +12 -2
- package/dist/esm/service/render/index.js.map +1 -1
- package/dist/esm/ws/beatleader.js.map +1 -1
- package/dist/esm/ws/beatsaver.js.map +1 -1
- package/dist/esm/ws/index.js +0 -1
- package/dist/esm/ws/index.js.map +1 -1
- package/dist/types/index.d.ts +1030 -44
- package/package.json +7 -7
- package/dist/cjs/ws/scoresaber.js +0 -75
- package/dist/cjs/ws/scoresaber.js.map +0 -1
- package/dist/esm/ws/scoresaber.js +0 -53
- package/dist/esm/ws/scoresaber.js.map +0 -1
- package/dist/types/cmd/bind/bind-beatleader.d.ts +0 -34
- package/dist/types/cmd/bind/bind-beatsaver.d.ts +0 -34
- package/dist/types/cmd/bind/bind-id-beatleader.d.ts +0 -34
- package/dist/types/cmd/bind/bind-id-beatsaver.d.ts +0 -34
- package/dist/types/cmd/bind/bind-scoresaber.d.ts +0 -34
- package/dist/types/cmd/bind/index.d.ts +0 -41
- package/dist/types/cmd/bsmap/id-search.d.ts +0 -41
- package/dist/types/cmd/bsmap/key-search.d.ts +0 -41
- package/dist/types/cmd/bsmap/latest.d.ts +0 -41
- package/dist/types/cmd/config/index.d.ts +0 -2
- package/dist/types/cmd/deprecated/tmp.d.ts +0 -41
- package/dist/types/cmd/index.d.ts +0 -34
- package/dist/types/cmd/rank.d.ts +0 -41
- package/dist/types/cmd/score.d.ts +0 -41
- package/dist/types/cmd/subscribe/beatleader.d.ts +0 -34
- package/dist/types/cmd/subscribe/beatsaver.d.ts +0 -34
- package/dist/types/cmd/subscribe/id-beatleader-score.d.ts +0 -34
- package/dist/types/cmd/subscribe/id-beatsaver-mapper.d.ts +0 -34
- package/dist/types/cmd/subscribe/index.d.ts +0 -41
- package/dist/types/cmd/subscribe/subjoin.d.ts +0 -41
- package/dist/types/cmd/subscribe/subleave.d.ts +0 -41
- package/dist/types/cmd/subscribe/unsubscribe.d.ts +0 -41
- package/dist/types/components/components/RankDifficulty.d.ts +0 -10
- package/dist/types/components/components/base/avatar.d.ts +0 -10
- package/dist/types/components/components/bl-rank-score-item.d.ts +0 -21
- package/dist/types/components/components/bl-score-item.d.ts +0 -10
- package/dist/types/components/components/characteristic.d.ts +0 -9
- package/dist/types/components/components/flag.d.ts +0 -9
- package/dist/types/components/components/icons/BeatLeader.d.ts +0 -6
- package/dist/types/components/components/icons/RankIcon.d.ts +0 -8
- package/dist/types/components/components/icons/ScoreSaberIcon.d.ts +0 -6
- package/dist/types/components/components/progressbar.d.ts +0 -8
- package/dist/types/components/components/scoreItem.d.ts +0 -8
- package/dist/types/components/components/scoregraph.d.ts +0 -15
- package/dist/types/components/components/skill-graph.d.ts +0 -9
- package/dist/types/components/components/socre-badge.d.ts +0 -9
- package/dist/types/components/components/ss-rank-score-item.d.ts +0 -21
- package/dist/types/components/components/ss-score-item.d.ts +0 -8
- package/dist/types/components/index.d.ts +0 -5
- package/dist/types/components/pages/bl-player.d.ts +0 -11
- package/dist/types/components/pages/bl-score-with-rank.d.ts +0 -18
- package/dist/types/components/pages/bl-score.d.ts +0 -15
- package/dist/types/components/pages/bs-map.d.ts +0 -11
- package/dist/types/components/pages/index.d.ts +0 -14
- package/dist/types/components/pages/ss-player.d.ts +0 -13
- package/dist/types/components/utils/bl/beatleader.d.ts +0 -15
- package/dist/types/components/utils/bl/blheadset.d.ts +0 -275
- package/dist/types/components/utils/bl/bsorDecoder.d.ts +0 -189
- package/dist/types/components/utils/bl/bsorReplayAcc.d.ts +0 -38
- package/dist/types/components/utils/bl/getPart.d.ts +0 -9
- package/dist/types/components/utils/bl/stastic.d.ts +0 -3
- package/dist/types/components/utils/canvas.d.ts +0 -2
- package/dist/types/components/utils/format.d.ts +0 -8
- package/dist/types/components/utils/getMods.d.ts +0 -5
- package/dist/types/components/utils/index.d.ts +0 -6
- package/dist/types/components/utils/qrcode.d.ts +0 -3
- package/dist/types/components/utils/sleep.d.ts +0 -3
- package/dist/types/components/utils/tag-format.d.ts +0 -3
- package/dist/types/components/utils/tw-join.d.ts +0 -5
- package/dist/types/config.d.ts +0 -30
- package/dist/types/index-Dagy_c8G.d.ts +0 -74
- package/dist/types/infra/errors/index.d.ts +0 -69
- package/dist/types/infra/i18n/index.d.ts +0 -4
- package/dist/types/infra/i18n/parser.d.ts +0 -16
- package/dist/types/infra/index.d.ts +0 -6
- package/dist/types/infra/s3/index.d.ts +0 -20
- package/dist/types/infra/support/cache.d.ts +0 -6
- package/dist/types/infra/support/fetch/error.d.ts +0 -11
- package/dist/types/infra/support/fetch/index.d.ts +0 -7
- package/dist/types/infra/support/fetch/ofetch.d.ts +0 -24
- package/dist/types/infra/support/render/index.d.ts +0 -38
- package/dist/types/infra/support/render/puppeteer.d.ts +0 -43
- package/dist/types/interface/bot.d.ts +0 -22
- package/dist/types/interface/cmd/builder.d.ts +0 -53
- package/dist/types/interface/cmd/type.d.ts +0 -30
- package/dist/types/interface/db/index.d.ts +0 -45
- package/dist/types/interface/db/models.d.ts +0 -41
- package/dist/types/interface/index.d.ts +0 -30
- package/dist/types/interface/logger.d.ts +0 -8
- package/dist/types/schedules/index.d.ts +0 -40
- package/dist/types/schedules/interface.d.ts +0 -45
- package/dist/types/schedules/temp.d.ts +0 -35
- package/dist/types/service/api/base/aioclient.d.ts +0 -13
- package/dist/types/service/api/base/blclient.d.ts +0 -28
- package/dist/types/service/api/base/bsclient.d.ts +0 -29
- package/dist/types/service/api/base/index.d.ts +0 -19
- package/dist/types/service/api/base/ssclient.d.ts +0 -17
- package/dist/types/service/api/index.d.ts +0 -59
- package/dist/types/service/api/interfaces/aiosaber/index.d.ts +0 -9
- package/dist/types/service/api/interfaces/beatleader/bsor.d.ts +0 -113
- package/dist/types/service/api/interfaces/beatleader/index.d.ts +0 -5
- package/dist/types/service/api/interfaces/beatleader/req.d.ts +0 -22
- package/dist/types/service/api/interfaces/beatleader/score.d.ts +0 -164
- package/dist/types/service/api/interfaces/beatleader/user.d.ts +0 -173
- package/dist/types/service/api/interfaces/beatleader/ws.d.ts +0 -90
- package/dist/types/service/api/interfaces/beatsaver/alert.d.ts +0 -20
- package/dist/types/service/api/interfaces/beatsaver/bsmap.d.ts +0 -70
- package/dist/types/service/api/interfaces/beatsaver/index.d.ts +0 -13
- package/dist/types/service/api/interfaces/beatsaver/resp.d.ts +0 -11
- package/dist/types/service/api/interfaces/beatsaver/user.d.ts +0 -10
- package/dist/types/service/api/interfaces/beatsaver/ws.d.ts +0 -13
- package/dist/types/service/api/interfaces/index.d.ts +0 -14
- package/dist/types/service/api/interfaces/scoresaber/index.d.ts +0 -3
- package/dist/types/service/api/interfaces/scoresaber/item.d.ts +0 -67
- package/dist/types/service/api/interfaces/scoresaber/leaderboard.d.ts +0 -13
- package/dist/types/service/api/interfaces/scoresaber/resp.d.ts +0 -12
- package/dist/types/service/api/interfaces/scoresaber/user.d.ts +0 -35
- package/dist/types/service/api/interfaces/scoresaber/ws.d.ts +0 -80
- package/dist/types/service/api/sortScore.d.ts +0 -5
- package/dist/types/service/index.d.ts +0 -30
- package/dist/types/service/preference.d.ts +0 -38
- package/dist/types/service/render/index.d.ts +0 -43
- package/dist/types/service/render/interfaces.d.ts +0 -30
- package/dist/types/utils/index.d.ts +0 -5
- package/dist/types/ws/beatleader.d.ts +0 -47
- package/dist/types/ws/beatsaver.d.ts +0 -52
- package/dist/types/ws/bl-filter.d.ts +0 -2
- package/dist/types/ws/handler.d.ts +0 -8
- package/dist/types/ws/index.d.ts +0 -36
- 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("
|
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 \"
|
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":["
|
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\
|
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("
|
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
|
-
|
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 \"
|
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
|
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
|
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":[]}
|
package/dist/cjs/ws/index.js
CHANGED
@@ -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
|
});
|
package/dist/cjs/ws/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/ws/index.ts"],"sourcesContent":["export * from './beatleader'\nexport * from './
|
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
|
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
|
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('开始渲染砍击榜了,请耐心等待
|
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')
|
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":[]}
|
package/dist/esm/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import {botCommands} from \"
|
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 @@
|
|
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
|
2
|
-
|
3
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
47
|
-
}
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
}
|
72
|
-
|
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
|
-
|
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
|
-
|
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'\
|
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"]}
|
package/dist/esm/infra/index.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/infra/index.ts"],"sourcesContent":["export * from './support/render'\nexport {
|
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({
|
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
|
}
|