From 433a175809b5708aeece13c8e8db9c931eed883b Mon Sep 17 00:00:00 2001 From: idranme <96647698+idranme@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:47:12 +0800 Subject: [PATCH] fix: `at` element --- src/ntqqapi/api/friend.ts | 8 ++---- src/ntqqapi/api/group.ts | 26 +++++++++++++++++++ src/ntqqapi/api/user.ts | 23 +++++++++------- .../services/NodeIKernelGroupService.ts | 2 ++ src/onebot11/helper/createMessage.ts | 7 +---- src/satori/message.ts | 6 ++++- 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/ntqqapi/api/friend.ts b/src/ntqqapi/api/friend.ts index 2206325..ed17a09 100644 --- a/src/ntqqapi/api/friend.ts +++ b/src/ntqqapi/api/friend.ts @@ -16,7 +16,7 @@ export class NTQQFriendApi extends Service { /** 大于或等于 26702 应使用 getBuddyV2 */ async getFriends() { - const data = await invoke<{ + const res = await invoke<{ data: { categoryId: number categroyName: string @@ -28,11 +28,7 @@ export class NTQQFriendApi extends Service { cbCmd: ReceiveCmdS.FRIENDS, afterFirstCmd: false }) - const _friends: Friend[] = [] - for (const item of data.data) { - _friends.push(...item.buddyList) - } - return _friends + return res.data.flatMap(e => e.buddyList) } async handleFriendRequest(friendUid: string, reqTime: string, accept: boolean) { diff --git a/src/ntqqapi/api/group.ts b/src/ntqqapi/api/group.ts index 2bc90fc..791bbb3 100644 --- a/src/ntqqapi/api/group.ts +++ b/src/ntqqapi/api/group.ts @@ -296,4 +296,30 @@ export class NTQQGroupApi extends Service { async setGroupAvatar(groupCode: string, path: string) { return await invoke('nodeIKernelGroupService/setHeader', [{ path, groupCode }]) } + + async searchMember(groupCode: string, keyword: string) { + await invoke('nodeIKernelGroupListener/onSearchMemberChange', [], { + registerEvent: true + }) + const sceneId = await invoke(NTMethod.GROUP_MEMBER_SCENE, [{ + groupCode, + scene: 'groupMemberList_MainWindow' + }]) + const data = await invoke<{ + sceneId: string + keyword: string + infos: Map + }>( + 'nodeIKernelGroupService/searchMember', + [{ sceneId, keyword }], + { + cbCmd: 'nodeIKernelGroupListener/onSearchMemberChange', + cmdCB: payload => { + return payload.sceneId === sceneId && payload.keyword === keyword + }, + afterFirstCmd: false + } + ) + return data.infos + } } diff --git a/src/ntqqapi/api/user.ts b/src/ntqqapi/api/user.ts index 5cb2d23..dc9f7f8 100644 --- a/src/ntqqapi/api/user.ts +++ b/src/ntqqapi/api/user.ts @@ -108,18 +108,23 @@ export class NTQQUserApi extends Service { async getUidByUinV1(uin: string, groupCode?: string) { let uid = (await invoke('nodeIKernelUixConvertService/getUid', [{ uins: [uin] }])).uidInfo.get(uin) if (!uid) { - const unveifyUid = (await this.getUserDetailInfoByUin(uin)).info.uid //特殊转换 - if (unveifyUid.indexOf('*') === -1) { - uid = unveifyUid - } - } - if (!uid) { - const friends = await this.ctx.ntFriendApi.getFriends() //从好友列表转 + const friends = await this.ctx.ntFriendApi.getFriends() uid = friends.find(item => item.uin === uin)?.uid } if (!uid && groupCode) { - const members = await this.ctx.ntGroupApi.getGroupMembers(groupCode) - uid = Array.from(members.values()).find(e => e.uin === uin)?.uid + let member = await this.ctx.ntGroupApi.searchMember(groupCode, uin) + if (member.size === 0) { + await this.ctx.ntGroupApi.getGroupMembers(groupCode, 1) + await this.ctx.sleep(30) + member = await this.ctx.ntGroupApi.searchMember(groupCode, uin) + } + uid = member.values().find(e => e.uin === uin)?.uid + } + if (!uid) { + const unveifyUid = (await this.getUserDetailInfoByUin(uin)).info.uid + if (!unveifyUid.includes('*')) { + uid = unveifyUid + } } return uid } diff --git a/src/ntqqapi/services/NodeIKernelGroupService.ts b/src/ntqqapi/services/NodeIKernelGroupService.ts index cf37bd9..f2a1aa6 100644 --- a/src/ntqqapi/services/NodeIKernelGroupService.ts +++ b/src/ntqqapi/services/NodeIKernelGroupService.ts @@ -125,4 +125,6 @@ export interface NodeIKernelGroupService { removeGroupEssence(param: { groupCode: string, msgRandom: number, msgSeq: number }): Promise setHeader(args: unknown[]): Promise + + searchMember(sceneId: string, keyword: string): Promise } diff --git a/src/onebot11/helper/createMessage.ts b/src/onebot11/helper/createMessage.ts index af5719d..39ae1a2 100644 --- a/src/onebot11/helper/createMessage.ts +++ b/src/onebot11/helper/createMessage.ts @@ -66,15 +66,10 @@ export async function createSendElements( } } else if (peer.chatType === ChatType.Group) { - const uid = await ctx.ntUserApi.getUidByUin(atQQ) ?? '' + const uid = await ctx.ntUserApi.getUidByUin(atQQ, peer.peerUid) ?? '' let display = '' if (sendMsg.data.name) { display = `@${sendMsg.data.name}` - } else { - try { - const member = await ctx.ntGroupApi.getGroupMember(peer.peerUid, uid) - display = `@${member.cardName || member.nick}` - } catch { } } sendElements.push(SendElement.at(atQQ, uid, AtType.One, display)) } diff --git a/src/satori/message.ts b/src/satori/message.ts index 3474fb0..2d67b85 100644 --- a/src/satori/message.ts +++ b/src/satori/message.ts @@ -175,10 +175,14 @@ export class MessageEncoder { if (type === 'text') { this.elements.push(SendElement.text(attrs.content)) } else if (type === 'at') { + this.peer ??= await getPeer(this.ctx, this.channelId) + if (this.peer.chatType !== NT.ChatType.Group) { + return + } if (attrs.type === 'all') { this.elements.push(SendElement.at('', '', NT.AtType.All, '@全体成员')) } else { - const uid = await this.ctx.ntUserApi.getUidByUin(attrs.id) ?? '' + const uid = await this.ctx.ntUserApi.getUidByUin(attrs.id, this.peer.peerUid) ?? '' const display = attrs.name ? '@' + attrs.name : '' this.elements.push(SendElement.at(attrs.id, uid, NT.AtType.One, display)) }