UNPKG

shirosaki-napcatsdk

Version:

全新的,省心的,NapCatQQ SDK

1,123 lines (1,099 loc) 29.9 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __decorateClass = (decorators, target, key, kind) => { var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result; if (kind && result) __defProp(target, key, result); return result; }; // src/index.ts var index_exports = {}; __export(index_exports, { At: () => At, BindThis: () => BindThis, Dice: () => Dice, Face: () => Face, Image: () => Image, Message: () => Message, MessageBuilder: () => MessageBuilder, MessageSegment: () => MessageSegment, Mface: () => Mface, NCMessage: () => NCMessage, NCSelf: () => NCSelf, NapCatClient: () => NapCatClient2, NapcatClientState: () => NapcatClientState, Poke: () => Poke, Reply: () => Reply, Rps: () => Rps, RpsState: () => RpsState, Segment: () => Segment, Sticker: () => Sticker, Text: () => Text, WebSocketManager: () => WebSocketManager }); module.exports = __toCommonJS(index_exports); // src/message/MessageSegment.ts var MessageSegment = class { constructor(...params) { } }; // src/message/segment/Text.ts var Text = class _Text extends MessageSegment { constructor(text) { super(); this.text = text; } toJSON() { return { type: "text", data: { text: this.text } }; } static fromJSON(obj) { return new this(obj?.data?.text ?? ""); } clone() { return new _Text(this.text); } equals(other) { return this.text === other?.text; } }; // src/message/segment/At.ts var At = class _At extends MessageSegment { target; constructor(target) { super(); this.target = String(target); } static fromJSON(obj) { return new this(obj?.data?.qq ?? 0); } toJSON() { return { type: "at", data: { qq: this.target } }; } clone() { return new _At(this.target); } equals(other) { return this.target === other?.target; } }; // src/message/segment/Reply.ts var Reply = class _Reply extends MessageSegment { constructor(id) { super(); this.id = id; } toJSON() { return { type: "reply", data: { id: this.id } }; } static fromJSON(obj) { return new this(obj?.data?.id ?? "0"); } clone() { return new _Reply(this.id); } equals(other) { return this.id === other?.id; } }; // src/message/segment/Face.ts var Face = class _Face extends MessageSegment { constructor(id, rawData = {}) { super(); this.id = id; this.rawData = rawData; } toJSON() { return { type: "face", data: { ...this.rawData, id: this.id } }; } static fromJSON(json) { const obj = new this(json?.data?.id ?? "0", json?.data ?? {}); return obj; } clone() { return new _Face(this.id, JSON.parse(JSON.stringify(this.rawData))); } equals(other) { return this.id === other?.id; } }; // src/message/segment/Sticker.ts var import_util = require("@ceale/util"); var Sticker = class _Sticker extends MessageSegment { constructor(urlOrData, summary) { super(); this.urlOrData = urlOrData; this.summary = summary; } static fromJSON(json) { return new this( json?.data?.url ?? "", json?.data?.summary ?? void 0 ); } toJSON() { const data = Buffer.isBuffer(this.urlOrData) ? "data:application/octet-stream;base64," + this.urlOrData.toString("base64") : this.urlOrData; return { type: "image", data: { sub_type: 1, file: data, summary: this.summary ?? void 0 } }; } async getData() { if (Buffer.isBuffer(this.urlOrData)) { return this.urlOrData; } else { const [data] = await (0, import_util.tryCatch)((await fetch(this.urlOrData)).arrayBuffer()); if (data) { return Buffer.from(data); } else { return Buffer.alloc(0); } } } clone() { return new _Sticker( Buffer.isBuffer(this.urlOrData) ? Buffer.from(this.urlOrData) : this.urlOrData, this.summary ); } equals(other) { return this.urlOrData === other?.urlOrData; } }; // src/message/segment/Image.ts var import_util2 = require("@ceale/util"); var Image = class _Image extends MessageSegment { constructor(urlOrData, summary) { super(); this.urlOrData = urlOrData; this.summary = summary; } static fromJSON(json) { return new this( json?.data?.url ?? "", json?.data?.summary ?? void 0 ); } toJSON() { const data = Buffer.isBuffer(this.urlOrData) ? "data:application/octet-stream;base64," + this.urlOrData.toString("base64") : this.urlOrData; return { type: "image", data: { file: data, summary: this.summary ?? void 0 } }; } async getData() { if (Buffer.isBuffer(this.urlOrData)) { return this.urlOrData; } else { const [data] = await (0, import_util2.tryCatch)((await fetch(this.urlOrData)).arrayBuffer()); if (data) { return Buffer.from(data); } else { return Buffer.alloc(0); } } } clone() { return new _Image( Buffer.isBuffer(this.urlOrData) ? Buffer.from(this.urlOrData) : this.urlOrData, this.summary ); } equals(other) { return this.urlOrData === other?.urlOrData; } }; // src/message/segment/Mface.ts var import_node_crypto = require("node:crypto"); var Mface = class _Mface extends MessageSegment { constructor(emojiId, emojiPackageId, summary) { super(); this.emojiId = emojiId; this.emojiPackageId = emojiPackageId; this.summary = summary; } key = (0, import_node_crypto.randomBytes)(8).toString("hex"); url; static fromJSON(json) { const obj = new this( json?.data?.emoji_package_id ?? "0", json?.data?.emoji_id ?? "0", json?.data?.summary ?? void 0 ); obj.key = json?.data?.key ?? obj.key; obj.url = json?.data?.url ?? obj.url; return obj; } toJSON() { return { type: "mface", data: { emoji_package_id: this.emojiPackageId, emoji_id: this.emojiId, key: this.key, summary: this.summary ?? void 0 } }; } clone() { const obj = new _Mface( this.emojiPackageId, this.emojiId, this.summary ); obj.key = this.key; return obj; } equals(other) { return this.emojiPackageId === other?.emojiPackageId && this.emojiId === other?.emojiId; } }; // src/message/segment/Rps.ts var import_util3 = require("@ceale/util"); var RpsState = (0, import_util3.defineEnum)("ROCK", "SCISSORS", "PAPER"); var Rps = class _Rps extends MessageSegment { constructor(state) { super(); this.state = state; } toJSON() { let result = void 0; switch (this.state) { case RpsState.ROCK: result = 1; break; case RpsState.SCISSORS: result = 2; break; case RpsState.PAPER: result = 3; break; } return { type: "dice", data: { result } }; } static fromJSON(json) { let state = void 0; switch (json?.data?.result) { case 1: state = RpsState.ROCK; break; case 2: state = RpsState.SCISSORS; break; case 3: state = RpsState.PAPER; break; } const obj = new this(state); return obj; } clone() { return new _Rps(this.state); } equals(other) { return this.state === other?.state; } }; // src/message/segment/Dice.ts var Dice = class _Dice extends MessageSegment { constructor(state) { super(); this.state = state; } static fromJSON(json) { const obj = new this(json?.data?.result ?? void 0); return obj; } toJSON() { return { type: "dice", data: { result: this.state } }; } clone() { return new _Dice(this.state); } equals(other) { return this.state === other?.state; } }; // src/message/segment/Poke.ts var Poke = class _Poke extends MessageSegment { constructor(type, id) { super(); this.type = type; this.id = id; } toJSON() { return { type: "poke", data: { type: this.type, id: this.id } }; } static fromJSON(obj) { return new this( obj?.data?.type ?? "", obj?.data?.id ?? "" ); } clone() { return new _Poke(this.type, this.id); } equals(other) { return this.type === other?.type && this.id === other?.id; } }; // src/message/MessageBuilder.ts var MessageBuilder = class { segments = []; build() { return new Message(this.segments); } template(strings, ...values) { strings.forEach((str, i) => { if (str !== "") this.segments.push(new Text(str)); if (values[i] !== void 0) { if (values[i] instanceof MessageSegment) this.segments.push(values[i]); else this.segments.push(new Text(String(values[i]))); } }); return this; } append(...segments) { this.segments.push(...segments); return this; } text(...params) { this.segments.push(new Text(...params)); return this; } at(...params) { this.segments.push(new At(...params)); return this; } reply(...params) { this.segments.push(new Reply(...params)); return this; } face(...params) { this.segments.push(new Face(...params)); return this; } rps(...params) { this.segments.push(new Rps(...params)); return this; } dice(...params) { this.segments.push(new Dice(...params)); return this; } image(...params) { this.segments.push(new Image(...params)); return this; } sticker(...params) { this.segments.push(new Sticker(...params)); return this; } mface(...params) { this.segments.push(new Mface(...params)); return this; } poke(...params) { this.segments.push(new Poke(...params)); return this; } }; // src/message/Segment.ts var import_util4 = require("@ceale/util"); var Segment = class { static fromJSON(json) { switch (json?.type) { case "text": return Text.fromJSON(json); case "at": return At.fromJSON(json); case "reply": return Reply.fromJSON(json); case "face": return Face.fromJSON(json); case "rps": return Rps.fromJSON(json); case "dice": return Dice.fromJSON(json); case "image": if (json?.data?.sub_type === 1) return Sticker.fromJSON(json); if (Object.hasOwn(json?.data ?? {}, "emoji_id")) return Mface.fromJSON(json); return Image.fromJSON(json); case "poke": return Poke.fromJSON(json); default: return void 0; } } static text(...params) { return new Text(...params); } static at(...params) { return new At(...params); } static reply(...params) { return new Reply(...params); } static face(...params) { return new Face(...params); } static rps(...params) { return new Rps(...params); } static dice(...params) { return new Dice(...params); } static image(...params) { return new Image(...params); } static sticker(...params) { return new Sticker(...params); } static mface(...params) { return new Mface(...params); } static poke(...params) { return new Poke(...params); } }; // src/message/Message.ts var Message = class _Message { static builder() { return new MessageBuilder(); } static template(...params) { return _Message.builder().template(...params).build(); } static create(...segments) { return new _Message(segments.map((segment) => { return typeof segment === "string" ? new Text(segment) : segment; })); } static fromJSON(json) { if (typeof json === "string") { return new _Message([new Text(json)]); } if (!Array.isArray(json)) { throw new TypeError("\u6D88\u606F\u6BB5\u5FC5\u987B\u662F array \u6216 string"); } const segments = json.map((segment) => Segment.fromJSON(segment)).filter((segment) => segment !== void 0); return new _Message(segments); } segments = []; getAllSegment() { return this.segments; } getSegment(index) { return this.segments[index] ?? null; } get length() { return this.segments.length; } constructor(segments) { this.segments = segments; } [Symbol.iterator]() { return this.segments[Symbol.iterator](); } toJSON() { return this.segments.map((segment) => segment.toJSON()); } clone() { return new _Message(this.segments.map((segment) => segment.clone())); } cloneToBuilder() { return _Message.builder().append(...this.clone().segments); } /** * * @param start 可以为负,负就是从尾部开始 * @param deleteCount * @param segments */ splice(start, deleteCount, ...segments) { const normalizedStart = start < 0 ? Math.max(this.segments.length + start, 0) : Math.min(start, this.segments.length); const actualDeleteCount = Math.max( 0, Math.min(deleteCount, this.segments.length - normalizedStart) ); const deleted = this.segments.splice(normalizedStart, actualDeleteCount, ...segments); return deleted; } text() { return this.segments.filter((segment) => segment instanceof Text).map((segment) => segment.text).join(""); } hasSegment(predicate) { return this.segments.some(predicate); } hasSegmentByType(type) { return this.segments.some((segment) => segment instanceof type); } findSegment(predicate) { return this.segments.find(predicate) ?? null; } findSegmentByType(type) { return this.segments.find((segment) => segment instanceof type) ?? null; } findAllSegment(predicate) { return this.segments.filter(predicate); } findAllSegmentByType(type) { return this.segments.filter((segment) => segment instanceof type); } equals(other) { return this.length === other.length && this.constructor === other.constructor && this.segments.every( (segment, index) => other.segments[index] && segment?.equals?.(other.segments[index]) ); } }; // src/NapCatClient.ts var import_node_events = require("node:events"); // src/WebSocketManager.ts var import_ws = __toESM(require("ws"), 1); var import_util5 = require("@ceale/util"); // src/util/AutoBind.ts var BindThis = (target, propertyKey, descriptor) => { const originalMethod = descriptor.value; return { configurable: true, get() { const boundFn = originalMethod.bind(this); Object.defineProperty(this, propertyKey, { value: boundFn, configurable: true, writable: true }); return boundFn; } }; }; // src/WebSocketManager.ts var WebsocketState = (0, import_util5.defineEnum)( "CONNECT", "ACTIVE", "CLOSE" ); var WebsocketManagerState = (0, import_util5.defineEnum)( "OPEN", "CLOSE" ); var WebSocketManager = class { constructor(wsParams, dataHandler, retryCfg, logger, timeout) { this.wsParams = wsParams; this.dataHandler = dataHandler; this.retryCfg = retryCfg; this.logger = logger; this.timeout = timeout; } /** WebSocketManager状态 */ wsmState = WebsocketManagerState.CLOSE; /** WebSocketManager状态判断 */ wsmStateIs = (value) => this.wsmState === value; /** 等待关闭的Promise */ waitCloseResolve; async open() { this.logger.debug("@WebSocketManager.open()"); if (this.wsmState === WebsocketManagerState.OPEN) return true; this.wsmState = WebsocketManagerState.OPEN; const isConnect = await this.connect(); if (this.wsmStateIs(WebsocketManagerState.CLOSE)) { this.waitCloseResolve?.(); return false; } else if (isConnect) { return true; } else { return await this.retry(); } } async retry() { this.logger.debug("@WebSocketManager.retry()"); const { interval, limit } = this.retryCfg; const isInfinity = limit === -1; for (let count = 0; isInfinity || count < limit; count++) { this.logger.info(`\u5C06\u5728 ${interval}ms \u540E\u8FDB\u884C\u7B2C ${count + 1} \u6B21\u91CD\u8FDE`); await (0, import_util5.wait)(this.retryCfg.interval); if (this.wsmStateIs(WebsocketManagerState.CLOSE)) { this.waitCloseResolve?.(); return false; } this.logger.info(`\u91CD\u65B0\u8FDE\u63A5\u4E2D`); if (await this.connect()) return true; } return false; } async close() { this.logger.debug("@WebSocketManager.close()"); if (this.wsmState === WebsocketManagerState.CLOSE) { return true; } this.wsmState = WebsocketManagerState.CLOSE; this.ws?.close(); await new Promise((resolve) => { this.waitCloseResolve = resolve; }); return true; } /** WebSocket状态 */ wsState = WebsocketState.CLOSE; ws = null; /** 等待WS连接完成(成功或失败)*/ waitActiveResolve; waitActiveTimeout; connect() { return new Promise((resolve) => { this.logger.debug("@WebSocketManager.connect()"); this.ws = new import_ws.default(...this.wsParams); this.wsState = WebsocketState.CONNECT; this.waitActiveResolve = resolve; this.logger.info("\u6B63\u5728\u5EFA\u7ACBWebSocket\u8FDE\u63A5"); this.ws.addEventListener("open", () => { if (this.timeout !== -1) { this.waitActiveTimeout = setTimeout(() => { this.logger.warn("\u5EFA\u7ACB\u8FDE\u63A5\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A\u7B49\u5F85\u8D85\u65F6"); this.ws?.close(); }, this.timeout); } this.ws?.addEventListener("message", this.onceMsg, { once: true }); }); this.ws.addEventListener("close", this.onClose); }); } sendData(data) { if (!this.ws) { this.logger.warn("\u53D1\u9001\u6570\u636E\u65F6\u53D1\u751F\u9519\u8BEF\uFF1AWebSocket\u6682\u672A\u8FDE\u63A5"); return false; } this.ws.send(JSON.stringify(data)); return true; } onceMsg(event) { clearTimeout(this.waitActiveTimeout); const [data] = (0, import_util5.tryCatch)(() => JSON.parse(event.data.toString())); const isMetaConnectPacket = data?.post_type === "meta_event" && data?.meta_event_type === "lifecycle" && data?.sub_type === "connect"; if (isMetaConnectPacket) { this.dataHandler(data); this.onActive(); } else { if (data?.status !== void 0) { this.logger.warn(`\u5EFA\u7ACB\u8FDE\u63A5\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A`, data); } else { this.logger.warn("\u5EFA\u7ACB\u8FDE\u63A5\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A\u9996\u4E2A\u6570\u636E\u5305\u4E0D\u662F OneBot.meta_event.connect"); } this.ws?.close(); } } onActive() { this.wsState = WebsocketState.ACTIVE; this.waitActiveResolve?.(true); this.ws?.addEventListener("message", this.onMsg); this.logger.info("\u8FDE\u63A5\u6210\u529F"); } onMsg(event) { const [data, error] = (0, import_util5.tryCatch)(() => JSON.parse(event.data.toString())); if (data) { this.dataHandler(data); } else { this.logger.warn("\u63A5\u6536\u6570\u636E\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A\u89E3\u6790\u6570\u636E\u5931\u8D25"); this.logger.warn(event.data?.toString()); this.logger.warn(error); } } onClose(event) { clearTimeout(this.waitActiveTimeout); if (this.wsState === WebsocketState.CONNECT) { this.waitActiveResolve?.(false); this.logger.warn("\u5EFA\u7ACB\u8FDE\u63A5\u5931\u8D25\uFF1A", event.code, event.reason); } else if (this.wsState === WebsocketState.ACTIVE) { if (this.wsmState === WebsocketManagerState.OPEN) { this.logger.warn("\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF1A", event.code, event.reason); this.retry(); } else if (this.wsmState === WebsocketManagerState.CLOSE) { this.waitCloseResolve?.(); } } this.wsState = WebsocketState.CLOSE; this.ws = null; } }; __decorateClass([ BindThis ], WebSocketManager.prototype, "open", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "retry", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "close", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "connect", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "sendData", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "onceMsg", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "onActive", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "onMsg", 1); __decorateClass([ BindThis ], WebSocketManager.prototype, "onClose", 1); // src/NapCatClient.ts var import_util7 = require("@ceale/util"); var import_node_console = __toESM(require("node:console"), 1); // src/service/NCMessage.ts var NCMessage = class { NCClient; Logger; debug; constructor({ NCClient, Logger = console }, { debug = false } = {}) { this.NCClient = NCClient; this.Logger = Logger; this.debug = debug; } sendMessage() { } onMessage() { } }; __decorateClass([ BindThis ], NCMessage.prototype, "sendMessage", 1); __decorateClass([ BindThis ], NCMessage.prototype, "onMessage", 1); // src/service/NCSelf.ts var import_util6 = require("@ceale/util"); var NCSelf = class { NCClient; Logger; debug; waitReady; isReady = false; constructor({ NCClient, Logger = console }, { debug = false } = {}) { this.NCClient = NCClient; this.Logger = Logger; this.debug = debug; this.waitReady = new Promise(async (resolve) => { if (this.NCClient.state === NapcatClientState.OPEN) { const { data } = await this.NCClient.sendAction("get_login_info"); this._user_id = data.user_id; await this.regetInfo(); this.isReady = true; resolve(); } else { NCClient.onceEvent("meta_event.lifecycle.connect", async (data) => { this._user_id = data.self_id; await this.regetInfo(); this.isReady = true; resolve(); }); } }); } _raw_info; get raw_info() { return this._raw_info; } async regetInfo() { if (!this.user_id) return false; const data = await this.NCClient.sendAction("get_stranger_info", { user_id: this.user_id }); if (data?.retcode !== 0) return false; this._raw_info = data?.data; this._nickname = data?.data.nickname; } _user_id; get user_id() { return this._user_id; } _nickname; get nickname() { return this._nickname; } async setNickname(name) { this.NCClient.sendAction("get_login_info"); } // private _a getAvatar() { const size = 0; const url = `https://thirdqq.qlogo.cn/g?b=sdk&s=${size}&nk=${this.user_id}`; } info; async getInfo() { return await this.NCClient.sendAction("get_login_info"); } async setInfo() { } }; // src/NapCatClient.ts var NapcatClientState = (0, import_util7.defineEnum)("OPEN", "CLOSE"); var NapCatClient2 = class { // 配置 url; token; debug; timeout; // 基础服务 logger; wsManager; _state = NapcatClientState.CLOSE; get state() { return this._state; } get wsState() { return this.wsManager.wsState; } // 功能模块 // public Self: NCSelf Message; constructor(url, { token = null, timeout = 5e3, retry: { interval = 5e3, limit = 5 } = {}, logger = import_node_console.default, debug = false } = {}) { if (url === void 0) throw new TypeError("url\u53C2\u6570\u662F\u5FC5\u987B\u7684"); this.url = url; this.token = token; this.debug = debug; this.timeout = timeout; this.logger = { debug: this.debug ? logger.debug : () => { }, info: logger.info, warn: logger.warn, error: logger.error }; const headers = { ...this.token ? { Authorization: this.token } : {} }; this.wsManager = new WebSocketManager( [this.url, { headers }], this.dataHandler, { interval, limit }, this.logger, this.timeout ); this.Message = new NCMessage({ NCClient: this, Logger: this.logger }, { debug: this.debug }); } async connect() { if (this.state === NapcatClientState.OPEN) return true; const success = await this.wsManager.open(); if (success) this._state = NapcatClientState.OPEN; return success; } async close() { if (this.state === NapcatClientState.CLOSE) return true; const success = await this.wsManager.close(); if (success) this._state = NapcatClientState.CLOSE; return success; } sendData(data) { this.logger.debug("\u53D1\u9001\u6570\u636E", data); return this.wsManager.sendData(data); } dataHandler(data) { this.logger.debug("\u63A5\u6536\u6570\u636E", data); this.dataMap.forEach((handler) => handler(data)); if (data.hasOwnProperty("post_type")) { this.postDataHandler(data); } else { this.actionRespHandler(data); } } dataMap = /* @__PURE__ */ new Set(); onData(handler) { this.dataMap.add(handler); } offData(handler) { this.dataMap.delete(handler); } actionMap = /* @__PURE__ */ new Map(); sendAction(action, params = {}) { return new Promise((resolve) => { const id = (Date.now().toString(36) + Math.random().toString(36).slice(2)).slice(0, 16).padEnd(16, "x"); this.actionMap.set(id, resolve); this.sendData({ action, params, echo: id }); if (this.timeout !== -1) setTimeout(() => { this.actionMap.delete(id); resolve({ status: "timeout", retcode: 1408, mas: "action timeout", wording: `Action "${action}" \u54CD\u5E94\u8D85\u65F6 (${this.timeout}ms)`, data: {}, echo: id }); }, this.timeout); }); } actionRespHandler(data) { this.actionMap.get(data.echo)?.(data); this.actionMap.delete(data.echo); } eventMap = /* @__PURE__ */ new Map(); postDataHandler(data) { const eventNamePath = []; if (data?.post_type) eventNamePath.push(data?.post_type); const postTypeKey = data.post_type + "_type"; if (data[postTypeKey]) eventNamePath.push(data[postTypeKey]); if (data?.sub_type) eventNamePath.push(data?.sub_type); this.logger.debug("\u63A5\u6536\u5230\u4E8B\u4EF6\uFF1A", eventNamePath); for (let i = eventNamePath.length; i > 0; i--) { const eventName = eventNamePath.slice(0, i).join("."); this.eventMap.get(eventName)?.forEach((handler) => handler(data)); } this.eventMap.get("all")?.forEach((handler) => handler(data)); } onEvent(arg1, arg2) { const [eventName, handler] = arg2 ? [arg1, arg2] : ["all", arg2]; (0, import_util7.assert)(eventName); (0, import_util7.assert)(handler); let eventSet = this.eventMap.get(eventName); if (!eventSet) { eventSet = /* @__PURE__ */ new Set(); this.eventMap.set(eventName, eventSet); } eventSet.add(handler); } onceEvent(arg1, arg2) { const [eventName, handler] = arg2 ? [arg1, arg2] : ["all", arg2]; (0, import_util7.assert)(eventName); (0, import_util7.assert)(handler); const onceHandler = (data) => { this.offEvent(eventName, onceHandler); handler(data); }; this.onEvent(eventName, onceHandler); } offEvent(arg1, arg2) { const [eventName, handler] = arg2 ? [arg1, arg2] : ["all", arg2]; (0, import_util7.assert)(eventName); (0, import_util7.assert)(handler); let eventSet = this.eventMap.get(eventName); if (eventSet) { eventSet.delete(handler); } } }; __decorateClass([ BindThis ], NapCatClient2.prototype, "connect", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "close", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "sendData", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "dataHandler", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "sendAction", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "actionRespHandler", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "postDataHandler", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "onEvent", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "onceEvent", 1); __decorateClass([ BindThis ], NapCatClient2.prototype, "offEvent", 1);