diff --git a/package.json b/package.json index ac86a6c2..15b854df 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "@ffmpeg.wasm/core-mt": "^0.13.2", "compressing": "^1.10.1", "express": "^5.0.0", + "napcat.protobuf": "^1.1.3", "piscina": "^4.7.0", "silk-wasm": "^3.6.1", "ws": "^8.18.0" diff --git a/src/onebot/action/extends/GetUnidirectionalFriendList.ts b/src/onebot/action/extends/GetUnidirectionalFriendList.ts new file mode 100644 index 00000000..7ba60cc0 --- /dev/null +++ b/src/onebot/action/extends/GetUnidirectionalFriendList.ts @@ -0,0 +1,47 @@ +import { PacketHexStr } from '@/core/packet/transformer/base'; +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { ProtoBuf, ProtoBufBase, PBUint32, PBString } from 'napcat.protobuf'; + +interface Friend { + Uin: number; + UID: number; + Nickname: string; + Age: number; + Source: string; +} + +export class GetUnidirectionalFriendList extends OneBotAction { + override actionName = ActionName.GetUnidirectionalFriendList; + + async pack_data(data: string): Promise { + return ProtoBuf(class extends ProtoBufBase { + type = PBUint32(2, false, 0); + data = PBString(3, false, data); + }).encode(); + } + + async _handle(): Promise { + const self_id = this.core.selfInfo.uin; + const req_json = JSON.stringify({ + uint64_uin: self_id, + uint64_top: 0, + uint32_req_num: 99, + bytes_cookies: "" + }); + const packed_data = await this.pack_data(req_json); + const data = Buffer.from(packed_data).toString('hex'); + const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketHexStr }; + const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); + const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); + const block_list = JSON.parse(block_json.data).rpt_block_list; + + return block_list.map((block: any) => ({ + Uin: block.Uin, + UID: block.UID, + Nickname: Buffer.from(block.NickBytes, 'base64').toString(), + Age: block.Age, + Source: Buffer.from(block.SourceBytes, 'base64').toString() + })); + } +} \ No newline at end of file diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index c28a838e..1d49b39c 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -107,6 +107,7 @@ import { SetDiyOnlineStatus } from './extends/SetDiyOnlineStatus'; import { BotExit } from './extends/BotExit'; import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton'; import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; +import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -226,7 +227,8 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new GetGroupSystemMsg(obContext, core), new BotExit(obContext, core), new ClickInlineKeyboardButton(obContext, core), - new GetPrivateFileUrl(obContext,core) + new GetPrivateFileUrl(obContext,core), + new GetUnidirectionalFriendList(obContext,core), ]; type HandlerUnion = typeof actionHandlers[number];