diff --git a/src/main/main.ts b/src/main/main.ts index a167e39..0b4108d 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -142,7 +142,8 @@ function onLoad() { .catch((e) => { log('保存设置失败', e.stack) }) - } else { + } + else { } }) .catch((err) => { @@ -169,12 +170,8 @@ function onLoad() { OB11Constructor.message(message) .then((msg) => { - if (debug) { - msg.raw = message - } else { - if (msg.message.length === 0) { - return - } + if (!debug && msg.message.length === 0) { + return } const isSelfMsg = msg.user_id.toString() == selfInfo.uin if (isSelfMsg && !reportSelfMessage) { @@ -210,7 +207,8 @@ function onLoad() { let pokeEvent: OB11FriendPokeEvent | OB11GroupPokeEvent if (isGroup) { pokeEvent = new OB11GroupPokeEvent(parseInt(id)) - } else { + } + else { pokeEvent = new OB11FriendPokeEvent(parseInt(id)) } postOb11Event(pokeEvent) @@ -323,10 +321,12 @@ function onLoad() { : 'set' // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal; postOb11Event(groupAdminNoticeEvent, true) - } else { + } + else { log('获取群通知的成员信息失败', notify, getGroup(notify.group.groupCode)) } - } else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) { + } + else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) { log('有成员退出通知', notify) try { const member1 = await NTQQUserApi.getUserDetailInfo(notify.user1.uid) @@ -348,7 +348,8 @@ function onLoad() { } catch (e) { log('获取群通知的成员信息失败', notify, e.stack.toString()) } - } else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) { + } + else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) { log('有加群请求') let groupRequestEvent = new OB11GroupRequestEvent() groupRequestEvent.group_id = parseInt(notify.group.groupCode) @@ -363,7 +364,8 @@ function onLoad() { groupRequestEvent.comment = notify.postscript groupRequestEvent.flag = notify.seq postOb11Event(groupRequestEvent) - } else if (notify.type == GroupNotifyTypes.INVITE_ME) { + } + else if (notify.type == GroupNotifyTypes.INVITE_ME) { log('收到邀请我加群通知') let groupInviteEvent = new OB11GroupRequestEvent() groupInviteEvent.group_id = parseInt(notify.group.groupCode) @@ -380,7 +382,8 @@ function onLoad() { log('解析群通知失败', e.stack.toString()) } } - } else if (payload.doubt) { + } + else if (payload.doubt) { // 可能有群管理员变动 } }) @@ -473,7 +476,8 @@ function onLoad() { getUserNick().then() start().then() - } else { + } + else { setTimeout(init, 1000) } } diff --git a/src/ntqqapi/api/msg.ts b/src/ntqqapi/api/msg.ts index 0daa919..0b9f76b 100644 --- a/src/ntqqapi/api/msg.ts +++ b/src/ntqqapi/api/msg.ts @@ -15,6 +15,54 @@ export interface Peer { guildId?: '' } +async function sendWaiter(peer: Peer, waitComplete = true, timeout: number = 10000) { + // 等待上一个相同的peer发送完 + const peerUid = peer.peerUid + let checkLastSendUsingTime = 0 + const waitLastSend = async () => { + if (checkLastSendUsingTime > timeout) { + throw '发送超时' + } + let lastSending = sendMessagePool[peer.peerUid] + if (lastSending) { + // log("有正在发送的消息,等待中...") + await sleep(500) + checkLastSendUsingTime += 500 + return await waitLastSend() + } else { + return + } + } + await waitLastSend() + + let sentMessage: RawMessage = null + sendMessagePool[peerUid] = async (rawMessage: RawMessage) => { + delete sendMessagePool[peerUid] + sentMessage = rawMessage + } + + let checkSendCompleteUsingTime = 0 + const checkSendComplete = async (): Promise => { + if (sentMessage) { + if (waitComplete) { + if ((await dbUtil.getMsgByLongId(sentMessage.msgId)).sendStatus == 2) { + return sentMessage + } + } else { + return sentMessage + } + // log(`给${peerUid}发送消息成功`) + } + checkSendCompleteUsingTime += 500 + if (checkSendCompleteUsingTime > timeout) { + throw '发送超时' + } + await sleep(500) + return await checkSendComplete() + } + return checkSendComplete(); +} + export class NTQQMsgApi { static async setEmojiLike(peer: Peer, msgSeq: string, emojiId: string, set: boolean = true) { // nt_qq//global//nt_data//Emoji//emoji-resource//sysface_res/apng/ 下可以看到所有QQ表情预览 @@ -116,52 +164,7 @@ export class NTQQMsgApi { } static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { - const peerUid = peer.peerUid - - // 等待上一个相同的peer发送完 - let checkLastSendUsingTime = 0 - const waitLastSend = async () => { - if (checkLastSendUsingTime > timeout) { - throw '发送超时' - } - let lastSending = sendMessagePool[peer.peerUid] - if (lastSending) { - // log("有正在发送的消息,等待中...") - await sleep(500) - checkLastSendUsingTime += 500 - return await waitLastSend() - } else { - return - } - } - await waitLastSend() - - let sentMessage: RawMessage = null - sendMessagePool[peerUid] = async (rawMessage: RawMessage) => { - delete sendMessagePool[peerUid] - sentMessage = rawMessage - } - - let checkSendCompleteUsingTime = 0 - const checkSendComplete = async (): Promise => { - if (sentMessage) { - if (waitComplete) { - if ((await dbUtil.getMsgByLongId(sentMessage.msgId)).sendStatus == 2) { - return sentMessage - } - } else { - return sentMessage - } - // log(`给${peerUid}发送消息成功`) - } - checkSendCompleteUsingTime += 500 - if (checkSendCompleteUsingTime > timeout) { - throw '发送超时' - } - await sleep(500) - return await checkSendComplete() - } - + const waiter = sendWaiter(peer, waitComplete, timeout); callNTQQApi({ methodName: NTQQApiMethod.SEND_MSG, args: [ @@ -174,11 +177,12 @@ export class NTQQMsgApi { null, ], }).then() - return await checkSendComplete() + return await waiter; } static async forwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]) { - return await callNTQQApi({ + const waiter = sendWaiter(destPeer, true, 10000); + callNTQQApi({ methodName: NTQQApiMethod.FORWARD_MSG, args: [ { @@ -190,7 +194,8 @@ export class NTQQMsgApi { }, null, ], - }) + }).then().catch(log) + return await waiter; } static async multiForwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]) { diff --git a/src/onebot11/action/msg/ForwardSingleMsg.ts b/src/onebot11/action/msg/ForwardSingleMsg.ts index b08a093..d3d5d6a 100644 --- a/src/onebot11/action/msg/ForwardSingleMsg.ts +++ b/src/onebot11/action/msg/ForwardSingleMsg.ts @@ -11,7 +11,11 @@ interface Payload { user_id?: number } -class ForwardSingleMsg extends BaseAction { +interface Response { + message_id: number +} + +class ForwardSingleMsg extends BaseAction { protected async getTargetPeer(payload: Payload): Promise { if (payload.user_id) { return { chatType: ChatType.friend, peerUid: getUidByUin(payload.user_id.toString()) } @@ -19,10 +23,10 @@ class ForwardSingleMsg extends BaseAction { return { chatType: ChatType.group, peerUid: payload.group_id.toString() } } - protected async _handle(payload: Payload): Promise { + protected async _handle(payload: Payload): Promise { const msg = await dbUtil.getMsgByShortId(payload.message_id) const peer = await this.getTargetPeer(payload) - await NTQQMsgApi.forwardMsg( + const sentMsg = await NTQQMsgApi.forwardMsg( { chatType: msg.chatType, peerUid: msg.peerUid, @@ -30,7 +34,8 @@ class ForwardSingleMsg extends BaseAction { peer, [msg.msgId], ) - return null + const ob11MsgId = await dbUtil.addMsg(sentMsg) + return {message_id: ob11MsgId} } } diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index aff880d..e179f01 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -55,6 +55,7 @@ export class OB11Constructor { let config = getConfigUtil().getConfig() const { enableLocalFile2Url, + debug, ob11: { messagePostFormat }, } = config const message_type = msg.chatType == ChatType.group ? 'group' : 'private' @@ -78,8 +79,11 @@ export class OB11Constructor { message_format: messagePostFormat === 'string' ? 'string' : 'array', post_type: selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE, } + if (debug) { + resMsg.raw = msg + } if (msg.chatType == ChatType.group) { - resMsg.sub_type = 'normal' // 这里go-cqhttp是group,而onebot11标准是normal, 蛋疼 + resMsg.sub_type = 'normal' resMsg.group_id = parseInt(msg.peerUin) const member = await getGroupMember(msg.peerUin, msg.senderUin) if (member) { @@ -155,16 +159,16 @@ export class OB11Constructor { else if (element.picElement) { message_data['type'] = 'image' // message_data["data"]["file"] = element.picElement.sourcePath - let fileName = element.picElement.fileName; - const sourcePath = element.picElement.sourcePath; - if (element.picElement.picType === PicType.gif && !fileName.endsWith('.gif')){ - fileName += ".gif"; + let fileName = element.picElement.fileName + const sourcePath = element.picElement.sourcePath + if (element.picElement.picType === PicType.gif && !fileName.endsWith('.gif')) { + fileName += '.gif' } message_data['data']['file'] = fileName // message_data["data"]["path"] = element.picElement.sourcePath // let currentRKey = "CAQSKAB6JWENi5LMk0kc62l8Pm3Jn1dsLZHyRLAnNmHGoZ3y_gDZPqZt-64" - message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement, msg.chatType); + message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement, msg.chatType) // message_data["data"]["file_id"] = element.picElement.fileUuid message_data['data']['file_size'] = element.picElement.fileSize dbUtil