117 lines
3.9 KiB
JavaScript
117 lines
3.9 KiB
JavaScript
import fs from "node:fs"
|
|
|
|
export default class stdinAdapter {
|
|
async makeBuffer(file) {
|
|
if (file.match(/^base64:\/\//))
|
|
return Buffer.from(file.replace(/^base64:\/\//, ""), "base64")
|
|
else if (file.match(/^https?:\/\//))
|
|
return Buffer.from(await (await fetch(file)).arrayBuffer())
|
|
else
|
|
return file
|
|
}
|
|
|
|
async sendMsg(msg) {
|
|
if (!Array.isArray(msg))
|
|
msg = [msg]
|
|
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 }}
|
|
switch (i.type) {
|
|
case "text":
|
|
if (i.data.text.match("\n"))
|
|
i.data.text = `\n${i.data.text}`
|
|
logger.info(`${logger.blue(`[stdin]`)} 发送文本:${i.data.text}`)
|
|
break
|
|
case "image":
|
|
i.file = `${process.cwd()}/data/${Date.now()}.png`
|
|
logger.info(`${logger.blue(`[stdin]`)} 发送图片:${i.data.file.replace(/^base64:\/\/.*/, "base64://...")}\n文件已保存到:${logger.cyan(i.file)}`)
|
|
fs.writeFileSync(i.file, await this.makeBuffer(i.data.file))
|
|
break
|
|
case "record":
|
|
i.file = `${process.cwd()}/data/${Date.now()}.mp3`
|
|
logger.info(`${logger.blue(`[stdin]`)} 发送音频:${i.data.file.replace(/^base64:\/\/.*/, "base64://...")}\n文件已保存到:${logger.cyan(i.file)}`)
|
|
fs.writeFileSync(i.file, await this.makeBuffer(i.data.file))
|
|
break
|
|
case "video":
|
|
i.file = `${process.cwd()}/data/${Date.now()}.mp4`
|
|
logger.info(`${logger.blue(`[stdin]`)} 发送视频:${i.data.file.replace(/^base64:\/\/.*/, "base64://...")}\n文件已保存到:${logger.cyan(i.file)}`)
|
|
fs.writeFileSync(i.file, await this.makeBuffer(i.data.file))
|
|
break
|
|
case "reply":
|
|
break
|
|
case "at":
|
|
break
|
|
default:
|
|
i = JSON.stringify(i)
|
|
if (i.match("\n"))
|
|
i = `\n${i}`
|
|
logger.info(`${logger.blue(`[stdin]`)} 发送消息:${i}`)
|
|
}
|
|
}
|
|
return { message_id: Date.now() }
|
|
}
|
|
|
|
recallMsg(message_id) {
|
|
logger.info(`${logger.blue(`[stdin]`)} 撤回消息:${message_id}`)
|
|
}
|
|
|
|
makeForwardMsg(msg) {
|
|
const messages = []
|
|
for (const i of msg)
|
|
messages.push(this.sendMsg(i.message))
|
|
messages.data = "系统消息"
|
|
return messages
|
|
}
|
|
|
|
message(msg) {
|
|
const data = {
|
|
bot: Bot.stdin,
|
|
self_id: Bot.stdin.uin,
|
|
user_id: Bot.stdin.uin,
|
|
post_type: "message",
|
|
message_type: "private",
|
|
sender: { nickname: Bot.stdin.nickname },
|
|
message: [{ type: "text", text: msg }],
|
|
raw_message: msg,
|
|
friend: Bot.stdin.pickFriend(),
|
|
}
|
|
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)
|
|
}
|
|
|
|
load() {
|
|
Bot.stdin = {
|
|
uin: "stdin",
|
|
nickname: "标准输入",
|
|
stat: { start_time: Date.now()/1000 },
|
|
version: { impl: "stdin" },
|
|
pickFriend: () => ({
|
|
sendMsg: msg => this.sendMsg(msg),
|
|
recallMsg: message_id => this.recallMsg(message_id),
|
|
makeForwardMsg: msg => this.makeForwardMsg(msg),
|
|
}),
|
|
fl: new Map().set("stdin", {}),
|
|
}
|
|
Bot.stdin.pickUser = Bot.stdin.pickFriend
|
|
Bot.stdin.pickGroup = Bot.stdin.pickFriend
|
|
Bot.stdin.pickMember = Bot.stdin.pickFriend
|
|
Bot.stdin.gl = Bot.stdin.fl
|
|
|
|
if (Array.isArray(Bot.uin)) {
|
|
if (!Bot.uin.includes("stdin"))
|
|
Bot.uin.push("stdin")
|
|
} else {
|
|
Bot.uin = ["stdin"]
|
|
}
|
|
|
|
process.stdin.on("data", data => this.message(data.toString().trim()))
|
|
|
|
logger.mark(`${logger.blue(`[stdin]`)} 标准输入 已连接`)
|
|
Bot.emit(`connect.stdin`, Bot.stdin)
|
|
Bot.emit(`connect`, Bot.stdin)
|
|
}
|
|
} |