2023-05-11 16:03:18 +08:00
|
|
|
|
import { randomUUID } from "crypto"
|
2023-06-18 11:57:31 +08:00
|
|
|
|
import path from "node:path"
|
|
|
|
|
import fs from "node:fs"
|
2023-07-07 10:21:01 +08:00
|
|
|
|
import { fileTypeFromBuffer } from "file-type"
|
2023-05-11 16:03:18 +08:00
|
|
|
|
|
2023-06-26 23:32:52 +08:00
|
|
|
|
Bot.adapter.push(new class ComWeChatAdapter {
|
|
|
|
|
constructor() {
|
|
|
|
|
this.id = "WeChat"
|
|
|
|
|
this.name = "ComWeChat"
|
2023-07-05 17:02:48 +08:00
|
|
|
|
this.path = this.name
|
2023-06-26 23:32:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-11 16:03:18 +08:00
|
|
|
|
toStr(data) {
|
|
|
|
|
switch (typeof data) {
|
|
|
|
|
case "string":
|
|
|
|
|
return data
|
|
|
|
|
case "number":
|
|
|
|
|
return String(data)
|
|
|
|
|
case "object":
|
|
|
|
|
if (Buffer.isBuffer(data))
|
|
|
|
|
return Buffer.from(data, "utf8").toString()
|
|
|
|
|
else
|
|
|
|
|
return JSON.stringify(data)
|
|
|
|
|
}
|
2023-07-05 17:02:48 +08:00
|
|
|
|
return data
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
makeLog(msg) {
|
2023-09-12 13:28:11 +08:00
|
|
|
|
return this.toStr(msg).replace(/(base64:\/\/|"type":"data","data":").*?"/g, '$1..."')
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-19 22:59:24 +08:00
|
|
|
|
sendApi(ws, action, params = {}) {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
const echo = randomUUID()
|
2023-11-04 15:56:13 +08:00
|
|
|
|
ws.sendMsg({ action, params, echo })
|
2023-05-11 16:03:18 +08:00
|
|
|
|
return new Promise(resolve =>
|
|
|
|
|
Bot.once(echo, data =>
|
|
|
|
|
resolve({ ...data, ...data.data })))
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-05 17:02:48 +08:00
|
|
|
|
async fileName(file) {
|
|
|
|
|
try {
|
|
|
|
|
if (file.match(/^base64:\/\//)) {
|
|
|
|
|
const buffer = Buffer.from(file.replace(/^base64:\/\//, ""), "base64")
|
|
|
|
|
const type = await fileTypeFromBuffer(buffer)
|
|
|
|
|
return `${Date.now()}.${type.ext}`
|
|
|
|
|
} else {
|
|
|
|
|
return path.basename(file)
|
|
|
|
|
}
|
|
|
|
|
} catch (err) {
|
|
|
|
|
logger.error(`文件类型检测错误:${logger.red(err)}`)
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async uploadFile(data, file, name) {
|
|
|
|
|
const opts = { name: name || await this.fileName(file) || randomUUID() }
|
2023-06-18 11:57:31 +08:00
|
|
|
|
|
|
|
|
|
if (file.match(/^https?:\/\//)) {
|
|
|
|
|
opts.type = "url"
|
|
|
|
|
opts.url = file
|
|
|
|
|
} else if (file.match(/^base64:\/\//)) {
|
|
|
|
|
opts.type = "data"
|
|
|
|
|
opts.data = file.replace(/^base64:\/\//, "")
|
|
|
|
|
} else if (fs.existsSync(file)) {
|
2023-09-12 13:28:11 +08:00
|
|
|
|
opts.type = "data"
|
2023-06-18 11:57:31 +08:00
|
|
|
|
opts.data = fs.readFileSync(file).toString("base64")
|
|
|
|
|
} else {
|
|
|
|
|
opts.type = "path"
|
|
|
|
|
opts.path = file
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-05 17:02:48 +08:00
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 上传文件:${this.makeLog(opts)}`)
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return data.bot.sendApi("upload_file", opts)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async makeMsg(data, msg) {
|
|
|
|
|
if (!Array.isArray(msg))
|
|
|
|
|
msg = [msg]
|
|
|
|
|
const msgs = []
|
|
|
|
|
for (let i of msg) {
|
|
|
|
|
if (typeof i != "object")
|
|
|
|
|
i = { type: "text", data: { text: i }}
|
|
|
|
|
else if (!i.data)
|
|
|
|
|
i = { type: i.type, data: { ...i, type: undefined }}
|
|
|
|
|
if (i.data.file)
|
2023-09-12 13:28:11 +08:00
|
|
|
|
i.data = { file_id: (await this.uploadFile(data, i.data.file, i.data.name)).file_id }
|
2023-07-05 17:02:48 +08:00
|
|
|
|
|
2023-05-11 16:03:18 +08:00
|
|
|
|
switch (i.type) {
|
2023-07-05 17:02:48 +08:00
|
|
|
|
case "text":
|
|
|
|
|
case "image":
|
2023-09-12 13:28:11 +08:00
|
|
|
|
case "file":
|
|
|
|
|
case "wx.emoji":
|
|
|
|
|
case "wx.link":
|
2023-07-05 17:02:48 +08:00
|
|
|
|
break
|
|
|
|
|
case "record":
|
|
|
|
|
case "video":
|
|
|
|
|
i.type = "file"
|
|
|
|
|
break
|
2023-05-11 16:03:18 +08:00
|
|
|
|
case "at":
|
|
|
|
|
if (i.data.qq == "all")
|
2023-07-05 17:02:48 +08:00
|
|
|
|
i = { type: "mention_all", data: {}}
|
2023-05-11 16:03:18 +08:00
|
|
|
|
else
|
2023-07-05 17:02:48 +08:00
|
|
|
|
i = { type: "mention", data: { user_id: i.data.qq }}
|
2023-05-11 16:03:18 +08:00
|
|
|
|
break
|
|
|
|
|
case "reply":
|
2023-07-07 17:48:53 +08:00
|
|
|
|
continue
|
2023-05-11 16:03:18 +08:00
|
|
|
|
default:
|
2023-07-05 17:02:48 +08:00
|
|
|
|
i = { type: "text", data: { text: JSON.stringify(i) }}
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
2023-07-05 17:02:48 +08:00
|
|
|
|
msgs.push(i)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
return msgs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async sendFriendMsg(data, msg) {
|
2023-06-18 11:57:31 +08:00
|
|
|
|
if (msg?.type == "node")
|
2023-07-05 17:02:48 +08:00
|
|
|
|
return Bot.sendForwardMsg(msg => this.sendFriendMsg(data, msg), msg.data)
|
2023-06-18 11:57:31 +08:00
|
|
|
|
|
2023-07-05 17:02:48 +08:00
|
|
|
|
const message = await this.makeMsg(data, msg)
|
2023-08-20 08:35:47 +08:00
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id} => ${data.user_id}]`)} 发送好友消息:${this.makeLog(message)}`)
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return data.bot.sendApi("send_message", {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
detail_type: "private",
|
|
|
|
|
user_id: data.user_id,
|
2023-07-05 17:02:48 +08:00
|
|
|
|
message,
|
2023-05-11 16:03:18 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async sendGroupMsg(data, msg) {
|
2023-06-18 11:57:31 +08:00
|
|
|
|
if (msg?.type == "node")
|
2023-07-05 17:02:48 +08:00
|
|
|
|
return Bot.sendForwardMsg(msg => this.sendGroupMsg(data, msg), msg.data)
|
2023-06-18 11:57:31 +08:00
|
|
|
|
|
2023-07-05 17:02:48 +08:00
|
|
|
|
const message = await this.makeMsg(data, msg)
|
2023-08-20 08:35:47 +08:00
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id} => ${data.group_id}]`)} 发送群消息:${this.makeLog(message)}`)
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return data.bot.sendApi("send_message", {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
detail_type: "group",
|
|
|
|
|
group_id: data.group_id,
|
2023-07-05 17:02:48 +08:00
|
|
|
|
message,
|
2023-05-11 16:03:18 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getFriendArray(data) {
|
2023-05-26 16:53:00 +08:00
|
|
|
|
const array = []
|
2023-08-21 11:55:17 +08:00
|
|
|
|
for (const i of (await data.bot.sendApi("get_friend_list")).data)
|
2023-05-26 16:53:00 +08:00
|
|
|
|
array.push({
|
|
|
|
|
...i,
|
|
|
|
|
nickname: i.user_remark == "null" ? i.user_displayname || i.user_name : i.user_remark,
|
|
|
|
|
})
|
|
|
|
|
return array
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getFriendList(data) {
|
|
|
|
|
const array = []
|
2023-07-08 21:40:55 +08:00
|
|
|
|
for (const { user_id } of (await this.getFriendArray(data)))
|
|
|
|
|
array.push(user_id)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
return array
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getFriendMap(data) {
|
|
|
|
|
for (const i of (await this.getFriendArray(data)))
|
2023-08-21 11:55:17 +08:00
|
|
|
|
data.bot.fl.set(i.user_id, i)
|
|
|
|
|
return data.bot.fl
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getFriendInfo(data) {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return data.bot.sendApi("get_user_info", {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
user_id: data.user_id,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getGroupArray(data) {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return (await data.bot.sendApi("get_group_list")).data
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getGroupList(data) {
|
|
|
|
|
const array = []
|
2023-07-08 21:40:55 +08:00
|
|
|
|
for (const { group_id } of (await this.getGroupArray(data)))
|
|
|
|
|
array.push(group_id)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
return array
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getGroupMap(data) {
|
|
|
|
|
for (const i of (await this.getGroupArray(data)))
|
2023-08-21 11:55:17 +08:00
|
|
|
|
data.bot.gl.set(i.group_id, i)
|
|
|
|
|
return data.bot.gl
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getGroupInfo(data) {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return data.bot.sendApi("get_group_info", {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
group_id: data.group_id,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-28 19:57:42 +08:00
|
|
|
|
async getMemberArray(data) {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return (await data.bot.sendApi("get_group_member_list", {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
group_id: data.group_id,
|
|
|
|
|
})).data
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-28 19:57:42 +08:00
|
|
|
|
async getMemberList(data) {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
const array = []
|
2023-07-08 21:40:55 +08:00
|
|
|
|
for (const { user_id } of (await this.getMemberArray(data)))
|
|
|
|
|
array.push(user_id)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
return array
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-28 19:57:42 +08:00
|
|
|
|
async getMemberMap(data) {
|
2023-08-20 08:35:47 +08:00
|
|
|
|
const map = new Map
|
2023-06-28 19:57:42 +08:00
|
|
|
|
for (const i of (await this.getMemberArray(data)))
|
2023-05-11 16:03:18 +08:00
|
|
|
|
map.set(i.user_id, i)
|
|
|
|
|
return map
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-28 19:57:42 +08:00
|
|
|
|
getMemberInfo(data) {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
return data.bot.sendApi("get_group_member_info", {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
group_id: data.group_id,
|
|
|
|
|
user_id: data.user_id,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-18 11:57:31 +08:00
|
|
|
|
pickFriend(data, user_id) {
|
2023-06-26 23:32:52 +08:00
|
|
|
|
const i = {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
...data.bot.fl.get(user_id),
|
2023-06-26 23:32:52 +08:00
|
|
|
|
...data,
|
|
|
|
|
user_id,
|
|
|
|
|
}
|
2023-06-18 11:57:31 +08:00
|
|
|
|
return {
|
2023-06-26 23:32:52 +08:00
|
|
|
|
...i,
|
2023-06-18 11:57:31 +08:00
|
|
|
|
sendMsg: msg => this.sendFriendMsg(i, msg),
|
2023-09-12 13:28:11 +08:00
|
|
|
|
sendFile: (file, name) => this.sendFriendMsg(i, segment.file(file, name)),
|
2023-06-18 11:57:31 +08:00
|
|
|
|
getInfo: () => this.getFriendInfo(i),
|
|
|
|
|
getAvatarUrl: async () => (await this.getFriendInfo(i))["wx.avatar"],
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pickMember(data, group_id, user_id) {
|
2023-06-26 23:32:52 +08:00
|
|
|
|
const i = {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
...data.bot.fl.get(user_id),
|
2023-06-26 23:32:52 +08:00
|
|
|
|
...data,
|
|
|
|
|
group_id,
|
|
|
|
|
user_id,
|
|
|
|
|
}
|
2023-06-18 11:57:31 +08:00
|
|
|
|
return {
|
|
|
|
|
...this.pickFriend(i, user_id),
|
2023-06-26 23:32:52 +08:00
|
|
|
|
...i,
|
2023-06-28 19:57:42 +08:00
|
|
|
|
getInfo: () => this.getMemberInfo(i),
|
|
|
|
|
getAvatarUrl: async () => (await this.getMemberInfo(i))["wx.avatar"],
|
2023-06-18 11:57:31 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pickGroup(data, group_id) {
|
2023-06-26 23:32:52 +08:00
|
|
|
|
const i = {
|
2023-08-21 11:55:17 +08:00
|
|
|
|
...data.bot.gl.get(group_id),
|
2023-06-26 23:32:52 +08:00
|
|
|
|
...data,
|
|
|
|
|
group_id,
|
|
|
|
|
}
|
2023-06-18 11:57:31 +08:00
|
|
|
|
return {
|
2023-06-26 23:32:52 +08:00
|
|
|
|
...i,
|
2023-06-18 11:57:31 +08:00
|
|
|
|
sendMsg: msg => this.sendGroupMsg(i, msg),
|
2023-09-12 13:28:11 +08:00
|
|
|
|
sendFile: (file, name) => this.sendGroupMsg(i, segment.file(file, name)),
|
2023-06-18 11:57:31 +08:00
|
|
|
|
getInfo: () => this.getGroupInfo(i),
|
|
|
|
|
getAvatarUrl: async () => (await this.getGroupInfo(i))["wx.avatar"],
|
2023-06-28 19:57:42 +08:00
|
|
|
|
getMemberArray: () => this.getMemberArray(i),
|
|
|
|
|
getMemberList: () => this.getMemberList(i),
|
|
|
|
|
getMemberMap: () => this.getMemberMap(i),
|
2023-06-18 11:57:31 +08:00
|
|
|
|
pickMember: user_id => this.pickMember(i, i.group_id, user_id),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-21 11:55:17 +08:00
|
|
|
|
async connect(data, ws) {
|
2023-06-19 22:59:24 +08:00
|
|
|
|
for (const bot of data.status.bots)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
data.self_id = bot.self.user_id
|
|
|
|
|
|
|
|
|
|
Bot[data.self_id] = {
|
2023-07-05 17:02:48 +08:00
|
|
|
|
adapter: this,
|
2023-08-21 11:55:17 +08:00
|
|
|
|
ws: ws,
|
|
|
|
|
sendApi: (action, params) => this.sendApi(ws, action, params),
|
2023-06-19 22:59:24 +08:00
|
|
|
|
stat: { ...data.status, start_time: data.time },
|
2023-05-11 16:03:18 +08:00
|
|
|
|
|
2023-07-28 12:23:18 +08:00
|
|
|
|
info: {},
|
|
|
|
|
get uin() { return this.info.user_id },
|
|
|
|
|
get nickname() { return this.info.user_name },
|
|
|
|
|
get avatar() { return this.info["wx.avatar"] },
|
|
|
|
|
|
2023-06-18 11:57:31 +08:00
|
|
|
|
pickFriend: user_id => this.pickFriend(data, user_id),
|
2023-07-29 13:47:45 +08:00
|
|
|
|
get pickUser() { return this.pickFriend },
|
2023-05-11 16:03:18 +08:00
|
|
|
|
getFriendArray: () => this.getFriendArray(data),
|
|
|
|
|
getFriendList: () => this.getFriendList(data),
|
|
|
|
|
getFriendMap: () => this.getFriendMap(data),
|
2023-08-20 08:35:47 +08:00
|
|
|
|
fl: new Map,
|
2023-05-11 16:03:18 +08:00
|
|
|
|
|
2023-06-18 11:57:31 +08:00
|
|
|
|
pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id),
|
|
|
|
|
pickGroup: group_id => this.pickGroup(data, group_id),
|
2023-05-11 16:03:18 +08:00
|
|
|
|
getGroupArray: () => this.getGroupArray(data),
|
|
|
|
|
getGroupList: () => this.getGroupList(data),
|
|
|
|
|
getGroupMap: () => this.getGroupMap(data),
|
2023-08-20 08:35:47 +08:00
|
|
|
|
gl: new Map,
|
|
|
|
|
gml: new Map,
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
2023-08-21 11:55:17 +08:00
|
|
|
|
data.bot = Bot[data.self_id]
|
2023-05-11 16:03:18 +08:00
|
|
|
|
|
2023-07-28 12:23:18 +08:00
|
|
|
|
if (!Bot.uin.includes(data.self_id))
|
|
|
|
|
Bot.uin.push(data.self_id)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
|
2023-08-21 11:55:17 +08:00
|
|
|
|
data.bot.info = (await data.bot.sendApi("get_self_info")).data
|
|
|
|
|
data.bot.version = {
|
|
|
|
|
...(await data.bot.sendApi("get_version")).data,
|
2023-06-26 23:32:52 +08:00
|
|
|
|
id: this.id,
|
|
|
|
|
name: this.name,
|
|
|
|
|
}
|
2023-06-19 22:59:24 +08:00
|
|
|
|
|
2023-08-21 11:55:17 +08:00
|
|
|
|
data.bot.getFriendMap()
|
|
|
|
|
data.bot.getGroupMap()
|
2023-05-11 16:03:18 +08:00
|
|
|
|
|
2023-08-21 11:55:17 +08:00
|
|
|
|
logger.mark(`${logger.blue(`[${data.self_id}]`)} ${this.name}(${this.id}) ${data.bot.version.impl}-${data.bot.version.version} 已连接`)
|
2023-08-20 08:35:47 +08:00
|
|
|
|
Bot.em(`connect.${data.self_id}`, data)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
makeMessage(data) {
|
|
|
|
|
data.post_type = data.type
|
|
|
|
|
data.message_type = data.detail_type
|
|
|
|
|
data.raw_message = data.alt_message
|
|
|
|
|
|
2023-06-28 19:57:42 +08:00
|
|
|
|
data.sender = {
|
|
|
|
|
...data.bot.fl.get(data.user_id),
|
|
|
|
|
user_id: data.user_id,
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-11 16:03:18 +08:00
|
|
|
|
const message = []
|
|
|
|
|
for (const i of data.message)
|
|
|
|
|
switch (i.type) {
|
|
|
|
|
case "mention":
|
|
|
|
|
message.push({ type: "at", qq: i.data.user_id })
|
|
|
|
|
break
|
|
|
|
|
case "mention_all":
|
|
|
|
|
message.push({ type: "at", qq: "all" })
|
|
|
|
|
break
|
|
|
|
|
case "voice":
|
|
|
|
|
message.push({ type: "record", ...i.data })
|
|
|
|
|
break
|
2023-07-19 19:18:38 +08:00
|
|
|
|
case "reply":
|
|
|
|
|
message.push({ type: "reply", id: i.data.message_id, user_id: i.data.user_id })
|
|
|
|
|
break
|
2023-05-11 16:03:18 +08:00
|
|
|
|
default:
|
|
|
|
|
message.push({ type: i.type, ...i.data })
|
|
|
|
|
}
|
|
|
|
|
data.message = message
|
|
|
|
|
|
|
|
|
|
switch (data.message_type) {
|
|
|
|
|
case "private":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 好友消息:[${data.user_id}] ${data.raw_message}`)
|
|
|
|
|
break
|
|
|
|
|
case "group":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 群消息:[${data.group_id}, ${data.user_id}] ${data.raw_message}`)
|
|
|
|
|
break
|
|
|
|
|
default:
|
2023-06-30 21:20:06 +08:00
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-20 08:35:47 +08:00
|
|
|
|
Bot.em(`${data.post_type}.${data.message_type}`, data)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-28 19:36:51 +08:00
|
|
|
|
makeNotice(data) {
|
|
|
|
|
data.post_type = data.type
|
|
|
|
|
if (data.group_id)
|
|
|
|
|
data.notice_type = "group"
|
|
|
|
|
else
|
|
|
|
|
data.notice_type = "friend"
|
|
|
|
|
|
|
|
|
|
switch (data.detail_type) {
|
|
|
|
|
case "private_message_delete":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 好友消息撤回:[${data.user_id}] ${data.message_id}`)
|
|
|
|
|
data.sub_type = "recall"
|
|
|
|
|
break
|
|
|
|
|
case "group_message_delete":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 群消息撤回:[${data.group_id}, ${data.operator_id}=>${data.user_id}] ${data.message_id}`)
|
|
|
|
|
data.sub_type = "recall"
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_private_file":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 私聊文件:[${data.user_id}] ${data.file_name} ${data.file_length} ${data.md5}`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_group_file":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 群文件:[${data.group_id}, ${data.user_id}] ${data.file_name} ${data.file_length} ${data.md5}`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_private_redbag":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 好友红包:[${data.user_id}]`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_group_redbag":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 群红包:[${data.group_id}, ${data.user_id}]`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_private_poke":
|
|
|
|
|
data.operator_id = data.from_user_id
|
|
|
|
|
data.target_id = data.user_id
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 好友拍一拍:[${data.operator_id}=>${data.target_id}]`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_group_poke":
|
|
|
|
|
data.operator_id = data.from_user_id
|
|
|
|
|
data.target_id = data.user_id
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 群拍一拍:[${data.group_id}, ${data.operator_id}=>${data.target_id}]`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_private_card":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 好友用户名片:[${data.user_id}] ${data.v3} ${data.v4} ${data.nickname} ${data.head_url} ${data.province} ${data.city} ${data.sex}`)
|
|
|
|
|
break
|
|
|
|
|
case "wx.get_group_card":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 群用户名片:[${data.group_id}, ${data.user_id}] ${data.v3} ${data.v4} ${data.nickname} ${data.head_url} ${data.province} ${data.city} ${data.sex}`)
|
|
|
|
|
break
|
|
|
|
|
default:
|
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知通知:${logger.magenta(JSON.stringify(data))}`)
|
|
|
|
|
}
|
|
|
|
|
if (!data.sub_type)
|
|
|
|
|
data.sub_type = data.detail_type.split("_").pop()
|
|
|
|
|
|
2023-08-20 08:35:47 +08:00
|
|
|
|
Bot.em(`${data.post_type}.${data.notice_type}.${data.sub_type}`, data)
|
2023-07-28 19:36:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
makeRequest(data) {
|
|
|
|
|
data.post_type = data.type
|
|
|
|
|
if (data.group_id)
|
|
|
|
|
data.notice_type = "group"
|
|
|
|
|
else
|
|
|
|
|
data.notice_type = "friend"
|
|
|
|
|
|
|
|
|
|
switch (data.detail_type) {
|
|
|
|
|
case "wx.friend_request":
|
|
|
|
|
logger.info(`${logger.blue(`[${data.self_id}]`)} 加好友请求:[${data.user_id}] ${data.v3} ${data.v4} ${data.nickname} ${data.content} ${data.province} ${data.city}`)
|
|
|
|
|
data.sub_type = "add"
|
|
|
|
|
break
|
|
|
|
|
default:
|
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知请求:${logger.magenta(JSON.stringify(data))}`)
|
|
|
|
|
}
|
|
|
|
|
if (!data.sub_type)
|
|
|
|
|
data.sub_type = data.detail_type.split("_").pop()
|
|
|
|
|
|
2023-08-20 08:35:47 +08:00
|
|
|
|
Bot.em(`${data.post_type}.${data.request_type}.${data.sub_type}`, data)
|
2023-07-28 19:36:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-21 11:55:17 +08:00
|
|
|
|
makeMeta(data, ws) {
|
2023-05-11 16:03:18 +08:00
|
|
|
|
switch (data.detail_type) {
|
2023-06-19 22:59:24 +08:00
|
|
|
|
case "heartbeat":
|
|
|
|
|
break
|
2023-05-11 16:03:18 +08:00
|
|
|
|
case "connect":
|
2023-06-19 22:59:24 +08:00
|
|
|
|
break
|
|
|
|
|
case "status_update":
|
2023-08-21 11:55:17 +08:00
|
|
|
|
this.connect(data, ws)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
break
|
|
|
|
|
default:
|
2023-06-30 21:20:06 +08:00
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
message(data, ws) {
|
|
|
|
|
try {
|
|
|
|
|
data = JSON.parse(data)
|
|
|
|
|
} catch (err) {
|
2023-06-30 21:20:06 +08:00
|
|
|
|
return logger.error(`解码数据失败:${logger.red(err)}`)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data.self?.user_id) {
|
|
|
|
|
data.self_id = data.self.user_id
|
|
|
|
|
} else {
|
|
|
|
|
data.self_id = data.id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data.type) {
|
2023-06-30 21:20:06 +08:00
|
|
|
|
if (data.type != "meta" && !Bot.uin.includes(data.self_id)) {
|
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 找不到对应Bot,忽略消息:${logger.magenta(JSON.stringify(data))}`)
|
2023-06-26 23:32:52 +08:00
|
|
|
|
return false
|
2023-06-30 21:20:06 +08:00
|
|
|
|
}
|
2023-06-26 23:32:52 +08:00
|
|
|
|
data.bot = Bot[data.self_id]
|
2023-06-30 21:20:06 +08:00
|
|
|
|
|
2023-05-11 16:03:18 +08:00
|
|
|
|
switch (data.type) {
|
2023-06-19 22:59:24 +08:00
|
|
|
|
case "meta":
|
2023-08-21 11:55:17 +08:00
|
|
|
|
this.makeMeta(data, ws)
|
2023-06-19 22:59:24 +08:00
|
|
|
|
break
|
2023-05-11 16:03:18 +08:00
|
|
|
|
case "message":
|
|
|
|
|
this.makeMessage(data)
|
|
|
|
|
break
|
|
|
|
|
case "notice":
|
|
|
|
|
this.makeNotice(data)
|
|
|
|
|
break
|
|
|
|
|
case "request":
|
|
|
|
|
this.makeRequest(data)
|
|
|
|
|
break
|
|
|
|
|
default:
|
2023-06-30 21:20:06 +08:00
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
} else if (data.echo) {
|
|
|
|
|
Bot.emit(data.echo, data)
|
|
|
|
|
} else {
|
2023-06-30 21:20:06 +08:00
|
|
|
|
logger.warn(`${logger.blue(`[${data.self_id}]`)} 未知消息:${logger.magenta(JSON.stringify(data))}`)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
load() {
|
2023-08-20 08:35:47 +08:00
|
|
|
|
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))
|
2023-07-23 19:04:24 +08:00
|
|
|
|
)
|
2023-05-11 16:03:18 +08:00
|
|
|
|
}
|
2023-06-26 23:32:52 +08:00
|
|
|
|
})
|