fix: send temp msg

fix: multi forward msg
This commit is contained in:
linyuchen
2024-02-21 05:11:13 +08:00
parent be7b68ec4e
commit 0f4d8f3fe2
9 changed files with 82 additions and 89 deletions

View File

@@ -77,12 +77,12 @@ export function getHistoryMsgBySeq(seq: string) {
}
export let uidMaps:Record<string, Friend> = {} // 一串加密的字符串(uid) -> qq号
export let uidMaps:Record<string, string> = {} // 一串加密的字符串(uid) -> qq号
export function getStrangerByUin(uin: string) {
export function getUidByUin(uin: string) {
for (const key in uidMaps) {
if (uidMaps[key].uin === uin) {
return uidMaps[key];
if (uidMaps[key] === uin) {
return key;
}
}
}

View File

@@ -3,7 +3,7 @@ import {hookApiCallbacks, ReceiveCmd, registerReceiveHook, removeReceiveHook} fr
import {log} from "../common/utils";
import {ChatType, Friend, Group, GroupMember, RawMessage, SelfInfo, SendMessageElement, User} from "./types";
import * as fs from "fs";
import {addHistoryMsg, msgHistory, selfInfo} from "../common/data";
import {addHistoryMsg, msgHistory, selfInfo, uidMaps} from "../common/data";
import {v4 as uuidv4} from "uuid"
interface IPCReceiveEvent {
@@ -224,9 +224,13 @@ export class NTQQApi {
// log("members info", typeof result.result.infos, Object.keys(result.result.infos))
let values = result.result.infos.values()
values = Array.from(values) as GroupMember[]
let members = Array.from(values) as GroupMember[]
for(const member of members){
uidMaps[member.uid] = member.uin;
}
log(uidMaps);
// log("members info", values);
return values
return members
} catch (e) {
log(`get group ${groupQQ} members failed`, e)
return []
@@ -428,7 +432,7 @@ export class NTQQApi {
// 需要判断它是转发的消息,并且识别到是当前转发的这一条
const arkElement = msg.elements.find(ele => ele.arkElement)
if (!arkElement) {
log("收到的不是转发消息")
// log("收到的不是转发消息")
return
}
const forwardData: any = JSON.parse(arkElement.arkElement.bytesData);
@@ -439,7 +443,7 @@ export class NTQQApi {
complete = true;
addHistoryMsg(msg)
resolve(msg);
log("收到转发消息:", payload)
log("转发消息成功", payload)
}
})
callNTQQApi<GeneralCallResult>({

View File

@@ -1,6 +1,6 @@
import {AtType, ChatType, Group, SendMessageElement} from "../../ntqqapi/types";
import {addHistoryMsg, friends, getGroup, getHistoryMsgByShortId, getStrangerByUin, selfInfo,} from "../../common/data";
import {OB11MessageData, OB11MessageDataType, OB11MessageNode, OB11PostSendMsg} from '../types';
import {addHistoryMsg, friends, getGroup, getHistoryMsgByShortId, getUidByUin, selfInfo,} from "../../common/data";
import {OB11MessageData, OB11MessageDataType, OB11MessageMixType, OB11MessageNode, OB11PostSendMsg} from '../types';
import {NTQQApi, Peer} from "../../ntqqapi/ntcall";
import {SendMsgElementConstructor} from "../../ntqqapi/constructor";
import {uri2local} from "../utils";
@@ -53,7 +53,7 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
actionName = ActionName.SendMsg
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
const messages = this.convertMessage2List(payload);
const messages = this.convertMessage2List(payload.message);
const fmNum = this.forwardMsgNum(payload)
if (fmNum && fmNum != messages.length) {
return {
@@ -88,15 +88,15 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
peer.peerUid = friend.uid
} else {
peer.chatType = ChatType.temp
const tempUser = getStrangerByUin(payload.user_id.toString())
if (!tempUser) {
const tempUserUid = getUidByUin(payload.user_id.toString())
if (!tempUserUid) {
throw (`找不到私聊对象${payload.user_id}`)
}
// peer.name = tempUser.nickName
peer.peerUid = tempUser.uid
peer.peerUid = tempUserUid;
}
}
const messages = this.convertMessage2List(payload);
const messages = this.convertMessage2List(payload.message);
if (this.forwardMsgNum(payload)) {
try {
const returnMsg = await this.handleForwardNode(peer, messages as OB11MessageNode[], group)
@@ -115,18 +115,18 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
}
}
private convertMessage2List(payload: OB11PostSendMsg) {
if (typeof payload.message === "string") {
payload.message = [{
private convertMessage2List(message: OB11MessageMixType) {
if (typeof message === "string") {
message = [{
type: OB11MessageDataType.text,
data: {
text: payload.message
text: message
}
}] as OB11MessageData[]
} else if (!Array.isArray(payload.message)) {
payload.message = [payload.message]
} else if (!Array.isArray(message)) {
message = [message]
}
return payload.message;
return message;
}
private forwardMsgNum(payload: OB11PostSendMsg): number {
@@ -156,12 +156,13 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
const {
sendElements,
deleteAfterSentFiles
} = await this.createSendElements(messageNode.data.content, group)
} = await this.createSendElements(this.convertMessage2List(messageNode.data.content), group)
try {
log("开始生成转发节点", sendElements);
const nodeMsg = await this.send(selfPeer, sendElements, deleteAfterSentFiles, true);
nodeIds.push(nodeMsg.msgId)
} catch (e) {
log("生效转发消息节点失败")
log("生效转发消息节点失败", e)
}
}
}

View File

@@ -72,7 +72,7 @@ export class OB11Constructor {
}
} else if (element.textElement) {
message_data["type"] = "text"
message_data["data"]["text"] = element.textElement.content
resMsg.raw_message += message_data["data"]["text"] = element.textElement.content
} else if (element.picElement) {
message_data["type"] = "image"
message_data["data"]["file_id"] = element.picElement.fileUuid

View File

@@ -10,6 +10,6 @@ export enum EventType {
export abstract class OB11BaseEvent {
time = new Date().getTime();
self_id = selfInfo.uin;
self_id = parseInt(selfInfo.uin);
post_type: EventType;
}

View File

@@ -22,11 +22,11 @@ export function unregisterWsEventSender(ws: websocket.WebSocket) {
}
export function postWsEvent(event: PostEventType) {
new Promise(() => {
for (const ws of eventWSList) {
for (const ws of eventWSList) {
new Promise(() => {
wsReply(ws, event);
}
}).then()
}).then()
}
}
export function postEvent(msg: PostEventType) {

View File

@@ -22,20 +22,44 @@ export class ReverseWebsocket {
this.running = true;
this.connect();
}
public stop(){
public stop() {
this.running = false;
unregisterWsEventSender(this.websocket);
this.websocket.close();
}
public onopen = function () {
public onopen() {
wsReply(this.websocket, new OB11LifeCycleEvent(LifeCycleSubType.CONNECT));
}
public onmessage = function (msg: string) {
public async onmessage(msg: string) {
let receiveData: { action: ActionName, params: any, echo?: string } = {action: null, params: {}}
let echo = ""
log("收到反向Websocket消息", msg.toString())
try {
receiveData = JSON.parse(msg.toString())
echo = receiveData.echo
} catch (e) {
return wsReply(this.websocket, OB11WebsocketResponse.error("json解析失败请检查数据格式", 1400, echo))
}
const action: BaseAction<any, any> = actionMap.get(receiveData.action);
if (!action) {
return wsReply(this.websocket, OB11WebsocketResponse.error("不支持的api " + receiveData.action, 1404, echo))
}
try {
let handleResult = await action.websocketHandle(receiveData.params, echo);
wsReply(this.websocket, handleResult)
} catch (e) {
wsReply(this.websocket, OB11WebsocketResponse.error(`api处理出错:${e}`, 1200, echo))
}
}
public onclose = function () {
log("反向ws断开", this.url);
unregisterWsEventSender(this.websocket);
if (this.running) {
this.reconnect();
}
}
public send(msg: string) {
@@ -60,28 +84,24 @@ export class ReverseWebsocket {
'Authorization': `Bearer ${token}`
}
});
registerWsEventSender(this.websocket);
log("Trying to connect to the websocket server: " + this.url);
const instance = this;
this.websocket.on("open", function open() {
log("Connected to the websocket server: " + instance.url);
instance.onopen();
this.websocket.on("open", ()=> {
log("Connected to the websocket server: " + this.url);
this.onopen();
});
this.websocket.on("message", function message(data) {
instance.onmessage(data.toString());
this.websocket.on("message", async (data)=>{
await this.onmessage(data.toString());
});
this.websocket.on("error", log);
this.websocket.on("close", function close() {
log("The websocket connection: " + instance.url + " closed, trying reconnecting...");
instance.onclose();
if (instance.running) {
instance.reconnect();
}
this.websocket.on("close", ()=> {
log("The websocket connection: " + this.url + " closed, trying reconnecting...");
this.onclose();
});
}
}
@@ -92,40 +112,7 @@ class OB11ReverseWebsockets {
log("开始连接反向ws", url)
new Promise(() => {
try {
let rwsClient = new ReverseWebsocket(url);
rwsList.push(rwsClient);
registerWsEventSender(rwsClient.websocket);
rwsClient.onopen = function () {
wsReply(rwsClient.websocket, new OB11LifeCycleEvent(LifeCycleSubType.CONNECT));
}
rwsClient.onclose = function () {
log("反向ws断开", url);
unregisterWsEventSender(rwsClient.websocket);
}
rwsClient.onmessage = async function (msg) {
let receiveData: { action: ActionName, params: any, echo?: string } = {action: null, params: {}}
let echo = ""
log("收到反向Websocket消息", msg.toString())
try {
receiveData = JSON.parse(msg.toString())
echo = receiveData.echo
} catch (e) {
return wsReply(rwsClient.websocket, OB11WebsocketResponse.error("json解析失败请检查数据格式", 1400, echo))
}
const action: BaseAction<any, any> = actionMap.get(receiveData.action);
if (!action) {
return wsReply(rwsClient.websocket, OB11WebsocketResponse.error("不支持的api " + receiveData.action, 1404, echo))
}
try {
let handleResult = await action.websocketHandle(receiveData.params, echo);
wsReply(rwsClient.websocket, handleResult)
} catch (e) {
wsReply(rwsClient.websocket, OB11WebsocketResponse.error(`api处理出错:${e}`, 1200, echo))
}
}
rwsList.push(new ReverseWebsocket(url));
} catch (e) {
log(e.stack);
}
@@ -134,7 +121,7 @@ class OB11ReverseWebsockets {
}
stop() {
for(let rws of rwsList){
for (let rws of rwsList) {
rws.stop();
}
}

View File

@@ -6,13 +6,12 @@ import {log} from "../../../common/utils";
export function wsReply(wsClient: websocket.WebSocket, data: OB11WebsocketResponse | PostEventType) {
try {
let packet = Object.assign({
echo: ""
}, data);
if (!packet.echo) {
packet.echo = "";
if (!packet["echo"]){
delete packet["echo"];
}
wsClient.send(JSON.stringify(packet))
log("ws 消息上报", data)
log("ws 消息上报", wsClient.url, data)
} catch (e) {
log("websocket 回复失败", e)
}

View File

@@ -135,13 +135,15 @@ export interface OB11MessageFace {
}
}
export type OB11MessageMixType = OB11MessageData[] | string | OB11MessageData;
export interface OB11MessageNode {
type: OB11MessageDataType.node
data: {
id?: string
user_id?: number
nickname: string
content: OB11MessageData[]
content: OB11MessageMixType
}
}
@@ -156,7 +158,7 @@ export interface OB11PostSendMsg {
message_type?: "private" | "group"
user_id: string,
group_id?: string,
message: OB11MessageData[] | string | OB11MessageData;
message: OB11MessageMixType;
}
export interface OB11Version {