细节优化,新增 发送文件

This commit is contained in:
🌌 2023-06-18 11:57:31 +08:00
parent 17406bd8db
commit 853442a5e8
10 changed files with 308 additions and 134 deletions

View File

@ -5,12 +5,12 @@ log_level: info
port: 2536 port: 2536
# chromium其他路径 # chromium其他路径
chromium_path: chromium_path:
# puppeteer接口地址 # puppeteer接口地址
puppeteer_ws: puppeteer_ws:
# 米游社接口代理地址,国际服用 # 米游社接口代理地址,国际服用
proxyAddress: proxyAddress:
# 上线时给主人推送帮助 # 上线时给主人推送帮助
online_msg: true online_msg: true

View File

@ -6,8 +6,8 @@ default:
onlyReplyAt: 0 # 是否只仅关注主动@机器人的消息, 0-否 1-是 onlyReplyAt: 0 # 是否只仅关注主动@机器人的消息, 0-否 1-是
botAlias: # 开启后则只回复@机器人的消息及特定前缀的消息,支持多个 botAlias: # 开启后则只回复@机器人的消息及特定前缀的消息,支持多个
- 云崽 - 云崽
- 云宝 - 云宝
imgAddLimit: 0 #添加表情是否限制 0-所有群员都可以添加 1-群管理员才能添加 2-主人才能添加 imgAddLimit: 0 #添加表情是否限制 0-所有群员都可以添加 1-群管理员才能添加 2-主人才能添加
imgMaxSize: 2 #添加表情图片大小限制默认2m imgMaxSize: 2 #添加表情图片大小限制默认2m
addPrivate: 1 #是否允许私聊添加 1-允许 0-禁止 addPrivate: 1 #是否允许私聊添加 1-允许 0-禁止
@ -16,11 +16,11 @@ default:
#禁用功能,功能名称,例如:十连、角色查询、体力查询、用户绑定、抽卡记录、添加表情、欢迎新人、退群通知 #禁用功能,功能名称,例如:十连、角色查询、体力查询、用户绑定、抽卡记录、添加表情、欢迎新人、退群通知
#禁用功能,功能名称,例如:云崽帮助、角色素材、今日素材、养成计算、米游社公告 #禁用功能,功能名称,例如:云崽帮助、角色素材、今日素材、养成计算、米游社公告
disable: disable:
- 禁用示例 - 禁用示例
- 支持多个 - 支持多个
# 群单独设置,自动覆盖默认值 # 群单独设置,自动覆盖默认值
123456: 123456:
groupCD: 500 # 群聊中所有指令操作冷却时间,单位毫秒,0则无限制 groupCD: 500 # 群聊中所有指令操作冷却时间,单位毫秒,0则无限制
singleCD: 2000 # 群聊中个人操作冷却时间,单位毫秒 singleCD: 2000 # 群聊中个人操作冷却时间,单位毫秒

View File

@ -4,7 +4,7 @@ host: 127.0.0.1
port: 6379 port: 6379
# redis用户名可以为空 # redis用户名可以为空
username: username:
# redis密码没有密码可以为空 # redis密码没有密码可以为空
password: password:
# redis数据库 # redis数据库
db: 0 db: 0

View File

@ -1,2 +1,2 @@
# 渲染后端, 默认为 puppeteer # 渲染后端, 默认为 puppeteer
name: name:

View File

