细节优化

This commit is contained in:
🌌 2023-08-20 08:35:47 +08:00
parent 5e86f18195
commit 9c31f1fda9
8 changed files with 119 additions and 120 deletions

View File

@ -16,3 +16,6 @@ proxyAddress:
online_msg: true online_msg: true
# 上线推送通知的冷却时间 # 上线推送通知的冷却时间
online_msg_exp: 86400 online_msg_exp: 86400
# 单条日志长度
logLength: 1000

View File

@ -5,6 +5,8 @@ import ListenerLoader from "./listener/loader.js"
import { EventEmitter } from "events" import { EventEmitter } from "events"
import express from "express" import express from "express"
import http from "http" import http from "http"
import { WebSocketServer } from "ws"
import _ from "lodash"
export default class Yunzai extends EventEmitter { export default class Yunzai extends EventEmitter {
constructor() { constructor() {
@ -13,11 +15,40 @@ export default class Yunzai extends EventEmitter {
this.adapter = [] this.adapter = []
this.express = express() this.express = express()
this.server = http.createServer(this.express) this.server = http.createServer(this.express)
this.wss = {}
this.server.on("upgrade", (req, socket, head) => { this.server.on("upgrade", (req, socket, head) => {
const wss = this.wss[req.url.split("/")[1]] this.wss.handleUpgrade(req, socket, head, conn => {
if (wss) wss.handleUpgrade(req, socket, head, conn => wss.emit("connection", conn, req)) 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() { async run() {
@ -30,7 +61,7 @@ export default class Yunzai extends EventEmitter {
serverLoad() { serverLoad() {
this.express.use(req => { 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") 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 host = this.server.address().address
const port = this.server.address().port const port = this.server.address().port
logger.mark(`启动 HTTP 服务器:${logger.green(`http://[${host}]:${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}`)}`) logger.info(`本机 ${i} 连接地址:${logger.blue(`ws://localhost:${port}/${i}`)}`)
}) })
} }
@ -60,7 +91,7 @@ export default class Yunzai extends EventEmitter {
} }
getFriendMap() { getFriendMap() {
const map = new Map() const map = new Map
for (const bot_id of this.uin) for (const bot_id of this.uin)
for (const [id, i] of this[bot_id].fl || []) for (const [id, i] of this[bot_id].fl || [])
map.set(id, { ...i, bot_id }) map.set(id, { ...i, bot_id })
@ -85,13 +116,20 @@ export default class Yunzai extends EventEmitter {
} }
getGroupMap() { getGroupMap() {
const map = new Map() const map = new Map
for (const bot_id of this.uin) for (const bot_id of this.uin)
for (const [id, i] of this[bot_id].gl || []) for (const [id, i] of this[bot_id].gl || [])
map.set(id, { ...i, bot_id }) map.set(id, { ...i, bot_id })
return map return map
} }
get gl() { return this.getGroupMap() } 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) { pickFriend(user_id) {
user_id = Number(user_id) || String(user_id) user_id = Number(user_id) || String(user_id)
@ -123,7 +161,7 @@ export default class Yunzai extends EventEmitter {
return new Promise(resolve => return new Promise(resolve =>
this.once(`connect.${bot_id}`, data => this.once(`connect.${bot_id}`, data =>
resolve(data.pickFriend(user_id).sendMsg(msg)))) resolve(data.bot.pickFriend(user_id).sendMsg(msg))))
} catch (err) { } catch (err) {
logger.error(`${logger.blue(`[${bot_id}]`)} 发送好友消息失败:[$${user_id}] ${err}`) logger.error(`${logger.blue(`[${bot_id}]`)} 发送好友消息失败:[$${user_id}] ${err}`)
} }
@ -140,7 +178,7 @@ export default class Yunzai extends EventEmitter {
return new Promise(resolve => return new Promise(resolve =>
this.once(`connect.${bot_id}`, data => this.once(`connect.${bot_id}`, data =>
resolve(data.pickGroup(group_id).sendMsg(msg)))) resolve(data.bot.pickGroup(group_id).sendMsg(msg))))
} catch (err) { } catch (err) {
logger.error(`${logger.blue(`[${bot_id}]`)} 发送群消息失败:[$${group_id}] ${err}`) logger.error(`${logger.blue(`[${bot_id}]`)} 发送群消息失败:[$${group_id}] ${err}`)
} }

View File

@ -1,20 +1,23 @@
import EventListener from '../listener/listener.js' import EventListener from "../listener/listener.js"
import cfg from '../config/config.js' import cfg from "../config/config.js"
/** /**
* 监听连接事件 * 监听连接事件
*/ */
export default class connectEvent extends EventListener { export default class connectEvent extends EventListener {
constructor () { constructor() {
super({ event: 'connect' }) 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 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 if (await redis.get(key)) return
redis.set(key, "1", { EX: cfg.bot.online_msg_exp }) redis.set(key, "1", { EX: cfg.bot.online_msg_exp })
for (const i of cfg.master[e.uin] ?? []) for (const i of cfg.master[e.self_id] || [])
e.pickFriend(i).sendMsg(`欢迎使用【TRSS-Yunzai v${cfg.package.version}\n【#帮助】查看指令说明\n【#状态】查看运行状态\n【#日志】查看运行日志\n【#重启】重新启动\n【#更新】拉取 Git 更新\n【#全部更新】更新全部插件\n【#更新日志】查看更新日志\n【#设置主人】设置主人账号\n【#安装插件】查看可安装插件`) e.bot.pickFriend(i).sendMsg(`欢迎使用【TRSS-Yunzai v${cfg.package.version}\n【#帮助】查看指令说明\n【#状态】查看运行状态\n【#日志】查看运行日志\n【#重启】重新启动\n【#更新】拉取 Git 更新\n【#全部更新】更新全部插件\n【#更新日志】查看更新日志\n【#设置主人】设置主人账号\n【#安装插件】查看可安装插件`)
} }
} }

View File

@ -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}`) 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.em(`${data.post_type}.${data.message_type}`, data)
Bot.emit(`${data.post_type}`, data)
} }
load() { load() {
@ -148,7 +147,9 @@ Bot.adapter.push(new class stdinAdapter {
group_name: this.name, group_name: this.name,
}), }),
get gl() { return this.fl }, 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)) if (!Bot.uin.includes(this.id))
Bot.uin.push(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())) process[this.id].on("data", data => this.message(data.toString()))
logger.mark(`${logger.blue(`[${this.id}]`)} ${this.name}(${this.id}) 已连接`) logger.mark(`${logger.blue(`[${this.id}]`)} ${this.name}(${this.id}) 已连接`)
Bot.emit(`connect.${this.id}`, Bot[this.id]) Bot.em(`connect.${this.id}`, { self_id: this.id })
Bot.emit("connect", Bot[this.id])
} }
}) })

View File

@ -32,7 +32,7 @@
"node-xlsx": "^0.23.0", "node-xlsx": "^0.23.0",
"oicq": "link:lib/modules/oicq", "oicq": "link:lib/modules/oicq",
"pm2": "^5.3.0", "pm2": "^5.3.0",
"puppeteer": "^21.0.3", "puppeteer": "^21.1.0",
"redis": "^4.6.7", "redis": "^4.6.7",
"sequelize": "^6.32.1", "sequelize": "^6.32.1",
"sqlite3": "^5.1.6", "sqlite3": "^5.1.6",
@ -42,7 +42,7 @@
"devDependencies": { "devDependencies": {
"eslint": "^8.47.0", "eslint": "^8.47.0",
"eslint-config-standard": "^17.1.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-n": "^16.0.1",
"eslint-plugin-promise": "^6.1.1" "eslint-plugin-promise": "^6.1.1"
}, },

View File

@ -1,4 +1,3 @@
import { WebSocketServer } from "ws"
import { randomUUID } from "crypto" import { randomUUID } from "crypto"
import path from "node:path" import path from "node:path"
import fs from "node:fs" import fs from "node:fs"
@ -32,9 +31,8 @@ Bot.adapter.push(new class ComWeChatAdapter {
sendApi(ws, action, params = {}) { sendApi(ws, action, params = {}) {
const echo = randomUUID() const echo = randomUUID()
const msg = JSON.stringify({ action, params, echo }) const msg = { action, params, echo }
logger.debug(`发送 API 请求:${logger.cyan(this.makeLog(msg))}`) ws.sendMsg(msg)
ws.send(msg)
return new Promise(resolve => return new Promise(resolve =>
Bot.once(echo, data => Bot.once(echo, data =>
resolve({ ...data, ...data.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) return Bot.sendForwardMsg(msg => this.sendFriendMsg(data, msg), msg.data)
const message = await this.makeMsg(data, msg) 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", { return data.sendApi("send_message", {
detail_type: "private", detail_type: "private",
user_id: data.user_id, 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) return Bot.sendForwardMsg(msg => this.sendGroupMsg(data, msg), msg.data)
const message = await this.makeMsg(data, msg) 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", { return data.sendApi("send_message", {
detail_type: "group", detail_type: "group",
group_id: data.group_id, group_id: data.group_id,
@ -212,7 +210,7 @@ Bot.adapter.push(new class ComWeChatAdapter {
} }
async getMemberMap(data) { async getMemberMap(data) {
const map = new Map() const map = new Map
for (const i of (await this.getMemberArray(data))) for (const i of (await this.getMemberArray(data)))
map.set(i.user_id, i) map.set(i.user_id, i)
return map return map
@ -300,14 +298,15 @@ Bot.adapter.push(new class ComWeChatAdapter {
getFriendArray: () => this.getFriendArray(data), getFriendArray: () => this.getFriendArray(data),
getFriendList: () => this.getFriendList(data), getFriendList: () => this.getFriendList(data),
getFriendMap: () => this.getFriendMap(data), getFriendMap: () => this.getFriendMap(data),
fl: new Map(), fl: new Map,
pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id), pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id),
pickGroup: group_id => this.pickGroup(data, group_id), pickGroup: group_id => this.pickGroup(data, group_id),
getGroupArray: () => this.getGroupArray(data), getGroupArray: () => this.getGroupArray(data),
getGroupList: () => this.getGroupList(data), getGroupList: () => this.getGroupList(data),
getGroupMap: () => this.getGroupMap(data), getGroupMap: () => this.getGroupMap(data),
gl: new Map(), gl: new Map,
gml: new Map,
} }
if (!Bot.uin.includes(data.self_id)) if (!Bot.uin.includes(data.self_id))
@ -324,8 +323,7 @@ Bot.adapter.push(new class ComWeChatAdapter {
Bot[data.self_id].getGroupMap() 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} 已连接`) 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.em(`connect.${data.self_id}`, data)
Bot.emit("connect", Bot[data.self_id])
} }
makeMessage(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))}`) logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
} }
Bot.emit(`${data.post_type}.${data.message_type}`, data) Bot.em(`${data.post_type}.${data.message_type}`, data)
Bot.emit(`${data.post_type}`, data)
} }
makeNotice(data) { makeNotice(data) {
@ -423,9 +420,7 @@ Bot.adapter.push(new class ComWeChatAdapter {
if (!data.sub_type) if (!data.sub_type)
data.sub_type = data.detail_type.split("_").pop() data.sub_type = data.detail_type.split("_").pop()
Bot.emit(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data) Bot.em(`${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)
} }
makeRequest(data) { makeRequest(data) {
@ -446,9 +441,7 @@ Bot.adapter.push(new class ComWeChatAdapter {
if (!data.sub_type) if (!data.sub_type)
data.sub_type = data.detail_type.split("_").pop() data.sub_type = data.detail_type.split("_").pop()
Bot.emit(`${data.post_type}.${data.request_type}.${data.sub_type}`, data) Bot.em(`${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)
} }
makeMeta(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))}`) logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
} }
} else if (data.echo) { } else if (data.echo) {
logger.debug(`请求 API 返回:${logger.cyan(JSON.stringify(data))}`)
Bot.emit(data.echo, data) Bot.emit(data.echo, data)
} else { } else {
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
@ -511,11 +503,10 @@ Bot.adapter.push(new class ComWeChatAdapter {
} }
load() { load() {
Bot.wss[this.path] = new WebSocketServer({ noServer: true }) if (!Array.isArray(Bot.wsf[this.path]))
Bot.wss[this.path].on("connection", ws => ws Bot.wsf[this.path] = []
.on("error", logger.error) Bot.wsf[this.path].push((ws, ...args) =>
.on("message", data => this.message(data, ws)) ws.on("message", data => this.message(data, ws, ...args))
) )
return true
} }
}) })

View File

@ -1,4 +1,3 @@
import { WebSocketServer } from "ws"
import { randomUUID } from "crypto" import { randomUUID } from "crypto"
import path from "node:path" import path from "node:path"
import fs from "node:fs" import fs from "node:fs"
@ -29,12 +28,6 @@ Bot.adapter.push(new class GSUIDCoreAdapter {
return this.toStr(msg).replace(/base64:\/\/.*?"/g, "base64://...\"") 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) { makeMsg(msg) {
if (!Array.isArray(msg)) if (!Array.isArray(msg))
msg = [msg] msg = [msg]
@ -81,7 +74,7 @@ Bot.adapter.push(new class GSUIDCoreAdapter {
sendFriendMsg(data, msg) { sendFriendMsg(data, msg) {
const content = this.makeMsg(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({ data.bot.sendApi({
bot_id: data.bot.bot_id, bot_id: data.bot.bot_id,
bot_self_id: data.bot.bot_self_id, bot_self_id: data.bot.bot_self_id,
@ -95,7 +88,7 @@ Bot.adapter.push(new class GSUIDCoreAdapter {
sendGroupMsg(data, msg) { sendGroupMsg(data, msg) {
const target = data.group_id.split("-") const target = data.group_id.split("-")
const content = this.makeMsg(msg) 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({ data.bot.sendApi({
bot_id: data.bot.bot_id, bot_id: data.bot.bot_id,
bot_self_id: data.bot.bot_self_id, bot_self_id: data.bot.bot_self_id,
@ -163,16 +156,13 @@ Bot.adapter.push(new class GSUIDCoreAdapter {
get pickUser() { return this.pickFriend }, get pickUser() { return this.pickFriend },
pickMember: (group_id, user_id) => this.pickMember(data.self_id, group_id, user_id), pickMember: (group_id, user_id) => this.pickMember(data.self_id, group_id, user_id),
pickGroup: group_id => this.pickGroup(data.self_id, group_id), pickGroup: group_id => this.pickGroup(data.self_id, group_id),
fl: new Map(), fl: new Map,
gl: 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}) 已连接`) logger.mark(`${logger.blue(`[${data.self_id}]`)} ${this.name}(${this.id}) 已连接`)
Bot.emit(`connect.${data.self_id}`, Bot[data.self_id]) Bot.em(`connect.${data.self_id}`, data)
Bot.emit("connect", Bot[data.self_id])
} }
message(data, ws) { message(data, ws) {
@ -183,7 +173,7 @@ Bot.adapter.push(new class GSUIDCoreAdapter {
} }
data.self_id = data.bot_self_id 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]) if (Bot[data.self_id])
Bot[data.self_id].sendApi = data.sendApi Bot[data.self_id].sendApi = data.sendApi
else 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}`) 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.em(`${data.post_type}.${data.message_type}`, data)
Bot.emit(`${data.post_type}`, data)
} }
load() { load() {
Bot.wss[this.path] = new WebSocketServer({ noServer: true }) if (!Array.isArray(Bot.wsf[this.path]))
Bot.wss[this.path].on("connection", ws => ws Bot.wsf[this.path] = []
.on("error", logger.error) Bot.wsf[this.path].push((ws, ...args) =>
.on("message", data => this.message(data, ws)) ws.on("message", data => this.message(data, ws, ...args))
) )
return true
} }
}) })

View File

@ -1,4 +1,3 @@
import { WebSocketServer } from "ws"
import { randomUUID } from "crypto" import { randomUUID } from "crypto"
import path from "node:path" import path from "node:path"
import fs from "node:fs" import fs from "node:fs"
@ -31,9 +30,8 @@ Bot.adapter.push(new class gocqhttpAdapter {
sendApi(ws, action, params) { sendApi(ws, action, params) {
const echo = randomUUID() const echo = randomUUID()
const msg = JSON.stringify({ action, params, echo }) const msg = { action, params, echo }
logger.debug(`发送 API 请求:${logger.cyan(this.makeLog(msg))}`) ws.sendMsg(msg)
ws.send(msg)
return new Promise(resolve => return new Promise(resolve =>
Bot.once(echo, data => Bot.once(echo, data =>
resolve({ ...data, ...data.data }))) resolve({ ...data, ...data.data })))
@ -64,7 +62,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
if (msg?.type == "node") if (msg?.type == "node")
return this.sendFriendForwardMsg(data, msg.data) 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", { return data.sendApi("send_msg", {
user_id: data.user_id, user_id: data.user_id,
message: this.makeMsg(msg), message: this.makeMsg(msg),
@ -75,7 +73,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
if (msg?.type == "node") if (msg?.type == "node")
return this.sendGroupForwardMsg(data, msg.data) 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", { return data.sendApi("send_msg", {
group_id: data.group_id, group_id: data.group_id,
message: this.makeMsg(msg), message: this.makeMsg(msg),
@ -84,9 +82,9 @@ Bot.adapter.push(new class gocqhttpAdapter {
sendGuildMsg(data, msg) { sendGuildMsg(data, msg) {
if (msg?.type == "node") 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", { return data.sendApi("send_guild_channel_msg", {
guild_id: data.guild_id, guild_id: data.guild_id,
channel_id: data.channel_id, channel_id: data.channel_id,
@ -132,7 +130,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
async sendFriendForwardMsg(data, msg) { 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", { msg = await data.sendApi("send_private_forward_msg", {
user_id: data.user_id, user_id: data.user_id,
messages: this.makeForwardMsg(msg), messages: this.makeForwardMsg(msg),
@ -141,7 +139,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
async sendGroupForwardMsg(data, msg) { 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", { msg = await data.sendApi("send_group_forward_msg", {
group_id: data.group_id, group_id: data.group_id,
messages: this.makeForwardMsg(msg), messages: this.makeForwardMsg(msg),
@ -149,13 +147,6 @@ Bot.adapter.push(new class gocqhttpAdapter {
return msg 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) { async getFriendArray(data) {
return (await data.sendApi("get_friend_list")).data return (await data.sendApi("get_friend_list")).data
} }
@ -228,7 +219,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
async getMemberMap(data) { async getMemberMap(data) {
const map = new Map() const map = new Map
for (const i of (await this.getMemberArray(data))) for (const i of (await this.getMemberArray(data)))
map.set(i.user_id, i) map.set(i.user_id, i)
return map return map
@ -258,7 +249,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
async getGuildChannelMap(data) { async getGuildChannelMap(data) {
const map = new Map() const map = new Map
for (const i of (await this.getGuildChannelArray(data))) for (const i of (await this.getGuildChannelArray(data)))
map.set(i.channel_id, i) map.set(i.channel_id, i)
return map return map
@ -292,7 +283,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
async getGuildMemberMap(data) { async getGuildMemberMap(data) {
const map = new Map() const map = new Map
for (const i of (await this.getGuildMemberArray(data))) for (const i of (await this.getGuildMemberArray(data)))
map.set(i.user_id, i) map.set(i.user_id, i)
return map return map
@ -366,7 +357,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
async sendFriendFile(data, file, name) { 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", { return data.sendApi("upload_private_file", {
user_id: data.user_id, user_id: data.user_id,
...await this.makeFile(data, file, name), ...await this.makeFile(data, file, name),
@ -464,7 +455,6 @@ Bot.adapter.push(new class gocqhttpAdapter {
getMsg: message_id => this.getMsg(i, message_id), getMsg: message_id => this.getMsg(i, message_id),
recallMsg: message_id => this.recallMsg(i, message_id), recallMsg: message_id => this.recallMsg(i, message_id),
getForwardMsg: message_id => this.getForwardMsg(i, message_id), getForwardMsg: message_id => this.getForwardMsg(i, message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendFriendForwardMsg(i, msg), sendForwardMsg: msg => this.sendFriendForwardMsg(i, msg),
sendFile: (file, name) => this.sendFriendFile(i, file, name), sendFile: (file, name) => this.sendFriendFile(i, file, name),
getInfo: () => this.getFriendInfo(i), getInfo: () => this.getFriendInfo(i),
@ -518,8 +508,6 @@ Bot.adapter.push(new class gocqhttpAdapter {
getMsg: message_id => this.getMsg(i, message_id), getMsg: message_id => this.getMsg(i, message_id),
recallMsg: message_id => this.recallMsg(i, message_id), recallMsg: message_id => this.recallMsg(i, message_id),
getForwardMsg: message_id => this.getForwardMsg(i, message_id), getForwardMsg: message_id => this.getForwardMsg(i, message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendGuildForwardMsg(i, msg),
getInfo: () => this.getGuildInfo(i), getInfo: () => this.getGuildInfo(i),
getChannelArray: () => this.getGuildChannelArray(i), getChannelArray: () => this.getGuildChannelArray(i),
getChannelList: () => this.getGuildChannelList(i), getChannelList: () => this.getGuildChannelList(i),
@ -542,7 +530,6 @@ Bot.adapter.push(new class gocqhttpAdapter {
getMsg: message_id => this.getMsg(i, message_id), getMsg: message_id => this.getMsg(i, message_id),
recallMsg: message_id => this.recallMsg(i, message_id), recallMsg: message_id => this.recallMsg(i, message_id),
getForwardMsg: message_id => this.getForwardMsg(i, message_id), getForwardMsg: message_id => this.getForwardMsg(i, message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendGroupForwardMsg(i, msg), sendForwardMsg: msg => this.sendGroupForwardMsg(i, msg),
sendFile: (file, name) => this.sendGroupFile(i, file, undefined, name), sendFile: (file, name) => this.sendGroupFile(i, file, undefined, name),
getInfo: () => this.getGroupInfo(i), getInfo: () => this.getGroupInfo(i),
@ -581,14 +568,15 @@ Bot.adapter.push(new class gocqhttpAdapter {
getFriendArray: () => this.getFriendArray(data), getFriendArray: () => this.getFriendArray(data),
getFriendList: () => this.getFriendList(data), getFriendList: () => this.getFriendList(data),
getFriendMap: () => this.getFriendMap(data), getFriendMap: () => this.getFriendMap(data),
fl: new Map(), fl: new Map,
pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id), pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id),
pickGroup: group_id => this.pickGroup(data, group_id), pickGroup: group_id => this.pickGroup(data, group_id),
getGroupArray: () => this.getGroupArray(data), getGroupArray: () => this.getGroupArray(data),
getGroupList: () => this.getGroupList(data), getGroupList: () => this.getGroupList(data),
getGroupMap: () => this.getGroupMap(data), getGroupMap: () => this.getGroupMap(data),
gl: new Map(), gl: new Map,
gml: new Map,
request_list: [], request_list: [],
getSystemMsg: () => Bot[data.self_id].request_list, getSystemMsg: () => Bot[data.self_id].request_list,
@ -617,8 +605,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
Bot[data.self_id].getGroupMap() Bot[data.self_id].getGroupMap()
logger.mark(`${logger.blue(`[${data.self_id}]`)} ${this.name}(${this.id}) ${Bot[data.self_id].version.app_full_name} 已连接`) 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.em(`connect.${data.self_id}`, data)
Bot.emit("connect", Bot[data.self_id])
} }
makeMessage(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))}`) logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
} }
if (data.sub_type) Bot.em(`${data.post_type}.${data.message_type}.${data.sub_type}`, data)
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)
} }
async makeNotice(data) { async makeNotice(data) {
@ -756,10 +740,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
Object.defineProperty(data, "friend", { get() { return this.member || {}}}) Object.defineProperty(data, "friend", { get() { return this.member || {}}})
} }
if (data.sub_type) Bot.em(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data)
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)
} }
makeRequest(data) { makeRequest(data) {
@ -778,10 +759,7 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
data.bot.request_list.push(data) data.bot.request_list.push(data)
if (data.sub_type) Bot.em(`${data.post_type}.${data.request_type}.${data.sub_type}`, data)
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)
} }
heartbeat(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))}`) logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
} }
} else if (data.echo) { } else if (data.echo) {
logger.debug(`请求 API 返回:${logger.cyan(JSON.stringify(data))}`)
Bot.emit(data.echo, data) Bot.emit(data.echo, data)
} else { } else {
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`) logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
@ -855,11 +832,10 @@ Bot.adapter.push(new class gocqhttpAdapter {
} }
load() { load() {
Bot.wss[this.path] = new WebSocketServer({ noServer: true }) if (!Array.isArray(Bot.wsf[this.path]))
Bot.wss[this.path].on("connection", ws => ws Bot.wsf[this.path] = []
.on("error", logger.error) Bot.wsf[this.path].push((ws, ...args) =>
.on("message", data => this.message(data, ws)) ws.on("message", data => this.message(data, ws, ...args))
) )
return true
} }
}) })