From 9757fbd8771e8c379478f3fa4cab0f0633476f04 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Mon, 30 Oct 2023 00:43:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0onebot=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{renderer.d.ts => global.d.ts} | 17 +++++-- src/main.ts | 58 +++-------------------- src/preload.ts | 14 +++--- src/renderer.ts | 75 +++++++++++++++++++++--------- 4 files changed, 79 insertions(+), 85 deletions(-) rename src/{renderer.d.ts => global.d.ts} (85%) diff --git a/src/renderer.d.ts b/src/global.d.ts similarity index 85% rename from src/renderer.d.ts rename to src/global.d.ts index d063249..61c53d6 100644 --- a/src/renderer.d.ts +++ b/src/global.d.ts @@ -9,9 +9,9 @@ declare type Peer = { uid: string // qq号 } -interface MessageElement{ +interface MessageElement { raw: { - elements:{ + elements: { raw: { replyElement: { senderUid: string, // 原消息发送者QQ号 @@ -79,7 +79,16 @@ declare var LLAPI: { getFriendsList(forced: boolean): Promise }; +declare type PostDataSendMsg = { + action: "send_private_msg" | "send_group_msg" | "get_group_list", + params: { + user_id: string, + group_id: string, + message: SendMessage[]; + } +} + declare var llonebot: { - listenSendMessage: (handle: (msg: any)=>void)=>void - startExpress: ()=>void + listenSendMessage: (handle: (msg: PostDataSendMsg) => void) => void + startExpress: () => void }; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 9832655..9d2ed45 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,81 +1,36 @@ // 运行在 Electron 主进程 下的插件入口 const express = require("express") -const { ipcMain } = require('electron'); -const { webContents } = require('electron') +const {ipcMain, webContents} = require('electron'); const CHANNEL_SEND_MSG = "llonebot_sendMsg" -type PostDataSendMsg = { - action: string, - params: { - user_id: string, - group_id: string, - message: SendMessage[]; - } -} - -function sendIPCCallSendQQMsg(postData: PostDataSendMsg){ +function sendIPCCallSendQQMsg(postData: PostDataSendMsg) { let contents = webContents.getAllWebContents(); for (const content of contents) { - try{ + try { content.send(CHANNEL_SEND_MSG, postData) - }catch (e) { + } catch (e) { } } } -function startExpress(event: any){ +function startExpress(event: any) { // const original_send = (window.webContents.__qqntim_original_object && window.webContents.__qqntim_original_object.send) || window.webContents.send; const app = express(); const port = 3000; // 中间件,用于解析POST请求的请求体 - app.use(express.urlencoded({ extended: true })); + app.use(express.urlencoded({extended: true})); app.use(express.json()); app.get('/', (req: any, res: any) => { - // original_send.call(window.webContents, "发送消息", {test: "test"}) - // event.reply("发送消息", {test: "test"}) - res.send('llonebot已启动'); }) // 处理POST请求的路由 app.post('/', (req: any, res: any) => { let jsonData: PostDataSendMsg = req.body; sendIPCCallSendQQMsg(jsonData); - // let json_data: {action: string, params: { - // user_id: string, - // group_id: string, - // message: SendMessage[]; - // }} = req.body; - // let peer: Peer| null = null; - // if (json_data.action == "send_private_msg"){ - // let friend = getFriend(json_data.params.user_id) - // if (friend) { - // peer = { - // chatType: "private", - // name: friend.nickName, - // uid: friend.uin - // } - // } - // } - // else if (json_data.action == "send_group_msg"){ - // let group = getGroup(json_data.params.group_id) - // if (group){ - // peer = { - // chatType: "group", - // name: group.name, - // uid: group.uid - // } - // } - // } - // if (peer) { - // original_send.call(window.webContents, "发送消息", peer, json_data.params.message) - // LLAPI.sendMessage(peer, json_data.params.message).then(res => console.log("消息发送成功:", res), - // err => console.log("消息发送失败", json_data, err)) - // } - // console.log(req.body); // 输出POST请求的请求体数据 res.send('POST请求已收到'); }); app.listen(port, () => { @@ -84,7 +39,6 @@ function startExpress(event: any){ } - // 加载插件时触发 function onLoad(plugin: any) { ipcMain.on("startExpress", (event: any, arg: any) => { diff --git a/src/preload.ts b/src/preload.ts index 5de0699..bcb7294 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -1,16 +1,16 @@ // Electron 主进程 与 渲染进程 交互的桥梁 -const { contextBridge } = require("electron"); -const { ipcRenderer } = require('electron'); + +const {contextBridge} = require("electron"); +const {ipcRenderer} = require('electron'); // 在window对象下导出只读对象 contextBridge.exposeInMainWorld("llonebot", { - listenSendMessage: (handle: (msg: any)=>void)=>{ - ipcRenderer.on("sendMsg", (event: any, args: any) => { - handle("收到ipc消息:发送消息") - console.log("收到ipc消息:发送消息", args); // 处理主进程发送的消息 + listenSendMessage: (handle: (jsonData: PostDataSendMsg) => void) => { + ipcRenderer.on("sendMsg", (event: any, args: PostDataSendMsg) => { + handle(args) }) }, - startExpress:()=>{ + startExpress: () => { ipcRenderer.send("startExpress"); } // startExpress, diff --git a/src/renderer.ts b/src/renderer.ts index 361aead..7796ed2 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -1,14 +1,15 @@ -/// +/// // import express from "express"; // const { ipcRenderer } = require('electron'); + const host = "http://localhost:5000" let groups: Group[] = [] let friends: User[] = [] -function getFriend(qq: string){ +function getFriend(qq: string) { return friends.find(friend => friend.uid == qq) } @@ -20,8 +21,46 @@ let self_qq: string = "" let uid_maps: Record = {} // 一串加密的字符串 -> qq号 -function onLoad(){ +function onLoad() { llonebot.startExpress(); + llonebot.listenSendMessage((postData: PostDataSendMsg) => { + if (postData.action == "send_private_msg" || postData.action == "send_group_msg") { + let peer: Peer | null = null; + if (postData.action == "send_private_msg") { + let friend = getFriend(postData.params.user_id) + if (friend) { + peer = { + chatType: "private", + name: friend.nickName, + uid: friend.uin + } + } + } + else if (postData.action == "send_group_msg") { + let group = getGroup(postData.params.group_id) + if (group) { + peer = { + chatType: "group", + name: group.name, + uid: group.uid + } + } + } + if (peer) { + LLAPI.sendMessage(peer, postData.params.message).then(res => console.log("消息发送成功:", res), + err => console.log("消息发送失败", postData, err)) + } + } + else if (postData.action == "get_group_list"){ + let groupsData = groups.map(group => { + return { + group_id: group.uid, + group_name: group.name + } + }) + } + + }); window.LLAPI.getAccountInfo().then(accountInfo => { self_qq = accountInfo.uid }) @@ -30,12 +69,7 @@ function onLoad(){ groups = groupsList }) window.LLAPI.on("new-messages", (messages) => { - try{ - llonebot.listenSendMessage(console.log); - console.log("ipc监听成功") - } catch (e){ - console.log("ipc监听失败", e) - } + console.log("收到新消息", messages) messages.forEach(message => { let onebot_message_data: any = { self: { @@ -46,24 +80,21 @@ function onLoad(){ type: "message", detail_type: message.peer.chatType, sub_type: "", - message: message.raw.elements.map(element=>{ - let message_data: any = { + message: message.raw.elements.map(element => { + let message_data: any = { data: {} } - if (element.raw.textElement?.atType == AtType.atUser){ + if (element.raw.textElement?.atType == AtType.atUser) { message_data["type"] = "at" message_data["data"]["mention"] = element.raw.textElement.atUid - } - else if (element.raw.textElement){ + } else if (element.raw.textElement) { message_data["type"] = "text" message_data["data"]["text"] = element.raw.textElement.content - } - else if (element.raw.picElement){ + } else if (element.raw.picElement) { message_data["type"] = "image" message_data["data"]["file_id"] = element.raw.picElement.fileUuid message_data["data"]["path"] = element.raw.picElement.sourcePath - } - else if (element.raw.replyElement){ + } else if (element.raw.replyElement) { message_data["type"] = "reply" message_data["data"]["reply"] = element.raw.replyElement.sourceMsgIdInRecords } @@ -71,12 +102,11 @@ function onLoad(){ }) } - if (message.peer.chatType == "group"){ + if (message.peer.chatType == "group") { onebot_message_data["group_id"] = message.peer.uid // todo: 将加密的uid转成qq号 onebot_message_data["user_id"] = message.sender.uid - } - else if (message.peer.chatType == "private"){ + } else if (message.peer.chatType == "private") { onebot_message_data["user_id"] = message.peer.uid } @@ -86,7 +116,8 @@ function onLoad(){ "Content-Type": "application/json" }, body: JSON.stringify(onebot_message_data) - }).then(res => {}, err => { + }).then(res => { + }, err => { console.log(err) }) });