@ -1,5 +1,7 @@
import { WebSocketServer } from "ws" import { WebSocketServer } from "ws"
import { randomUUID } from "crypto" import { randomUUID } from "crypto"
import path from "node:path"
import fs from "node:fs"
export default class ComWeChatAdapter { export default class ComWeChatAdapter {
toStr(data) { toStr(data) {
@ -30,12 +32,24 @@ export default class ComWeChatAdapter {
resolve({ ...data, ...data.data }))) resolve({ ...data, ...data.data })))
} }
uploadFile(data, file) { uploadFile(data, file, name) {
return data.sendApi("upload_file", { const opts = { name }
type: "data",
data: file.replace(/^base64:\/\//, ""), if (file.match(/^https?:\/\//)) {
name: randomUUID(), opts.type = "url"
}) opts.url = file
} else if (file.match(/^base64:\/\//)) {
opts.type = "data"
opts.data = file.replace(/^base64:\/\//, "")
} else if (fs.existsSync(file)) {
opts.type = "data",
opts.data = fs.readFileSync(file).toString("base64")
} else {
opts.type = "path"
opts.path = file
}
return data.sendApi("upload_file", opts)
} }
async makeMsg(data, msg) { async makeMsg(data, msg) {
@ -48,7 +62,7 @@ export default class ComWeChatAdapter {
else if (!i.data) else if (!i.data)
i = { type: i.type, data: { ...i, type: undefined }} i = { type: i.type, data: { ...i, type: undefined }}
if (i.data.file) if (i.data.file)
i.data = { file_id: (await this.uploadFile(data, i.data.file)).file_id } i.data = { file_id: (await this.uploadFile(data, i.data.file, randomUUID())).file_id }
switch (i.type) { switch (i.type) {
case "at": case "at":
if (i.data.qq == "all") if (i.data.qq == "all")
@ -66,6 +80,9 @@ export default class ComWeChatAdapter {
} }
async sendFriendMsg(data, msg) { async sendFriendMsg(data, msg) {
if (msg?.type == "node")
return this.sendForwardMsg(msg => this.sendFriendMsg(data, msg), 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_message", { return data.sendApi("send_message", {
detail_type: "private", detail_type: "private",
@ -75,6 +92,9 @@ export default class ComWeChatAdapter {
} }
async sendGroupMsg(data, msg) { async sendGroupMsg(data, msg) {
if (msg?.type == "node")
return this.sendForwardMsg(msg => this.sendGroupMsg(data, msg), 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_message", { return data.sendApi("send_message", {
detail_type: "group", detail_type: "group",
@ -83,7 +103,7 @@ export default class ComWeChatAdapter {
}) })
} }
async makeForwardMsg(send, msg) { async sendForwardMsg(send, msg) {
const messages = [] const messages = []
for (const i of msg) for (const i of msg)
messages.push(await send(i.message)) messages.push(await send(i.message))
@ -178,6 +198,51 @@ export default class ComWeChatAdapter {
}) })
} }
async sendFile(data, send, file, name) {
return send(segment.custom("file", {
file_id: (await this.uploadFile(data, file, name || path.basename(file))).file_id
}))
}
pickFriend(data, user_id) {
const i = { ...data, user_id }
return {
sendMsg: msg => this.sendFriendMsg(i, msg),
recallMsg: () => false,
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendForwardMsg(msg => this.sendFriendMsg(i, msg), msg),
sendFile: (file, name) => this.sendFile(i, msg => this.sendFriendMsg(i, msg), file, name),
getInfo: () => this.getFriendInfo(i),
getAvatarUrl: async () => (await this.getFriendInfo(i))["wx.avatar"],
}
}
pickMember(data, group_id, user_id) {
const i = { ...data, group_id, user_id }
return {
...this.pickFriend(i, user_id),
getInfo: () => this.getGroupMemberInfo(i),
getAvatarUrl: async () => (await this.getGroupMemberInfo(i))["wx.avatar"],
}
}
pickGroup(data, group_id) {
const i = { ...data, group_id }
return {
sendMsg: msg => this.sendGroupMsg(i, msg),
recallMsg: () => false,
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendForwardMsg(msg => this.sendGroupMsg(i, msg), msg),
sendFile: (file, name) => this.sendFile(i, msg => this.sendGroupMsg(i, msg), file, name),
getInfo: () => this.getGroupInfo(i),
getAvatarUrl: async () => (await this.getGroupInfo(i))["wx.avatar"],
getMemberArray: () => this.getGroupMemberArray(i),
getMemberList: () => this.getGroupMemberList(i),
getMemberMap: () => this.getGroupMemberMap(i),
pickMember: user_id => this.pickMember(i, i.group_id, user_id),
}
}
async connect(data) { async connect(data) {
const status = await data.sendApi("get_status", {}) const status = await data.sendApi("get_status", {})
for (const bot of status.bots) for (const bot of status.bots)
@ -188,44 +253,14 @@ export default class ComWeChatAdapter {
version: data.version, version: data.version,
stat: { start_time: data.time }, stat: { start_time: data.time },
pickFriend: user_id => { pickFriend: user_id => this.pickFriend(data, user_id),
const i = { ...data, user_id }
return {
sendMsg: msg => this.sendFriendMsg(i, msg),
recallMsg: () => false,
makeForwardMsg: msg => this.makeForwardMsg(msg => this.sendFriendMsg(i, msg), msg),
getInfo: () => this.getFriendInfo(i),
getAvatarUrl: async () => (await this.getFriendInfo(i))["wx.avatar"],
}
},
getFriendArray: () => this.getFriendArray(data), getFriendArray: () => this.getFriendArray(data),
getFriendList: () => this.getFriendList(data), getFriendList: () => this.getFriendList(data),
getFriendMap: () => this.getFriendMap(data), getFriendMap: () => this.getFriendMap(data),
pickMember: (group_id, user_id) => { pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id),
const i = { ...data, group_id, user_id } pickGroup: group_id => this.pickGroup(data, group_id),
return {
...Bot[data.self_id].pickFriend(user_id),
getInfo: () => this.getGroupMemberInfo(i),
getAvatarUrl: async () => (await this.getGroupMemberInfo(i))["wx.avatar"],
}
},
pickGroup: group_id => {
const i = { ...data, group_id }
return {
sendMsg: msg => this.sendGroupMsg(i, msg),
recallMsg: () => false,
makeForwardMsg: msg => this.makeForwardMsg(msg => this.sendGroupMsg(i, msg), msg),
getInfo: () => this.getGroupInfo(i),
getAvatarUrl: async () => (await this.getGroupInfo(i))["wx.avatar"],
getMemberArray: () => this.getGroupMemberArray(i),
getMemberList: () => this.getGroupMemberList(i),
getMemberMap: () => this.getGroupMemberMap(i),
pickMember: user_id => Bot[data.self_id].pickMember(i.group_id, user_id),
}
},
getGroupArray: () => this.getGroupArray(data), getGroupArray: () => this.getGroupArray(data),
getGroupList: () => this.getGroupList(data), getGroupList: () => this.getGroupList(data),

View File

@ -1,5 +1,6 @@
import { WebSocketServer } from "ws" import { WebSocketServer } from "ws"
import { randomUUID } from "crypto" import { randomUUID } from "crypto"
import path from "node:path"
export default class gocqhttpAdapter { export default class gocqhttpAdapter {
toStr(data) { toStr(data) {
@ -47,6 +48,9 @@ export default class gocqhttpAdapter {
} }
sendFriendMsg(data, msg) { sendFriendMsg(data, msg) {
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", { return data.sendApi("send_msg", {
user_id: data.user_id, user_id: data.user_id,
@ -55,6 +59,9 @@ export default class gocqhttpAdapter {
} }
sendGroupMsg(data, msg) { sendGroupMsg(data, msg) {
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", { return data.sendApi("send_msg", {
group_id: data.group_id, group_id: data.group_id,
@ -63,6 +70,9 @@ export default class gocqhttpAdapter {
} }
sendGuildMsg(data, msg) { sendGuildMsg(data, msg) {
if (msg?.type == "node")
return this.sendGuildForwardMsg(data, msg.data)
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,
@ -99,7 +109,7 @@ export default class gocqhttpAdapter {
return messages return messages
} }
async makeFriendForwardMsg(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,
@ -109,7 +119,7 @@ export default class gocqhttpAdapter {
return msg return msg
} }
async makeGroupForwardMsg(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,
@ -119,7 +129,7 @@ export default class gocqhttpAdapter {
return msg return msg
} }
async makeGuildForwardMsg(data, msg) { async sendGuildForwardMsg(data, msg) {
const messages = [] const messages = []
for (const i of msg) for (const i of msg)
messages.push(await this.sendGuildMsg(data, i.message)) messages.push(await this.sendGuildMsg(data, i.message))
@ -317,6 +327,165 @@ export default class gocqhttpAdapter {
}) })
} }
downloadFile(data, url, thread_count, headers) {
return data.sendApi("download_file", {
url,
thread_count,
headers,
})
}
async makeFile(data, file, name) {
if (!name)
name = path.basename(file)
if (file.match(/^https?:\/\//))
file = (await this.downloadFile(data, file)).file
else if (fs.existsSync(file))
file = path.resolve(file)
return { file, name }
}
async sendFriendFile(data, file, name) {
return data.sendApi("upload_private_file", {
user_id: data.user_id,
...await this.makeFile(data, file, name),
})
}
async sendGroupFile(data, file, folder, name) {
return data.sendApi("upload_group_file", {
group_id: data.group_id,
folder,
...await this.makeFile(data, file, name),
})
}
deleteGroupFile(data, file_id, busid) {
return data.sendApi("delete_group_file", {
group_id: data.group_id,
file_id,
busid,
})
}
createGroupFileFolder(data, name) {
return data.sendApi("create_group_file_folder", {
group_id: data.group_id,
name,
})
}
getGroupFileSystemInfo(data) {
return data.sendApi("get_group_file_system_info", {
group_id: data.group_id,
})
}
getGroupFiles(data, folder_id) {
if (folder_id)
return data.sendApi("get_group_files_by_folder", {
group_id: data.group_id,
folder_id,
})
return data.sendApi("get_group_root_files", {
group_id: data.group_id,
})
}
getGroupFileUrl(data, file_id, busid) {
return data.sendApi("get_group_file_url", {
group_id: data.group_id,
file_id,
busid,
})
}
getGroupFs(data) {
return {
upload: (file, folder, name) => this.sendGroupFile(data, file, folder, name),
rm: (file_id, busid) => this.deleteGroupFile(data, file_id, busid),
mkdir: name => this.createGroupFileFolder(data, name),
df: () => this.getGroupFileSystemInfo(data),
ls: folder_id => this.getGroupFiles(data, folder_id),
download: (file_id, busid) => this.getGroupFileUrl(data, file_id, busid),
}
}
pickFriend(data, user_id) {
const i = { ...data, user_id }
return {
sendMsg: msg => this.sendFriendMsg(i, msg),
recallMsg: message_id => this.recallMsg(i, message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendFriendForwardMsg(i, msg),
sendFile: (file, name) => this.sendFriendFile(i, file, name),
getInfo: () => this.getFriendInfo(i),
getAvatarUrl: () => `https://q1.qlogo.cn/g?b=qq&s=0&nk=${i.user_id}`,
}
}
pickMember(data, group_id, user_id) {
if (typeof group_id == "string" && group_id.match("-")) {
group_id = group_id.split("-")
const i = { ...data, guild_id: group_id[0], channel_id: group_id[1], user_id }
return {
...this.pickGroup(i, `${i.guild_id}-${i.channel_id}`),
getInfo: () => this.getGuildMemberInfo(i),
getAvatarUrl: async () => (await this.getGuildMemberInfo(i)).avatar_url,
}
} else {
const i = { ...data, group_id, user_id }
return {
...this.pickFriend(i, i.user_id),
getInfo: () => this.getGroupMemberInfo(i),
poke: () => this.sendGroupMsg(i, segment.poke(i.user_id)),
}
}
}
pickGroup(data, group_id) {
if (typeof group_id == "string" && group_id.match("-")) {
group_id = group_id.split("-")
const i = { ...data, guild_id: group_id[0], channel_id: group_id[1] }
return {
sendMsg: msg => this.sendGuildMsg(i, msg),
recallMsg: message_id => this.recallMsg(i, message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendGuildForwardMsg(i, msg),
getInfo: () => this.getGuildInfo(i),
getChannelArray: () => this.getGuildChannelArray(i),
getChannelList: () => this.getGuildChannelList(i),
getChannelMap: () => this.getGuildChannelMap(i),
getMemberArray: () => this.getGuildMemberArray(i),
getMemberList: () => this.getGuildMemberList(i),
getMemberMap: () => this.getGuildMemberMap(i),
pickMember: user_id => this.pickMember(i, `${i.guild_id}-${i.channel_id}`, user_id),
}
}
const i = { ...data, group_id }
return {
sendMsg: msg => this.sendGroupMsg(i, msg),
recallMsg: message_id => this.recallMsg(i, message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendGroupForwardMsg(i, msg),
sendFile: (file, name) => this.sendGroupFile(data, file, undefined, name),
getInfo: () => this.getGroupInfo(i),
getAvatarUrl: () => `https://p.qlogo.cn/gh/${i.group_id}/${i.group_id}/0`,
getMemberArray: () => this.getGroupMemberArray(i),
getMemberList: () => this.getGroupMemberList(i),
getMemberMap: () => this.getGroupMemberMap(i),
pickMember: user_id => this.pickMember(i, i.group_id, user_id),
pokeMember: user_id => this.sendGroupMsg(i, segment.poke(user_id)),
setName: group_name => this.setGroupName(i, group_name),
setAvatar: file => this.setGroupAvatar(i, file),
setAdmin: (user_id, enable) => this.setGroupAdmin(i, user_id, enable),
setCard: (user_id, card) => this.setGroupCard(i, user_id, card),
setTitle: (user_id, special_title, duration) => this.setGroupTitle(i, user_id, special_title, duration),
fs: this.getGroupFs(i),
}
}
async connect(data) { async connect(data) {
Bot[data.self_id] = { Bot[data.self_id] = {
sendApi: data.sendApi, sendApi: data.sendApi,
@ -326,78 +495,14 @@ export default class gocqhttpAdapter {
recallMsg: message_id => this.recallMsg(data, message_id), recallMsg: message_id => this.recallMsg(data, message_id),
getForwardMsg: message_id => this.getForwardMsg(data, message_id), getForwardMsg: message_id => this.getForwardMsg(data, message_id),
pickFriend: user_id => { pickFriend: user_id => this.pickFriend(data, user_id),
const i = { ...data, user_id }
return {
sendMsg: msg => this.sendFriendMsg(i, msg),
recallMsg: message_id => this.recallMsg(i, message_id),
makeForwardMsg: msg => this.makeFriendForwardMsg(i, msg),
getInfo: () => this.getFriendInfo(i),
getAvatarUrl: () => `https://q1.qlogo.cn/g?b=qq&s=0&nk=${i.user_id}`,
}
},
getFriendArray: () => this.getFriendArray(data), getFriendArray: () => this.getFriendArray(data),
getFriendList: () => this.getFriendList(data), getFriendList: () => this.getFriendList(data),
getFriendMap: () => this.getFriendMap(data), getFriendMap: () => this.getFriendMap(data),
pickMember: (group_id, user_id) => { pickMember: (group_id, user_id) => this.pickMember(data, group_id, user_id),
if (typeof group_id == "string" && group_id.match("-")) { pickGroup: group_id => this.pickGroup(data, group_id),
group_id = group_id.split("-")
const i = { ...data, guild_id: group_id[0], channel_id: group_id[1], user_id }
return {
...Bot[data.self_id].pickGroup(`${i.guild_id}-${i.channel_id}`),
getInfo: () => this.getGuildMemberInfo(i),
getAvatarUrl: async () => (await this.getGuildMemberInfo(i)).avatar_url,
}
} else {
const i = { ...data, group_id, user_id }
return {
...Bot[data.self_id].pickFriend(i.user_id),
getInfo: () => this.getGroupMemberInfo(i),
poke: () => this.sendGroupMsg(i, segment.poke(i.user_id)),
}
}
},
pickGroup: group_id => {
if (typeof group_id == "string" && group_id.match("-")) {
group_id = group_id.split("-")
const i = { ...data, guild_id: group_id[0], channel_id: group_id[1] }
return {
sendMsg: msg => this.sendGuildMsg(i, msg),
recallMsg: message_id => this.recallMsg(i, message_id),
makeForwardMsg: msg => this.makeGuildForwardMsg(i, msg),
getInfo: () => this.getGuildInfo(i),
getChannelArray: () => this.getGuildChannelArray(i),
getChannelList: () => this.getGuildChannelList(i),
getChannelMap: () => this.getGuildChannelMap(i),
getMemberArray: () => this.getGuildMemberArray(i),
getMemberList: () => this.getGuildMemberList(i),
getMemberMap: () => this.getGuildMemberMap(i),
pickMember: user_id => Bot[data.self_id].pickMember(`${i.guild_id}-${i.channel_id}`, user_id),
}
}
const i = { ...data, group_id }
return {
sendMsg: msg => this.sendGroupMsg(i, msg),
recallMsg: message_id => this.recallMsg(i, message_id),
makeForwardMsg: msg => this.makeGroupForwardMsg(i, msg),
getInfo: () => this.getGroupInfo(i),
getAvatarUrl: () => `https://p.qlogo.cn/gh/${i.group_id}/${i.group_id}/0`,
getMemberArray: () => this.getGroupMemberArray(i),
getMemberList: () => this.getGroupMemberList(i),
getMemberMap: () => this.getGroupMemberMap(i),
pickMember: user_id => Bot[data.self_id].pickMember(i.group_id, user_id),
pokeMember: user_id => this.sendGroupMsg(i, segment.poke(user_id)),
setName: group_name => this.setGroupName(i, group_name),
setAvatar: file => this.setGroupAvatar(i, file),
setAdmin: (user_id, enable) => this.setGroupAdmin(i, user_id, enable),
setCard: (user_id, card) => this.setGroupCard(i, user_id, card),
setTitle: (user_id, special_title, duration) => this.setGroupTitle(i, user_id, special_title, duration),
}
},
getGroupArray: () => this.getGroupArray(data), getGroupArray: () => this.getGroupArray(data),
getGroupList: () => this.getGroupList(data), getGroupList: () => this.getGroupList(data),

View File

@ -1,4 +1,5 @@
import fs from "node:fs" import fs from "node:fs"
import path from "node:path"
export default class stdinAdapter { export default class stdinAdapter {
async makeBuffer(file) { async makeBuffer(file) {
@ -43,6 +44,9 @@ export default class stdinAdapter {
break break
case "at": case "at":
break break
case "node":
this.sendForwardMsg(i.data)
break
default: default:
i = JSON.stringify(i) i = JSON.stringify(i)
if (i.match("\n")) if (i.match("\n"))
@ -57,7 +61,7 @@ export default class stdinAdapter {
logger.info(`${logger.blue(`[stdin]`)} 撤回消息:${message_id}`) logger.info(`${logger.blue(`[stdin]`)} 撤回消息:${message_id}`)
} }
makeForwardMsg(msg) { sendForwardMsg(msg) {
const messages = [] const messages = []
for (const i of msg) for (const i of msg)
messages.push(this.sendMsg(i.message)) messages.push(this.sendMsg(i.message))
@ -65,6 +69,32 @@ export default class stdinAdapter {
return messages return messages
} }
async sendFile(file, name) {
let buffer
if (Buffer.isBuffer(file)) {
buffer = file
} else if (file.match(/^https?:\/\//)) {
buffer = Buffer.from(await (await fetch(file)).arrayBuffer())
} else if (!fs.existsSync(file)) {
logger.error(`${logger.blue(`[stdin]`)} 发送文件错误:找不到文件 ${logger.red(file)}`)
return false
}
const files = `${process.cwd()}/data/${Date.now()}-${name || path.basename(file)}`
logger.info(`${logger.blue(`[stdin]`)} 发送文件:${file}\n文件已保存到:${logger.cyan(files)}`)
return fs.copyFileSync(buffer || file, files)
}
pickFriend() {
return {
sendMsg: msg => this.sendMsg(msg),
recallMsg: message_id => this.recallMsg(message_id),
makeForwardMsg: Bot.makeForwardMsg,
sendForwardMsg: msg => this.sendForwardMsg(msg),
sendFile: (file, name) => this.sendFile(file, name),
}
}
message(msg) { message(msg) {
const data = { const data = {
bot: Bot.stdin, bot: Bot.stdin,
@ -89,11 +119,7 @@ export default class stdinAdapter {
nickname: "标准输入", nickname: "标准输入",
stat: { start_time: Date.now()/1000 }, stat: { start_time: Date.now()/1000 },
version: { impl: "stdin" }, version: { impl: "stdin" },
pickFriend: () => ({ pickFriend: () => this.pickFriend(),
sendMsg: msg => this.sendMsg(msg),
recallMsg: message_id => this.recallMsg(message_id),
makeForwardMsg: msg => this.makeForwardMsg(msg),
}),
fl: new Map().set("stdin", {}), fl: new Map().set("stdin", {}),
} }
Bot.stdin.pickUser = Bot.stdin.pickFriend Bot.stdin.pickUser = Bot.stdin.pickFriend

View File

@ -150,4 +150,9 @@ export default class Yunzai extends EventEmitter {
if (msg) return msg if (msg) return msg
} }
} }
makeForwardMsg(msg) {
msg.replace = () => msg
return { type: "node", data: msg }
}
} }

View File

@ -30,15 +30,15 @@
"node-schedule": "^2.1.1", "node-schedule": "^2.1.1",
"node-xlsx": "^0.23.0", "node-xlsx": "^0.23.0",
"pm2": "^5.3.0", "pm2": "^5.3.0",
"puppeteer": "^20.5.0", "puppeteer": "^20.7.2",
"redis": "^4.6.7", "redis": "^4.6.7",
"sequelize": "^6.31.1", "sequelize": "^6.32.1",
"sqlite3": "^5.1.6", "sqlite3": "^5.1.6",
"ws": "^8.13.0", "ws": "^8.13.0",
"yaml": "^2.3.1" "yaml": "^2.3.1"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^8.41.0", "eslint": "^8.43.0",
"eslint-config-standard": "^17.1.0", "eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.27.5", "eslint-plugin-import": "^2.27.5",
"eslint-plugin-n": "^16.0.0", "eslint-plugin-n": "^16.0.0",

View File

@ -104,11 +104,14 @@ export class update extends plugin {
let type = '更新' let type = '更新'
if (this.e.msg.includes('强制')) { if (this.e.msg.includes('强制')) {
type = '强制更新' type = '强制更新'
cm = `git fetch --all && git reset --hard && ${cm}` cm = `git reset --hard && git pull --rebase --allow-unrelated-histories`
} }
if (plugin) { if (plugin) {
cm = `git -C ./plugins/${plugin}/ pull --no-rebase` if (type == '强制更新')
cm = `git -C 'plugins/${plugin}' reset --hard && git -C 'plugins/${plugin}' pull --rebase --allow-unrelated-histories`
else
cm = `git -C 'plugins/${plugin}' pull --no-rebase`
} }
this.oldCommitId = await this.getcommitId(plugin) this.oldCommitId = await this.getcommitId(plugin)