diff --git a/config/default_config/bot.yaml b/config/default_config/bot.yaml index 1b6f8c7..5660e37 100644 --- a/config/default_config/bot.yaml +++ b/config/default_config/bot.yaml @@ -15,4 +15,7 @@ proxyAddress: # 上线时给主人推送帮助 online_msg: true # 上线推送通知的冷却时间 -online_msg_exp: 86400 \ No newline at end of file +online_msg_exp: 86400 + +# 单条日志长度 +logLength: 1000 \ No newline at end of file diff --git a/lib/bot.js b/lib/bot.js index 5a21685..0c478ff 100644 --- a/lib/bot.js +++ b/lib/bot.js @@ -5,6 +5,8 @@ import ListenerLoader from "./listener/loader.js" import { EventEmitter } from "events" import express from "express" import http from "http" +import { WebSocketServer } from "ws" +import _ from "lodash" export default class Yunzai extends EventEmitter { constructor() { @@ -13,11 +15,40 @@ export default class Yunzai extends EventEmitter { this.adapter = [] this.express = express() this.server = http.createServer(this.express) - this.wss = {} this.server.on("upgrade", (req, socket, head) => { - const wss = this.wss[req.url.split("/")[1]] - if (wss) wss.handleUpgrade(req, socket, head, conn => wss.emit("connection", conn, req)) + this.wss.handleUpgrade(req, socket, head, conn => { + conn.id = `${req.connection.remoteAddress}-${req.headers["sec-websocket-key"]}` + this.makeLog("mark", `${logger.blue(`[${conn.id} <=> ${req.url}]`)} 建立连接:${JSON.stringify(req.headers)}`) + conn.on("error", logger.error) + conn.on("close", () => this.makeLog("mark", `${logger.blue(`[${conn.id} <≠> ${req.url}]`)} 断开连接`)) + conn.on("message", msg => this.makeLog("debug", `${logger.blue(`[${conn.id} => ${req.url}]`)} 消息:${String(msg).trim()}`)) + conn.sendMsg = msg => { + if (typeof msg == "object") + msg = JSON.stringify(msg) + this.makeLog("debug", `${logger.blue(`[${conn.id} <= ${req.url}]`)} 消息:${msg}`) + return conn.send(msg) + } + for (const i of this.wsf[req.url.split("/")[1]] || []) + i(conn, req, socket, head) + }) }) + this.wss = new WebSocketServer({ noServer: true }) + this.wsf = {} + } + + makeLog(level, msg) { + logger[level](_.truncate(msg, { length: cfg.bot.logLength })) + } + + em(name = "", data = {}) { + if (data.self_id) + Object.defineProperty(data, "bot", { value: Bot[data.self_id] }) + while (true) { + this.emit(name, data) + const i = name.lastIndexOf(".") + if (i == -1) break + name = name.slice(0, i) + } } async run() { @@ -30,7 +61,7 @@ export default class Yunzai extends EventEmitter { serverLoad() { this.express.use(req => { - logger.info(`${logger.blue(`[${req.ip}]`)} HTTP ${req.method} 请求:${req.url} ${JSON.stringify(req.rawHeaders)}`) + logger.mark(`${logger.blue(`[${req.ip} => ${req.url}]`)} HTTP ${req.method} 请求:${JSON.stringify(req.headers)}`) req.res.redirect("https://github.com/TimeRainStarSky/Yunzai") }) @@ -38,7 +69,7 @@ export default class Yunzai extends EventEmitter { const host = this.server.address().address const port = this.server.address().port logger.mark(`启动 HTTP 服务器:${logger.green(`http://[${host}]:${port}`)}`) - for (const i of Object.keys(this.wss)) + for (const i of Object.keys(this.wsf)) logger.info(`本机 ${i} 连接地址:${logger.blue(`ws://localhost:${port}/${i}`)}`) }) } @@ -60,7 +91,7 @@ export default class Yunzai extends EventEmitter { } getFriendMap() { - const map = new Map() + const map = new Map for (const bot_id of this.uin) for (const [id, i] of this[bot_id].fl || []) map.set(id, { ...i, bot_id }) @@ -85,13 +116,20 @@ export default class Yunzai extends EventEmitter { } getGroupMap() { - const map = new Map() + const map = new Map for (const bot_id of this.uin) for (const [id, i] of this[bot_id].gl || []) map.set(id, { ...i, bot_id }) return map } get gl() { return this.getGroupMap() } + get gml() { + const map = new Map + for (const bot_id of this.uin) + for (const [id, i] of this[bot_id].gml || []) + map.set(id, i) + return map + } pickFriend(user_id) { user_id = Number(user_id) || String(user_id) @@ -123,7 +161,7 @@ export default class Yunzai extends EventEmitter { return new Promise(resolve => this.once(`connect.${bot_id}`, data => - resolve(data.pickFriend(user_id).sendMsg(msg)))) + resolve(data.bot.pickFriend(user_id).sendMsg(msg)))) } catch (err) { logger.error(`${logger.blue(`[${bot_id}]`)} 发送好友消息失败:[$${user_id}] ${err}`) } @@ -140,7 +178,7 @@ export default class Yunzai extends EventEmitter { return new Promise(resolve => this.once(`connect.${bot_id}`, data => - resolve(data.pickGroup(group_id).sendMsg(msg)))) + resolve(data.bot.pickGroup(group_id).sendMsg(msg)))) } catch (err) { logger.error(`${logger.blue(`[${bot_id}]`)} 发送群消息失败:[$${group_id}] ${err}`) } diff --git a/lib/events/connect.js b/lib/events/connect.js index f7b1c15..46ef1e2 100644 --- a/lib/events/connect.js +++ b/lib/events/connect.js @@ -1,20 +1,23 @@ -import EventListener from '../listener/listener.js' -import cfg from '../config/config.js' +import EventListener from "../listener/listener.js" +import cfg from "../config/config.js" /** * 监听连接事件 */ export default class connectEvent extends EventListener { - constructor () { - super({ event: 'connect' }) + constructor() { + super({ event: "connect" }) } - async execute (e) { + async execute(e) { + if (!Bot.uin.includes(e.self_id)) + Bot.uin.push(e.self_id) + if (!cfg.bot.online_msg) return - const key = `Yz:loginMsg:${e.uin}` + const key = `Yz:loginMsg:${e.self_id}` if (await redis.get(key)) return redis.set(key, "1", { EX: cfg.bot.online_msg_exp }) - for (const i of cfg.master[e.uin] ?? []) - e.pickFriend(i).sendMsg(`欢迎使用【TRSS-Yunzai v${cfg.package.version}】\n【#帮助】查看指令说明\n【#状态】查看运行状态\n【#日志】查看运行日志\n【#重启】重新启动\n【#更新】拉取 Git 更新\n【#全部更新】更新全部插件\n【#更新日志】查看更新日志\n【#设置主人】设置主人账号\n【#安装插件】查看可安装插件`) + for (const i of cfg.master[e.self_id] || []) + e.bot.pickFriend(i).sendMsg(`欢迎使用【TRSS-Yunzai v${cfg.package.version}】\n【#帮助】查看指令说明\n【#状态】查看运行状态\n【#日志】查看运行日志\n【#重启】重新启动\n【#更新】拉取 Git 更新\n【#全部更新】更新全部插件\n【#更新日志】查看更新日志\n【#设置主人】设置主人账号\n【#安装插件】查看可安装插件`) } } \ No newline at end of file diff --git a/lib/plugins/stdin.js b/lib/plugins/stdin.js index 89ae63f..6174c42 100644 --- a/lib/plugins/stdin.js +++ b/lib/plugins/stdin.js @@ -125,8 +125,7 @@ Bot.adapter.push(new class stdinAdapter { } logger.info(`${logger.blue(`[${data.self_id}]`)} 系统消息:[${data.sender.nickname}(${data.user_id})] ${data.raw_message}`) - Bot.emit(`${data.post_type}.${data.message_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.message_type}`, data) } load() { @@ -148,7 +147,9 @@ Bot.adapter.push(new class stdinAdapter { group_name: this.name, }), get gl() { return this.fl }, + gml: new Map, } + Bot[this.id].gml.set(this.id, Bot[this.id].fl) if (!Bot.uin.includes(this.id)) Bot.uin.push(this.id) @@ -156,7 +157,6 @@ Bot.adapter.push(new class stdinAdapter { process[this.id].on("data", data => this.message(data.toString())) logger.mark(`${logger.blue(`[${this.id}]`)} ${this.name}(${this.id}) 已连接`) - Bot.emit(`connect.${this.id}`, Bot[this.id]) - Bot.emit("connect", Bot[this.id]) + Bot.em(`connect.${this.id}`, { self_id: this.id }) } }) \ No newline at end of file diff --git a/package.json b/package.json index ec75ea0..2f7a206 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "node-xlsx": "^0.23.0", "oicq": "link:lib/modules/oicq", "pm2": "^5.3.0", - "puppeteer": "^21.0.3", + "puppeteer": "^21.1.0", "redis": "^4.6.7", "sequelize": "^6.32.1", "sqlite3": "^5.1.6", @@ -42,7 +42,7 @@ "devDependencies": { "eslint": "^8.47.0", "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.28.0", + "eslint-plugin-import": "^2.28.1", "eslint-plugin-n": "^16.0.1", "eslint-plugin-promise": "^6.1.1" }, diff --git a/plugins/adapter/ComWeChat.js b/plugins/adapter/ComWeChat.js index efe5768..634db30 100644 --- a/plugins/adapter/ComWeChat.js +++ b/plugins/adapter/ComWeChat.js @@ -1,4 +1,3 @@ -import { WebSocketServer } from "ws" import { randomUUID } from "crypto" import path from "node:path" import fs from "node:fs" @@ -32,9 +31,8 @@ Bot.adapter.push(new class ComWeChatAdapter { sendApi(ws, action, params = {}) { const echo = randomUUID() - const msg = JSON.stringify({ action, params, echo }) - logger.debug(`发送 API 请求:${logger.cyan(this.makeLog(msg))}`) - ws.send(msg) + const msg = { action, params, echo } + ws.sendMsg(msg) return new Promise(resolve => Bot.once(echo, data => resolve({ ...data, ...data.data }))) @@ -125,7 +123,7 @@ Bot.adapter.push(new class ComWeChatAdapter { return Bot.sendForwardMsg(msg => this.sendFriendMsg(data, msg), msg.data) const message = await this.makeMsg(data, msg) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送好友消息:[${data.user_id}] ${this.makeLog(message)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.user_id}]`)} 发送好友消息:${this.makeLog(message)}`) return data.sendApi("send_message", { detail_type: "private", user_id: data.user_id, @@ -138,7 +136,7 @@ Bot.adapter.push(new class ComWeChatAdapter { return Bot.sendForwardMsg(msg => this.sendGroupMsg(data, msg), msg.data) const message = await this.makeMsg(data, msg) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送群消息:[${data.group_id}] ${this.makeLog(message)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.group_id}]`)} 发送群消息:${this.makeLog(message)}`) return data.sendApi("send_message", { detail_type: "group", group_id: data.group_id, @@ -212,7 +210,7 @@ Bot.adapter.push(new class ComWeChatAdapter { } async getMemberMap(data) { - const map = new Map() + const map = new Map for (const i of (await this.getMemberArray(data))) map.set(i.user_id, i) return map @@ -300,14 +298,15 @@ Bot.adapter.push(new class ComWeChatAdapter { getFriendArray: () => this.getFriendArray(data), getFriendList: () => this.getFriendList(data), getFriendMap: () => this.getFriendMap(data), - fl: new Map(), + fl: new Map, pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id), pickGroup: group_id => this.pickGroup(data, group_id), getGroupArray: () => this.getGroupArray(data), getGroupList: () => this.getGroupList(data), getGroupMap: () => this.getGroupMap(data), - gl: new Map(), + gl: new Map, + gml: new Map, } if (!Bot.uin.includes(data.self_id)) @@ -324,8 +323,7 @@ Bot.adapter.push(new class ComWeChatAdapter { Bot[data.self_id].getGroupMap() logger.mark(`${logger.blue(`[${data.self_id}]`)} ${this.name}(${this.id}) ${Bot[data.self_id].version.impl}-${Bot[data.self_id].version.version} 已连接`) - Bot.emit(`connect.${data.self_id}`, Bot[data.self_id]) - Bot.emit("connect", Bot[data.self_id]) + Bot.em(`connect.${data.self_id}`, data) } makeMessage(data) { @@ -369,8 +367,7 @@ Bot.adapter.push(new class ComWeChatAdapter { logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) } - Bot.emit(`${data.post_type}.${data.message_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.message_type}`, data) } makeNotice(data) { @@ -423,9 +420,7 @@ Bot.adapter.push(new class ComWeChatAdapter { if (!data.sub_type) data.sub_type = data.detail_type.split("_").pop() - Bot.emit(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data) - Bot.emit(`${data.post_type}.${data.notice_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data) } makeRequest(data) { @@ -446,9 +441,7 @@ Bot.adapter.push(new class ComWeChatAdapter { if (!data.sub_type) data.sub_type = data.detail_type.split("_").pop() - Bot.emit(`${data.post_type}.${data.request_type}.${data.sub_type}`, data) - Bot.emit(`${data.post_type}.${data.request_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.request_type}.${data.sub_type}`, data) } makeMeta(data) { @@ -503,7 +496,6 @@ Bot.adapter.push(new class ComWeChatAdapter { logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) } } else if (data.echo) { - logger.debug(`请求 API 返回:${logger.cyan(JSON.stringify(data))}`) Bot.emit(data.echo, data) } else { logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) @@ -511,11 +503,10 @@ Bot.adapter.push(new class ComWeChatAdapter { } load() { - Bot.wss[this.path] = new WebSocketServer({ noServer: true }) - Bot.wss[this.path].on("connection", ws => ws - .on("error", logger.error) - .on("message", data => this.message(data, ws)) + if (!Array.isArray(Bot.wsf[this.path])) + Bot.wsf[this.path] = [] + Bot.wsf[this.path].push((ws, ...args) => + ws.on("message", data => this.message(data, ws, ...args)) ) - return true } }) \ No newline at end of file diff --git a/plugins/adapter/GSUIDCore.js b/plugins/adapter/GSUIDCore.js index 9af9e58..b7d6102 100644 --- a/plugins/adapter/GSUIDCore.js +++ b/plugins/adapter/GSUIDCore.js @@ -1,4 +1,3 @@ -import { WebSocketServer } from "ws" import { randomUUID } from "crypto" import path from "node:path" import fs from "node:fs" @@ -29,12 +28,6 @@ Bot.adapter.push(new class GSUIDCoreAdapter { return this.toStr(msg).replace(/base64:\/\/.*?"/g, "base64://...\"") } - sendApi(ws, data) { - const msg = JSON.stringify(data) - logger.debug(`发送 API 请求:${logger.cyan(this.makeLog(msg))}`) - return ws.send(msg) - } - makeMsg(msg) { if (!Array.isArray(msg)) msg = [msg] @@ -81,7 +74,7 @@ Bot.adapter.push(new class GSUIDCoreAdapter { sendFriendMsg(data, msg) { const content = this.makeMsg(msg) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送好友消息:[${data.user_id}] ${this.makeLog(content)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.user_id}]`)} 发送好友消息:${this.makeLog(content)}`) data.bot.sendApi({ bot_id: data.bot.bot_id, bot_self_id: data.bot.bot_self_id, @@ -95,7 +88,7 @@ Bot.adapter.push(new class GSUIDCoreAdapter { sendGroupMsg(data, msg) { const target = data.group_id.split("-") const content = this.makeMsg(msg) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送群消息:[${data.group_id}] ${this.makeLog(content)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.group_id}]`)} 发送群消息:${this.makeLog(content)}`) data.bot.sendApi({ bot_id: data.bot.bot_id, bot_self_id: data.bot.bot_self_id, @@ -163,16 +156,13 @@ Bot.adapter.push(new class GSUIDCoreAdapter { get pickUser() { return this.pickFriend }, pickMember: (group_id, user_id) => this.pickMember(data.self_id, group_id, user_id), pickGroup: group_id => this.pickGroup(data.self_id, group_id), - fl: new Map(), - gl: new Map(), + fl: new Map, + gl: new Map, + gml: new Map, } - if (!Bot.uin.includes(data.self_id)) - Bot.uin.push(data.self_id) - logger.mark(`${logger.blue(`[${data.self_id}]`)} ${this.name}(${this.id}) 已连接`) - Bot.emit(`connect.${data.self_id}`, Bot[data.self_id]) - Bot.emit("connect", Bot[data.self_id]) + Bot.em(`connect.${data.self_id}`, data) } message(data, ws) { @@ -183,7 +173,7 @@ Bot.adapter.push(new class GSUIDCoreAdapter { } data.self_id = data.bot_self_id - data.sendApi = data => this.sendApi(ws, data) + data.sendApi = data => ws.sendMsg(data) if (Bot[data.self_id]) Bot[data.self_id].sendApi = data.sendApi else @@ -245,16 +235,14 @@ Bot.adapter.push(new class GSUIDCoreAdapter { logger.info(`${logger.blue(`[${data.self_id}]`)} 群消息:[${data.group_id}, ${data.user_id}] ${data.raw_message}`) } - Bot.emit(`${data.post_type}.${data.message_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.message_type}`, data) } load() { - Bot.wss[this.path] = new WebSocketServer({ noServer: true }) - Bot.wss[this.path].on("connection", ws => ws - .on("error", logger.error) - .on("message", data => this.message(data, ws)) + if (!Array.isArray(Bot.wsf[this.path])) + Bot.wsf[this.path] = [] + Bot.wsf[this.path].push((ws, ...args) => + ws.on("message", data => this.message(data, ws, ...args)) ) - return true } }) \ No newline at end of file diff --git a/plugins/adapter/go-cqhttp.js b/plugins/adapter/go-cqhttp.js index d8b36bc..7122c8f 100644 --- a/plugins/adapter/go-cqhttp.js +++ b/plugins/adapter/go-cqhttp.js @@ -1,4 +1,3 @@ -import { WebSocketServer } from "ws" import { randomUUID } from "crypto" import path from "node:path" import fs from "node:fs" @@ -31,9 +30,8 @@ Bot.adapter.push(new class gocqhttpAdapter { sendApi(ws, action, params) { const echo = randomUUID() - const msg = JSON.stringify({ action, params, echo }) - logger.debug(`发送 API 请求:${logger.cyan(this.makeLog(msg))}`) - ws.send(msg) + const msg = { action, params, echo } + ws.sendMsg(msg) return new Promise(resolve => Bot.once(echo, data => resolve({ ...data, ...data.data }))) @@ -64,7 +62,7 @@ Bot.adapter.push(new class gocqhttpAdapter { if (msg?.type == "node") return this.sendFriendForwardMsg(data, msg.data) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送好友消息:[${data.user_id}] ${this.makeLog(msg)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.user_id}]`)} 发送好友消息:${this.makeLog(msg)}`) return data.sendApi("send_msg", { user_id: data.user_id, message: this.makeMsg(msg), @@ -75,7 +73,7 @@ Bot.adapter.push(new class gocqhttpAdapter { if (msg?.type == "node") return this.sendGroupForwardMsg(data, msg.data) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送群消息:[${data.group_id}] ${this.makeLog(msg)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.group_id}]`)} 发送群消息:${this.makeLog(msg)}`) return data.sendApi("send_msg", { group_id: data.group_id, message: this.makeMsg(msg), @@ -84,9 +82,9 @@ Bot.adapter.push(new class gocqhttpAdapter { sendGuildMsg(data, msg) { if (msg?.type == "node") - return this.sendGuildForwardMsg(data, msg.data) + return Bot.sendForwardMsg(msg => this.sendGuildMsg(data, msg), msg) - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送频道消息:[${data.guild_id}-${data.channel_id}] ${this.makeLog(msg)}`) + logger.info(`${logger.blue(`[${data.self_id}] => ${data.guild_id}-${data.channel_id}`)} 发送频道消息:${this.makeLog(msg)}`) return data.sendApi("send_guild_channel_msg", { guild_id: data.guild_id, channel_id: data.channel_id, @@ -132,7 +130,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } async sendFriendForwardMsg(data, msg) { - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送好友转发消息:[${data.user_id}] ${this.makeLog(msg)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.user_id}]`)} 发送好友转发消息:${this.makeLog(msg)}`) msg = await data.sendApi("send_private_forward_msg", { user_id: data.user_id, messages: this.makeForwardMsg(msg), @@ -141,7 +139,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } async sendGroupForwardMsg(data, msg) { - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送群转发消息:[${data.group_id}] ${this.makeLog(msg)}`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.group_id}]`)} 发送群转发消息:${this.makeLog(msg)}`) msg = await data.sendApi("send_group_forward_msg", { group_id: data.group_id, messages: this.makeForwardMsg(msg), @@ -149,13 +147,6 @@ Bot.adapter.push(new class gocqhttpAdapter { return msg } - async sendGuildForwardMsg(data, msg) { - const messages = [] - for (const i of msg) - messages.push(await this.sendGuildMsg(data, i.message)) - return messages - } - async getFriendArray(data) { return (await data.sendApi("get_friend_list")).data } @@ -228,7 +219,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } async getMemberMap(data) { - const map = new Map() + const map = new Map for (const i of (await this.getMemberArray(data))) map.set(i.user_id, i) return map @@ -258,7 +249,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } async getGuildChannelMap(data) { - const map = new Map() + const map = new Map for (const i of (await this.getGuildChannelArray(data))) map.set(i.channel_id, i) return map @@ -292,7 +283,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } async getGuildMemberMap(data) { - const map = new Map() + const map = new Map for (const i of (await this.getGuildMemberArray(data))) map.set(i.user_id, i) return map @@ -366,7 +357,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } async sendFriendFile(data, file, name) { - logger.info(`${logger.blue(`[${data.self_id}]`)} 发送好友文件:[${data.user_id}] ${name}(${file})`) + logger.info(`${logger.blue(`[${data.self_id} => ${data.user_id}]`)} 发送好友文件:${name}(${file})`) return data.sendApi("upload_private_file", { user_id: data.user_id, ...await this.makeFile(data, file, name), @@ -464,7 +455,6 @@ Bot.adapter.push(new class gocqhttpAdapter { getMsg: message_id => this.getMsg(i, message_id), recallMsg: message_id => this.recallMsg(i, message_id), getForwardMsg: message_id => this.getForwardMsg(i, message_id), - makeForwardMsg: Bot.makeForwardMsg, sendForwardMsg: msg => this.sendFriendForwardMsg(i, msg), sendFile: (file, name) => this.sendFriendFile(i, file, name), getInfo: () => this.getFriendInfo(i), @@ -518,8 +508,6 @@ Bot.adapter.push(new class gocqhttpAdapter { getMsg: message_id => this.getMsg(i, message_id), recallMsg: message_id => this.recallMsg(i, message_id), getForwardMsg: message_id => this.getForwardMsg(i, message_id), - makeForwardMsg: Bot.makeForwardMsg, - sendForwardMsg: msg => this.sendGuildForwardMsg(i, msg), getInfo: () => this.getGuildInfo(i), getChannelArray: () => this.getGuildChannelArray(i), getChannelList: () => this.getGuildChannelList(i), @@ -542,7 +530,6 @@ Bot.adapter.push(new class gocqhttpAdapter { getMsg: message_id => this.getMsg(i, message_id), recallMsg: message_id => this.recallMsg(i, message_id), getForwardMsg: message_id => this.getForwardMsg(i, message_id), - makeForwardMsg: Bot.makeForwardMsg, sendForwardMsg: msg => this.sendGroupForwardMsg(i, msg), sendFile: (file, name) => this.sendGroupFile(i, file, undefined, name), getInfo: () => this.getGroupInfo(i), @@ -581,14 +568,15 @@ Bot.adapter.push(new class gocqhttpAdapter { getFriendArray: () => this.getFriendArray(data), getFriendList: () => this.getFriendList(data), getFriendMap: () => this.getFriendMap(data), - fl: new Map(), + fl: new Map, pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id), pickGroup: group_id => this.pickGroup(data, group_id), getGroupArray: () => this.getGroupArray(data), getGroupList: () => this.getGroupList(data), getGroupMap: () => this.getGroupMap(data), - gl: new Map(), + gl: new Map, + gml: new Map, request_list: [], getSystemMsg: () => Bot[data.self_id].request_list, @@ -617,8 +605,7 @@ Bot.adapter.push(new class gocqhttpAdapter { Bot[data.self_id].getGroupMap() logger.mark(`${logger.blue(`[${data.self_id}]`)} ${this.name}(${this.id}) ${Bot[data.self_id].version.app_full_name} 已连接`) - Bot.emit(`connect.${data.self_id}`, Bot[data.self_id]) - Bot.emit("connect", Bot[data.self_id]) + Bot.em(`connect.${data.self_id}`, data) } makeMessage(data) { @@ -644,10 +631,7 @@ Bot.adapter.push(new class gocqhttpAdapter { logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) } - if (data.sub_type) - Bot.emit(`${data.post_type}.${data.message_type}.${data.sub_type}`, data) - Bot.emit(`${data.post_type}.${data.message_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.message_type}.${data.sub_type}`, data) } async makeNotice(data) { @@ -756,10 +740,7 @@ Bot.adapter.push(new class gocqhttpAdapter { Object.defineProperty(data, "friend", { get() { return this.member || {}}}) } - if (data.sub_type) - Bot.emit(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data) - Bot.emit(`${data.post_type}.${data.notice_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data) } makeRequest(data) { @@ -778,10 +759,7 @@ Bot.adapter.push(new class gocqhttpAdapter { } data.bot.request_list.push(data) - if (data.sub_type) - Bot.emit(`${data.post_type}.${data.request_type}.${data.sub_type}`, data) - Bot.emit(`${data.post_type}.${data.request_type}`, data) - Bot.emit(`${data.post_type}`, data) + Bot.em(`${data.post_type}.${data.request_type}.${data.sub_type}`, data) } heartbeat(data) { @@ -847,7 +825,6 @@ Bot.adapter.push(new class gocqhttpAdapter { logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) } } else if (data.echo) { - logger.debug(`请求 API 返回:${logger.cyan(JSON.stringify(data))}`) Bot.emit(data.echo, data) } else { logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) @@ -855,11 +832,10 @@ Bot.adapter.push(new class gocqhttpAdapter { } load() { - Bot.wss[this.path] = new WebSocketServer({ noServer: true }) - Bot.wss[this.path].on("connection", ws => ws - .on("error", logger.error) - .on("message", data => this.message(data, ws)) + if (!Array.isArray(Bot.wsf[this.path])) + Bot.wsf[this.path] = [] + Bot.wsf[this.path].push((ws, ...args) => + ws.on("message", data => this.message(data, ws, ...args)) ) - return true } }) \ No newline at end of file