实现onebot协议中

This commit is contained in:
linyuchen 2023-10-30 00:43:32 +08:00
parent 881570c513
commit 9757fbd877
4 changed files with 79 additions and 85 deletions

View File

@ -9,9 +9,9 @@ declare type Peer = {
uid: string // qq号 uid: string // qq号
} }
interface MessageElement{ interface MessageElement {
raw: { raw: {
elements:{ elements: {
raw: { raw: {
replyElement: { replyElement: {
senderUid: string, // 原消息发送者QQ号 senderUid: string, // 原消息发送者QQ号
@ -79,7 +79,16 @@ declare var LLAPI: {
getFriendsList(forced: boolean): Promise<User[]> getFriendsList(forced: boolean): Promise<User[]>
}; };
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: { declare var llonebot: {
listenSendMessage: (handle: (msg: any)=>void)=>void listenSendMessage: (handle: (msg: PostDataSendMsg) => void) => void
startExpress: ()=>void startExpress: () => void
}; };

View File

@ -1,81 +1,36 @@
// 运行在 Electron 主进程 下的插件入口 // 运行在 Electron 主进程 下的插件入口
const express = require("express") const express = require("express")
const { ipcMain } = require('electron'); const {ipcMain, webContents} = require('electron');
const { webContents } = require('electron')
const CHANNEL_SEND_MSG = "llonebot_sendMsg" const CHANNEL_SEND_MSG = "llonebot_sendMsg"
type PostDataSendMsg = { function sendIPCCallSendQQMsg(postData: PostDataSendMsg) {
action: string,
params: {
user_id: string,
group_id: string,
message: SendMessage[];
}
}
function sendIPCCallSendQQMsg(postData: PostDataSendMsg){
let contents = webContents.getAllWebContents(); let contents = webContents.getAllWebContents();
for (const content of contents) { for (const content of contents) {
try{ try {
content.send(CHANNEL_SEND_MSG, postData) 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 original_send = (window.webContents.__qqntim_original_object && window.webContents.__qqntim_original_object.send) || window.webContents.send;
const app = express(); const app = express();
const port = 3000; const port = 3000;
// 中间件用于解析POST请求的请求体 // 中间件用于解析POST请求的请求体
app.use(express.urlencoded({ extended: true })); app.use(express.urlencoded({extended: true}));
app.use(express.json()); app.use(express.json());
app.get('/', (req: any, res: any) => { app.get('/', (req: any, res: any) => {
// original_send.call(window.webContents, "发送消息", {test: "test"})
// event.reply("发送消息", {test: "test"})
res.send('llonebot已启动'); res.send('llonebot已启动');
}) })
// 处理POST请求的路由 // 处理POST请求的路由
app.post('/', (req: any, res: any) => { app.post('/', (req: any, res: any) => {
let jsonData: PostDataSendMsg = req.body; let jsonData: PostDataSendMsg = req.body;
sendIPCCallSendQQMsg(jsonData); 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请求已收到'); res.send('POST请求已收到');
}); });
app.listen(port, () => { app.listen(port, () => {
@ -84,7 +39,6 @@ function startExpress(event: any){
} }
// 加载插件时触发 // 加载插件时触发
function onLoad(plugin: any) { function onLoad(plugin: any) {
ipcMain.on("startExpress", (event: any, arg: any) => { ipcMain.on("startExpress", (event: any, arg: any) => {

View File

@ -1,16 +1,16 @@
// Electron 主进程 与 渲染进程 交互的桥梁 // Electron 主进程 与 渲染进程 交互的桥梁
const { contextBridge } = require("electron");
const { ipcRenderer } = require('electron'); const {contextBridge} = require("electron");
const {ipcRenderer} = require('electron');
// 在window对象下导出只读对象 // 在window对象下导出只读对象
contextBridge.exposeInMainWorld("llonebot", { contextBridge.exposeInMainWorld("llonebot", {
listenSendMessage: (handle: (msg: any)=>void)=>{ listenSendMessage: (handle: (jsonData: PostDataSendMsg) => void) => {
ipcRenderer.on("sendMsg", (event: any, args: any) => { ipcRenderer.on("sendMsg", (event: any, args: PostDataSendMsg) => {
handle("收到ipc消息发送消息") handle(args)
console.log("收到ipc消息发送消息", args); // 处理主进程发送的消息
}) })
}, },
startExpress:()=>{ startExpress: () => {
ipcRenderer.send("startExpress"); ipcRenderer.send("startExpress");
} }
// startExpress, // startExpress,

View File

@ -1,14 +1,15 @@
/// <reference path="./renderer.d.ts" /> /// <reference path="./global.d.ts" />
// import express from "express"; // import express from "express";
// const { ipcRenderer } = require('electron'); // const { ipcRenderer } = require('electron');
const host = "http://localhost:5000" const host = "http://localhost:5000"
let groups: Group[] = [] let groups: Group[] = []
let friends: User[] = [] let friends: User[] = []
function getFriend(qq: string){ function getFriend(qq: string) {
return friends.find(friend => friend.uid == qq) return friends.find(friend => friend.uid == qq)
} }
@ -20,8 +21,46 @@ let self_qq: string = ""
let uid_maps: Record<string, string> = {} // 一串加密的字符串 -> qq号 let uid_maps: Record<string, string> = {} // 一串加密的字符串 -> qq号
function onLoad(){ function onLoad() {
llonebot.startExpress(); 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 => { window.LLAPI.getAccountInfo().then(accountInfo => {
self_qq = accountInfo.uid self_qq = accountInfo.uid
}) })
@ -30,12 +69,7 @@ function onLoad(){
groups = groupsList groups = groupsList
}) })
window.LLAPI.on("new-messages", (messages) => { window.LLAPI.on("new-messages", (messages) => {
try{ console.log("收到新消息", messages)
llonebot.listenSendMessage(console.log);
console.log("ipc监听成功")
} catch (e){
console.log("ipc监听失败", e)
}
messages.forEach(message => { messages.forEach(message => {
let onebot_message_data: any = { let onebot_message_data: any = {
self: { self: {
@ -46,24 +80,21 @@ function onLoad(){
type: "message", type: "message",
detail_type: message.peer.chatType, detail_type: message.peer.chatType,
sub_type: "", sub_type: "",
message: message.raw.elements.map(element=>{ message: message.raw.elements.map(element => {
let message_data: any = { let message_data: any = {
data: {} data: {}
} }
if (element.raw.textElement?.atType == AtType.atUser){ if (element.raw.textElement?.atType == AtType.atUser) {
message_data["type"] = "at" message_data["type"] = "at"
message_data["data"]["mention"] = element.raw.textElement.atUid message_data["data"]["mention"] = element.raw.textElement.atUid
} } else if (element.raw.textElement) {
else if (element.raw.textElement){
message_data["type"] = "text" message_data["type"] = "text"
message_data["data"]["text"] = element.raw.textElement.content message_data["data"]["text"] = element.raw.textElement.content
} } else if (element.raw.picElement) {
else if (element.raw.picElement){
message_data["type"] = "image" message_data["type"] = "image"
message_data["data"]["file_id"] = element.raw.picElement.fileUuid message_data["data"]["file_id"] = element.raw.picElement.fileUuid
message_data["data"]["path"] = element.raw.picElement.sourcePath message_data["data"]["path"] = element.raw.picElement.sourcePath
} } else if (element.raw.replyElement) {
else if (element.raw.replyElement){
message_data["type"] = "reply" message_data["type"] = "reply"
message_data["data"]["reply"] = element.raw.replyElement.sourceMsgIdInRecords 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 onebot_message_data["group_id"] = message.peer.uid
// todo: 将加密的uid转成qq号 // todo: 将加密的uid转成qq号
onebot_message_data["user_id"] = message.sender.uid 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 onebot_message_data["user_id"] = message.peer.uid
} }
@ -86,7 +116,8 @@ function onLoad(){
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
body: JSON.stringify(onebot_message_data) body: JSON.stringify(onebot_message_data)
}).then(res => {}, err => { }).then(res => {
}, err => {
console.log(err) console.log(err)
}) })
}); });