refactor: SendMessageContext

This commit is contained in:
手瓜一十雪 2024-08-06 17:00:27 +08:00
parent 7cb85ed73c
commit 87bb36c39f
3 changed files with 24 additions and 28 deletions

View File

@ -6,6 +6,7 @@ import {
IdMusicSignPostData, IdMusicSignPostData,
NTQQFileApi, NTQQFileApi,
NTQQMsgApi, NTQQMsgApi,
Peer,
SendArkElement, SendArkElement,
SendMessageElement, SendMessageElement,
SendMsgElementConstructor, SendMsgElementConstructor,
@ -19,8 +20,8 @@ import { RequestUtil } from '@/common/utils/request';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
export type MessageContext = { export type MessageContext = {
group?: Group,
deleteAfterSentFiles: string[], deleteAfterSentFiles: string[],
peer:Peer
} }
async function handleOb11FileLikeMessage( async function handleOb11FileLikeMessage(
{ data: inputdata }: OB11MessageFileBase, { data: inputdata }: OB11MessageFileBase,
@ -52,12 +53,12 @@ const _handlers: {
[OB11MessageDataType.text]: async ({ data: { text } }) => SendMsgElementConstructor.text(text), [OB11MessageDataType.text]: async ({ data: { text } }) => SendMsgElementConstructor.text(text),
[OB11MessageDataType.at]: async ({ data: { qq: atQQ } }, context) => { [OB11MessageDataType.at]: async ({ data: { qq: atQQ } }, context) => {
if (!context.group) return undefined; if (!context.peer) return undefined;
if (atQQ === 'all') return SendMsgElementConstructor.at(atQQ, atQQ, AtType.atAll, '全体成员'); if (atQQ === 'all') return SendMsgElementConstructor.at(atQQ, atQQ, AtType.atAll, '全体成员');
// then the qq is a group member // then the qq is a group member
const atMember = await getGroupMember(context.group.groupCode, atQQ); const atMember = await getGroupMember(context.peer.peerUid, atQQ);
return atMember ? return atMember ?
SendMsgElementConstructor.at(atQQ, atMember.uid, AtType.atUser, atMember.cardName || atMember.nick) : SendMsgElementConstructor.at(atQQ, atMember.uid, AtType.atUser, atMember.cardName || atMember.nick) :
undefined; undefined;
@ -206,7 +207,7 @@ const handlers = <{
export default async function createSendElements( export default async function createSendElements(
messageData: OB11MessageData[], messageData: OB11MessageData[],
group?: Group, peer: Peer,
ignoreTypes: OB11MessageDataType[] = [] ignoreTypes: OB11MessageDataType[] = []
) { ) {
const deleteAfterSentFiles: string[] = []; const deleteAfterSentFiles: string[] = [];
@ -217,7 +218,7 @@ export default async function createSendElements(
} }
const callResult = handlers[sendMsg.type]( const callResult = handlers[sendMsg.type](
sendMsg, sendMsg,
{ group, deleteAfterSentFiles } { peer, deleteAfterSentFiles }
)?.catch(undefined); )?.catch(undefined);
callResultList.push(callResult); callResultList.push(callResult);
} }
@ -228,7 +229,7 @@ export default async function createSendElements(
export async function createSendElementsParallel( export async function createSendElementsParallel(
messageData: OB11MessageData[], messageData: OB11MessageData[],
group?: Group, peer: Peer,
ignoreTypes: OB11MessageDataType[] = [] ignoreTypes: OB11MessageDataType[] = []
) { ) {
const deleteAfterSentFiles: string[] = []; const deleteAfterSentFiles: string[] = [];
@ -236,7 +237,7 @@ export async function createSendElementsParallel(
await Promise.all( await Promise.all(
messageData.map(async sendMsg => ignoreTypes.includes(sendMsg.type) ? messageData.map(async sendMsg => ignoreTypes.includes(sendMsg.type) ?
undefined : undefined :
handlers[sendMsg.type](sendMsg, { group, deleteAfterSentFiles })) handlers[sendMsg.type](sendMsg, { peer, deleteAfterSentFiles }))
).then( ).then(
results => results.filter( results => results.filter(
element => element !== undefined element => element !== undefined

View File

@ -36,7 +36,7 @@ async function cloneMsg(msg: RawMessage): Promise<RawMessage | undefined> {
} }
} }
export async function handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[], group: Group | undefined): Promise<RawMessage | null> { export async function handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[], inputPeer: Peer): Promise<RawMessage | null> {
const selfPeer = { const selfPeer = {
chatType: ChatType.friend, chatType: ChatType.friend,
peerUid: selfInfo.uid peerUid: selfInfo.uid
@ -75,7 +75,9 @@ export async function handleForwardNode(destPeer: Peer, messageNodes: OB11Messag
// 自定义的消息 // 自定义的消息
// 提取消息段发给自己生成消息id // 提取消息段发给自己生成消息id
try { try {
const { sendElements } = await createSendElements(normalize(messageNode.data.content), group); //if(messageNode.data.content instanceof OB11MessageNode)
let OB11Data = normalize(messageNode.data.content);
const { sendElements } = await createSendElements(OB11Data, inputPeer);
//logDebug('开始生成转发节点', sendElements); //logDebug('开始生成转发节点', sendElements);
const sendElementsSplit: SendMessageElement[][] = []; const sendElementsSplit: SendMessageElement[][] = [];
let splitIndex = 0; let splitIndex = 0;
@ -98,9 +100,9 @@ export async function handleForwardNode(destPeer: Peer, messageNodes: OB11Messag
// log("分割后的转发节点", sendElementsSplit) // log("分割后的转发节点", sendElementsSplit)
const MsgNodeList: Promise<RawMessage | undefined>[] = []; const MsgNodeList: Promise<RawMessage | undefined>[] = [];
for (const sendElementsSplitElement of sendElementsSplit) { for (const sendElementsSplitElement of sendElementsSplit) {
MsgNodeList.push(sendMsg(selfPeer, sendElementsSplitElement, [], true)); MsgNodeList.push(sendMsg(selfPeer, sendElementsSplitElement, [], true).catch(e => new Promise((resolve, reject) => { resolve(undefined) })));
await sleep(Math.trunc(sendElementsSplit.length / 10) * 100); //await sleep(Math.trunc(sendElementsSplit.length / 10) * 100); // 防止风控
//await sleep(10); await sleep(10);
} }
for (const msgNode of MsgNodeList) { for (const msgNode of MsgNodeList) {
const result = await msgNode; const result = await msgNode;

View File

@ -76,9 +76,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de
return returnMsg; return returnMsg;
} }
async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode): Promise<{ async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode): Promise<Peer> {
peer: Peer, group?: Group
}> {
// This function determines the type of message by the existence of user_id / group_id, // This function determines the type of message by the existence of user_id / group_id,
// not message_type. // not message_type.
// This redundant design of Ob11 here should be blamed. // This redundant design of Ob11 here should be blamed.
@ -86,11 +84,8 @@ async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode)
if ((contextMode === ContextMode.Group || contextMode === ContextMode.Normal) && payload.group_id) { if ((contextMode === ContextMode.Group || contextMode === ContextMode.Normal) && payload.group_id) {
const group = (await getGroup(payload.group_id))!; // checked before const group = (await getGroup(payload.group_id))!; // checked before
return { return {
peer: { chatType: ChatType.group,
chatType: ChatType.group, peerUid: group.groupCode
peerUid: group.groupCode
},
group: group,
}; };
} }
if ((contextMode === ContextMode.Private || contextMode === ContextMode.Normal) && payload.user_id) { if ((contextMode === ContextMode.Private || contextMode === ContextMode.Normal) && payload.user_id) {
@ -98,10 +93,8 @@ async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode)
const isBuddy = await NTQQFriendApi.isBuddy(Uid!); const isBuddy = await NTQQFriendApi.isBuddy(Uid!);
//console.log("[调试代码] UIN:", payload.user_id, " UID:", Uid, " IsBuddy:", isBuddy); //console.log("[调试代码] UIN:", payload.user_id, " UID:", Uid, " IsBuddy:", isBuddy);
return { return {
peer: { chatType: isBuddy ? ChatType.friend : ChatType.temp,
chatType: isBuddy ? ChatType.friend : ChatType.temp, peerUid: Uid!
peerUid: Uid!
},
}; };
} }
throw '请指定 group_id 或 user_id'; throw '请指定 group_id 或 user_id';
@ -139,7 +132,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
} }
protected async _handle(payload: OB11PostSendMsg): Promise<{ message_id: number }> { protected async _handle(payload: OB11PostSendMsg): Promise<{ message_id: number }> {
const { peer, group } = await createContext(payload, this.contextMode); const peer = await createContext(payload, this.contextMode);
const messages = normalize( const messages = normalize(
payload.message, payload.message,
@ -147,9 +140,9 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
); );
if (getSpecialMsgNum(payload, OB11MessageDataType.node)) { if (getSpecialMsgNum(payload, OB11MessageDataType.node)) {
const returnMsg = await handleForwardNode(peer, messages as OB11MessageNode[], group); const returnMsg = await handleForwardNode(peer, messages as OB11MessageNode[], peer);
if (returnMsg) { if (returnMsg) {
const msgShortId = await MessageUnique.createMsg({ guildId: '', peerUid: peer.peerUid, chatType: peer.chatType }, returnMsg!.msgId); const msgShortId = MessageUnique.createMsg({ guildId: '', peerUid: peer.peerUid, chatType: peer.chatType }, returnMsg!.msgId);
return { message_id: msgShortId! }; return { message_id: msgShortId! };
} else { } else {
throw Error('发送转发消息失败'); throw Error('发送转发消息失败');
@ -163,7 +156,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
} }
// log("send msg:", peer, sendElements) // log("send msg:", peer, sendElements)
const { sendElements, deleteAfterSentFiles } = await createSendElements(messages, group); const { sendElements, deleteAfterSentFiles } = await createSendElements(messages, peer);
//console.log(peer, JSON.stringify(sendElements,null,2)); //console.log(peer, JSON.stringify(sendElements,null,2));
const returnMsg = await sendMsg(peer, sendElements, deleteAfterSentFiles); const returnMsg = await sendMsg(peer, sendElements, deleteAfterSentFiles);
return { message_id: returnMsg!.id! }; return { message_id: returnMsg!.id! };