diff --git a/src/onebot11/action/msg/SendMsg/create-send-elements.ts b/src/onebot11/action/msg/SendMsg/create-send-elements.ts index 92358791..84d39636 100644 --- a/src/onebot11/action/msg/SendMsg/create-send-elements.ts +++ b/src/onebot11/action/msg/SendMsg/create-send-elements.ts @@ -6,6 +6,7 @@ import { IdMusicSignPostData, NTQQFileApi, NTQQMsgApi, + Peer, SendArkElement, SendMessageElement, SendMsgElementConstructor, @@ -19,8 +20,8 @@ import { RequestUtil } from '@/common/utils/request'; import { MessageUnique } from '@/common/utils/MessageUnique'; export type MessageContext = { - group?: Group, deleteAfterSentFiles: string[], + peer:Peer } async function handleOb11FileLikeMessage( { data: inputdata }: OB11MessageFileBase, @@ -52,12 +53,12 @@ const _handlers: { [OB11MessageDataType.text]: async ({ data: { text } }) => SendMsgElementConstructor.text(text), [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, '全体成员'); // 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 ? SendMsgElementConstructor.at(atQQ, atMember.uid, AtType.atUser, atMember.cardName || atMember.nick) : undefined; @@ -206,7 +207,7 @@ const handlers = <{ export default async function createSendElements( messageData: OB11MessageData[], - group?: Group, + peer: Peer, ignoreTypes: OB11MessageDataType[] = [] ) { const deleteAfterSentFiles: string[] = []; @@ -217,7 +218,7 @@ export default async function createSendElements( } const callResult = handlers[sendMsg.type]( sendMsg, - { group, deleteAfterSentFiles } + { peer, deleteAfterSentFiles } )?.catch(undefined); callResultList.push(callResult); } @@ -228,7 +229,7 @@ export default async function createSendElements( export async function createSendElementsParallel( messageData: OB11MessageData[], - group?: Group, + peer: Peer, ignoreTypes: OB11MessageDataType[] = [] ) { const deleteAfterSentFiles: string[] = []; @@ -236,7 +237,7 @@ export async function createSendElementsParallel( await Promise.all( messageData.map(async sendMsg => ignoreTypes.includes(sendMsg.type) ? undefined : - handlers[sendMsg.type](sendMsg, { group, deleteAfterSentFiles })) + handlers[sendMsg.type](sendMsg, { peer, deleteAfterSentFiles })) ).then( results => results.filter( element => element !== undefined diff --git a/src/onebot11/action/msg/SendMsg/handle-forward-node.ts b/src/onebot11/action/msg/SendMsg/handle-forward-node.ts index d9cc523c..f9ee7a0d 100644 --- a/src/onebot11/action/msg/SendMsg/handle-forward-node.ts +++ b/src/onebot11/action/msg/SendMsg/handle-forward-node.ts @@ -36,7 +36,7 @@ async function cloneMsg(msg: RawMessage): Promise { } } -export async function handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[], group: Group | undefined): Promise { +export async function handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[], inputPeer: Peer): Promise { const selfPeer = { chatType: ChatType.friend, peerUid: selfInfo.uid @@ -75,7 +75,9 @@ export async function handleForwardNode(destPeer: Peer, messageNodes: OB11Messag // 自定义的消息 // 提取消息段,发给自己生成消息id 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); const sendElementsSplit: SendMessageElement[][] = []; let splitIndex = 0; @@ -98,9 +100,9 @@ export async function handleForwardNode(destPeer: Peer, messageNodes: OB11Messag // log("分割后的转发节点", sendElementsSplit) const MsgNodeList: Promise[] = []; for (const sendElementsSplitElement of sendElementsSplit) { - MsgNodeList.push(sendMsg(selfPeer, sendElementsSplitElement, [], true)); - await sleep(Math.trunc(sendElementsSplit.length / 10) * 100); - //await sleep(10); + MsgNodeList.push(sendMsg(selfPeer, sendElementsSplitElement, [], true).catch(e => new Promise((resolve, reject) => { resolve(undefined) }))); + //await sleep(Math.trunc(sendElementsSplit.length / 10) * 100); // 防止风控 + await sleep(10); } for (const msgNode of MsgNodeList) { const result = await msgNode; diff --git a/src/onebot11/action/msg/SendMsg/index.ts b/src/onebot11/action/msg/SendMsg/index.ts index 2932aa77..6eb51400 100644 --- a/src/onebot11/action/msg/SendMsg/index.ts +++ b/src/onebot11/action/msg/SendMsg/index.ts @@ -76,9 +76,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de return returnMsg; } -async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode): Promise<{ - peer: Peer, group?: Group -}> { +async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode): Promise { // This function determines the type of message by the existence of user_id / group_id, // not message_type. // 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) { const group = (await getGroup(payload.group_id))!; // checked before return { - peer: { - chatType: ChatType.group, - peerUid: group.groupCode - }, - group: group, + chatType: ChatType.group, + peerUid: group.groupCode }; } 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!); //console.log("[调试代码] UIN:", payload.user_id, " UID:", Uid, " IsBuddy:", isBuddy); return { - peer: { - chatType: isBuddy ? ChatType.friend : ChatType.temp, - peerUid: Uid! - }, + chatType: isBuddy ? ChatType.friend : ChatType.temp, + peerUid: Uid! }; } throw '请指定 group_id 或 user_id'; @@ -139,7 +132,7 @@ export class SendMsg extends BaseAction { } 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( payload.message, @@ -147,9 +140,9 @@ export class SendMsg extends BaseAction { ); 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) { - 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! }; } else { throw Error('发送转发消息失败'); @@ -163,7 +156,7 @@ export class SendMsg extends BaseAction { } // 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)); const returnMsg = await sendMsg(peer, sendElements, deleteAfterSentFiles); return { message_id: returnMsg!.id! };