beatsaber-bot-core 0.3.0-rc.20 → 0.3.0-rc.4
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/rank.js +3 -3
- package/dist/cjs/cmd/rank.js.map +1 -1
- package/dist/cjs/cmd/score.js +2 -2
- package/dist/cjs/cmd/score.js.map +1 -1
- package/dist/cjs/common/i18n/index.js +1 -2
- package/dist/cjs/common/i18n/index.js.map +1 -1
- package/dist/cjs/core/session.js.map +1 -1
- package/dist/cjs/events/schedules/temp.js +1 -1
- package/dist/cjs/events/schedules/temp.js.map +1 -1
- package/dist/cjs/events/ws/beatleader.js +1 -1
- package/dist/cjs/events/ws/beatleader.js.map +1 -1
- package/dist/cjs/events/ws/beatsaver.js +2 -2
- package/dist/cjs/events/ws/beatsaver.js.map +1 -1
- package/dist/cjs/services/i18n/index.js +2 -2
- package/dist/cjs/services/i18n/index.js.map +1 -1
- package/dist/esm/cmd/rank.js +3 -3
- package/dist/esm/cmd/rank.js.map +1 -1
- package/dist/esm/cmd/score.js +2 -2
- package/dist/esm/cmd/score.js.map +1 -1
- package/dist/esm/common/i18n/index.js +1 -2
- package/dist/esm/common/i18n/index.js.map +1 -1
- package/dist/esm/events/schedules/temp.js +1 -1
- package/dist/esm/events/schedules/temp.js.map +1 -1
- package/dist/esm/events/ws/beatleader.js +1 -1
- package/dist/esm/events/ws/beatleader.js.map +1 -1
- package/dist/esm/events/ws/beatsaver.js +2 -2
- package/dist/esm/events/ws/beatsaver.js.map +1 -1
- package/dist/esm/services/i18n/index.js +2 -2
- package/dist/esm/services/i18n/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +17 -7
package/dist/cjs/cmd/rank.js
CHANGED
@@ -43,17 +43,17 @@ module.exports = __toCommonJS(rank_exports);
|
|
43
43
|
var import_interface = require("../interface/index.js");
|
44
44
|
var import_utils = require("../utils/index.js");
|
45
45
|
var import_errors = require("../services/errors/index.js");
|
46
|
-
var rank_default = () => new import_interface.CommandBuilder().setName("rank").addOption("p", "platform:string").setExecutor((c) => __async(null, null, function* () {
|
46
|
+
var rank_default = () => new import_interface.CommandBuilder().setName("rank").addOption("p", "platform:string").setDescription("clear an auth account relate info").setExecutor((c) => __async(null, null, function* () {
|
47
47
|
let uid = c.session.user.id;
|
48
48
|
if (c.session.mentions && c.session.mentions.length > 0) {
|
49
49
|
uid = c.session.mentions[0].id;
|
50
50
|
}
|
51
51
|
const { blAccount, ssAccount } = yield c.services.db.getUserAccountsByUid(uid);
|
52
|
-
let accountId = import_utils.Platform.BL && (blAccount == null ? void 0 : blAccount.
|
52
|
+
let accountId = import_utils.Platform.BL && (blAccount == null ? void 0 : blAccount.platformUid);
|
53
53
|
if (c.input) {
|
54
54
|
accountId = c.input;
|
55
55
|
} else if (!accountId) {
|
56
|
-
accountId = import_utils.Platform.SS && (ssAccount == null ? void 0 : ssAccount.
|
56
|
+
accountId = import_utils.Platform.SS && (ssAccount == null ? void 0 : ssAccount.platformUid);
|
57
57
|
}
|
58
58
|
if (!accountId && !c.input) {
|
59
59
|
throw new import_errors.UnknownUserIDError();
|
package/dist/cjs/cmd/rank.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/cmd/rank.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface\";\nimport { parsePlatform, Platform } from '@/utils'\nimport {UnknownUserIDError} from \"@/services/errors\";\n\nexport default () =>\n new CommandBuilder()\n .setName('rank')\n .addOption('p', 'platform:string')\n .setExecutor(async (c) => {\n let uid = c.session.user.id\n if (c.session.mentions && c.session.mentions.length > 0) {\n uid = c.session.mentions[0].id\n }\n const { blAccount, ssAccount } = await c.services.db.getUserAccountsByUid(uid)\n let accountId = Platform.BL && blAccount?.
|
1
|
+
{"version":3,"sources":["../../../src/cmd/rank.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface\";\nimport { parsePlatform, Platform } from '@/utils'\nimport {UnknownUserIDError} from \"@/services/errors\";\n\nexport default () =>\n new CommandBuilder()\n .setName('rank')\n .addOption('p', 'platform:string')\n .setDescription('clear an auth account relate info')\n .setExecutor(async (c) => {\n let uid = c.session.user.id\n if (c.session.mentions && c.session.mentions.length > 0) {\n uid = c.session.mentions[0].id\n }\n const { blAccount, ssAccount } = await c.services.db.getUserAccountsByUid(uid)\n let accountId = Platform.BL && blAccount?.platformUid\n\n if (c.input) {\n accountId = c.input\n // preference = undefined\n } else if (!accountId) {\n accountId = Platform.SS && ssAccount?.platformUid\n }\n\n if (!accountId && !c.input) {\n throw new UnknownUserIDError()\n }\n const rankPlatform = parsePlatform(c.options.p)\n const img = await c.services.render.renderRank(accountId, rankPlatform)\n await c.session.sendImgBuffer(img)\n })\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA6B;AAC7B,mBAAwC;AACxC,oBAAiC;AAEjC,IAAO,eAAQ,MACb,IAAI,gCAAe,EAChB,QAAQ,MAAM,EACd,UAAU,KAAK,iBAAiB,EAChC,eAAe,mCAAmC,EAClD,YAAY,CAAO,MAAM;AACxB,MAAI,MAAM,EAAE,QAAQ,KAAK;AACzB,MAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,GAAG;AACvD,UAAM,EAAE,QAAQ,SAAS,CAAC,EAAE;AAAA,EAC9B;AACA,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,EAAE,SAAS,GAAG,qBAAqB,GAAG;AAC7E,MAAI,YAAY,sBAAS,OAAM,uCAAW;AAE1C,MAAI,EAAE,OAAO;AACX,gBAAY,EAAE;AAAA,EAEhB,WAAW,CAAC,WAAW;AACrB,gBAAY,sBAAS,OAAM,uCAAW;AAAA,EACxC;AAEA,MAAI,CAAC,aAAa,CAAC,EAAE,OAAO;AAC1B,UAAM,IAAI,iCAAmB;AAAA,EAC/B;AACA,QAAM,mBAAe,4BAAc,EAAE,QAAQ,CAAC;AAC9C,QAAM,MAAM,MAAM,EAAE,SAAS,OAAO,WAAW,WAAW,YAAY;AACtE,QAAM,EAAE,QAAQ,cAAc,GAAG;AACnC,EAAC;","names":[]}
|
package/dist/cjs/cmd/score.js
CHANGED
@@ -64,13 +64,13 @@ var score_default = () => new import_interface.CommandBuilder().setName("score")
|
|
64
64
|
}
|
65
65
|
const mapId = c.input;
|
66
66
|
const score = yield c.services.api.getScoreByPlayerIdAndMapId(
|
67
|
-
account.
|
67
|
+
account.platformUid,
|
68
68
|
mapId,
|
69
69
|
diffOption
|
70
70
|
);
|
71
71
|
if (!score) {
|
72
72
|
throw new import_errors.ScoreNotFoundError({
|
73
|
-
user: account.
|
73
|
+
user: account.platformUname,
|
74
74
|
id: mapId,
|
75
75
|
diff: diffOption == null ? void 0 : diffOption.difficulty,
|
76
76
|
mode: c.options.m
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/cmd/score.ts"],"sourcesContent":["import { CommandBuilder } from \"@/interface\";\nimport { Platform, convertDiff } from '@/utils'\nimport {\n AccountBindingNotFoundError,\n ScoreNotFoundError,\n} from '@/services/errors'\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.user.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.
|
1
|
+
{"version":3,"sources":["../../../src/cmd/score.ts"],"sourcesContent":["import { CommandBuilder } from \"@/interface\";\nimport { Platform, convertDiff } from '@/utils'\nimport {\n AccountBindingNotFoundError,\n ScoreNotFoundError,\n} from '@/services/errors'\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.user.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 )\n if(!score) {\n throw new ScoreNotFoundError({\n user: account.platformUname, id: mapId,\n diff: diffOption?.difficulty, mode: c.options.m,\n })\n }\n const img = await c.services.render.renderScore(score.id?.toString())\n await c.session.sendImgBuffer(img)\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA+B;AAC/B,mBAAsC;AACtC,oBAGO;AACP,IAAO,gBAAQ,MACb,IAAI,gCAAe,EAChB,QAAQ,OAAO,EACf,UAAU,KAAK,mBAAmB,EAClC,UAAU,KAAK,aAAa,EAC5B,SAAS,SAAS,EAClB,SAAS,QAAQ,EACjB,YAAY,CAAO,MAAM;AAb9B;AAcM,MAAI,MAAM,EAAE,QAAQ,KAAK;AAEzB,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,sBAAS,MAAM;AAC7B,wBAAY,sBAAS,MAAM;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,0CAA4B;AAAA,EACxC;AAEA,MAAI;AACJ,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,GAAG;AAC9B,iBAAa;AAAA,MACX,gBAAY,0BAAY,EAAE,QAAQ,CAAC;AAAA,MACnC,MAAM,EAAE,QAAQ;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,EAAE;AAChB,QAAM,QAAQ,MAAM,EAAE,SAAS,IAAI;AAAA,IACjC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,MAAG,CAAC,OAAO;AACT,UAAM,IAAI,iCAAmB;AAAA,MAC3B,MAAM,QAAQ;AAAA,MAAe,IAAI;AAAA,MACjC,MAAM,yCAAY;AAAA,MAAY,MAAM,EAAE,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH;AACA,QAAM,MAAM,MAAM,EAAE,SAAS,OAAO,aAAY,WAAM,OAAN,mBAAU,UAAU;AACpE,QAAM,EAAE,QAAQ,cAAc,GAAG;AACnC,EAAC;","names":[]}
|
@@ -22,12 +22,11 @@ __export(i18n_exports, {
|
|
22
22
|
module.exports = __toCommonJS(i18n_exports);
|
23
23
|
var import_parser = require("./parser.js");
|
24
24
|
var import_util = require("./util.js");
|
25
|
-
const defaultLang = "
|
25
|
+
const defaultLang = "en-US";
|
26
26
|
const createTranslator = (translateObject) => {
|
27
27
|
return (path, params = {}, lang = defaultLang) => _translate(translateObject, path, params, lang);
|
28
28
|
};
|
29
29
|
const _translate = (translateObject, path, params = {}, lang = defaultLang) => {
|
30
|
-
console.log("translate", path, params, lang);
|
31
30
|
const keys = path.split(".");
|
32
31
|
let result = translateObject[lang];
|
33
32
|
if (!result) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/common/i18n/index.ts"],"sourcesContent":["import {interpolate} from \"./parser\";\nimport {interpolateString} from \"./util\";\n\nconst defaultLang = \"
|
1
|
+
{"version":3,"sources":["../../../../src/common/i18n/index.ts"],"sourcesContent":["import {interpolate} from \"./parser\";\nimport {interpolateString} from \"./util\";\n\nconst defaultLang = \"en-US\";\n\nexport const createTranslator = (translateObject: object) => {\n return (path: string, params = {}, lang = defaultLang) => _translate(translateObject, path, params, lang)\n}\nconst _translate = (\n translateObject: object,\n path: string,\n params = {},\n lang = defaultLang\n) => {\n const keys = path.split('.')\n let result = translateObject[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 return null\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAC1B,kBAAgC;AAEhC,MAAM,cAAc;AAEb,MAAM,mBAAmB,CAAC,oBAA4B;AAC3D,SAAO,CAAC,MAAc,SAAS,CAAC,GAAG,OAAO,gBAAgB,WAAW,iBAAiB,MAAM,QAAQ,IAAI;AAC1G;AACA,MAAM,aAAa,CACjB,iBACA,MACA,SAAS,CAAC,GACV,OAAO,gBACJ;AACH,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,SAAS,gBAAgB,IAAI;AACjC,MAAG,CAAC,QAAQ;AACV,WAAO;AAAA,EACT;AACA,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,GAAG,MAAM,QAAW;AAC7B,eAAS,OAAO,GAAG;AAAA,IACrB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI;AACF,QAAI,OAAO,WAAW,UAAU;AAC9B,iBAAO,2BAAY,QAAQ,MAAM;AAAA,IACnC;AAAA,EACF,SAAS,GAAG;AACV,eAAO,+BAAkB,QAAQ,MAAM;AAAA,EACzC;AACA,SAAO;AACT;","names":[]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/core/session.ts"],"sourcesContent":["import {User, Account, SessionAgent, Channel} from \"./domain\";\n\ntype Message = string\n\n\n// 被动session\nexport interface ISession {\n // 被动 Session,对方有用户\n sendImgBuffer(content: any, mimeType?: string): Promise<void>\n sendImgByUrl(url: string): Promise<void>\n sendAudioByUrl(url: string): Promise<void>\n send(msg: Message): Promise<void>\n sendQueued(msg: Message): Promise<void>\n sendQuote(msg: Message): Promise<void>\n text(path: string, args?): Message\n prompt(timeout?: number): Promise<Message | undefined>\n}\n\nexport interface PassiveSession extends ISession {\n user: User\n channel: Channel\n mentions: User[]\n agent: SessionAgent\n}\n\n\nexport interface AgentService {\n getAgentSessionByChannelInfo(channel: Channel):
|
1
|
+
{"version":3,"sources":["../../../src/core/session.ts"],"sourcesContent":["import {User, Account, SessionAgent, Channel} from \"./domain\";\n\ntype Message = string\n\n\n// 被动session\nexport interface ISession {\n // 被动 Session,对方有用户\n sendImgBuffer(content: any, mimeType?: string): Promise<void>\n sendImgByUrl(url: string): Promise<void>\n sendAudioByUrl(url: string): Promise<void>\n send(msg: Message): Promise<void>\n sendQueued(msg: Message): Promise<void>\n sendQuote(msg: Message): Promise<void>\n text(path: string, args?): Message\n prompt(timeout?: number): Promise<Message | undefined>\n}\n\nexport interface PassiveSession extends ISession {\n user: User\n channel: Channel\n mentions: User[]\n agent: SessionAgent\n}\n\n\nexport interface AgentService {\n getAgentSessionByChannelInfo(channel: Channel): PositiveSession\n}\n\nexport interface PositiveSession extends ISession {\n channel: Channel\n agent: SessionAgent\n}\n// 例如定时任务。或者监控数据的产生的事件。\n\n// NotificationAgent\n//\n\n\n// 主动Session\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
@@ -54,7 +54,7 @@ const LBScoreMonitor = (c) => __async(null, null, function* () {
|
|
54
54
|
})
|
55
55
|
]);
|
56
56
|
for (const group of channels) {
|
57
|
-
const session =
|
57
|
+
const session = c.agentService.getAgentSessionByChannelInfo(group.channel);
|
58
58
|
if (!session) {
|
59
59
|
continue;
|
60
60
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/schedules/temp.ts"],"sourcesContent":["import { EventHandlerCtx } from \"@/core\";\nimport { Config } from \"@/config\";\nimport {Services} from \"@/interface\";\n\nexport const LBScoreMonitor = async (c: EventHandlerCtx<Services, Config>) => {\n const channels = await c.services.db.getSubscriptionsByType('lb-rank')\n if (channels.length <= 0) {\n return\n }\n const [hitbuf, scorebuf] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n }),\n ])\n for (const group of channels) {\n // 获取一个带有 Agent 的 Service\n const session =
|
1
|
+
{"version":3,"sources":["../../../../src/events/schedules/temp.ts"],"sourcesContent":["import { EventHandlerCtx } from \"@/core\";\nimport { Config } from \"@/config\";\nimport {Services} from \"@/interface\";\n\nexport const LBScoreMonitor = async (c: EventHandlerCtx<Services, Config>) => {\n const channels = await c.services.db.getSubscriptionsByType('lb-rank')\n if (channels.length <= 0) {\n return\n }\n const [hitbuf, scorebuf] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n }),\n ])\n for (const group of channels) {\n // 获取一个带有 Agent 的 Service\n const session = c.agentService.getAgentSessionByChannelInfo(group.channel)\n if (!session) {\n continue\n }\n await session.sendImgBuffer(hitbuf, 'image/png')\n await session.sendImgBuffer(scorebuf, 'image/png')\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,iBAAiB,CAAO,MAAyC;AAC5E,QAAM,WAAW,MAAM,EAAE,SAAS,GAAG,uBAAuB,SAAS;AACrE,MAAI,SAAS,UAAU,GAAG;AACxB;AAAA,EACF;AACA,QAAM,CAAC,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,EAAE,SAAS,OAAO,UAAU,wCAAwC;AAAA,MAClE,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,EAAE,SAAS,OAAO,UAAU,uCAAuC;AAAA,MACjE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACD,aAAW,SAAS,UAAU;AAE5B,UAAM,UAAU,EAAE,aAAa,6BAA6B,MAAM,OAAO;AACzE,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,QAAQ,WAAW;AAC/C,UAAM,QAAQ,cAAc,UAAU,WAAW;AAAA,EACnD;AACF;","names":[]}
|
@@ -73,7 +73,7 @@ class BeatleaderWSHandler {
|
|
73
73
|
if (restSub.length === 0) return;
|
74
74
|
const img = yield this.render.renderScore(data.id.toString());
|
75
75
|
for (const item of restSub) {
|
76
|
-
const session =
|
76
|
+
const session = this.agentService.getAgentSessionByChannelInfo(item.channel);
|
77
77
|
if (!session) {
|
78
78
|
continue;
|
79
79
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/ws/beatleader.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport { AgentService, Logger } from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport {RenderService} from \"@/services\";\nimport { BeatLeaderWSEvent } from \"@/services/api/interfaces/beatleader\";\n\nexport class BeatleaderWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://sockets.api.beatleader.xyz/scores'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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.subscription.type == 'beatleader-score' && it.subscription.enabled == 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 =
|
1
|
+
{"version":3,"sources":["../../../../src/events/ws/beatleader.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport { AgentService, Logger } from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport {RenderService} from \"@/services\";\nimport { BeatLeaderWSEvent } from \"@/services/api/interfaces/beatleader\";\n\nexport class BeatleaderWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://sockets.api.beatleader.xyz/scores'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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.subscription.type == 'beatleader-score' && it.subscription.enabled == 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.agentService.getAgentSessionByChannelInfo(item.channel)\n if (!session) {\n continue\n }\n await session.send(\n `恭喜 <at id=\"${item.account.userId}\"/> 刚刚在谱面「${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;AAOO,MAAM,oBAA4C;AAAA,EAOvD,YACE,IACA,QACA,QACA,QACA,cACA;AAZF,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,iCAAgB;AAChB,wBAAQ;AACR;AAQE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,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,aAAa,QAAQ,sBAAsB,GAAG,aAAa,WAAW;AAAA,MAC3E;AAEA,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,MAAM,MAAM,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,CAAC;AAC5D,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,aAAa,6BAA6B,KAAK,OAAO;AAC3E,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,wBAAc,KAAK,QAAQ,MAAM,2CAAa,KAAK,YAAY,KAAK,IAAI,mCAAU,KAAK,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,QACnH;AACA,cAAM,QAAQ,cAAc,GAAG;AAAA,MACjC;AAAA,IACF;AAAA;AACF;","names":[]}
|
@@ -100,7 +100,7 @@ class BeatSaverWSHandler {
|
|
100
100
|
if (restSub.length === 0 && restGroupSubs) return;
|
101
101
|
const image = this.render.renderMap(bsmap);
|
102
102
|
for (const item of restSub) {
|
103
|
-
const session =
|
103
|
+
const session = this.agentService.getAgentSessionByChannelInfo(item.channel);
|
104
104
|
if (!session) {
|
105
105
|
continue;
|
106
106
|
}
|
@@ -111,7 +111,7 @@ class BeatSaverWSHandler {
|
|
111
111
|
yield session.sendAudioByUrl(bsmap.versions[0].previewURL);
|
112
112
|
}
|
113
113
|
for (const item of restGroupSubs) {
|
114
|
-
const session =
|
114
|
+
const session = this.agentService.getAgentSessionByChannelInfo(item.channel);
|
115
115
|
if (!session) {
|
116
116
|
continue;
|
117
117
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/ws/beatsaver.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport {AgentService, EventHandlerCtx, Logger} from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { handleWSEventWithCache } from '@/utils'\nimport {BeatSaverWSEvent, BSMap} from \"@/services/api/interfaces/beatsaver\";\nimport {RenderService} from \"@/services\";\nimport {Services} from \"@/interface\";\nexport class BeatSaverWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://ws.beatsaver.com/maps'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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 String(userId),\n 'beatsaver'\n )\n\n const restSub = subscriptions.filter(\n (it) =>\n it.subscription.type == 'beatsaver-map' && it.subscription.enabled == true\n )\n const gids = restSub.map((it) => it.channel.id)\n const groupSubs = await this.db.getIDSubscriptionByType('id-beatsaver-map')\n const restGroupSubs = groupSubs.filter(\n (it) =>\n !gids.includes(it.channel.id) &&\n it.subscription.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 =
|
1
|
+
{"version":3,"sources":["../../../../src/events/ws/beatsaver.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport {AgentService, EventHandlerCtx, Logger} from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { handleWSEventWithCache } from '@/utils'\nimport {BeatSaverWSEvent, BSMap} from \"@/services/api/interfaces/beatsaver\";\nimport {RenderService} from \"@/services\";\nimport {Services} from \"@/interface\";\nexport class BeatSaverWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://ws.beatsaver.com/maps'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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 String(userId),\n 'beatsaver'\n )\n\n const restSub = subscriptions.filter(\n (it) =>\n it.subscription.type == 'beatsaver-map' && it.subscription.enabled == true\n )\n const gids = restSub.map((it) => it.channel.id)\n const groupSubs = await this.db.getIDSubscriptionByType('id-beatsaver-map')\n const restGroupSubs = groupSubs.filter(\n (it) =>\n !gids.includes(it.channel.id) &&\n it.subscription.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.agentService.getAgentSessionByChannelInfo(item.channel)\n if (!session) {\n continue\n }\n await session.send(\n `本群谱师 「<at id=\"${item.account.userId}\"/> (${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.agentService.getAgentSessionByChannelInfo(item.channel)\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;AAIA,mBAAuC;AAIhC,MAAM,mBAA2C;AAAA,EAOtD,YACE,IACA,QACA,QACA,QACA,cACA;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,eAAe;AACpB,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,OAAO,MAAM;AAAA,QACb;AAAA,MACF;AAEA,YAAM,UAAU,cAAc;AAAA,QAC5B,CAAC,OACC,GAAG,aAAa,QAAQ,mBAAmB,GAAG,aAAa,WAAW;AAAA,MAC1E;AACA,YAAM,OAAO,QAAQ,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE;AAC9C,YAAM,YAAY,MAAM,KAAK,GAAG,wBAAwB,kBAAkB;AAC1E,YAAM,gBAAgB,UAAU;AAAA,QAC9B,CAAC,OAAI;AApEX;AAqEQ,kBAAC,KAAK,SAAS,GAAG,QAAQ,EAAE,OAC5B,cAAG,aAAa,SAAhB,mBAAsB,aAAtB,mBAAgC,gBAAe,OAAO,SAAS;AAAA;AAAA,MACnE;AAGA,UAAI,QAAQ,WAAW,KAAK,cAAe;AAC3C,YAAM,QAAQ,KAAK,OAAO,UAAU,KAAK;AACzC,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,aAAa,6BAA6B,KAAK,OAAO;AAC3E,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,0CAAiB,KAAK,QAAQ,MAAM,QAAQ,MAAM,SAAS,IAAI,sEAAe,MAAM,IAAI;AAAA,QAC1F;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,aAAa,6BAA6B,KAAK,OAAO;AAC3E,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":[]}
|
@@ -26,13 +26,13 @@ var import_i18n = require("../../common/i18n/index.js");
|
|
26
26
|
class I18nService {
|
27
27
|
constructor(config) {
|
28
28
|
__publicField(this, "translator");
|
29
|
-
this.translator = (0, import_i18n.createTranslator)(config);
|
29
|
+
this.translator = (0, import_i18n.createTranslator)(config != null ? config : {});
|
30
30
|
}
|
31
31
|
mergeConfig(lang, obj) {
|
32
32
|
}
|
33
33
|
loadLang(lang) {
|
34
34
|
}
|
35
|
-
tran(path, params = {}, lang = "zh-
|
35
|
+
tran(path, params = {}, lang = "zh-cn") {
|
36
36
|
return this.translator(path, params, lang);
|
37
37
|
}
|
38
38
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/services/i18n/index.ts"],"sourcesContent":["import {createTranslator} from \"@/common/i18n\";\n\nexport class I18nService {\n translator: (path: string, params: any, lang: string) => string\n constructor(config?: any) {\n this.translator = createTranslator(config)\n }\n mergeConfig(lang: string, obj: any) {\n\n }\n\n loadLang(lang: string) {\n\n }\n\n tran(path: string, params = {}, lang = 'zh-
|
1
|
+
{"version":3,"sources":["../../../../src/services/i18n/index.ts"],"sourcesContent":["import {createTranslator} from \"@/common/i18n\";\n\nexport class I18nService {\n translator: (path: string, params: any, lang: string) => string\n constructor(config?: any) {\n this.translator = createTranslator(config ?? {})\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 return this.translator(path, params, lang)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA+B;AAExB,MAAM,YAAY;AAAA,EAEvB,YAAY,QAAc;AAD1B;AAEE,SAAK,iBAAa,8BAAiB,0BAAU,CAAC,CAAC;AAAA,EACjD;AAAA,EACA,YAAY,MAAc,KAAU;AAAA,EAEpC;AAAA,EAEA,SAAS,MAAc;AAAA,EAEvB;AAAA,EAEA,KAAK,MAAc,SAAS,CAAC,GAAG,OAAO,SAAiB;AACtD,WAAO,KAAK,WAAW,MAAM,QAAQ,IAAI;AAAA,EAC3C;AACF;","names":[]}
|
package/dist/esm/cmd/rank.js
CHANGED
@@ -21,17 +21,17 @@ var __async = (__this, __arguments, generator) => {
|
|
21
21
|
import { CommandBuilder } from "../interface/index.js";
|
22
22
|
import { parsePlatform, Platform } from "../utils/index.js";
|
23
23
|
import { UnknownUserIDError } from "../services/errors/index.js";
|
24
|
-
var rank_default = () => new CommandBuilder().setName("rank").addOption("p", "platform:string").setExecutor((c) => __async(null, null, function* () {
|
24
|
+
var rank_default = () => new CommandBuilder().setName("rank").addOption("p", "platform:string").setDescription("clear an auth account relate info").setExecutor((c) => __async(null, null, function* () {
|
25
25
|
let uid = c.session.user.id;
|
26
26
|
if (c.session.mentions && c.session.mentions.length > 0) {
|
27
27
|
uid = c.session.mentions[0].id;
|
28
28
|
}
|
29
29
|
const { blAccount, ssAccount } = yield c.services.db.getUserAccountsByUid(uid);
|
30
|
-
let accountId = Platform.BL && (blAccount == null ? void 0 : blAccount.
|
30
|
+
let accountId = Platform.BL && (blAccount == null ? void 0 : blAccount.platformUid);
|
31
31
|
if (c.input) {
|
32
32
|
accountId = c.input;
|
33
33
|
} else if (!accountId) {
|
34
|
-
accountId = Platform.SS && (ssAccount == null ? void 0 : ssAccount.
|
34
|
+
accountId = Platform.SS && (ssAccount == null ? void 0 : ssAccount.platformUid);
|
35
35
|
}
|
36
36
|
if (!accountId && !c.input) {
|
37
37
|
throw new UnknownUserIDError();
|
package/dist/esm/cmd/rank.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/cmd/rank.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface\";\nimport { parsePlatform, Platform } from '@/utils'\nimport {UnknownUserIDError} from \"@/services/errors\";\n\nexport default () =>\n new CommandBuilder()\n .setName('rank')\n .addOption('p', 'platform:string')\n .setExecutor(async (c) => {\n let uid = c.session.user.id\n if (c.session.mentions && c.session.mentions.length > 0) {\n uid = c.session.mentions[0].id\n }\n const { blAccount, ssAccount } = await c.services.db.getUserAccountsByUid(uid)\n let accountId = Platform.BL && blAccount?.
|
1
|
+
{"version":3,"sources":["../../../src/cmd/rank.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface\";\nimport { parsePlatform, Platform } from '@/utils'\nimport {UnknownUserIDError} from \"@/services/errors\";\n\nexport default () =>\n new CommandBuilder()\n .setName('rank')\n .addOption('p', 'platform:string')\n .setDescription('clear an auth account relate info')\n .setExecutor(async (c) => {\n let uid = c.session.user.id\n if (c.session.mentions && c.session.mentions.length > 0) {\n uid = c.session.mentions[0].id\n }\n const { blAccount, ssAccount } = await c.services.db.getUserAccountsByUid(uid)\n let accountId = Platform.BL && blAccount?.platformUid\n\n if (c.input) {\n accountId = c.input\n // preference = undefined\n } else if (!accountId) {\n accountId = Platform.SS && ssAccount?.platformUid\n }\n\n if (!accountId && !c.input) {\n throw new UnknownUserIDError()\n }\n const rankPlatform = parsePlatform(c.options.p)\n const img = await c.services.render.renderRank(accountId, rankPlatform)\n await c.session.sendImgBuffer(img)\n })\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAQ,sBAAqB;AAC7B,SAAS,eAAe,gBAAgB;AACxC,SAAQ,0BAAyB;AAEjC,IAAO,eAAQ,MACb,IAAI,eAAe,EAChB,QAAQ,MAAM,EACd,UAAU,KAAK,iBAAiB,EAChC,eAAe,mCAAmC,EAClD,YAAY,CAAO,MAAM;AACxB,MAAI,MAAM,EAAE,QAAQ,KAAK;AACzB,MAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,GAAG;AACvD,UAAM,EAAE,QAAQ,SAAS,CAAC,EAAE;AAAA,EAC9B;AACA,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,EAAE,SAAS,GAAG,qBAAqB,GAAG;AAC7E,MAAI,YAAY,SAAS,OAAM,uCAAW;AAE1C,MAAI,EAAE,OAAO;AACX,gBAAY,EAAE;AAAA,EAEhB,WAAW,CAAC,WAAW;AACrB,gBAAY,SAAS,OAAM,uCAAW;AAAA,EACxC;AAEA,MAAI,CAAC,aAAa,CAAC,EAAE,OAAO;AAC1B,UAAM,IAAI,mBAAmB;AAAA,EAC/B;AACA,QAAM,eAAe,cAAc,EAAE,QAAQ,CAAC;AAC9C,QAAM,MAAM,MAAM,EAAE,SAAS,OAAO,WAAW,WAAW,YAAY;AACtE,QAAM,EAAE,QAAQ,cAAc,GAAG;AACnC,EAAC;","names":[]}
|
package/dist/esm/cmd/score.js
CHANGED
@@ -45,13 +45,13 @@ var score_default = () => new CommandBuilder().setName("score").addOption("d", "
|
|
45
45
|
}
|
46
46
|
const mapId = c.input;
|
47
47
|
const score = yield c.services.api.getScoreByPlayerIdAndMapId(
|
48
|
-
account.
|
48
|
+
account.platformUid,
|
49
49
|
mapId,
|
50
50
|
diffOption
|
51
51
|
);
|
52
52
|
if (!score) {
|
53
53
|
throw new ScoreNotFoundError({
|
54
|
-
user: account.
|
54
|
+
user: account.platformUname,
|
55
55
|
id: mapId,
|
56
56
|
diff: diffOption == null ? void 0 : diffOption.difficulty,
|
57
57
|
mode: c.options.m
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/cmd/score.ts"],"sourcesContent":["import { CommandBuilder } from \"@/interface\";\nimport { Platform, convertDiff } from '@/utils'\nimport {\n AccountBindingNotFoundError,\n ScoreNotFoundError,\n} from '@/services/errors'\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.user.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.
|
1
|
+
{"version":3,"sources":["../../../src/cmd/score.ts"],"sourcesContent":["import { CommandBuilder } from \"@/interface\";\nimport { Platform, convertDiff } from '@/utils'\nimport {\n AccountBindingNotFoundError,\n ScoreNotFoundError,\n} from '@/services/errors'\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.user.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 )\n if(!score) {\n throw new ScoreNotFoundError({\n user: account.platformUname, id: mapId,\n diff: diffOption?.difficulty, mode: c.options.m,\n })\n }\n const img = await c.services.render.renderScore(score.id?.toString())\n await c.session.sendImgBuffer(img)\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,sBAAsB;AAC/B,SAAS,UAAU,mBAAmB;AACtC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,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;AAb9B;AAcM,MAAI,MAAM,EAAE,QAAQ,KAAK;AAEzB,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;AACA,MAAG,CAAC,OAAO;AACT,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM,QAAQ;AAAA,MAAe,IAAI;AAAA,MACjC,MAAM,yCAAY;AAAA,MAAY,MAAM,EAAE,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH;AACA,QAAM,MAAM,MAAM,EAAE,SAAS,OAAO,aAAY,WAAM,OAAN,mBAAU,UAAU;AACpE,QAAM,EAAE,QAAQ,cAAc,GAAG;AACnC,EAAC;","names":[]}
|
@@ -1,11 +1,10 @@
|
|
1
1
|
import { interpolate } from "./parser.js";
|
2
2
|
import { interpolateString } from "./util.js";
|
3
|
-
const defaultLang = "
|
3
|
+
const defaultLang = "en-US";
|
4
4
|
const createTranslator = (translateObject) => {
|
5
5
|
return (path, params = {}, lang = defaultLang) => _translate(translateObject, path, params, lang);
|
6
6
|
};
|
7
7
|
const _translate = (translateObject, path, params = {}, lang = defaultLang) => {
|
8
|
-
console.log("translate", path, params, lang);
|
9
8
|
const keys = path.split(".");
|
10
9
|
let result = translateObject[lang];
|
11
10
|
if (!result) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/common/i18n/index.ts"],"sourcesContent":["import {interpolate} from \"./parser\";\nimport {interpolateString} from \"./util\";\n\nconst defaultLang = \"
|
1
|
+
{"version":3,"sources":["../../../../src/common/i18n/index.ts"],"sourcesContent":["import {interpolate} from \"./parser\";\nimport {interpolateString} from \"./util\";\n\nconst defaultLang = \"en-US\";\n\nexport const createTranslator = (translateObject: object) => {\n return (path: string, params = {}, lang = defaultLang) => _translate(translateObject, path, params, lang)\n}\nconst _translate = (\n translateObject: object,\n path: string,\n params = {},\n lang = defaultLang\n) => {\n const keys = path.split('.')\n let result = translateObject[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 return null\n}\n"],"mappings":"AAAA,SAAQ,mBAAkB;AAC1B,SAAQ,yBAAwB;AAEhC,MAAM,cAAc;AAEb,MAAM,mBAAmB,CAAC,oBAA4B;AAC3D,SAAO,CAAC,MAAc,SAAS,CAAC,GAAG,OAAO,gBAAgB,WAAW,iBAAiB,MAAM,QAAQ,IAAI;AAC1G;AACA,MAAM,aAAa,CACjB,iBACA,MACA,SAAS,CAAC,GACV,OAAO,gBACJ;AACH,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,SAAS,gBAAgB,IAAI;AACjC,MAAG,CAAC,QAAQ;AACV,WAAO;AAAA,EACT;AACA,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;AACA,SAAO;AACT;","names":[]}
|
@@ -32,7 +32,7 @@ const LBScoreMonitor = (c) => __async(null, null, function* () {
|
|
32
32
|
})
|
33
33
|
]);
|
34
34
|
for (const group of channels) {
|
35
|
-
const session =
|
35
|
+
const session = c.agentService.getAgentSessionByChannelInfo(group.channel);
|
36
36
|
if (!session) {
|
37
37
|
continue;
|
38
38
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/schedules/temp.ts"],"sourcesContent":["import { EventHandlerCtx } from \"@/core\";\nimport { Config } from \"@/config\";\nimport {Services} from \"@/interface\";\n\nexport const LBScoreMonitor = async (c: EventHandlerCtx<Services, Config>) => {\n const channels = await c.services.db.getSubscriptionsByType('lb-rank')\n if (channels.length <= 0) {\n return\n }\n const [hitbuf, scorebuf] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n }),\n ])\n for (const group of channels) {\n // 获取一个带有 Agent 的 Service\n const session =
|
1
|
+
{"version":3,"sources":["../../../../src/events/schedules/temp.ts"],"sourcesContent":["import { EventHandlerCtx } from \"@/core\";\nimport { Config } from \"@/config\";\nimport {Services} from \"@/interface\";\n\nexport const LBScoreMonitor = async (c: EventHandlerCtx<Services, Config>) => {\n const channels = await c.services.db.getSubscriptionsByType('lb-rank')\n if (channels.length <= 0) {\n return\n }\n const [hitbuf, scorebuf] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n }),\n ])\n for (const group of channels) {\n // 获取一个带有 Agent 的 Service\n const session = c.agentService.getAgentSessionByChannelInfo(group.channel)\n if (!session) {\n continue\n }\n await session.sendImgBuffer(hitbuf, 'image/png')\n await session.sendImgBuffer(scorebuf, 'image/png')\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAIO,MAAM,iBAAiB,CAAO,MAAyC;AAC5E,QAAM,WAAW,MAAM,EAAE,SAAS,GAAG,uBAAuB,SAAS;AACrE,MAAI,SAAS,UAAU,GAAG;AACxB;AAAA,EACF;AACA,QAAM,CAAC,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,EAAE,SAAS,OAAO,UAAU,wCAAwC;AAAA,MAClE,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,EAAE,SAAS,OAAO,UAAU,uCAAuC;AAAA,MACjE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACD,aAAW,SAAS,UAAU;AAE5B,UAAM,UAAU,EAAE,aAAa,6BAA6B,MAAM,OAAO;AACzE,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,QAAQ,WAAW;AAC/C,UAAM,QAAQ,cAAc,UAAU,WAAW;AAAA,EACnD;AACF;","names":[]}
|
@@ -52,7 +52,7 @@ class BeatleaderWSHandler {
|
|
52
52
|
if (restSub.length === 0) return;
|
53
53
|
const img = yield this.render.renderScore(data.id.toString());
|
54
54
|
for (const item of restSub) {
|
55
|
-
const session =
|
55
|
+
const session = this.agentService.getAgentSessionByChannelInfo(item.channel);
|
56
56
|
if (!session) {
|
57
57
|
continue;
|
58
58
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/ws/beatleader.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport { AgentService, Logger } from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport {RenderService} from \"@/services\";\nimport { BeatLeaderWSEvent } from \"@/services/api/interfaces/beatleader\";\n\nexport class BeatleaderWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://sockets.api.beatleader.xyz/scores'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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.subscription.type == 'beatleader-score' && it.subscription.enabled == 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 =
|
1
|
+
{"version":3,"sources":["../../../../src/events/ws/beatleader.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport { AgentService, Logger } from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport {RenderService} from \"@/services\";\nimport { BeatLeaderWSEvent } from \"@/services/api/interfaces/beatleader\";\n\nexport class BeatleaderWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://sockets.api.beatleader.xyz/scores'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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.subscription.type == 'beatleader-score' && it.subscription.enabled == 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.agentService.getAgentSessionByChannelInfo(item.channel)\n if (!session) {\n continue\n }\n await session.send(\n `恭喜 <at id=\"${item.account.userId}\"/> 刚刚在谱面「${data.leaderboard.song.name}」中打出了 ${(data.accuracy * 100).toFixed(2)}% 的好成绩`\n )\n await session.sendImgBuffer(img)\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAOO,MAAM,oBAA4C;AAAA,EAOvD,YACE,IACA,QACA,QACA,QACA,cACA;AAZF,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,iCAAgB;AAChB,wBAAQ;AACR;AAQE,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,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,aAAa,QAAQ,sBAAsB,GAAG,aAAa,WAAW;AAAA,MAC3E;AAEA,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,MAAM,MAAM,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,CAAC;AAC5D,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,aAAa,6BAA6B,KAAK,OAAO;AAC3E,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,wBAAc,KAAK,QAAQ,MAAM,2CAAa,KAAK,YAAY,KAAK,IAAI,mCAAU,KAAK,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,QACnH;AACA,cAAM,QAAQ,cAAc,GAAG;AAAA,MACjC;AAAA,IACF;AAAA;AACF;","names":[]}
|
@@ -79,7 +79,7 @@ class BeatSaverWSHandler {
|
|
79
79
|
if (restSub.length === 0 && restGroupSubs) return;
|
80
80
|
const image = this.render.renderMap(bsmap);
|
81
81
|
for (const item of restSub) {
|
82
|
-
const session =
|
82
|
+
const session = this.agentService.getAgentSessionByChannelInfo(item.channel);
|
83
83
|
if (!session) {
|
84
84
|
continue;
|
85
85
|
}
|
@@ -90,7 +90,7 @@ class BeatSaverWSHandler {
|
|
90
90
|
yield session.sendAudioByUrl(bsmap.versions[0].previewURL);
|
91
91
|
}
|
92
92
|
for (const item of restGroupSubs) {
|
93
|
-
const session =
|
93
|
+
const session = this.agentService.getAgentSessionByChannelInfo(item.channel);
|
94
94
|
if (!session) {
|
95
95
|
continue;
|
96
96
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/ws/beatsaver.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport {AgentService, EventHandlerCtx, Logger} from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { handleWSEventWithCache } from '@/utils'\nimport {BeatSaverWSEvent, BSMap} from \"@/services/api/interfaces/beatsaver\";\nimport {RenderService} from \"@/services\";\nimport {Services} from \"@/interface\";\nexport class BeatSaverWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://ws.beatsaver.com/maps'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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 String(userId),\n 'beatsaver'\n )\n\n const restSub = subscriptions.filter(\n (it) =>\n it.subscription.type == 'beatsaver-map' && it.subscription.enabled == true\n )\n const gids = restSub.map((it) => it.channel.id)\n const groupSubs = await this.db.getIDSubscriptionByType('id-beatsaver-map')\n const restGroupSubs = groupSubs.filter(\n (it) =>\n !gids.includes(it.channel.id) &&\n it.subscription.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 =
|
1
|
+
{"version":3,"sources":["../../../../src/events/ws/beatsaver.ts"],"sourcesContent":["import { WSHandler } from './handler'\nimport {AgentService, EventHandlerCtx, Logger} from '@/core'\nimport { Config } from '@/config'\nimport { DB } from '@/interface/db'\nimport { handleWSEventWithCache } from '@/utils'\nimport {BeatSaverWSEvent, BSMap} from \"@/services/api/interfaces/beatsaver\";\nimport {RenderService} from \"@/services\";\nimport {Services} from \"@/interface\";\nexport class BeatSaverWSHandler<T> implements WSHandler {\n private readonly logger: Logger\n private render: RenderService\n private agentService: AgentService\n wsUrl: string = 'wss://ws.beatsaver.com/maps'\n private db: DB\n config: Config\n constructor(\n db: DB,\n render: RenderService,\n logger: Logger,\n config: Config,\n agentService: AgentService\n ) {\n this.logger = logger\n this.render = render\n this.agentService = agentService\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 String(userId),\n 'beatsaver'\n )\n\n const restSub = subscriptions.filter(\n (it) =>\n it.subscription.type == 'beatsaver-map' && it.subscription.enabled == true\n )\n const gids = restSub.map((it) => it.channel.id)\n const groupSubs = await this.db.getIDSubscriptionByType('id-beatsaver-map')\n const restGroupSubs = groupSubs.filter(\n (it) =>\n !gids.includes(it.channel.id) &&\n it.subscription.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.agentService.getAgentSessionByChannelInfo(item.channel)\n if (!session) {\n continue\n }\n await session.send(\n `本群谱师 「<at id=\"${item.account.userId}\"/> (${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.agentService.getAgentSessionByChannelInfo(item.channel)\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":";;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,8BAA8B;AAIhC,MAAM,mBAA2C;AAAA,EAOtD,YACE,IACA,QACA,QACA,QACA,cACA;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,mCAAU;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,eAAe;AACpB,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,OAAO,MAAM;AAAA,QACb;AAAA,MACF;AAEA,YAAM,UAAU,cAAc;AAAA,QAC5B,CAAC,OACC,GAAG,aAAa,QAAQ,mBAAmB,GAAG,aAAa,WAAW;AAAA,MAC1E;AACA,YAAM,OAAO,QAAQ,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE;AAC9C,YAAM,YAAY,MAAM,KAAK,GAAG,wBAAwB,kBAAkB;AAC1E,YAAM,gBAAgB,UAAU;AAAA,QAC9B,CAAC,OAAI;AApEX;AAqEQ,kBAAC,KAAK,SAAS,GAAG,QAAQ,EAAE,OAC5B,cAAG,aAAa,SAAhB,mBAAsB,aAAtB,mBAAgC,gBAAe,OAAO,SAAS;AAAA;AAAA,MACnE;AAGA,UAAI,QAAQ,WAAW,KAAK,cAAe;AAC3C,YAAM,QAAQ,KAAK,OAAO,UAAU,KAAK;AACzC,iBAAW,QAAQ,SAAS;AAC1B,cAAM,UAAU,KAAK,aAAa,6BAA6B,KAAK,OAAO;AAC3E,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,0CAAiB,KAAK,QAAQ,MAAM,QAAQ,MAAM,SAAS,IAAI,sEAAe,MAAM,IAAI;AAAA,QAC1F;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,aAAa,6BAA6B,KAAK,OAAO;AAC3E,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":[]}
|
@@ -5,13 +5,13 @@ import { createTranslator } from "../../common/i18n/index.js";
|
|
5
5
|
class I18nService {
|
6
6
|
constructor(config) {
|
7
7
|
__publicField(this, "translator");
|
8
|
-
this.translator = createTranslator(config);
|
8
|
+
this.translator = createTranslator(config != null ? config : {});
|
9
9
|
}
|
10
10
|
mergeConfig(lang, obj) {
|
11
11
|
}
|
12
12
|
loadLang(lang) {
|
13
13
|
}
|
14
|
-
tran(path, params = {}, lang = "zh-
|
14
|
+
tran(path, params = {}, lang = "zh-cn") {
|
15
15
|
return this.translator(path, params, lang);
|
16
16
|
}
|
17
17
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/services/i18n/index.ts"],"sourcesContent":["import {createTranslator} from \"@/common/i18n\";\n\nexport class I18nService {\n translator: (path: string, params: any, lang: string) => string\n constructor(config?: any) {\n this.translator = createTranslator(config)\n }\n mergeConfig(lang: string, obj: any) {\n\n }\n\n loadLang(lang: string) {\n\n }\n\n tran(path: string, params = {}, lang = 'zh-
|
1
|
+
{"version":3,"sources":["../../../../src/services/i18n/index.ts"],"sourcesContent":["import {createTranslator} from \"@/common/i18n\";\n\nexport class I18nService {\n translator: (path: string, params: any, lang: string) => string\n constructor(config?: any) {\n this.translator = createTranslator(config ?? {})\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 return this.translator(path, params, lang)\n }\n}\n"],"mappings":";;;AAAA,SAAQ,wBAAuB;AAExB,MAAM,YAAY;AAAA,EAEvB,YAAY,QAAc;AAD1B;AAEE,SAAK,aAAa,iBAAiB,0BAAU,CAAC,CAAC;AAAA,EACjD;AAAA,EACA,YAAY,MAAc,KAAU;AAAA,EAEpC;AAAA,EAEA,SAAS,MAAc;AAAA,EAEvB;AAAA,EAEA,KAAK,MAAc,SAAS,CAAC,GAAG,OAAO,SAAiB;AACtD,WAAO,KAAK,WAAW,MAAM,QAAQ,IAAI;AAAA,EAC3C;AACF;","names":[]}
|
package/dist/types/index.d.ts
CHANGED
@@ -47,7 +47,7 @@ interface PassiveSession extends ISession {
|
|
47
47
|
agent: SessionAgent;
|
48
48
|
}
|
49
49
|
interface AgentService {
|
50
|
-
getAgentSessionByChannelInfo(channel: Channel$1):
|
50
|
+
getAgentSessionByChannelInfo(channel: Channel$1): PositiveSession;
|
51
51
|
}
|
52
52
|
interface PositiveSession extends ISession {
|
53
53
|
channel: Channel$1;
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "beatsaber-bot-core",
|
3
3
|
"description": "Beatsaber bot",
|
4
|
-
"version": "0.3.0-rc.
|
4
|
+
"version": "0.3.0-rc.4",
|
5
5
|
"files": [
|
6
6
|
"dist"
|
7
7
|
],
|
@@ -26,15 +26,25 @@
|
|
26
26
|
"require": "./dist/cjs/interface/**/*.js",
|
27
27
|
"import": "./dist/esm/interface/**/*.js"
|
28
28
|
},
|
29
|
-
"./
|
29
|
+
"./service": {
|
30
30
|
"types": "./dist/types/index.d.ts",
|
31
|
-
"require": "./dist/cjs/
|
32
|
-
"import": "./dist/esm/
|
31
|
+
"require": "./dist/cjs/service/*.js",
|
32
|
+
"import": "./dist/esm/service/*.js"
|
33
33
|
},
|
34
|
-
"./
|
34
|
+
"./service/*": {
|
35
35
|
"types": "./dist/types/index.d.ts",
|
36
|
-
"require": "./dist/cjs/
|
37
|
-
"import": "./dist/esm/
|
36
|
+
"require": "./dist/cjs/service/*/index.js",
|
37
|
+
"import": "./dist/esm/service/*/index.js"
|
38
|
+
},
|
39
|
+
"./infra": {
|
40
|
+
"types": "./dist/types/index.d.ts",
|
41
|
+
"require": "./dist/cjs/infra/index.js",
|
42
|
+
"import": "./dist/esm/infra/index.js"
|
43
|
+
},
|
44
|
+
"./infra/*": {
|
45
|
+
"types": "./dist/types/index.d.ts",
|
46
|
+
"require": "./dist/cjs/infra/*/index.js",
|
47
|
+
"import": "./dist/esm/infra/*/index.js"
|
38
48
|
}
|
39
49
|
},
|
40
50
|
"keywords": [
|