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.
@@ -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.accountId);
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.accountId);
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();
@@ -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?.accountId\n\n if (c.input) {\n accountId = c.input\n // preference = undefined\n } else if (!accountId) {\n accountId = Platform.SS && ssAccount?.accountId\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,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":[]}
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":[]}
@@ -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.accountId,
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.providerUsername,
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.accountId,\n mapId,\n diffOption\n )\n if(!score) {\n throw new ScoreNotFoundError({\n user: account.providerUsername, 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,MAAkB,IAAI;AAAA,MACpC,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
+ {"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 = "zh-CN";
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 = \"zh-CN\";\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\n console.log(\"translate\", path, params, lang)\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;AAEH,UAAQ,IAAI,aAAa,MAAM,QAAQ,IAAI;AAC3C,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
+ {"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): Promise<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":[]}
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 = yield c.agentService.getAgentSessionByChannelInfo(group.channel);
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 = await 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,MAAM,EAAE,aAAa,6BAA6B,MAAM,OAAO;AAC/E,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,QAAQ,WAAW;AAC/C,UAAM,QAAQ,cAAc,UAAU,WAAW;AAAA,EACnD;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/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 = yield this.agentService.getAgentSessionByChannelInfo(item.channel);
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 = await 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,MAAM,KAAK,aAAa,6BAA6B,KAAK,OAAO;AACjF,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":[]}
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 = yield this.agentService.getAgentSessionByChannelInfo(item.channel);
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 = yield this.agentService.getAgentSessionByChannelInfo(item.channel);
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 = await 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 = await 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,MAAM,KAAK,aAAa,6BAA6B,KAAK,OAAO;AACjF,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,MAAM,KAAK,aAAa,6BAA6B,KAAK,OAAO;AACjF,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,qBAAM,MAAM,SAAS,IAAI,qEAAc,MAAM,IAAI;AAAA,QACnD;AAEA,cAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,cAAM,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA;AAUF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/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-CN") {
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-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,MAAM;AAAA,EAC3C;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":[]}
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":[]}
@@ -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.accountId);
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.accountId);
34
+ accountId = Platform.SS && (ssAccount == null ? void 0 : ssAccount.platformUid);
35
35
  }
36
36
  if (!accountId && !c.input) {
37
37
  throw new UnknownUserIDError();
@@ -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?.accountId\n\n if (c.input) {\n accountId = c.input\n // preference = undefined\n } else if (!accountId) {\n accountId = Platform.SS && ssAccount?.accountId\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,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":[]}
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":[]}
@@ -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.accountId,
48
+ account.platformUid,
49
49
  mapId,
50
50
  diffOption
51
51
  );
52
52
  if (!score) {
53
53
  throw new ScoreNotFoundError({
54
- user: account.providerUsername,
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.accountId,\n mapId,\n diffOption\n )\n if(!score) {\n throw new ScoreNotFoundError({\n user: account.providerUsername, 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,MAAkB,IAAI;AAAA,MACpC,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
+ {"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 = "zh-CN";
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 = \"zh-CN\";\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\n console.log(\"translate\", path, params, lang)\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;AAEH,UAAQ,IAAI,aAAa,MAAM,QAAQ,IAAI;AAC3C,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":[]}
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 = yield c.agentService.getAgentSessionByChannelInfo(group.channel);
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 = await 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,MAAM,EAAE,aAAa,6BAA6B,MAAM,OAAO;AAC/E,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,QAAQ,WAAW;AAC/C,UAAM,QAAQ,cAAc,UAAU,WAAW;AAAA,EACnD;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/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 = yield this.agentService.getAgentSessionByChannelInfo(item.channel);
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 = await 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,MAAM,KAAK,aAAa,6BAA6B,KAAK,OAAO;AACjF,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":[]}
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 = yield this.agentService.getAgentSessionByChannelInfo(item.channel);
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 = yield this.agentService.getAgentSessionByChannelInfo(item.channel);
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 = await 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 = await 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,MAAM,KAAK,aAAa,6BAA6B,KAAK,OAAO;AACjF,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,MAAM,KAAK,aAAa,6BAA6B,KAAK,OAAO;AACjF,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AACA,cAAM,QAAQ;AAAA,UACZ,qBAAM,MAAM,SAAS,IAAI,qEAAc,MAAM,IAAI;AAAA,QACnD;AAEA,cAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,cAAM,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA;AAUF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/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-CN") {
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-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,MAAM;AAAA,EAC3C;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":[]}
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":[]}
@@ -47,7 +47,7 @@ interface PassiveSession extends ISession {
47
47
  agent: SessionAgent;
48
48
  }
49
49
  interface AgentService {
50
- getAgentSessionByChannelInfo(channel: Channel$1): Promise<PositiveSession>;
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.20",
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
- "./services": {
29
+ "./service": {
30
30
  "types": "./dist/types/index.d.ts",
31
- "require": "./dist/cjs/services/*.js",
32
- "import": "./dist/esm/services/*.js"
31
+ "require": "./dist/cjs/service/*.js",
32
+ "import": "./dist/esm/service/*.js"
33
33
  },
34
- "./services/*": {
34
+ "./service/*": {
35
35
  "types": "./dist/types/index.d.ts",
36
- "require": "./dist/cjs/services/*",
37
- "import": "./dist/esm/services/*"
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": [