mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
fix: send temp msg
fix: multi forward msg
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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>({
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
@@ -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) {
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user