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) {
|
for (const key in uidMaps) {
|
||||||
if (uidMaps[key].uin === uin) {
|
if (uidMaps[key] === uin) {
|
||||||
return uidMaps[key];
|
return key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ import {hookApiCallbacks, ReceiveCmd, registerReceiveHook, removeReceiveHook} fr
|
|||||||
import {log} from "../common/utils";
|
import {log} from "../common/utils";
|
||||||
import {ChatType, Friend, Group, GroupMember, RawMessage, SelfInfo, SendMessageElement, User} from "./types";
|
import {ChatType, Friend, Group, GroupMember, RawMessage, SelfInfo, SendMessageElement, User} from "./types";
|
||||||
import * as fs from "fs";
|
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"
|
import {v4 as uuidv4} from "uuid"
|
||||||
|
|
||||||
interface IPCReceiveEvent {
|
interface IPCReceiveEvent {
|
||||||
@@ -224,9 +224,13 @@ export class NTQQApi {
|
|||||||
// log("members info", typeof result.result.infos, Object.keys(result.result.infos))
|
// log("members info", typeof result.result.infos, Object.keys(result.result.infos))
|
||||||
let values = result.result.infos.values()
|
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);
|
// log("members info", values);
|
||||||
return values
|
return members
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log(`get group ${groupQQ} members failed`, e)
|
log(`get group ${groupQQ} members failed`, e)
|
||||||
return []
|
return []
|
||||||
@@ -428,7 +432,7 @@ export class NTQQApi {
|
|||||||
// 需要判断它是转发的消息,并且识别到是当前转发的这一条
|
// 需要判断它是转发的消息,并且识别到是当前转发的这一条
|
||||||
const arkElement = msg.elements.find(ele => ele.arkElement)
|
const arkElement = msg.elements.find(ele => ele.arkElement)
|
||||||
if (!arkElement) {
|
if (!arkElement) {
|
||||||
log("收到的不是转发消息")
|
// log("收到的不是转发消息")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const forwardData: any = JSON.parse(arkElement.arkElement.bytesData);
|
const forwardData: any = JSON.parse(arkElement.arkElement.bytesData);
|
||||||
@@ -439,7 +443,7 @@ export class NTQQApi {
|
|||||||
complete = true;
|
complete = true;
|
||||||
addHistoryMsg(msg)
|
addHistoryMsg(msg)
|
||||||
resolve(msg);
|
resolve(msg);
|
||||||
log("收到转发消息:", payload)
|
log("转发消息成功:", payload)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
callNTQQApi<GeneralCallResult>({
|
callNTQQApi<GeneralCallResult>({
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import {AtType, ChatType, Group, SendMessageElement} from "../../ntqqapi/types";
|
import {AtType, ChatType, Group, SendMessageElement} from "../../ntqqapi/types";
|
||||||
import {addHistoryMsg, friends, getGroup, getHistoryMsgByShortId, getStrangerByUin, selfInfo,} from "../../common/data";
|
import {addHistoryMsg, friends, getGroup, getHistoryMsgByShortId, getUidByUin, selfInfo,} from "../../common/data";
|
||||||
import {OB11MessageData, OB11MessageDataType, OB11MessageNode, OB11PostSendMsg} from '../types';
|
import {OB11MessageData, OB11MessageDataType, OB11MessageMixType, OB11MessageNode, OB11PostSendMsg} from '../types';
|
||||||
import {NTQQApi, Peer} from "../../ntqqapi/ntcall";
|
import {NTQQApi, Peer} from "../../ntqqapi/ntcall";
|
||||||
import {SendMsgElementConstructor} from "../../ntqqapi/constructor";
|
import {SendMsgElementConstructor} from "../../ntqqapi/constructor";
|
||||||
import {uri2local} from "../utils";
|
import {uri2local} from "../utils";
|
||||||
@@ -53,7 +53,7 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
actionName = ActionName.SendMsg
|
actionName = ActionName.SendMsg
|
||||||
|
|
||||||
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
|
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
|
||||||
const messages = this.convertMessage2List(payload);
|
const messages = this.convertMessage2List(payload.message);
|
||||||
const fmNum = this.forwardMsgNum(payload)
|
const fmNum = this.forwardMsgNum(payload)
|
||||||
if (fmNum && fmNum != messages.length) {
|
if (fmNum && fmNum != messages.length) {
|
||||||
return {
|
return {
|
||||||
@@ -88,15 +88,15 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
peer.peerUid = friend.uid
|
peer.peerUid = friend.uid
|
||||||
} else {
|
} else {
|
||||||
peer.chatType = ChatType.temp
|
peer.chatType = ChatType.temp
|
||||||
const tempUser = getStrangerByUin(payload.user_id.toString())
|
const tempUserUid = getUidByUin(payload.user_id.toString())
|
||||||
if (!tempUser) {
|
if (!tempUserUid) {
|
||||||
throw (`找不到私聊对象${payload.user_id}`)
|
throw (`找不到私聊对象${payload.user_id}`)
|
||||||
}
|
}
|
||||||
// peer.name = tempUser.nickName
|
// 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)) {
|
if (this.forwardMsgNum(payload)) {
|
||||||
try {
|
try {
|
||||||
const returnMsg = await this.handleForwardNode(peer, messages as OB11MessageNode[], group)
|
const returnMsg = await this.handleForwardNode(peer, messages as OB11MessageNode[], group)
|
||||||
@@ -115,18 +115,18 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private convertMessage2List(payload: OB11PostSendMsg) {
|
private convertMessage2List(message: OB11MessageMixType) {
|
||||||
if (typeof payload.message === "string") {
|
if (typeof message === "string") {
|
||||||
payload.message = [{
|
message = [{
|
||||||
type: OB11MessageDataType.text,
|
type: OB11MessageDataType.text,
|
||||||
data: {
|
data: {
|
||||||
text: payload.message
|
text: message
|
||||||
}
|
}
|
||||||
}] as OB11MessageData[]
|
}] as OB11MessageData[]
|
||||||
} else if (!Array.isArray(payload.message)) {
|
} else if (!Array.isArray(message)) {
|
||||||
payload.message = [payload.message]
|
message = [message]
|
||||||
}
|
}
|
||||||
return payload.message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
private forwardMsgNum(payload: OB11PostSendMsg): number {
|
private forwardMsgNum(payload: OB11PostSendMsg): number {
|
||||||
@@ -156,12 +156,13 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
const {
|
const {
|
||||||
sendElements,
|
sendElements,
|
||||||
deleteAfterSentFiles
|
deleteAfterSentFiles
|
||||||
} = await this.createSendElements(messageNode.data.content, group)
|
} = await this.createSendElements(this.convertMessage2List(messageNode.data.content), group)
|
||||||
try {
|
try {
|
||||||
|
log("开始生成转发节点", sendElements);
|
||||||
const nodeMsg = await this.send(selfPeer, sendElements, deleteAfterSentFiles, true);
|
const nodeMsg = await this.send(selfPeer, sendElements, deleteAfterSentFiles, true);
|
||||||
nodeIds.push(nodeMsg.msgId)
|
nodeIds.push(nodeMsg.msgId)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("生效转发消息节点失败")
|
log("生效转发消息节点失败", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -72,7 +72,7 @@ export class OB11Constructor {
|
|||||||
}
|
}
|
||||||
} else if (element.textElement) {
|
} else if (element.textElement) {
|
||||||
message_data["type"] = "text"
|
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) {
|
} else if (element.picElement) {
|
||||||
message_data["type"] = "image"
|
message_data["type"] = "image"
|
||||||
message_data["data"]["file_id"] = element.picElement.fileUuid
|
message_data["data"]["file_id"] = element.picElement.fileUuid
|
||||||
|
@@ -10,6 +10,6 @@ export enum EventType {
|
|||||||
|
|
||||||
export abstract class OB11BaseEvent {
|
export abstract class OB11BaseEvent {
|
||||||
time = new Date().getTime();
|
time = new Date().getTime();
|
||||||
self_id = selfInfo.uin;
|
self_id = parseInt(selfInfo.uin);
|
||||||
post_type: EventType;
|
post_type: EventType;
|
||||||
}
|
}
|
@@ -22,11 +22,11 @@ export function unregisterWsEventSender(ws: websocket.WebSocket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function postWsEvent(event: PostEventType) {
|
export function postWsEvent(event: PostEventType) {
|
||||||
new Promise(() => {
|
for (const ws of eventWSList) {
|
||||||
for (const ws of eventWSList) {
|
new Promise(() => {
|
||||||
wsReply(ws, event);
|
wsReply(ws, event);
|
||||||
}
|
}).then()
|
||||||
}).then()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function postEvent(msg: PostEventType) {
|
export function postEvent(msg: PostEventType) {
|
||||||
|
@@ -22,20 +22,44 @@ export class ReverseWebsocket {
|
|||||||
this.running = true;
|
this.running = true;
|
||||||
this.connect();
|
this.connect();
|
||||||
}
|
}
|
||||||
public stop(){
|
|
||||||
|
public stop() {
|
||||||
this.running = false;
|
this.running = false;
|
||||||
unregisterWsEventSender(this.websocket);
|
|
||||||
this.websocket.close();
|
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 () {
|
public onclose = function () {
|
||||||
|
log("反向ws断开", this.url);
|
||||||
unregisterWsEventSender(this.websocket);
|
unregisterWsEventSender(this.websocket);
|
||||||
|
if (this.running) {
|
||||||
|
this.reconnect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public send(msg: string) {
|
public send(msg: string) {
|
||||||
@@ -60,28 +84,24 @@ export class ReverseWebsocket {
|
|||||||
'Authorization': `Bearer ${token}`
|
'Authorization': `Bearer ${token}`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
registerWsEventSender(this.websocket);
|
||||||
log("Trying to connect to the websocket server: " + this.url);
|
log("Trying to connect to the websocket server: " + this.url);
|
||||||
|
|
||||||
const instance = this;
|
|
||||||
|
|
||||||
this.websocket.on("open", function open() {
|
this.websocket.on("open", ()=> {
|
||||||
log("Connected to the websocket server: " + instance.url);
|
log("Connected to the websocket server: " + this.url);
|
||||||
instance.onopen();
|
this.onopen();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.websocket.on("message", function message(data) {
|
this.websocket.on("message", async (data)=>{
|
||||||
instance.onmessage(data.toString());
|
await this.onmessage(data.toString());
|
||||||
});
|
});
|
||||||
|
|
||||||
this.websocket.on("error", log);
|
this.websocket.on("error", log);
|
||||||
|
|
||||||
this.websocket.on("close", function close() {
|
this.websocket.on("close", ()=> {
|
||||||
log("The websocket connection: " + instance.url + " closed, trying reconnecting...");
|
log("The websocket connection: " + this.url + " closed, trying reconnecting...");
|
||||||
instance.onclose();
|
this.onclose();
|
||||||
|
|
||||||
if (instance.running) {
|
|
||||||
instance.reconnect();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -92,40 +112,7 @@ class OB11ReverseWebsockets {
|
|||||||
log("开始连接反向ws", url)
|
log("开始连接反向ws", url)
|
||||||
new Promise(() => {
|
new Promise(() => {
|
||||||
try {
|
try {
|
||||||
let rwsClient = new ReverseWebsocket(url);
|
rwsList.push(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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log(e.stack);
|
log(e.stack);
|
||||||
}
|
}
|
||||||
@@ -134,7 +121,7 @@ class OB11ReverseWebsockets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
for(let rws of rwsList){
|
for (let rws of rwsList) {
|
||||||
rws.stop();
|
rws.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,13 +6,12 @@ import {log} from "../../../common/utils";
|
|||||||
export function wsReply(wsClient: websocket.WebSocket, data: OB11WebsocketResponse | PostEventType) {
|
export function wsReply(wsClient: websocket.WebSocket, data: OB11WebsocketResponse | PostEventType) {
|
||||||
try {
|
try {
|
||||||
let packet = Object.assign({
|
let packet = Object.assign({
|
||||||
echo: ""
|
|
||||||
}, data);
|
}, data);
|
||||||
if (!packet.echo) {
|
if (!packet["echo"]){
|
||||||
packet.echo = "";
|
delete packet["echo"];
|
||||||
}
|
}
|
||||||
wsClient.send(JSON.stringify(packet))
|
wsClient.send(JSON.stringify(packet))
|
||||||
log("ws 消息上报", data)
|
log("ws 消息上报", wsClient.url, data)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("websocket 回复失败", e)
|
log("websocket 回复失败", e)
|
||||||
}
|
}
|
||||||
|
@@ -135,13 +135,15 @@ export interface OB11MessageFace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type OB11MessageMixType = OB11MessageData[] | string | OB11MessageData;
|
||||||
|
|
||||||
export interface OB11MessageNode {
|
export interface OB11MessageNode {
|
||||||
type: OB11MessageDataType.node
|
type: OB11MessageDataType.node
|
||||||
data: {
|
data: {
|
||||||
id?: string
|
id?: string
|
||||||
user_id?: number
|
user_id?: number
|
||||||
nickname: string
|
nickname: string
|
||||||
content: OB11MessageData[]
|
content: OB11MessageMixType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +158,7 @@ export interface OB11PostSendMsg {
|
|||||||
message_type?: "private" | "group"
|
message_type?: "private" | "group"
|
||||||
user_id: string,
|
user_id: string,
|
||||||
group_id?: string,
|
group_id?: string,
|
||||||
message: OB11MessageData[] | string | OB11MessageData;
|
message: OB11MessageMixType;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OB11Version {
|
export interface OB11Version {
|
||||||
|
Reference in New Issue
Block a user