{"version":3,"file":"index.mjs","names":["parseFriendRequest","parseFriendRequest"],"sources":["../src/common/appinfo/linux/39038.json","../src/common/appinfo/linux/46494.json","../src/common/appinfo/index.ts","../src/common/client.ts","../src/common/enum.ts","../src/common/error.ts","../src/common/logging.ts","../src/common/service.ts","../src/entity/base.ts","../src/entity/friend.ts","../src/entity/group.ts","../src/entity/message.ts","../src/internal/proto/flash-transfer.ts","../src/internal/util/sha1-stream.ts","../src/internal/flash-transfer.ts","../src/internal/proto/highway.ts","../src/internal/highway.ts","../src/internal/proto/message/elem.ts","../src/internal/proto/message/common.ts","../src/internal/proto/misc.ts","../src/internal/proto/oidb/0x5cf.ts","../src/internal/proto/oidb/0x7e5.ts","../src/internal/proto/oidb/0x126b.ts","../src/internal/proto/oidb/0xb5d.ts","../src/internal/proto/oidb/0xd69.ts","../src/internal/proto/oidb/0xd72.ts","../src/internal/proto/oidb/0xed3.ts","../src/internal/service/friend.ts","../src/internal/proto/oidb/0x8a0.ts","../src/internal/proto/oidb/0x8fc.ts","../src/internal/proto/oidb/0x10c0.ts","../src/internal/proto/oidb/0x10c8.ts","../src/internal/proto/oidb/0x88d.ts","../src/internal/proto/oidb/0x89a.ts","../src/internal/proto/oidb/0x1096.ts","../src/internal/proto/oidb/0x1097.ts","../src/internal/proto/oidb/0x1253.ts","../src/internal/proto/oidb/0x9082.ts","../src/internal/proto/oidb/0xeac.ts","../src/internal/service/group.ts","../src/internal/proto/oidb/media.ts","../src/internal/service/media.ts","../src/internal/proto/message/action.ts","../src/internal/service/message.ts","../src/internal/proto/httpconn.ts","../src/internal/proto/oidb/0x102a.ts","../src/internal/proto/oidb/0x9154.ts","../src/internal/proto/oidb/0xfd4.ts","../src/internal/proto/oidb/0xfe1.ts","../src/internal/proto/oidb/0xfe5.ts","../src/internal/proto/oidb/0xfe7.ts","../src/internal/util/ipv4.ts","../src/internal/service/system.ts","../src/internal/ticket.ts","../src/internal/transform/group.ts","../src/internal/transform/message/incoming.ts","../src/internal/transform/message/outgoing.ts","../src/internal/transform/notification.ts","../src/internal/proto/message/event.ts","../src/internal/transform/event.ts","../src/index.ts"],"sourcesContent":["","","import z from 'zod';\n\nexport const zAppInfo = z.object({\n  Os: z.string(),\n  Kernel: z.string(),\n  VendorOs: z.string(),\n  CurrentVersion: z.string(),\n  MiscBitmap: z.number(),\n  PtVersion: z.string(),\n  SsoVersion: z.number(),\n  PackageName: z.string(),\n  WtLoginSdk: z.string(),\n  AppId: z.number(),\n  SubAppId: z.number(),\n  AppClientVersion: z.number(),\n  MainSigMap: z.number(),\n  SubSigMap: z.number(),\n  NTLoginType: z.number(),\n});\n\nexport type AppInfo = z.infer<typeof zAppInfo>;\n\nexport const BundledAppInfo = {\n  Linux: {\n    '39038': (await import('./linux/39038.json')) satisfies AppInfo,\n    '46494': (await import('./linux/46494.json')) satisfies AppInfo,\n  },\n};\n","export interface OutgoingSsoPacket {\n  command: string;\n  sequence: number;\n  payload: Buffer;\n  overrides?: Partial<SsoPacketOverrides>;\n}\n\nexport enum SsoRequestType {\n  D2Auth = 12,\n  Simple = 13,\n}\n\nexport enum SsoEncryptType {\n  None = 0,\n  WithD2Key = 1,\n  WithEmptyKey = 2,\n}\n\nexport interface SsoPacketOverrides {\n  requestType: SsoRequestType;\n  encryptType: SsoEncryptType;\n  ssoReservedMsgType: number;\n}\n\nexport interface IncomingSsoPacket {\n  command: string;\n  sequence: number;\n  retcode: number;\n  payload: Buffer;\n  extra: string;\n}\n\nexport interface SelfInfo {\n  uin: number;\n  uid: string;\n}\n\nexport interface PacketClient {\n  send(packet: OutgoingSsoPacket): Promise<IncomingSsoPacket>;\n  onPush(handler: (packet: IncomingSsoPacket) => void): void;\n  offPush(handler: (packet: IncomingSsoPacket) => void): void;\n  getSelfInfo(): Promise<SelfInfo>;\n}\n","export enum BotUserInfoGender {\n  Unset = 0,\n  Male = 1,\n  Female = 2,\n  Unknown = 255,\n}\n\nexport enum BotUserInfoKey {\n  Avatar = 101,\n  Bio = 102,\n  Remark = 103,\n  Level = 105,\n  BusinessList = 107,\n  Nickname = 20002,\n  Country = 20003,\n  Gender = 20009,\n  City = 20020,\n  School = 20021,\n  RegisterTime = 20026,\n  Age = 20037,\n  Qid = 27394,\n}\n\nexport enum BotGroupMemberRole {\n  Member = 0,\n  Owner = 1,\n  Admin = 2,\n}\n\nexport enum ImageSubType {\n  Normal = 0,\n  Sticker = 1,\n}\n\nexport enum ImageFormat {\n  PNG = 1001,\n  GIF = 2000,\n  JPEG = 1000,\n  BMP = 1005,\n  WEBP = 1002,\n  TIFF = 1006,\n}\n\nexport enum RequestState {\n  Default = 0,\n  Pending = 1,\n  Accepted = 2,\n  Rejected = 3,\n}\n","export class ServiceError extends Error {\n  constructor(\n    public readonly command: string,\n    public readonly retcode: number,\n    public readonly message: string,\n  ) {\n    super(`ServiceError when calling ${command}, code=${retcode}, message=${message}`);\n  }\n}\n\nexport class OidbError extends Error {\n  constructor(\n    public readonly command: number,\n    public readonly service: number,\n    public readonly result: number,\n    public readonly oidbMessage: string,\n  ) {\n    super(`OidbError when calling 0x${command.toString(16)}_${service}, code=${result}, message=${oidbMessage}`);\n  }\n}\n\nexport class MessageSendError extends Error {\n  constructor(\n    public readonly result: number,\n    public readonly sendMessage: string,\n  ) {\n    super(`MessageSendError, code=${result}, message=${sendMessage}`);\n  }\n}\n\nexport class WebApiError extends Error {\n  constructor(\n    public readonly webMessage: string,\n    public readonly statusCode: number,\n  ) {\n    super(`${webMessage} (${statusCode})`);\n  }\n}\n","import type { Emitter } from 'mitt';\n\nexport interface LogMessage {\n  level: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n  module: string;\n  message: string;\n  error?: unknown;\n}\n\nexport type LogEmitter = Emitter<{\n  log: LogMessage;\n}>;\n\nexport interface Logger {\n  trace(message: string, error?: unknown): void;\n  debug(message: string, error?: unknown): void;\n  info(message: string, error?: unknown): void;\n  warn(message: string, error?: unknown): void;\n  error(message: string, error?: unknown): void;\n}\n\nexport function createLogger(logEmitter: LogEmitter, module: string): Logger {\n  return {\n    trace(message, error) {\n      logEmitter.emit('log', { level: 'trace', module, message, error });\n    },\n    debug(message, error) {\n      logEmitter.emit('log', { level: 'debug', module, message, error });\n    },\n    info(message, error) {\n      logEmitter.emit('log', { level: 'info', module, message, error });\n    },\n    warn(message, error) {\n      logEmitter.emit('log', { level: 'warn', module, message, error });\n    },\n    error(message, error) {\n      logEmitter.emit('log', { level: 'error', module, message, error });\n    },\n  };\n}\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nimport { type Bot, OidbError, type PacketClient, type SsoPacketOverrides } from '..';\n\nexport interface Service<T extends Array<unknown>, R, C extends PacketClient> {\n  command: string;\n  build(bot: Bot<C>, ...args: T): Buffer;\n  parse?(bot: Bot<C>, payload: Buffer): R;\n  overrides?: Partial<SsoPacketOverrides>;\n}\n\nexport function defineService<T extends Array<unknown>, R = undefined, C extends PacketClient = PacketClient>(\n  service: Service<T, R, C>,\n) {\n  return service;\n}\n\nexport interface OidbServiceInit<T extends Array<unknown>, R, C extends PacketClient> {\n  command: number;\n  service: number;\n  build(bot: Bot<C>, ...args: T): Buffer;\n  parse?(bot: Bot<C>, payload: Buffer): R;\n  reserved?: number;\n  overrides?: Partial<SsoPacketOverrides>;\n}\n\nconst OidbBase = ProtoMessage.of({\n  command: ProtoField(1, 'uint32'),\n  service: ProtoField(2, 'uint32'),\n  result: ProtoField(3, 'uint32'),\n  body: ProtoField(4, 'bytes'),\n  message: ProtoField(5, 'string'),\n  reserved: ProtoField(12, 'int32'),\n});\n\nexport function defineOidbService<T extends Array<unknown>, R = undefined, C extends PacketClient = PacketClient>(\n  init: OidbServiceInit<T, R, C>,\n): Service<T, R, C> {\n  return {\n    command: `OidbSvcTrpcTcp.0x${init.command.toString(16)}_${init.service}`,\n    build(bot, ...args) {\n      const body = init.build(bot, ...args);\n      return OidbBase.encode({\n        command: init.command,\n        service: init.service,\n        body,\n        reserved: init.reserved ?? 0,\n      });\n    },\n    parse(bot, payload) {\n      const { result, body, message } = OidbBase.decode(payload);\n      if (result !== 0) {\n        throw new OidbError(init.command, init.service, result, message);\n      }\n      return init.parse?.(bot, body) ?? (undefined as R);\n    },\n    overrides: init.overrides,\n  };\n}\n","import { Mutex } from 'async-mutex';\n\nimport type { Bot, Logger } from '..';\n\nexport abstract class BotEntity<T> {\n  constructor(\n    public bot: Bot,\n    public data: T,\n  ) {}\n\n  updateBinding(data: T) {\n    this.data = data;\n  }\n}\n\nexport class BotEntityHolder<K, E extends BotEntity<B>, B> {\n  private map = new Map<K, E>();\n  private updating: boolean = false;\n  private readonly mutex = new Mutex();\n  private readonly logger: Logger;\n\n  constructor(\n    public readonly bot: Bot,\n    private readonly updateCache: (bot: Bot) => Promise<Map<K, B>>,\n    private readonly entityFactory: (bot: Bot, data: B) => E,\n  ) {\n    this.logger = this.bot.createLogger(this.constructor.name);\n  }\n\n  async get(key: K, forceUpdate = false) {\n    if (!this.map.has(key) || forceUpdate) {\n      this.logger.trace('请求刷新缓存');\n      await this.update();\n    }\n    return this.map.get(key);\n  }\n\n  async getAll(forceUpdate = false) {\n    if (forceUpdate || this.map.size === 0) {\n      await this.update();\n    }\n    return this.map.values();\n  }\n\n  async update() {\n    if (this.updating) {\n      this.logger.trace('重复的缓存刷新请求，已忽略');\n      await this.mutex.waitForUnlock();\n    } else {\n      this.updating = true;\n      await this.mutex.runExclusive(async () => {\n        try {\n          const data = await this.updateCache(this.bot);\n          this.acceptData(data);\n        } catch {\n          this.logger.warn('缓存刷新失败');\n        } finally {\n          this.updating = false;\n        }\n      });\n    }\n  }\n\n  acceptData(data: Map<K, B>) {\n    const map = new Map<K, E>();\n    for (const [key, value] of data.entries()) {\n      const entity = this.map.get(key);\n      if (entity) {\n        entity.updateBinding(value);\n        map.set(key, entity);\n      } else {\n        map.set(key, this.entityFactory(this.bot, value));\n      }\n    }\n    this.map = map;\n  }\n}\n","import type { BotUserInfoGender } from '../common';\nimport { BotEntity } from './base';\n\nexport interface BotFriendData {\n  uin: number;\n  uid: string;\n  gender: BotUserInfoGender;\n  nickname: string;\n  remark: string;\n  bio: string;\n  qid: string;\n  categoryId: number;\n  categoryName: string;\n}\n\nexport class BotFriend extends BotEntity<BotFriendData> implements BotFriendData {\n  get uin() {\n    return this.data.uin;\n  }\n  get uid() {\n    return this.data.uid;\n  }\n  get gender() {\n    return this.data.gender;\n  }\n  get nickname() {\n    return this.data.nickname;\n  }\n  get remark() {\n    return this.data.remark;\n  }\n  get bio() {\n    return this.data.bio;\n  }\n  get qid() {\n    return this.data.qid;\n  }\n  get categoryId() {\n    return this.data.categoryId;\n  }\n  get categoryName() {\n    return this.data.categoryName;\n  }\n\n  override toString() {\n    return `${this.remark || this.nickname} (${this.uin})`;\n  }\n}\n","import type { Bot, BotGroupMemberRole } from '..';\nimport { BotEntity, BotEntityHolder } from './base';\n\nexport interface BotGroupData {\n  uin: number;\n  name: string;\n  remark: string;\n  description: string;\n  question: string;\n  announcement: string;\n  createdTime: number;\n  maxMemberCount: number;\n  memberCount: number;\n}\n\nexport interface BotGroupMemberData {\n  uin: number;\n  uid: string;\n  nickname: string;\n  card: string;\n  specialTitle: string;\n  level: number;\n  joinedAt: number;\n  lastSpokeAt: number;\n  mutedUntil?: number;\n  role: BotGroupMemberRole;\n}\n\nexport interface BotGroupAnnouncement {\n  groupUin: number;\n  announcementId: string;\n  senderId: number;\n  time: number;\n  content: string;\n  imageUrl?: string;\n}\n\nexport class BotGroup extends BotEntity<BotGroupData> implements BotGroupData {\n  private readonly memberHolder: BotEntityHolder<number, BotGroupMember, BotGroupMemberData>;\n\n  constructor(bot: Bot, data: BotGroupData) {\n    super(bot, data);\n\n    this.memberHolder = new BotEntityHolder(\n      bot,\n      async (currentBot) => {\n        const members = await currentBot.fetchGroupMemberData(this.uin);\n        return new Map(members.map((member) => [member.uin, member]));\n      },\n      (currentBot, memberData) => new BotGroupMember(currentBot, memberData, this),\n    );\n  }\n\n  get uin() {\n    return this.data.uin;\n  }\n  get name() {\n    return this.data.name;\n  }\n  get remark() {\n    return this.data.remark;\n  }\n  get description() {\n    return this.data.description;\n  }\n  get question() {\n    return this.data.question;\n  }\n  get announcement() {\n    return this.data.announcement;\n  }\n  get createdTime() {\n    return this.data.createdTime;\n  }\n  get maxMemberCount() {\n    return this.data.maxMemberCount;\n  }\n  get memberCount() {\n    return this.data.memberCount;\n  }\n\n  async getMembers(forceUpdate = false): Promise<BotGroupMember[]> {\n    return Array.from(await this.memberHolder.getAll(forceUpdate));\n  }\n\n  async getMember(uin: number, forceUpdate = false): Promise<BotGroupMember | undefined> {\n    return this.memberHolder.get(uin, forceUpdate);\n  }\n\n  async updateMemberCache(): Promise<void> {\n    await this.memberHolder.update();\n  }\n\n  override toString() {\n    return `${this.name} (${this.uin})`;\n  }\n}\n\nexport class BotGroupMember extends BotEntity<BotGroupMemberData> implements BotGroupMemberData {\n  constructor(\n    bot: Bot,\n    data: BotGroupMemberData,\n    readonly group: BotGroup,\n  ) {\n    super(bot, data);\n  }\n\n  get uin() {\n    return this.data.uin;\n  }\n  get uid() {\n    return this.data.uid;\n  }\n  get nickname() {\n    return this.data.nickname;\n  }\n  get card() {\n    return this.data.card;\n  }\n  get specialTitle() {\n    return this.data.specialTitle;\n  }\n  get level() {\n    return this.data.level;\n  }\n  get joinedAt() {\n    return this.data.joinedAt;\n  }\n  get lastSpokeAt() {\n    return this.data.lastSpokeAt;\n  }\n  get mutedUntil() {\n    const currentTime = Math.floor(Date.now() / 1000);\n    return this.data.mutedUntil && this.data.mutedUntil > currentTime ? this.data.mutedUntil : undefined;\n  }\n  get role() {\n    return this.data.role;\n  }\n\n  override toString() {\n    return `${this.card || this.nickname} (${this.uin})`;\n  }\n}\n","import { match } from 'ts-pattern';\n\nimport { type ImageFormat, ImageSubType } from '../common';\n\nexport type MessageScene = 'friend' | 'group' | 'temp';\n\nexport interface BotIncomingMessage {\n  scene: MessageScene;\n  peerUin: number;\n  peerUid: string;\n  sequence: number;\n  timestamp: number;\n  senderUin: number;\n  senderUid: string;\n  clientSequence: number;\n  random: number;\n  messageUid: bigint;\n  segments: BotIncomingSegment[];\n  extraInfo?: BotIncomingMessageExtraInfo;\n}\n\nexport interface BotIncomingMessageExtraInfo {\n  nick: string;\n  card: string;\n  specialTitle: string;\n}\n\nexport type BotIncomingSegment =\n  | {\n      type: 'text';\n      text: string;\n    }\n  | {\n      type: 'mention';\n      uin?: number;\n      name: string;\n    }\n  | {\n      type: 'face';\n      faceId: number;\n      summary: string;\n      isLarge: boolean;\n    }\n  | {\n      type: 'reply';\n      sequence: number;\n      senderUin: number;\n      senderName?: string;\n      timestamp: number;\n      segments: BotIncomingSegment[];\n    }\n  | {\n      type: 'image';\n      fileId: string;\n      width: number;\n      height: number;\n      subType: ImageSubType;\n      summary: string;\n    }\n  | {\n      type: 'record';\n      fileId: string;\n      duration: number;\n    }\n  | {\n      type: 'video';\n      fileId: string;\n      duration: number;\n      width: number;\n      height: number;\n    }\n  | {\n      type: 'file';\n      fileId: string;\n      fileName: string;\n      fileSize: number;\n      fileHash?: string;\n    }\n  | {\n      type: 'forward';\n      resId: string;\n      title: string;\n      preview: string[];\n      summary: string;\n    }\n  | {\n      type: 'marketFace';\n      url: string;\n      summary: string;\n      emojiId: string;\n      emojiPackageId: number;\n      key: string;\n    }\n  | {\n      type: 'lightApp';\n      appName: string;\n      jsonPayload: string;\n    };\n\nexport interface BotForwardedMessage {\n  sequence: number;\n  senderName: string;\n  avatarUrl: string;\n  timestamp: number;\n  segments: BotIncomingSegment[];\n}\n\nexport interface BotHistoryMessages {\n  messages: BotIncomingMessage[];\n  nextStartSequence?: number;\n}\n\nexport type BotEssenceSegment =\n  | {\n      type: 'text';\n      text: string;\n    }\n  | {\n      type: 'face';\n      faceId: number;\n    }\n  | {\n      type: 'image';\n      imageUrl: string;\n    }\n  | {\n      type: 'video';\n      thumbnailUrl: string;\n    };\n\nexport interface BotEssenceMessage {\n  groupUin: number;\n  messageSeq: number;\n  messageTime: number;\n  senderUin: number;\n  senderName: string;\n  operatorUin: number;\n  operatorName: string;\n  operationTime: number;\n  segments: BotEssenceSegment[];\n}\n\nexport interface BotEssenceMessageResult {\n  messages: BotEssenceMessage[];\n  isEnd: boolean;\n}\n\nexport type BotOutgoingSegment =\n  | {\n      type: 'text';\n      text: string;\n    }\n  | {\n      type: 'mention';\n      uin?: number;\n      name: string;\n    }\n  | {\n      type: 'face';\n      faceId: number;\n      isLarge?: boolean;\n    }\n  | {\n      type: 'reply';\n      sequence: number;\n    }\n  | {\n      type: 'image';\n      data: Buffer;\n      format: ImageFormat;\n      width: number;\n      height: number;\n      subType?: ImageSubType;\n      summary?: string;\n    }\n  | {\n      type: 'record';\n      data: Buffer;\n      duration: number;\n    }\n  | {\n      type: 'video';\n      data: Buffer;\n      width: number;\n      height: number;\n      duration: number;\n      thumb: Buffer;\n      thumbFormat: ImageFormat;\n    }\n  | {\n      type: 'forward';\n      nodes: BotOutgoingForwardNode[];\n      title?: string;\n      preview?: string[];\n      summary?: string;\n      prompt?: string;\n    }\n  | {\n      type: 'lightApp';\n      jsonPayload: string;\n    };\n\nexport interface BotOutgoingForwardNode {\n  senderUin: number;\n  senderName: string;\n  segments: BotOutgoingSegment[];\n}\n\nexport interface BotOutgoingMessageResult {\n  sequence: number;\n  sendTime: number;\n}\n\nexport interface BotOutgoingMessageOptions {\n  clientSequence?: number;\n  random?: number;\n}\n\nexport function incomingSegmentPreview(segment: BotIncomingSegment): string {\n  return match(segment)\n    .with({ type: 'text' }, (item) => item.text)\n    .with({ type: 'mention' }, (item) => item.name)\n    .with({ type: 'face' }, (item) => item.summary)\n    .with({ type: 'reply' }, () => '[引用消息]')\n    .with({ type: 'image' }, (item) => item.summary)\n    .with({ type: 'record' }, (item) => `[语音 ${item.duration}s]`)\n    .with({ type: 'video' }, (item) => `[视频 ${item.width}x${item.height} ${item.duration}s]`)\n    .with({ type: 'file' }, (item) => `[文件 ${item.fileName}]`)\n    .with({ type: 'forward' }, () => '[转发消息]')\n    .with({ type: 'marketFace' }, (item) => item.summary)\n    .with({ type: 'lightApp' }, (item) => `[卡片消息 ${item.appName}]`)\n    .exhaustive();\n}\n\nexport function outgoingSegmentPreview(segment: BotOutgoingSegment): string {\n  return match(segment)\n    .with({ type: 'text' }, (item) => item.text)\n    .with({ type: 'mention' }, (item) => `@${item.name}`)\n    .with({ type: 'face' }, () => '[表情]')\n    .with({ type: 'reply' }, () => '[引用消息]')\n    .with({ type: 'image' }, (item) => {\n      return item.summary ?? (item.subType === ImageSubType.Sticker ? '[动画表情]' : '[图片]');\n    })\n    .with({ type: 'record' }, (item) => `[语音 ${item.duration}s]`)\n    .with({ type: 'video' }, (item) => `[视频 ${item.width}x${item.height} ${item.duration}s]`)\n    .with({ type: 'forward' }, (item) => item.prompt ?? '[聊天记录]')\n    .with({ type: 'lightApp' }, () => '[小程序]')\n    .exhaustive();\n}\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FlashTransferUploadRequest = ProtoMessage.of({\n  field1: ProtoField(1, 'uint32'),\n  appId: ProtoField(2, 'uint32'),\n  field3: ProtoField(3, 'uint32'),\n  body: ProtoField(107, {\n    field1: ProtoField(1, 'bytes'),\n    uKey: ProtoField(2, 'string'),\n    start: ProtoField(3, 'uint32'),\n    end: ProtoField(4, 'uint32'),\n    sha1: ProtoField(5, 'bytes'),\n    sha1StateV: ProtoField(6, {\n      state: ProtoField(1, 'bytes', 'repeated'),\n    }),\n    body: ProtoField(7, 'bytes'),\n  }),\n});\n\nexport const FlashTransferUploadResponse = ProtoMessage.of({\n  status: ProtoField(5, 'string'),\n});\n","const SHA1_BLOCK_SIZE = 64;\nconst SHA1_DIGEST_SIZE = 20;\n\nconst PADDING = Buffer.from([\n  0x80, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n]);\n\nexport class SHA1Stream {\n  static readonly blockSize = SHA1_BLOCK_SIZE;\n  static readonly digestSize = SHA1_DIGEST_SIZE;\n\n  private readonly state = new Uint32Array(5);\n  private readonly count = new Uint32Array(2);\n  private readonly buffer = Buffer.alloc(SHA1_BLOCK_SIZE);\n\n  constructor() {\n    this.reset();\n  }\n\n  reset(): void {\n    this.state[0] = 0x67452301;\n    this.state[1] = 0xefcdab89;\n    this.state[2] = 0x98badcfe;\n    this.state[3] = 0x10325476;\n    this.state[4] = 0xc3d2e1f0;\n    this.count[0] = 0;\n    this.count[1] = 0;\n    this.buffer.fill(0);\n  }\n\n  update(data: Buffer | Uint8Array, length = data.length): void {\n    if (!Number.isInteger(length) || length < 0 || length > data.length) {\n      throw new RangeError('Invalid SHA1 update length');\n    }\n\n    let index = (this.count[0] >>> 3) & 0x3f;\n    const oldLow = this.count[0];\n    this.count[0] = (this.count[0] + ((length * 8) >>> 0)) >>> 0;\n    if (this.count[0] < oldLow) {\n      this.count[1] = (this.count[1] + 1) >>> 0;\n    }\n    this.count[1] = (this.count[1] + Math.floor(length / 0x20000000)) >>> 0;\n\n    const partLength = SHA1_BLOCK_SIZE - index;\n    let offset = 0;\n\n    if (length >= partLength) {\n      this.buffer.set(data.subarray(0, partLength), index);\n      this.transform(this.buffer, 0);\n\n      offset = partLength;\n      while (offset + SHA1_BLOCK_SIZE <= length) {\n        this.transform(data, offset);\n        offset += SHA1_BLOCK_SIZE;\n      }\n      index = 0;\n    }\n\n    if (offset < length) {\n      this.buffer.set(data.subarray(offset, length), index);\n    }\n  }\n\n  hash(bigEndian: boolean): Buffer {\n    const digest = Buffer.alloc(SHA1_DIGEST_SIZE);\n    for (let i = 0; i < this.state.length; i++) {\n      const value = this.state[i];\n      if (bigEndian) {\n        digest[i * 4] = (value >>> 24) & 0xff;\n        digest[i * 4 + 1] = (value >>> 16) & 0xff;\n        digest[i * 4 + 2] = (value >>> 8) & 0xff;\n        digest[i * 4 + 3] = value & 0xff;\n      } else {\n        digest[i * 4] = value & 0xff;\n        digest[i * 4 + 1] = (value >>> 8) & 0xff;\n        digest[i * 4 + 2] = (value >>> 16) & 0xff;\n        digest[i * 4 + 3] = (value >>> 24) & 0xff;\n      }\n    }\n    return digest;\n  }\n\n  final(): Buffer {\n    const bits = Buffer.alloc(8);\n    for (let i = 0; i < 8; i++) {\n      const wordIndex = i >= 4 ? 0 : 1;\n      const shift = (3 - (i & 3)) * 8;\n      bits[i] = (this.count[wordIndex] >>> shift) & 0xff;\n    }\n\n    const index = (this.count[0] >>> 3) & 0x3f;\n    const padLength = index < 56 ? 56 - index : 120 - index;\n\n    this.update(PADDING, padLength);\n    this.update(bits, 8);\n\n    return this.hash(true);\n  }\n\n  private transform(block: Buffer | Uint8Array, offset: number): void {\n    const w = new Uint32Array(80);\n\n    for (let i = 0; i < 16; i++) {\n      const j = offset + i * 4;\n      w[i] = ((block[j] << 24) | (block[j + 1] << 16) | (block[j + 2] << 8) | block[j + 3]) >>> 0;\n    }\n\n    for (let i = 16; i < 80; i++) {\n      const value = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]) >>> 0;\n      w[i] = ((value << 1) | (value >>> 31)) >>> 0;\n    }\n\n    let a = this.state[0];\n    let b = this.state[1];\n    let c = this.state[2];\n    let d = this.state[3];\n    let e = this.state[4];\n\n    for (let i = 0; i < 80; i++) {\n      let temp: number;\n      if (i < 20) {\n        temp = ((((b & c) | (~b & d)) >>> 0) + 0x5a827999) >>> 0;\n      } else if (i < 40) {\n        temp = ((b ^ c ^ d) + 0x6ed9eba1) >>> 0;\n      } else if (i < 60) {\n        temp = ((((b & c) | (b & d) | (c & d)) >>> 0) + 0x8f1bbcdc) >>> 0;\n      } else {\n        temp = ((b ^ c ^ d) + 0xca62c1d6) >>> 0;\n      }\n\n      const next = ((((a << 5) | (a >>> 27)) >>> 0) + temp + e + w[i]) >>> 0;\n      e = d;\n      d = c;\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = next;\n    }\n\n    this.state[0] = (this.state[0] + a) >>> 0;\n    this.state[1] = (this.state[1] + b) >>> 0;\n    this.state[2] = (this.state[2] + c) >>> 0;\n    this.state[3] = (this.state[3] + d) >>> 0;\n    this.state[4] = (this.state[4] + e) >>> 0;\n  }\n}\n","import { FlashTransferUploadRequest, FlashTransferUploadResponse } from './proto/flash-transfer';\nimport { SHA1Stream } from './util/sha1-stream';\n\nimport { createHash } from 'node:crypto';\n\nexport interface FlashTransferUploadOptions {\n  uKey: string;\n  appId: number;\n  data: Buffer;\n  timeout?: number;\n}\n\nconst chunkSize = 1024 * 1024;\n\nexport class FlashTransferClient {\n  private readonly url = 'https://multimedia.qfile.qq.com/sliceupload';\n\n  async uploadFile(options: FlashTransferUploadOptions): Promise<boolean> {\n    const sha1StateList = this.buildSha1StateList(options.data);\n\n    for (let start = 0; start < options.data.length; start += chunkSize) {\n      const body = options.data.subarray(start, start + chunkSize);\n      const success = await this.uploadChunk(options, start, sha1StateList, body);\n      if (!success) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private buildSha1StateList(data: Buffer): Buffer[] {\n    const chunkCount = Math.ceil(data.length / chunkSize);\n    const sha1StateList: Buffer[] = [];\n    const sha1Stream = new SHA1Stream();\n\n    for (let i = 0; i < chunkCount; i++) {\n      const chunk = data.subarray(i * chunkSize, (i + 1) * chunkSize);\n      sha1Stream.update(chunk);\n      sha1StateList.push(i === chunkCount - 1 ? sha1Stream.final() : sha1Stream.hash(false));\n    }\n\n    return sha1StateList;\n  }\n\n  private async uploadChunk(\n    options: FlashTransferUploadOptions,\n    start: number,\n    sha1StateList: Buffer[],\n    body: Buffer,\n  ): Promise<boolean> {\n    const payload = FlashTransferUploadRequest.encode({\n      field1: 0,\n      appId: options.appId,\n      field3: 2,\n      body: {\n        field1: Buffer.alloc(0),\n        uKey: options.uKey,\n        start,\n        end: start + body.length - 1,\n        sha1: createHash('sha1').update(body).digest(),\n        sha1StateV: { state: sha1StateList },\n        body,\n      },\n    });\n\n    try {\n      const response = await fetch(this.url, {\n        method: 'POST',\n        headers: {\n          Accept: '*/*',\n          Expect: '100-continue',\n          Connection: 'Keep-Alive',\n          'Accept-Encoding': 'gzip',\n        },\n        body: payload,\n        signal: AbortSignal.timeout(options.timeout ?? 1_200_000),\n      });\n      const responseBytes = Buffer.from(await response.arrayBuffer());\n      if (!response.ok) {\n        return false;\n      }\n\n      const { status } = FlashTransferUploadResponse.decode(responseBytes);\n      return status === 'success';\n    } catch {\n      return false;\n    }\n  }\n}\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const GroupAvatarExtra = ProtoMessage.of({\n  type: ProtoField(1, 'uint32'),\n  groupUin: ProtoField(2, 'uint32'),\n  field3: ProtoField(3, {\n    field1: ProtoField(1, 'uint32'),\n  }),\n  field5: ProtoField(5, 'uint32'),\n  field6: ProtoField(6, 'uint32'),\n});\n\nexport const DataHighwayHead = ProtoMessage.of({\n  version: ProtoField(1, 'uint32'),\n  uin: ProtoField(2, 'string'),\n  command: ProtoField(3, 'string'),\n  seq: ProtoField(4, 'uint32'),\n  retryTimes: ProtoField(5, 'uint32'),\n  appId: ProtoField(6, 'uint32'),\n  dataFlag: ProtoField(7, 'uint32'),\n  commandId: ProtoField(8, 'uint32'),\n  buildVer: ProtoField(9, 'bytes'),\n});\n\nexport const SegHead = ProtoMessage.of({\n  serviceId: ProtoField(1, 'uint32'),\n  filesize: ProtoField(2, 'uint32'),\n  dataOffset: ProtoField(3, 'uint32'),\n  dataLength: ProtoField(4, 'uint32'),\n  retCode: ProtoField(5, 'uint32'),\n  serviceTicket: ProtoField(6, 'bytes'),\n  md5: ProtoField(8, 'bytes'),\n  fileMd5: ProtoField(9, 'bytes'),\n  cacheAddr: ProtoField(10, 'uint32'),\n  cachePort: ProtoField(13, 'uint32'),\n});\n\nexport const RequestDataHighwayHead = ProtoMessage.of({\n  msgBaseHead: ProtoField(1, DataHighwayHead),\n  msgSegHead: ProtoField(2, SegHead),\n  bytesReqExtendInfo: ProtoField(3, 'bytes'),\n  timestamp: ProtoField(4, 'uint32'),\n  msgLoginSigHead: ProtoField(5, {\n    uint32LoginSigType: ProtoField(1, 'uint32'),\n    bytesLoginSig: ProtoField(2, 'bytes'),\n    appId: ProtoField(3, 'uint32'),\n  }),\n});\n\nexport const ResponseDataHighwayHead = ProtoMessage.of({\n  msgBaseHead: ProtoField(1, DataHighwayHead),\n  msgSegHead: ProtoField(2, SegHead),\n  errorCode: ProtoField(3, 'uint32'),\n  allowRetry: ProtoField(4, 'uint32'),\n  cacheCost: ProtoField(5, 'uint32'),\n  htCost: ProtoField(6, 'uint32'),\n  bytesRspExtendInfo: ProtoField(7, 'bytes'),\n  timestamp: ProtoField(8, 'uint32'),\n  range: ProtoField(9, 'uint32'),\n  isReset: ProtoField(10, 'uint32'),\n});\n","import { RequestDataHighwayHead, ResponseDataHighwayHead } from './proto/highway';\n\nimport { createHash } from 'node:crypto';\n\nexport interface HighwayUploadOptions {\n  commandId: number;\n  data: Buffer;\n  fileMd5?: Buffer;\n  extendInfo?: Buffer;\n  ticket?: Buffer;\n  timeout?: number;\n}\n\nexport interface HighwayUploadResult {\n  responseHead: Buffer;\n  responseBody: Buffer;\n}\n\nconst maxBlockSize = 1024 * 1024;\n\nexport class HighwayClient {\n  constructor(\n    readonly uin: number,\n    readonly host: string,\n    readonly port: number,\n    readonly sigSession: Buffer,\n  ) {}\n\n  async upload(options: HighwayUploadOptions) {\n    const fileMd5 = options.fileMd5 ?? this.md5(options.data);\n    let offset = 0;\n\n    do {\n      const block = options.data.subarray(offset, offset + maxBlockSize);\n      await this.uploadBlock(options, fileMd5, block, offset);\n      offset += block.length;\n    } while (offset < options.data.length);\n  }\n\n  private async uploadBlock(\n    options: HighwayUploadOptions,\n    fileMd5: Buffer,\n    block: Buffer,\n    dataOffset: number,\n  ) {\n    const response = await fetch(`http://${this.host}:${this.port}/cgi-bin/httpconn?htcmd=0x6FF0087&uin=${this.uin}`, {\n      method: 'POST',\n      headers: {\n        Connection: 'Keep-Alive',\n        'Accept-Encoding': 'identity',\n        'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)',\n      },\n      body: this.packFrame(this.buildUploadHead(options, this.md5(block), fileMd5, block.length, dataOffset), block),\n      signal: AbortSignal.timeout(options.timeout ?? 1_200_000),\n    });\n\n    const frame = Buffer.from(await response.arrayBuffer());\n    const { head } = this.unpackFrame(frame);\n    const responseHead = ResponseDataHighwayHead.decode(head);\n    if (responseHead.errorCode !== 0) {\n      throw new Error(`Highway HTTP upload failed with code ${responseHead.errorCode}`);\n    }\n  }\n\n  private buildUploadHead(\n    options: HighwayUploadOptions,\n    blockMd5: Buffer,\n    fileMd5: Buffer,\n    dataLength: number,\n    dataOffset: number,\n  ): Buffer {\n    return RequestDataHighwayHead.encode({\n      msgBaseHead: {\n        version: 1,\n        uin: String(this.uin),\n        command: 'PicUp.DataUp',\n        seq: 0,\n        retryTimes: 0,\n        appId: 1600001604,\n        dataFlag: 16,\n        commandId: options.commandId,\n      },\n      msgSegHead: {\n        serviceId: 0,\n        filesize: options.data.length,\n        dataOffset,\n        dataLength,\n        serviceTicket: this.sigSession,\n        md5: blockMd5,\n        fileMd5,\n        cacheAddr: 0,\n        cachePort: 0,\n      },\n      bytesReqExtendInfo: options.extendInfo ?? Buffer.alloc(0),\n      timestamp: 0,\n      msgLoginSigHead: {\n        uint32LoginSigType: 8,\n        bytesLoginSig: options.ticket ?? Buffer.alloc(0),\n        appId: 1600001604,\n      },\n    });\n  }\n\n  private packFrame(head: Buffer, body: Buffer): Buffer {\n    const frame = Buffer.alloc(9 + head.length + body.length + 1);\n    frame[0] = 0x28;\n    frame.writeUInt32BE(head.length, 1);\n    frame.writeUInt32BE(body.length, 5);\n    head.copy(frame, 9);\n    body.copy(frame, 9 + head.length);\n    frame[frame.length - 1] = 0x29;\n    return frame;\n  }\n\n  private unpackFrame(frame: Buffer): { head: Buffer; body: Buffer } {\n    if (frame[0] !== 0x28 || frame[frame.length - 1] !== 0x29) {\n      throw new Error('Invalid Highway frame');\n    }\n\n    const headLength = frame.readUInt32BE(1);\n    const bodyLength = frame.readUInt32BE(5);\n    return {\n      head: frame.subarray(9, 9 + headLength),\n      body: frame.subarray(9 + headLength, 9 + headLength + bodyLength),\n    };\n  }\n\n  private md5(data: Buffer): Buffer {\n    return createHash('md5').update(data).digest();\n  }\n}\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const TextResvAttr = ProtoMessage.of({\n  atType: ProtoField(3, 'uint32'),\n  atMemberUin: ProtoField(4, 'uint32'),\n  atMemberTinyid: ProtoField(5, 'uint32'),\n  atMemberUid: ProtoField(9, 'string'),\n});\n\nexport const QSmallFaceExtra = ProtoMessage.of({\n  faceId: ProtoField(1, 'uint32'),\n  text: ProtoField(2, 'string'),\n  compatText: ProtoField(3, 'string'),\n});\n\nexport const QBigFaceExtra = ProtoMessage.of({\n  aniStickerPackId: ProtoField(1, 'string'),\n  aniStickerId: ProtoField(2, 'string'),\n  faceId: ProtoField(3, 'uint32'),\n  field4: ProtoField(4, 'uint32'),\n  aniStickerType: ProtoField(5, 'uint32'),\n  field6: ProtoField(6, 'string'),\n  preview: ProtoField(7, 'string'),\n  field9: ProtoField(9, 'uint32'),\n});\n\nexport const MsgInfo = ProtoMessage.of({\n  msgInfoBody: ProtoField(1, {\n    index: ProtoField(1, {\n      info: ProtoField(1, {\n        fileSize: ProtoField(1, 'uint64'),\n        fileHash: ProtoField(2, 'string'),\n        fileSha1: ProtoField(3, 'string'),\n        fileName: ProtoField(4, 'string'),\n        type: ProtoField(5, {\n          type: ProtoField(1, 'uint32'),\n          picFormat: ProtoField(2, 'uint32'),\n          videoFormat: ProtoField(3, 'uint32'),\n          voiceFormat: ProtoField(4, 'uint32'),\n        }),\n        width: ProtoField(6, 'uint32'),\n        height: ProtoField(7, 'uint32'),\n        time: ProtoField(8, 'uint32'),\n        original: ProtoField(9, 'uint32'),\n      }),\n      fileUuid: ProtoField(2, 'string'),\n      storeId: ProtoField(3, 'uint32'),\n      uploadTime: ProtoField(4, 'uint32'),\n      ttl: ProtoField(5, 'uint32'),\n      subType: ProtoField(6, 'uint32'),\n      appId: ProtoField(7, 'uint32'),\n    }),\n  }, 'repeated'),\n  extBizInfo: ProtoField(2, {\n    pic: ProtoField(1, {\n      bizType: ProtoField(1, 'uint32'),\n      textSummary: ProtoField(2, 'string'),\n      bytesPbReserveC2C: ProtoField(11, {\n        subType: ProtoField(1, 'uint32'),\n      }),\n      bytesPbReserveTroop: ProtoField(12, {\n        subType: ProtoField(1, 'uint32'),\n      }),\n    }),\n    video: ProtoField(2, {\n      fromScene: ProtoField(1, 'uint32'),\n      toScene: ProtoField(2, 'uint32'),\n      bytesPbReserve: ProtoField(3, 'bytes'),\n    }),\n    ptt: ProtoField(3, {\n      srcUin: ProtoField(1, 'uint32'),\n      pttScene: ProtoField(2, 'uint32'),\n      pttType: ProtoField(3, 'uint32'),\n      changeVoice: ProtoField(4, 'uint32'),\n      waveform: ProtoField(5, 'bytes'),\n      autoConvertText: ProtoField(6, 'uint32'),\n      bytesReserve: ProtoField(11, 'bytes'),\n      bytesPbReserve: ProtoField(12, 'bytes'),\n      bytesGeneralFlags: ProtoField(13, 'bytes'),\n    }),\n    busiType: ProtoField(10, 'uint32'),\n  }),\n});\n\nexport const GroupFileExtra = ProtoMessage.of({\n  field1: ProtoField(1, 'uint32'),\n  fileName: ProtoField(2, 'string'),\n  display: ProtoField(3, 'string'),\n  inner: ProtoField(7, {\n    info: ProtoField(2, {\n      busId: ProtoField(1, 'uint32'),\n      fileId: ProtoField(2, 'string'),\n      fileSize: ProtoField(3, 'uint64'),\n      fileName: ProtoField(4, 'string'),\n      field5: ProtoField(5, 'uint32'),\n      field7: ProtoField(7, 'string'),\n      fileMd5: ProtoField(8, 'string'),\n    }),\n  }),\n});\n\nexport const PrivateFileExtra = ProtoMessage.of({\n  notOnlineFile: ProtoField(1, {\n    fileType: ProtoField(1, 'uint32'),\n    sig: ProtoField(2, 'bytes'),\n    fileUuid: ProtoField(3, 'string'),\n    fileMd5: ProtoField(4, 'bytes'),\n    fileName: ProtoField(5, 'string'),\n    fileSize: ProtoField(6, 'uint64'),\n    note: ProtoField(7, 'bytes'),\n    reserved: ProtoField(8, 'uint32'),\n    subCmd: ProtoField(9, 'uint32'),\n    microCloud: ProtoField(10, 'uint32'),\n    fileUrls: ProtoField(11, 'bytes', 'repeated'),\n    downloadFlag: ProtoField(12, 'uint32'),\n    dangerLevel: ProtoField(50, 'uint32'),\n    lifeTime: ProtoField(51, 'uint32'),\n    uploadTime: ProtoField(52, 'uint32'),\n    absFileType: ProtoField(53, 'uint32'),\n    clientType: ProtoField(54, 'uint32'),\n    expireTime: ProtoField(55, 'uint32'),\n    pbReserve: ProtoField(56, 'bytes'),\n    fileIdCrcMedia: ProtoField(57, 'string'),\n  }),\n});\n\nexport const Elem = ProtoMessage.of({\n  text: ProtoField(1, {\n    textMsg: ProtoField(1, 'string'),\n    link: ProtoField(2, 'string'),\n    attr6Buf: ProtoField(3, 'bytes'),\n    attr7Buf: ProtoField(4, 'bytes'),\n    buf: ProtoField(11, 'bytes'),\n    pbReserve: ProtoField(12, 'bytes'),\n  }, 'optional'),\n  face: ProtoField(2, {\n    index: ProtoField(1, 'uint32'),\n  }, 'optional'),\n  notOnlineImage: ProtoField(4, 'bytes', 'optional'),\n  transElemInfo: ProtoField(5, {\n    elemType: ProtoField(1, 'uint32'),\n    elemValue: ProtoField(2, 'bytes'),\n  }, 'optional'),\n  marketFace: ProtoField(6, {\n    summary: ProtoField(1, 'string'),\n    itemType: ProtoField(2, 'uint32'),\n    info: ProtoField(3, 'uint32'),\n    faceId: ProtoField(4, 'bytes'),\n    tabId: ProtoField(5, 'uint32'),\n    subType: ProtoField(6, 'uint32'),\n    key: ProtoField(7, 'string'),\n    width: ProtoField(10, 'uint32'),\n    height: ProtoField(11, 'uint32'),\n    pbReserve: ProtoField(13, {\n      field8: ProtoField(8, 'uint32'),\n    }),\n  }, 'optional'),\n  customFace: ProtoField(8, 'bytes', 'optional'),\n  richMsg: ProtoField(12, {\n    bytesTemplate1: ProtoField(1, 'bytes'),\n    serviceId: ProtoField(2, 'uint32'),\n    bytesMsgResid: ProtoField(3, 'bytes'),\n    rand: ProtoField(4, 'uint32'),\n    seq: ProtoField(5, 'uint32'),\n    flags: ProtoField(6, 'uint32'),\n  }, 'optional'),\n  extraInfo: ProtoField(16, {\n    nick: ProtoField(1, 'string'),\n    groupCard: ProtoField(2, 'string'),\n    level: ProtoField(3, 'uint32'),\n    flags: ProtoField(4, 'uint32'),\n    groupMask: ProtoField(5, 'uint32'),\n    msgTailId: ProtoField(6, 'uint32'),\n    senderTitle: ProtoField(7, 'string'),\n    apnsTips: ProtoField(8, 'string'),\n    uin: ProtoField(9, 'uint32'),\n    msgStateFlag: ProtoField(10, 'uint32'),\n    apnsSoundType: ProtoField(11, 'uint32'),\n    newGroupFlag: ProtoField(12, 'uint32'),\n  }, 'optional'),\n  generalFlags: ProtoField(37, {\n    flags: ProtoField(1, 'uint32'),\n    pbReserve: ProtoField(2, 'bytes'),\n  }, 'optional'),\n  srcMsg: ProtoField(45, () => SourceMsg, 'optional'),\n  lightAppElem: ProtoField(51, {\n    bytesData: ProtoField(1, 'bytes'),\n    bytesMsgResid: ProtoField(2, 'bytes'),\n  }, 'optional'),\n  commonElem: ProtoField(53, {\n    serviceType: ProtoField(1, 'uint32'),\n    pbElem: ProtoField(2, 'bytes'),\n    businessType: ProtoField(3, 'uint32'),\n  }, 'optional'),\n});\n\nexport const SourceMsg = ProtoMessage.of({\n  origSeqs: ProtoField(1, 'uint32', 'repeated'),\n  senderUin: ProtoField(2, 'uint32'),\n  time: ProtoField(3, 'uint32'),\n  flag: ProtoField(4, 'uint32'),\n  elems: ProtoField(5, () => Elem, 'repeated'),\n  type: ProtoField(6, 'uint32'),\n  richMsg: ProtoField(7, 'bytes'),\n  pbReserve: ProtoField(8, 'bytes'),\n  srcMsg: ProtoField(9, 'bytes', 'optional'),\n  toUin: ProtoField(10, 'uint32'),\n  troopName: ProtoField(11, 'bytes'),\n});\n\nexport const SourceMsgPbReserve = ProtoMessage.of({\n  senderUid: ProtoField(6, 'string'),\n  receiverUid: ProtoField(7, 'string'),\n  friendSequence: ProtoField(8, 'uint32'),\n});\n\nexport const SourceMsgResvAttr = ProtoMessage.of({\n  oriMsgType: ProtoField(1, 'uint32'),\n  sourceMsgId: ProtoField(2, 'uint64'),\n  senderUid: ProtoField(3, 'string'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nimport { Elem } from './elem';\n\nexport enum PushMsgType {\n  FriendMessage = 166,\n  GroupMessage = 82,\n  TempMessage = 141,\n  Event0x210 = 0x210,\n  Event0x2DC = 0x2dc,\n  FriendRecordMessage = 208,\n  FriendFileMessage = 529,\n  GroupInvitedJoinRequest = 525,\n  GroupJoinRequest = 84,\n  GroupInvitation = 87,\n  GroupAdminChange = 44,\n  GroupMemberIncrease = 33,\n  GroupMemberDecrease = 34,\n}\n\nexport const RoutingHead = ProtoMessage.of({\n  fromUin: ProtoField(1, 'uint32'),\n  fromUid: ProtoField(2, 'string'),\n  fromAppId: ProtoField(3, 'uint32'),\n  fromInstId: ProtoField(4, 'uint32'),\n  toUin: ProtoField(5, 'uint32'),\n  toUid: ProtoField(6, 'string'),\n  commonC2C: ProtoField(7, {\n    c2CType: ProtoField(1, 'uint32'),\n    serviceType: ProtoField(2, 'uint32'),\n    sig: ProtoField(3, 'bytes'),\n    fromTinyId: ProtoField(4, 'uint32'),\n    toTinyId: ProtoField(5, 'uint32'),\n    name: ProtoField(6, 'string'),\n  }),\n  group: ProtoField(8, {\n    groupCode: ProtoField(1, 'uint32'),\n    groupType: ProtoField(2, 'uint32'),\n    groupInfoSeq: ProtoField(3, 'uint32'),\n    groupCard: ProtoField(4, 'string'),\n    groupCardType: ProtoField(5, 'uint32'),\n    groupLevel: ProtoField(6, 'uint32'),\n    groupName: ProtoField(7, 'string'),\n    extGroupKeyInfo: ProtoField(8, 'string'),\n    msgFlag: ProtoField(9, 'uint32'),\n  }),\n});\n\nexport const ContentHead = ProtoMessage.of({\n  type: ProtoField(1, 'uint32'),\n  subType: ProtoField(2, 'uint32'),\n  c2CCommand: ProtoField(3, 'uint32'),\n  random: ProtoField(4, 'uint32'),\n  sequence: ProtoField(5, 'uint32'),\n  time: ProtoField(6, 'uint32'),\n  pkgNum: ProtoField(7, 'uint32'),\n  pkgIndex: ProtoField(8, 'uint32'),\n  divSeq: ProtoField(9, 'uint32'),\n  autoReply: ProtoField(10, 'uint32'),\n  clientSequence: ProtoField(11, 'uint32'),\n  msgUid: ProtoField(12, 'uint64'),\n  forwardExt: ProtoField(15, {\n    field1: ProtoField(1, 'uint32'),\n    field2: ProtoField(2, 'uint32'),\n    field3: ProtoField(3, 'uint32'),\n    unknownBase64: ProtoField(4, 'string'),\n    avatar: ProtoField(5, 'string'),\n  }),\n});\n\nexport const MessageBody = ProtoMessage.of({\n  richText: ProtoField(1, {\n    attr: ProtoField(1, {\n      codePage: ProtoField(1, 'uint32'),\n      time: ProtoField(2, 'uint32'),\n      random: ProtoField(3, 'uint32'),\n      color: ProtoField(4, 'uint32'),\n      size: ProtoField(5, 'uint32'),\n      effect: ProtoField(6, 'uint32'),\n      charSet: ProtoField(7, 'uint32'),\n      pitchAndFamily: ProtoField(8, 'uint32'),\n      fontName: ProtoField(9, 'string'),\n      reserveData: ProtoField(10, 'bytes'),\n    }, 'optional'),\n    elems: ProtoField(2, Elem, 'repeated'),\n    notOnlineFile: ProtoField(3, {\n      fileType: ProtoField(1, 'uint32'),\n      sig: ProtoField(2, 'bytes'),\n      fileUuid: ProtoField(3, 'string'),\n      fileMd5: ProtoField(4, 'bytes'),\n      fileName: ProtoField(5, 'string'),\n      fileSize: ProtoField(6, 'uint64'),\n      note: ProtoField(7, 'bytes'),\n      reserved: ProtoField(8, 'uint32'),\n      subCmd: ProtoField(9, 'uint32'),\n      microCloud: ProtoField(10, 'uint32'),\n      fileUrls: ProtoField(11, 'bytes', 'repeated'),\n      downloadFlag: ProtoField(12, 'uint32'),\n      dangerLevel: ProtoField(50, 'uint32'),\n      lifeTime: ProtoField(51, 'uint32'),\n      uploadTime: ProtoField(52, 'uint32'),\n      absFileType: ProtoField(53, 'uint32'),\n      clientType: ProtoField(54, 'uint32'),\n      expireTime: ProtoField(55, 'uint32'),\n      pbReserve: ProtoField(56, 'bytes'),\n      fileIdCrcMedia: ProtoField(57, 'string'),\n    }, 'optional'),\n  }),\n  msgContent: ProtoField(2, 'bytes'),\n  msgEncryptContent: ProtoField(3, 'bytes'),\n});\n\nexport const CommonMessage = ProtoMessage.of({\n  routingHead: ProtoField(1, RoutingHead),\n  contentHead: ProtoField(2, ContentHead),\n  messageBody: ProtoField(3, MessageBody),\n});\n\nexport const PushMsg = ProtoMessage.of({\n  message: ProtoField(1, CommonMessage),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FileId = ProtoMessage.of({\n  storeId: ProtoField(3, 'uint32'),\n  appId: ProtoField(4, 'uint32'),\n  ttl: ProtoField(10, 'uint32'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchFriendRequestsRequest = ProtoMessage.of({\n  version: ProtoField(1, 'uint32'),\n  type: ProtoField(3, 'uint32'),\n  selfUid: ProtoField(4, 'string'),\n  startIndex: ProtoField(5, 'uint32'),\n  reqNum: ProtoField(6, 'uint32'),\n  getFlag: ProtoField(8, 'uint32'),\n  startTime: ProtoField(9, 'uint32'),\n  needCommFriend: ProtoField(12, 'uint32'),\n  field22: ProtoField(22, 'uint32'),\n});\n\nexport const FetchFriendRequestsResponse = ProtoMessage.of({\n  info: ProtoField(3, {\n    requests: ProtoField(7, {\n      targetUid: ProtoField(1, 'string'),\n      sourceUid: ProtoField(2, 'string'),\n      state: ProtoField(3, 'uint32'),\n      timestamp: ProtoField(4, 'uint32'),\n      comment: ProtoField(5, 'string'),\n      source: ProtoField(6, 'string'),\n      sourceId: ProtoField(7, 'uint32'),\n      subSourceId: ProtoField(8, 'uint32'),\n    }, 'repeated'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const ProfileLikeRequest = ProtoMessage.of({\n  targetUid: ProtoField(11, 'string'),\n  field2: ProtoField(12, 'uint32'),\n  count: ProtoField(13, 'uint32'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const DeleteFriendRequest = ProtoMessage.of({\n  body: ProtoField(1, {\n    targetUid: ProtoField(1, 'string'),\n    field2: ProtoField(2, {\n      field1: ProtoField(1, 'uint32'),\n      field2: ProtoField(2, 'uint32'),\n      field3: ProtoField(3, {\n        field1: ProtoField(1, 'uint32'),\n        field2: ProtoField(2, 'uint32'),\n        field3: ProtoField(3, 'uint32'),\n      }),\n    }),\n    block: ProtoField(3, 'bool'),\n    field4: ProtoField(4, 'bool'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetFriendRequestRequest = ProtoMessage.of({\n  accept: ProtoField(1, 'uint32'),\n  targetUid: ProtoField(2, 'string'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchFilteredFriendRequestsRequest = ProtoMessage.of({\n  field1: ProtoField(1, 'uint32'),\n  field2: ProtoField(2, {\n    count: ProtoField(1, 'uint32'),\n  }),\n});\n\nexport const FetchFilteredFriendRequestsResponse = ProtoMessage.of({\n  info: ProtoField(2, {\n    requests: ProtoField(1, {\n      sourceUid: ProtoField(1, 'string'),\n      sourceNickname: ProtoField(2, 'string'),\n      comment: ProtoField(5, 'string'),\n      source: ProtoField(6, 'string'),\n      warningInfo: ProtoField(7, 'string'),\n      timestamp: ProtoField(8, 'uint32'),\n    }, 'repeated'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetFilteredFriendRequestRequest = ProtoMessage.of({\n  selfUid: ProtoField(1, 'string'),\n  requestUid: ProtoField(2, 'string'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SendNudgeRequest = ProtoMessage.of({\n  targetUin: ProtoField(1, 'uint32'),\n  groupUin: ProtoField(2, 'uint32'),\n  friendUin: ProtoField(5, 'uint32'),\n  ext: ProtoField(6, 'uint32'),\n});\n","import { defineOidbService } from '../../common';\nimport { FetchFriendRequestsRequest, FetchFriendRequestsResponse } from '../proto/oidb/0x5cf';\nimport { ProfileLikeRequest } from '../proto/oidb/0x7e5';\nimport { DeleteFriendRequest } from '../proto/oidb/0x126b';\nimport { SetFriendRequestRequest } from '../proto/oidb/0xb5d';\nimport { FetchFilteredFriendRequestsRequest, FetchFilteredFriendRequestsResponse } from '../proto/oidb/0xd69';\nimport { SetFilteredFriendRequestRequest } from '../proto/oidb/0xd72';\nimport { SendNudgeRequest } from '../proto/oidb/0xed3';\n\nexport const SendFriendNudge = defineOidbService({\n  command: 0xed3,\n  service: 1,\n  build(_, friendUin: number, targetUin: number) {\n    return SendNudgeRequest.encode({\n      targetUin,\n      groupUin: 0,\n      friendUin,\n      ext: 0,\n    });\n  },\n});\n\nexport const SendProfileLike = defineOidbService({\n  command: 0x7e5,\n  service: 104,\n  build(_, targetUid: string, count: number) {\n    return ProfileLikeRequest.encode({\n      targetUid,\n      field2: 71,\n      count,\n    });\n  },\n});\n\nexport const DeleteFriend = defineOidbService({\n  command: 0x126b,\n  service: 0,\n  build(_, friendUid: string, block: boolean) {\n    return DeleteFriendRequest.encode({\n      body: {\n        targetUid: friendUid,\n        field2: {\n          field1: 130,\n          field2: 109,\n          field3: {\n            field1: 8,\n            field2: 8,\n            field3: 50,\n          },\n        },\n        block,\n      },\n    });\n  },\n});\n\nexport const FetchNormalFriendRequests = defineOidbService({\n  command: 0x5cf,\n  service: 11,\n  build(_, selfUid: string, limit: number) {\n    return FetchFriendRequestsRequest.encode({\n      version: 1,\n      type: 6,\n      selfUid,\n      startIndex: 0,\n      reqNum: limit,\n      getFlag: 2,\n      startTime: 0,\n      needCommFriend: 1,\n      field22: 1,\n    });\n  },\n  parse(_, payload) {\n    return FetchFriendRequestsResponse.decode(payload).info.requests;\n  },\n});\n\nexport const FetchFilteredFriendRequests = defineOidbService({\n  command: 0xd69,\n  service: 0,\n  build(_, limit: number) {\n    return FetchFilteredFriendRequestsRequest.encode({\n      field1: 1,\n      field2: { count: limit },\n    });\n  },\n  parse(_, payload) {\n    return FetchFilteredFriendRequestsResponse.decode(payload).info.requests;\n  },\n});\n\nexport const SetNormalFriendRequest = defineOidbService({\n  command: 0xb5d,\n  service: 44,\n  build(_, initiatorUid: string, accept: boolean) {\n    return SetFriendRequestRequest.encode({\n      accept: accept ? 3 : 5,\n      targetUid: initiatorUid,\n    });\n  },\n});\n\nexport const SetFilteredFriendRequest = defineOidbService({\n  command: 0xd72,\n  service: 0,\n  build(_, selfUid: string, initiatorUid: string) {\n    return SetFilteredFriendRequestRequest.encode({\n      selfUid,\n      requestUid: initiatorUid,\n    });\n  },\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const KickMemberRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  kickFlag: ProtoField(2, 'uint32'),\n  memberUid: ProtoField(3, 'string'),\n  rejectAddRequest: ProtoField(4, 'bool'),\n  reason: ProtoField(5, 'string'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetMemberProfileRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  memLevelInfo: ProtoField(3, {\n    memberUid: ProtoField(1, 'string'),\n    specialTitle: ProtoField(5, 'string'),\n    specialTitleExpireTime: ProtoField(6, 'int32'),\n    card: ProtoField(8, 'string'),\n  }, 'repeated'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchGroupNotificationsRequest = ProtoMessage.of({\n  count: ProtoField(1, 'uint32'),\n  startSeq: ProtoField(2, 'uint32'),\n});\n\nexport const FetchGroupNotificationsResponse = ProtoMessage.of({\n  notifications: ProtoField(1, {\n    sequence: ProtoField(1, 'uint32'),\n    notifyType: ProtoField(2, 'uint32'),\n    requestState: ProtoField(3, 'uint32'),\n    group: ProtoField(4, {\n      groupUin: ProtoField(1, 'uint32'),\n      groupName: ProtoField(2, 'string'),\n    }),\n    user1: ProtoField(5, {\n      uid: ProtoField(1, 'string'),\n      nickname: ProtoField(2, 'string'),\n    }),\n    user2: ProtoField(6, {\n      uid: ProtoField(1, 'string'),\n      nickname: ProtoField(2, 'string'),\n    }, 'optional'),\n    user3: ProtoField(7, {\n      uid: ProtoField(1, 'string'),\n      nickname: ProtoField(2, 'string'),\n    }, 'optional'),\n    time: ProtoField(8, 'uint32'),\n    comment: ProtoField(10, 'string'),\n  }, 'repeated'),\n  nextStartSeq: ProtoField(2, 'uint32'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetGroupRequestRequest = ProtoMessage.of({\n  accept: ProtoField(1, 'uint32'),\n  body: ProtoField(2, {\n    sequence: ProtoField(1, 'uint32'),\n    eventType: ProtoField(2, 'uint32'),\n    groupUin: ProtoField(3, 'uint32'),\n    message: ProtoField(4, 'string'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchGroupExtraInfoRequest = ProtoMessage.of({\n  random: ProtoField(1, 'int32'),\n  config: ProtoField(2, {\n    groupUin: ProtoField(1, 'uint32'),\n    flags: ProtoField(2, {\n      latestMessageSeq: ProtoField(22, 'bool'),\n    }),\n  }),\n});\n\nexport const FetchGroupExtraInfoResponse = ProtoMessage.of({\n  info: ProtoField(1, {\n    groupUin: ProtoField(1, 'uint32'),\n    results: ProtoField(3, {\n      latestMessageSeq: ProtoField(22, 'uint32'),\n    }),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetGroupWholeMuteRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  state: ProtoField(2, {\n    isMute: ProtoField(17, 'int32'),\n  }),\n});\n\nexport const SetGroupNameRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  groupName: ProtoField(2, 'string'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetMemberAdminRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  memberUid: ProtoField(2, 'string'),\n  isAdmin: ProtoField(3, 'bool'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const QuitGroupRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetMemberMuteRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  type: ProtoField(2, 'uint32'),\n  body: ProtoField(3, {\n    memberUid: ProtoField(1, 'string'),\n    duration: ProtoField(2, 'uint32'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetGroupMessageReactionRequest = ProtoMessage.of({\n  groupUin: ProtoField(2, 'uint32'),\n  sequence: ProtoField(3, 'uint32'),\n  code: ProtoField(4, 'string'),\n  type: ProtoField(5, 'uint32'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const SetGroupEssenceMessageRequest = ProtoMessage.of({\n  groupCode: ProtoField(1, 'uint32'),\n  sequence: ProtoField(2, 'uint32'),\n  random: ProtoField(3, 'int32'),\n});\n","import { defineOidbService } from '../../common';\nimport { KickMemberRequest } from '../proto/oidb/0x8a0';\nimport { SetMemberProfileRequest } from '../proto/oidb/0x8fc';\nimport { FetchGroupNotificationsRequest, FetchGroupNotificationsResponse } from '../proto/oidb/0x10c0';\nimport { SetGroupRequestRequest } from '../proto/oidb/0x10c8';\nimport { FetchGroupExtraInfoRequest, FetchGroupExtraInfoResponse } from '../proto/oidb/0x88d';\nimport { SetGroupNameRequest, SetGroupWholeMuteRequest } from '../proto/oidb/0x89a';\nimport { SetMemberAdminRequest } from '../proto/oidb/0x1096';\nimport { QuitGroupRequest } from '../proto/oidb/0x1097';\nimport { SetMemberMuteRequest } from '../proto/oidb/0x1253';\nimport { SetGroupMessageReactionRequest } from '../proto/oidb/0x9082';\nimport { SetGroupEssenceMessageRequest } from '../proto/oidb/0xeac';\nimport { SendNudgeRequest } from '../proto/oidb/0xed3';\n\nimport { randomInt } from 'node:crypto';\n\nexport const SetGroupName = defineOidbService({\n  command: 0x89a,\n  service: 15,\n  build(_, groupUin: number, groupName: string) {\n    return SetGroupNameRequest.encode({ groupUin, groupName });\n  },\n});\n\nexport const SetMemberCard = defineOidbService({\n  command: 0x8fc,\n  service: 3,\n  build(_, groupUin: number, memberUid: string, card: string) {\n    return SetMemberProfileRequest.encode({\n      groupUin,\n      memLevelInfo: [{ memberUid, card }],\n    });\n  },\n});\n\nexport const SetMemberTitle = defineOidbService({\n  command: 0x8fc,\n  service: 2,\n  build(_, groupUin: number, memberUid: string, specialTitle: string) {\n    return SetMemberProfileRequest.encode({\n      groupUin,\n      memLevelInfo: [\n        {\n          memberUid,\n          specialTitle,\n          specialTitleExpireTime: -1,\n        },\n      ],\n    });\n  },\n});\n\nexport const SetMemberAdmin = defineOidbService({\n  command: 0x1096,\n  service: 1,\n  build(_, groupUin: number, memberUid: string, isAdmin: boolean) {\n    return SetMemberAdminRequest.encode({ groupUin, memberUid, isAdmin });\n  },\n});\n\nexport const SetMemberMute = defineOidbService({\n  command: 0x1253,\n  service: 1,\n  build(_, groupUin: number, memberUid: string, duration: number) {\n    return SetMemberMuteRequest.encode({\n      groupUin,\n      type: 1,\n      body: { memberUid, duration },\n    });\n  },\n});\n\nexport const SetGroupWholeMute = defineOidbService({\n  command: 0x89a,\n  service: 0,\n  build(_, groupUin: number, isMute: boolean) {\n    return SetGroupWholeMuteRequest.encode({\n      groupUin,\n      state: {\n        isMute: isMute ? -1 : 0,\n      },\n    });\n  },\n});\n\nexport const KickMember = defineOidbService({\n  command: 0x8a0,\n  service: 1,\n  build(_, groupUin: number, memberUid: string, rejectAddRequest: boolean, reason: string) {\n    return KickMemberRequest.encode({\n      groupUin,\n      kickFlag: 0,\n      memberUid,\n      rejectAddRequest,\n      reason,\n    });\n  },\n});\n\nexport const QuitGroup = defineOidbService({\n  command: 0x1097,\n  service: 1,\n  build(_, groupUin: number) {\n    return QuitGroupRequest.encode({ groupUin });\n  },\n});\n\nexport const SetGroupMessageReactionAdd = defineOidbService({\n  command: 0x9082,\n  service: 1,\n  build(_, groupUin: number, sequence: number, code: string, type: number) {\n    return SetGroupMessageReactionRequest.encode({ groupUin, sequence, code, type });\n  },\n});\n\nexport const SetGroupMessageReactionRemove = defineOidbService({\n  command: 0x9082,\n  service: 2,\n  build(_, groupUin: number, sequence: number, code: string, type: number) {\n    return SetGroupMessageReactionRequest.encode({ groupUin, sequence, code, type });\n  },\n});\n\nexport const SendGroupNudge = defineOidbService({\n  command: 0xed3,\n  service: 1,\n  build(_, groupUin: number, targetUin: number) {\n    return SendNudgeRequest.encode({\n      targetUin,\n      groupUin,\n      friendUin: 0,\n      ext: 0,\n    });\n  },\n});\n\nexport const SetGroupEssenceMessageSet = defineOidbService({\n  command: 0xeac,\n  service: 1,\n  build(_, groupUin: number, sequence: number, random: number) {\n    return SetGroupEssenceMessageRequest.encode({ groupCode: groupUin, sequence, random });\n  },\n});\n\nexport const SetGroupEssenceMessageUnset = defineOidbService({\n  command: 0xeac,\n  service: 2,\n  build(_, groupUin: number, sequence: number, random: number) {\n    return SetGroupEssenceMessageRequest.encode({ groupCode: groupUin, sequence, random });\n  },\n});\n\nexport const FetchGroupExtraInfo = defineOidbService({\n  command: 0x88d,\n  service: 0,\n  build(_, groupUin: number) {\n    return FetchGroupExtraInfoRequest.encode({\n      random: randomInt(-0x80000000, 0x80000000),\n      config: {\n        groupUin,\n        flags: {\n          latestMessageSeq: true,\n        },\n      },\n    });\n  },\n  parse(_, payload) {\n    return {\n      latestMessageSeq: FetchGroupExtraInfoResponse.decode(payload).info.results.latestMessageSeq,\n    };\n  },\n});\n\nexport const FetchGroupNotificationsNormal = defineOidbService({\n  command: 0x10c0,\n  service: 1,\n  build(_, startSequence: number, count: number) {\n    return FetchGroupNotificationsRequest.encode({ startSeq: startSequence, count });\n  },\n  parse(_, payload) {\n    const response = FetchGroupNotificationsResponse.decode(payload);\n    return {\n      nextSequence: response.nextStartSeq,\n      notifications: response.notifications,\n    };\n  },\n});\n\nexport const FetchGroupNotificationsFiltered = defineOidbService({\n  command: 0x10c0,\n  service: 2,\n  build(_, startSequence: number, count: number) {\n    return FetchGroupNotificationsRequest.encode({ startSeq: startSequence, count });\n  },\n  parse(_, payload) {\n    const response = FetchGroupNotificationsResponse.decode(payload);\n    return {\n      nextSequence: response.nextStartSeq,\n      notifications: response.notifications,\n    };\n  },\n});\n\nexport const SetGroupRequestNormal = defineOidbService({\n  command: 0x10c8,\n  service: 1,\n  build(_, groupUin: number, sequence: number, eventType: number, accept: number, reason: string) {\n    return SetGroupRequestRequest.encode({\n      accept,\n      body: { sequence, eventType, groupUin, message: reason },\n    });\n  },\n});\n\nexport const SetGroupRequestFiltered = defineOidbService({\n  command: 0x10c8,\n  service: 2,\n  build(_, groupUin: number, sequence: number, eventType: number, accept: number, reason: string) {\n    return SetGroupRequestRequest.encode({\n      accept,\n      body: { sequence, eventType, groupUin, message: reason },\n    });\n  },\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const IndexNode = ProtoMessage.of({\n  info: ProtoField(1, {\n    fileSize: ProtoField(1, 'uint64'),\n    fileHash: ProtoField(2, 'string'),\n    fileSha1: ProtoField(3, 'string'),\n    fileName: ProtoField(4, 'string'),\n    type: ProtoField(5, {\n      type: ProtoField(1, 'uint32'),\n      picFormat: ProtoField(2, 'uint32'),\n      videoFormat: ProtoField(3, 'uint32'),\n      voiceFormat: ProtoField(4, 'uint32'),\n    }),\n    width: ProtoField(6, 'uint32'),\n    height: ProtoField(7, 'uint32'),\n    time: ProtoField(8, 'uint32'),\n    original: ProtoField(9, 'uint32'),\n  }),\n  fileUuid: ProtoField(2, 'string'),\n  storeId: ProtoField(3, 'uint32'),\n  uploadTime: ProtoField(4, 'uint32'),\n  ttl: ProtoField(5, 'uint32'),\n  subType: ProtoField(6, 'uint32'),\n  appId: ProtoField(7, 'uint32'),\n});\n\nexport const MsgInfoBody = ProtoMessage.of({\n  index: ProtoField(1, IndexNode),\n  picture: ProtoField(2, {\n    urlPath: ProtoField(1, 'string'),\n    ext: ProtoField(2, {\n      originalParameter: ProtoField(1, 'string'),\n      bigParameter: ProtoField(2, 'string'),\n      thumbParameter: ProtoField(3, 'string'),\n    }),\n    domain: ProtoField(3, 'string'),\n  }),\n  fileExist: ProtoField(5, 'bool'),\n  hashSum: ProtoField(6, {\n    c2C: ProtoField(201, {\n      friendUid: ProtoField(2, 'string'),\n    }),\n    troop: ProtoField(202, {\n      groupUin: ProtoField(1, 'uint32'),\n    }),\n  }),\n});\n\nexport const RichMediaMsgInfo = ProtoMessage.of({\n  msgInfoBody: ProtoField(1, MsgInfoBody, 'repeated'),\n});\n\nexport const NTV2RichMediaRequest = ProtoMessage.of({\n  reqHead: ProtoField(1, {\n    common: ProtoField(1, {\n      requestId: ProtoField(1, 'uint32'),\n      command: ProtoField(2, 'uint32'),\n    }),\n    scene: ProtoField(2, {\n      requestType: ProtoField(101, 'uint32'),\n      businessType: ProtoField(102, 'uint32'),\n      sceneType: ProtoField(200, 'uint32'),\n      c2C: ProtoField(201, {\n        accountType: ProtoField(1, 'uint32'),\n        targetUid: ProtoField(2, 'string'),\n      }),\n      group: ProtoField(202, {\n        groupUin: ProtoField(1, 'uint32'),\n      }),\n    }),\n    client: ProtoField(3, {\n      agentType: ProtoField(1, 'uint32'),\n    }),\n  }),\n  upload: ProtoField(2, {\n    uploadInfo: ProtoField(1, {\n      fileInfo: ProtoField(1, {\n        fileSize: ProtoField(1, 'uint64'),\n        fileHash: ProtoField(2, 'string'),\n        fileSha1: ProtoField(3, 'string'),\n        fileName: ProtoField(4, 'string'),\n        type: ProtoField(5, {\n          type: ProtoField(1, 'uint32'),\n          picFormat: ProtoField(2, 'uint32'),\n          videoFormat: ProtoField(3, 'uint32'),\n          voiceFormat: ProtoField(4, 'uint32'),\n        }),\n        width: ProtoField(6, 'uint32'),\n        height: ProtoField(7, 'uint32'),\n        time: ProtoField(8, 'uint32'),\n        original: ProtoField(9, 'uint32'),\n      }),\n      subFileType: ProtoField(2, 'uint32'),\n    }, 'repeated'),\n    tryFastUploadCompleted: ProtoField(2, 'bool'),\n    srvSendMsg: ProtoField(3, 'bool'),\n    clientRandomId: ProtoField(4, 'uint64'),\n    compatQMsgSceneType: ProtoField(5, 'uint32'),\n    extBizInfo: ProtoField(6, {\n      pic: ProtoField(1, {\n        bizType: ProtoField(1, 'uint32'),\n        textSummary: ProtoField(2, 'string'),\n        bytesPbReserveC2C: ProtoField(11, {\n          subType: ProtoField(1, 'uint32'),\n        }),\n        bytesPbReserveTroop: ProtoField(12, {\n          subType: ProtoField(1, 'uint32'),\n        }),\n      }),\n      video: ProtoField(2, {\n        fromScene: ProtoField(1, 'uint32'),\n        toScene: ProtoField(2, 'uint32'),\n        bytesPbReserve: ProtoField(3, 'bytes'),\n      }),\n      ptt: ProtoField(3, {\n        srcUin: ProtoField(1, 'uint32'),\n        pttScene: ProtoField(2, 'uint32'),\n        pttType: ProtoField(3, 'uint32'),\n        changeVoice: ProtoField(4, 'uint32'),\n        waveform: ProtoField(5, 'bytes'),\n        autoConvertText: ProtoField(6, 'uint32'),\n        bytesReserve: ProtoField(11, 'bytes'),\n        bytesPbReserve: ProtoField(12, 'bytes'),\n        bytesGeneralFlags: ProtoField(13, 'bytes'),\n      }),\n      busiType: ProtoField(10, 'uint32'),\n    }),\n    clientSeq: ProtoField(7, 'uint32'),\n    noNeedCompatMsg: ProtoField(8, 'bool'),\n  }),\n  download: ProtoField(3, {\n    node: ProtoField(1, IndexNode),\n  }),\n});\n\nexport const NTV2RichMediaResponse = ProtoMessage.of({\n  upload: ProtoField(2, {\n    uKey: ProtoField(1, 'string'),\n    uKeyTtlSecond: ProtoField(2, 'uint32'),\n    ipv4s: ProtoField(3, {\n      outIP: ProtoField(1, 'uint32'),\n      outPort: ProtoField(2, 'uint32'),\n      inIP: ProtoField(3, 'uint32'),\n      inPort: ProtoField(4, 'uint32'),\n      ipType: ProtoField(5, 'uint32'),\n    }, 'repeated'),\n    ipv6s: ProtoField(4, {\n      outIP: ProtoField(1, 'bytes'),\n      outPort: ProtoField(2, 'uint32'),\n      inIP: ProtoField(3, 'bytes'),\n      inPort: ProtoField(4, 'uint32'),\n      ipType: ProtoField(5, 'uint32'),\n    }, 'repeated'),\n    msgSeq: ProtoField(5, 'uint64'),\n    msgInfoBuf: ProtoField(6, 'bytes'),\n    ext: ProtoField(7, {\n      subType: ProtoField(1, 'uint32'),\n      extType: ProtoField(2, 'uint32'),\n      extValue: ProtoField(3, 'bytes'),\n    }, 'repeated'),\n    compatQMsg: ProtoField(8, 'bytes'),\n    subFileInfos: ProtoField(10, {\n      subType: ProtoField(1, 'uint32'),\n      uKey: ProtoField(2, 'string'),\n      uKeyTtlSecond: ProtoField(3, 'uint32'),\n      ipv4s: ProtoField(4, {\n        outIP: ProtoField(1, 'uint32'),\n        outPort: ProtoField(2, 'uint32'),\n        inIP: ProtoField(3, 'uint32'),\n        inPort: ProtoField(4, 'uint32'),\n        ipType: ProtoField(5, 'uint32'),\n      }, 'repeated'),\n      ipv6s: ProtoField(5, {\n        outIP: ProtoField(1, 'bytes'),\n        outPort: ProtoField(2, 'uint32'),\n        inIP: ProtoField(3, 'bytes'),\n        inPort: ProtoField(4, 'uint32'),\n        ipType: ProtoField(5, 'uint32'),\n      }, 'repeated'),\n    }, 'repeated'),\n  }),\n  download: ProtoField(3, {\n    rKeyParam: ProtoField(1, 'string'),\n    info: ProtoField(3, {\n      domain: ProtoField(1, 'string'),\n      urlPath: ProtoField(2, 'string'),\n    }),\n  }),\n});\n\nexport const NTV2RichMediaHighwayExt = ProtoMessage.of({\n  fileUuid: ProtoField(1, 'string'),\n  uKey: ProtoField(2, 'string'),\n  network: ProtoField(5, {\n    ipv4s: ProtoField(1, {\n      domain: ProtoField(1, {\n        isEnable: ProtoField(1, 'bool'),\n        ip: ProtoField(2, 'string'),\n      }),\n      port: ProtoField(2, 'uint32'),\n    }, 'repeated'),\n  }),\n  msgInfoBody: ProtoField(6, MsgInfoBody, 'repeated'),\n  blockSize: ProtoField(10, 'uint32'),\n  hash: ProtoField(11, {\n    fileSha1: ProtoField(1, 'bytes', 'repeated'),\n  }),\n});\n","import type { InferProtoModel, InferProtoModelInput } from '@saltify/typeproto';\n\nimport { defineOidbService } from '../../common';\nimport { type IndexNode, NTV2RichMediaRequest, NTV2RichMediaResponse } from '../proto/oidb/media';\n\nimport { randomInt } from 'node:crypto';\n\nexport interface ImageUploadRequest {\n  imageSize: number;\n  imageMd5: string;\n  imageSha1: string;\n  imageExt: string;\n  width: number;\n  height: number;\n  picFormat: number;\n  subType: number;\n  textSummary: string;\n  groupUin?: number;\n}\n\nexport interface RecordUploadRequest {\n  audioSize: number;\n  audioMd5: string;\n  audioSha1: string;\n  audioDuration: number;\n  groupUin?: number;\n}\n\nexport interface VideoUploadRequest {\n  videoSize: number;\n  videoMd5: string;\n  videoSha1: string;\n  videoWidth: number;\n  videoHeight: number;\n  videoDuration: number;\n  thumbnailSize: number;\n  thumbnailMd5: string;\n  thumbnailSha1: string;\n  thumbnailExt: string;\n  thumbnailPicFormat: number;\n  groupUin?: number;\n}\n\nexport type RichMediaUploadResponse = InferProtoModel<typeof NTV2RichMediaResponse>['upload'];\ntype RichMediaRequestInput = InferProtoModelInput<typeof NTV2RichMediaRequest>;\ntype UploadRequestInput = NonNullable<RichMediaRequestInput['upload']>;\ntype UploadInfoInput = NonNullable<UploadRequestInput['uploadInfo']>[number];\ntype ExtBizInfoInput = NonNullable<UploadRequestInput['extBizInfo']>;\n\ninterface RichMediaServiceInit<T extends Array<unknown>, R> {\n  command: number;\n  service: number;\n  requestId?: number;\n  requestType: number;\n  businessType: number;\n  sceneType: number;\n  build(...args: T): Omit<InferProtoModelInput<typeof NTV2RichMediaRequest>, 'reqHead'>;\n  parse(response: InferProtoModel<typeof NTV2RichMediaResponse>): R;\n}\n\nexport function defineRichMediaService<T extends Array<unknown>, R>(init: RichMediaServiceInit<T, R>) {\n  return defineOidbService({\n    command: init.command,\n    service: init.service,\n    build(bot, ...args: T) {\n      const scene =\n        init.sceneType === 1\n          ? {\n              requestType: init.requestType,\n              businessType: init.businessType,\n              sceneType: init.sceneType,\n              c2C: {\n                accountType: 2,\n                targetUid: bot.uid,\n              },\n            }\n          : {\n              requestType: init.requestType,\n              businessType: init.businessType,\n              sceneType: init.sceneType,\n            };\n      const groupUin =\n        args.find((arg): arg is { groupUin?: number } => typeof arg === 'object' && arg !== null && 'groupUin' in arg)\n          ?.groupUin ?? 0;\n      return NTV2RichMediaRequest.encode({\n        reqHead: {\n          common: {\n            requestId: init.requestId ?? 1,\n            command: init.service,\n          },\n          scene: init.sceneType === 2 ? { ...scene, group: { groupUin } } : scene,\n          client: {\n            agentType: 2,\n          },\n        },\n        ...init.build(...args),\n      });\n    },\n    parse(_, payload) {\n      return init.parse(NTV2RichMediaResponse.decode(payload));\n    },\n  });\n}\n\nfunction buildImageUploadInfo(payload: ImageUploadRequest): UploadInfoInput {\n  return {\n    fileInfo: {\n      fileSize: BigInt(payload.imageSize),\n      fileHash: payload.imageMd5,\n      fileSha1: payload.imageSha1,\n      fileName: payload.imageMd5.toUpperCase() + payload.imageExt,\n      type: {\n        type: 1,\n        picFormat: payload.picFormat,\n        videoFormat: 0,\n        voiceFormat: 0,\n      },\n      width: payload.width,\n      height: payload.height,\n      time: 0,\n      original: 1,\n    },\n    subFileType: 0,\n  };\n}\n\nfunction buildRecordUploadInfo(payload: RecordUploadRequest): UploadInfoInput {\n  return {\n    fileInfo: {\n      fileSize: BigInt(payload.audioSize),\n      fileHash: payload.audioMd5,\n      fileSha1: payload.audioSha1,\n      fileName: `${payload.audioMd5}.amr`,\n      type: {\n        type: 3,\n        picFormat: 0,\n        videoFormat: 0,\n        voiceFormat: 1,\n      },\n      width: 0,\n      height: 0,\n      time: payload.audioDuration,\n      original: 0,\n    },\n    subFileType: 0,\n  };\n}\n\nfunction buildVideoUploadInfoList(payload: VideoUploadRequest): UploadInfoInput[] {\n  return [\n    {\n      fileInfo: {\n        fileSize: BigInt(payload.videoSize),\n        fileHash: payload.videoMd5,\n        fileSha1: payload.videoSha1,\n        fileName: 'video.mp4',\n        type: {\n          type: 2,\n          picFormat: 0,\n          videoFormat: 0,\n          voiceFormat: 0,\n        },\n        width: payload.videoWidth,\n        height: payload.videoHeight,\n        time: payload.videoDuration,\n        original: 0,\n      },\n      subFileType: 0,\n    },\n    {\n      fileInfo: {\n        fileSize: BigInt(payload.thumbnailSize),\n        fileHash: payload.thumbnailMd5,\n        fileSha1: payload.thumbnailSha1,\n        fileName: `video.${payload.thumbnailExt}`,\n        type: {\n          type: 1,\n          picFormat: payload.thumbnailPicFormat,\n          videoFormat: 0,\n          voiceFormat: 0,\n        },\n        width: payload.videoWidth,\n        height: payload.videoHeight,\n        time: 0,\n        original: 0,\n      },\n      subFileType: 100,\n    },\n  ];\n}\n\nfunction buildImageExtBizInfo(sceneType: 1 | 2, subType: number, textSummary: string): ExtBizInfoInput {\n  return {\n    pic: {\n      bizType: subType,\n      textSummary: textSummary || (subType === 1 ? '[动画表情]' : '[图片]'),\n      bytesPbReserveC2C: sceneType === 1 ? { subType } : undefined,\n      bytesPbReserveTroop: sceneType === 2 ? { subType } : undefined,\n    },\n  };\n}\n\nfunction buildPrivateRecordExtBizInfo(): ExtBizInfoInput {\n  return {\n    pic: { textSummary: '' },\n    video: { bytesPbReserve: Buffer.alloc(0) },\n    ptt: {\n      bytesReserve: Buffer.from([0x08, 0x00, 0x38, 0x00]),\n      bytesPbReserve: Buffer.alloc(0),\n      bytesGeneralFlags: Buffer.from([\n        0x9a, 0x01, 0x0b, 0xaa, 0x03, 0x08, 0x08, 0x04, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00,\n      ]),\n    },\n  };\n}\n\nfunction buildGroupRecordExtBizInfo(): ExtBizInfoInput {\n  return {\n    pic: { textSummary: '' },\n    video: { bytesPbReserve: Buffer.alloc(0) },\n    ptt: {\n      bytesReserve: Buffer.alloc(0),\n      bytesPbReserve: Buffer.from([0x08, 0x00, 0x38, 0x00]),\n      bytesGeneralFlags: Buffer.from([0x9a, 0x01, 0x07, 0xaa, 0x03, 0x04, 0x08, 0x08, 0x12, 0x00]),\n    },\n  };\n}\n\nfunction buildVideoExtBizInfo(): ExtBizInfoInput {\n  return {\n    pic: {\n      bizType: 0,\n      textSummary: '',\n    },\n    video: {\n      bytesPbReserve: Buffer.from([0x80, 0x01, 0x00]),\n    },\n    ptt: {\n      bytesReserve: Buffer.alloc(0),\n      bytesPbReserve: Buffer.alloc(0),\n      bytesGeneralFlags: Buffer.alloc(0),\n    },\n  };\n}\n\nfunction buildUploadRequest(\n  uploadInfo: UploadInfoInput[],\n  compatQMsgSceneType: number,\n  extBizInfo: ExtBizInfoInput,\n): Omit<RichMediaRequestInput, 'reqHead'> {\n  return {\n    upload: {\n      uploadInfo,\n      tryFastUploadCompleted: true,\n      srvSendMsg: false,\n      clientRandomId: BigInt(randomInt(0x7fffffff)),\n      compatQMsgSceneType,\n      extBizInfo,\n      noNeedCompatMsg: false,\n    },\n  };\n}\n\nfunction defineRichMediaDownloadService(init: {\n  command: number;\n  requestType: number;\n  businessType: number;\n  sceneType: number;\n}) {\n  return defineRichMediaService({\n    ...init,\n    service: 200,\n    build(indexNode: InferProtoModelInput<typeof IndexNode>) {\n      return {\n        download: {\n          node: indexNode,\n        },\n      };\n    },\n    parse(response) {\n      const { download } = response;\n      return `https://${download.info.domain}${download.info.urlPath}${download.rKeyParam}`;\n    },\n  });\n}\n\nexport const RichMediaDownload = {\n  PrivateRecord: defineRichMediaDownloadService({\n    command: 0x126d,\n    requestType: 1,\n    businessType: 3,\n    sceneType: 1,\n  }),\n  GroupRecord: defineRichMediaDownloadService({\n    command: 0x126e,\n    requestType: 1,\n    businessType: 3,\n    sceneType: 2,\n  }),\n  PrivateImage: defineRichMediaDownloadService({\n    command: 0x11c5,\n    requestType: 2,\n    businessType: 1,\n    sceneType: 1,\n  }),\n  GroupImage: defineRichMediaDownloadService({\n    command: 0x11c4,\n    requestType: 2,\n    businessType: 1,\n    sceneType: 2,\n  }),\n  PrivateVideo: defineRichMediaDownloadService({\n    command: 0x11e9,\n    requestType: 2,\n    businessType: 2,\n    sceneType: 1,\n  }),\n  GroupVideo: defineRichMediaDownloadService({\n    command: 0x11ea,\n    requestType: 2,\n    businessType: 2,\n    sceneType: 2,\n  }),\n};\n\nexport const RichMediaUpload = {\n  PrivateImage: defineRichMediaService({\n    command: 0x11c5,\n    service: 100,\n    requestType: 2,\n    businessType: 1,\n    sceneType: 1,\n    build(payload: ImageUploadRequest) {\n      return buildUploadRequest(\n        [buildImageUploadInfo(payload)],\n        1,\n        buildImageExtBizInfo(1, payload.subType, payload.textSummary),\n      );\n    },\n    parse(response) {\n      return response.upload;\n    },\n  }),\n  GroupImage: defineRichMediaService({\n    command: 0x11c4,\n    service: 100,\n    requestType: 2,\n    businessType: 1,\n    sceneType: 2,\n    build(payload: ImageUploadRequest) {\n      return buildUploadRequest(\n        [buildImageUploadInfo(payload)],\n        2,\n        buildImageExtBizInfo(2, payload.subType, payload.textSummary),\n      );\n    },\n    parse(response) {\n      return response.upload;\n    },\n  }),\n  PrivateRecord: defineRichMediaService({\n    command: 0x126d,\n    service: 100,\n    requestId: 4,\n    requestType: 2,\n    businessType: 3,\n    sceneType: 1,\n    build(payload: RecordUploadRequest) {\n      return buildUploadRequest([buildRecordUploadInfo(payload)], 1, buildPrivateRecordExtBizInfo());\n    },\n    parse(response) {\n      return response.upload;\n    },\n  }),\n  GroupRecord: defineRichMediaService({\n    command: 0x126e,\n    service: 100,\n    requestType: 2,\n    businessType: 3,\n    sceneType: 2,\n    build(payload: RecordUploadRequest) {\n      return buildUploadRequest([buildRecordUploadInfo(payload)], 2, buildGroupRecordExtBizInfo());\n    },\n    parse(response) {\n      return response.upload;\n    },\n  }),\n  PrivateVideo: defineRichMediaService({\n    command: 0x11e9,\n    service: 100,\n    requestId: 3,\n    requestType: 2,\n    businessType: 2,\n    sceneType: 1,\n    build(payload: VideoUploadRequest) {\n      return buildUploadRequest(buildVideoUploadInfoList(payload), 2, buildVideoExtBizInfo());\n    },\n    parse(response) {\n      return response.upload;\n    },\n  }),\n  GroupVideo: defineRichMediaService({\n    command: 0x11ea,\n    service: 100,\n    requestId: 3,\n    requestType: 2,\n    businessType: 2,\n    sceneType: 2,\n    build(payload: VideoUploadRequest) {\n      return buildUploadRequest(buildVideoUploadInfoList(payload), 2, buildVideoExtBizInfo());\n    },\n    parse(response) {\n      return response.upload;\n    },\n  }),\n};\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nimport { CommonMessage, MessageBody } from './common';\n\nexport const SsoGetC2cMsgRequest = ProtoMessage.of({\n  peerUid: ProtoField(2, 'string'),\n  startSequence: ProtoField(3, 'uint32'),\n  endSequence: ProtoField(4, 'uint32'),\n});\n\nexport const SsoGetC2cMsgResponse = ProtoMessage.of({\n  retcode: ProtoField(1, 'int32'),\n  errorMsg: ProtoField(2, 'string'),\n  messages: ProtoField(7, CommonMessage, 'repeated'),\n});\n\nexport const SsoGetGroupMsgRequest = ProtoMessage.of({\n  groupInfo: ProtoField(1, {\n    groupUin: ProtoField(1, 'uint32'),\n    startSequence: ProtoField(2, 'uint32'),\n    endSequence: ProtoField(3, 'uint32'),\n  }),\n  filter: ProtoField(2, 'uint32'),\n});\n\nexport const SsoGetGroupMsgResponse = ProtoMessage.of({\n  retcode: ProtoField(1, 'int32'),\n  errorMsg: ProtoField(2, 'string'),\n  body: ProtoField(3, {\n    retcode: ProtoField(1, 'int32'),\n    errorMsg: ProtoField(2, 'string'),\n    groupUin: ProtoField(3, 'uint32'),\n    startSequence: ProtoField(4, 'uint32'),\n    endSequence: ProtoField(5, 'uint32'),\n    messages: ProtoField(6, CommonMessage, 'repeated'),\n  }),\n});\n\nexport const SsoGetPeerSeqRequest = ProtoMessage.of({\n  peerUid: ProtoField(1, 'string'),\n});\n\nexport const SsoGetPeerSeqResponse = ProtoMessage.of({\n  seq1: ProtoField(3, 'uint32'),\n  seq2: ProtoField(4, 'uint32'),\n  latestMsgTime: ProtoField(5, 'uint32'),\n});\n\nexport const PbSendMsgRequest = ProtoMessage.of({\n  routingHead: ProtoField(1, {\n    c2C: ProtoField(1, {\n      peerUin: ProtoField(1, 'uint32'),\n      peerUid: ProtoField(2, 'string'),\n    }, 'optional'),\n    group: ProtoField(2, {\n      groupUin: ProtoField(1, 'uint32'),\n    }, 'optional'),\n  }),\n  contentHead: ProtoField(2, {\n    pkgNum: ProtoField(1, 'uint32'),\n    pkgIndex: ProtoField(2, 'uint32'),\n    divSeq: ProtoField(3, 'uint32'),\n    autoReply: ProtoField(4, 'uint32'),\n  }),\n  messageBody: ProtoField(3, MessageBody),\n  clientSequence: ProtoField(4, 'uint32'),\n  random: ProtoField(5, 'int32'),\n});\n\nexport const PbSendMsgResponse = ProtoMessage.of({\n  result: ProtoField(1, 'int32'),\n  errMsg: ProtoField(2, 'string'),\n  sendTime: ProtoField(3, 'uint32'),\n  msgInfoFlag: ProtoField(10, 'uint32'),\n  sequence: ProtoField(11, 'uint32'),\n  clientSequence: ProtoField(14, 'uint32'),\n});\n\nexport const C2CRecallMsg = ProtoMessage.of({\n  type: ProtoField(1, 'uint32'),\n  targetUid: ProtoField(3, 'string'),\n  info: ProtoField(4, {\n    clientSequence: ProtoField(1, 'uint32'),\n    random: ProtoField(2, 'int32'),\n    messageId: ProtoField(3, 'uint64'),\n    timestamp: ProtoField(4, 'uint32'),\n    field5: ProtoField(5, 'uint32'),\n    messageSequence: ProtoField(6, 'uint32'),\n  }, 'optional'),\n  settings: ProtoField(5, {\n    field1: ProtoField(1, 'bool'),\n    field2: ProtoField(2, 'bool'),\n  }, 'optional'),\n  field6: ProtoField(6, 'bool'),\n});\n\nexport const GroupRecallMsg = ProtoMessage.of({\n  type: ProtoField(1, 'uint32'),\n  groupUin: ProtoField(2, 'uint32'),\n  info: ProtoField(3, {\n    sequence: ProtoField(1, 'uint32'),\n    random: ProtoField(2, 'int32'),\n    field3: ProtoField(3, 'uint32'),\n  }, 'optional'),\n  field4: ProtoField(4, {\n    field1: ProtoField(1, 'uint32'),\n  }, 'optional'),\n});\n\nexport const LongMsgInterfaceRequest = ProtoMessage.of({\n  recvReq: ProtoField(1, {\n    peerInfo: ProtoField(1, {\n      peerUid: ProtoField(2, 'string'),\n    }, 'optional'),\n    resId: ProtoField(2, 'string'),\n    msgType: ProtoField(3, 'uint32'),\n  }, 'optional'),\n  sendReq: ProtoField(2, {\n    msgType: ProtoField(1, 'uint32'),\n    peerInfo: ProtoField(2, {\n      peerUid: ProtoField(2, 'string'),\n    }, 'optional'),\n    groupUin: ProtoField(3, 'uint32'),\n    payload: ProtoField(4, 'bytes'),\n  }, 'optional'),\n  attr: ProtoField(15, {\n    subCmd: ProtoField(1, 'uint32'),\n    clientType: ProtoField(2, 'uint32'),\n    platform: ProtoField(3, 'uint32'),\n    proxyType: ProtoField(4, 'uint32'),\n  }, 'optional'),\n});\n\nexport const LongMsgInterfaceResponse = ProtoMessage.of({\n  recvResp: ProtoField(1, {\n    resId: ProtoField(3, 'string'),\n    payload: ProtoField(4, 'bytes'),\n  }, 'optional'),\n  sendResp: ProtoField(2, {\n    resId: ProtoField(3, 'string'),\n  }, 'optional'),\n});\n\nexport const PbMultiMsgTransmit = ProtoMessage.of({\n  messages: ProtoField(1, CommonMessage, 'repeated'),\n  items: ProtoField(2, {\n    fileName: ProtoField(1, 'string'),\n    buffer: ProtoField(2, {\n      msg: ProtoField(1, CommonMessage, 'repeated'),\n    }, 'optional'),\n  }, 'repeated'),\n});\n","import type { InferProtoModelInput } from '@saltify/typeproto';\nimport { match } from 'ts-pattern';\n\nimport { defineService } from '../../common';\nimport {\n  C2CRecallMsg,\n  GroupRecallMsg,\n  LongMsgInterfaceRequest,\n  LongMsgInterfaceResponse,\n  PbMultiMsgTransmit,\n  PbSendMsgRequest,\n  PbSendMsgResponse,\n  SsoGetC2cMsgRequest,\n  SsoGetC2cMsgResponse,\n  SsoGetGroupMsgRequest,\n  SsoGetGroupMsgResponse,\n  SsoGetPeerSeqRequest,\n  SsoGetPeerSeqResponse,\n} from '../proto/message/action';\nimport type { CommonMessage } from '../proto/message/common';\nimport type { Elem } from '../proto/message/elem';\n\nimport { gunzipSync, gzipSync } from 'node:zlib';\n\ntype RawMessage = InferProtoModelInput<typeof CommonMessage>;\ntype RawElem = InferProtoModelInput<typeof Elem>;\n\nexport interface SendMessageResponse {\n  result: number;\n  errMsg: string;\n  sendTime: number;\n  sequence: number;\n}\n\nfunction checkRetcode(retcode: number, message: string, command: string) {\n  if (retcode !== 0) {\n    throw new Error(`ServiceError when calling ${command}, code=${retcode}, message=${message}`);\n  }\n}\n\nexport const FetchFriendMessages = defineService({\n  command: 'trpc.msg.register_proxy.RegisterProxy.SsoGetC2cMsg',\n  build(_, peerUid: string, startSequence: number, endSequence: number) {\n    return SsoGetC2cMsgRequest.encode({ peerUid, startSequence, endSequence });\n  },\n  parse(_, payload) {\n    const response = SsoGetC2cMsgResponse.decode(payload);\n    checkRetcode(response.retcode, response.errorMsg, FetchFriendMessages.command);\n    return response.messages;\n  },\n});\n\nexport const FetchGroupMessages = defineService({\n  command: 'trpc.msg.register_proxy.RegisterProxy.SsoGetGroupMsg',\n  build(_, groupUin: number, startSequence: number, endSequence: number, filter: number = 1) {\n    return SsoGetGroupMsgRequest.encode({\n      groupInfo: { groupUin, startSequence, endSequence },\n      filter,\n    });\n  },\n  parse(_, payload) {\n    const response = SsoGetGroupMsgResponse.decode(payload);\n    checkRetcode(response.retcode, response.errorMsg, FetchGroupMessages.command);\n    return response.body.messages;\n  },\n});\n\nexport const GetFriendLatestSequence = defineService({\n  command: 'trpc.msg.msg_svc.MsgService.SsoGetPeerSeq',\n  build(_, peerUid: string) {\n    return SsoGetPeerSeqRequest.encode({ peerUid });\n  },\n  parse(_, payload) {\n    const response = SsoGetPeerSeqResponse.decode(payload);\n    return Math.max(response.seq1, response.seq2);\n  },\n});\n\nexport const SendFriendMessage = defineService({\n  command: 'MessageSvc.PbSendMsg',\n  build(_, friendUin: number, friendUid: string, elems: RawElem[], clientSequence: number, random: number) {\n    return PbSendMsgRequest.encode({\n      routingHead: {\n        c2C: {\n          peerUin: friendUin,\n          peerUid: friendUid,\n        },\n      },\n      contentHead: {\n        pkgNum: 1,\n      },\n      messageBody: {\n        richText: {\n          elems,\n        },\n      },\n      clientSequence,\n      random,\n    });\n  },\n  parse(_, payload): SendMessageResponse {\n    const response = PbSendMsgResponse.decode(payload);\n    return {\n      result: response.result,\n      errMsg: response.errMsg,\n      sendTime: response.sendTime,\n      sequence: response.clientSequence,\n    };\n  },\n});\n\nexport const SendGroupMessage = defineService({\n  command: 'MessageSvc.PbSendMsg',\n  build(_, groupUin: number, elems: RawElem[], clientSequence: number, random: number) {\n    return PbSendMsgRequest.encode({\n      routingHead: {\n        group: {\n          groupUin,\n        },\n      },\n      contentHead: {\n        pkgNum: 1,\n      },\n      messageBody: {\n        richText: {\n          elems,\n        },\n      },\n      clientSequence,\n      random,\n    });\n  },\n  parse(_, payload): SendMessageResponse {\n    const response = PbSendMsgResponse.decode(payload);\n    return {\n      result: response.result,\n      errMsg: response.errMsg,\n      sendTime: response.sendTime,\n      sequence: response.sequence,\n    };\n  },\n});\n\nexport const RecallFriendMessage = defineService({\n  command: 'trpc.msg.msg_svc.MsgService.SsoC2CRecallMsg',\n  build(_, targetUid: string, clientSequence: number, messageSequence: number, random: number, timestamp: number) {\n    return C2CRecallMsg.encode({\n      type: 1,\n      targetUid,\n      info: {\n        clientSequence,\n        random,\n        messageId: (0x01000000n << 32n) | BigInt(random >>> 0),\n        timestamp,\n        field5: 0,\n        messageSequence,\n      },\n      settings: {\n        field1: false,\n        field2: false,\n      },\n      field6: false,\n    });\n  },\n});\n\nexport const RecallGroupMessage = defineService({\n  command: 'trpc.msg.msg_svc.MsgService.SsoGroupRecallMsg',\n  build(_, groupUin: number, sequence: number) {\n    return GroupRecallMsg.encode({\n      type: 1,\n      groupUin,\n      info: {\n        sequence,\n        field3: 0,\n      },\n      field4: {\n        field1: 0,\n      },\n    });\n  },\n});\n\nexport const RecvLongMsg = defineService({\n  command: 'trpc.group.long_msg_interface.MsgService.SsoRecvLongMsg',\n  build(bot, resId: string, isGroup = false) {\n    const os = bot.appinfo.Os;\n    return LongMsgInterfaceRequest.encode({\n      recvReq: {\n        peerInfo: { peerUid: bot.uid },\n        resId,\n        msgType: isGroup ? 1 : 3,\n      },\n      attr: {\n        subCmd: 2,\n        clientType: os === 'AndroidPad' ? 5 : os === 'AndroidPhone' ? 2 : 1,\n        platform: os === 'Windows' ? 3 : os === 'Linux' ? 6 : os === 'Mac' ? 7 : 9,\n        proxyType: 0,\n      },\n    });\n  },\n  parse(_, payload) {\n    const response = LongMsgInterfaceResponse.decode(payload);\n    const compressed = response.recvResp?.payload;\n    if (compressed === undefined || compressed.length === 0) {\n      throw new Error('No payload in LongMsgInterfaceResponse');\n    }\n\n    const content = PbMultiMsgTransmit.decode(gunzipSync(compressed));\n    return content.items.find((item) => item.fileName === 'MultiMsg')?.buffer?.msg ?? [];\n  },\n});\n\nexport const SendLongMsg = defineService({\n  command: 'trpc.group.long_msg_interface.MsgService.SsoSendLongMsg',\n  build(\n    bot,\n    scene: 'friend' | 'group',\n    peerUin: number,\n    peerUid: string,\n    messages: RawMessage[],\n    nestedForwardTrace: Map<string, RawMessage[]>,\n  ) {\n    const os = bot.appinfo.Os;\n    return LongMsgInterfaceRequest.encode({\n      sendReq: {\n        msgType: scene === 'friend' ? 1 : 3,\n        peerInfo: { peerUid },\n        groupUin: scene === 'group' ? peerUin : 0,\n        payload: gzipSync(\n          PbMultiMsgTransmit.encode({\n            items: [\n              {\n                fileName: 'MultiMsg',\n                buffer: { msg: messages },\n              },\n              ...Array.from(nestedForwardTrace, ([fileName, msg]) => ({\n                fileName,\n                buffer: { msg },\n              })),\n            ],\n          }),\n        ),\n      },\n      attr: {\n        subCmd: 4,\n        clientType: 1,\n        platform: match(os)\n          .with('Windows', () => 3)\n          .with('Linux', () => 6)\n          .with('Mac', () => 7)\n          .with('AndroidPhone', 'AndroidPad', () => 9)\n          .otherwise(() => 0),\n        proxyType: 0,\n      },\n    });\n  },\n  parse(_, payload) {\n    const response = LongMsgInterfaceResponse.decode(payload);\n    const resId = response.sendResp?.resId;\n    if (resId === undefined || resId.length === 0) {\n      throw new Error('No resId in LongMsgInterfaceResponse');\n    }\n    return resId;\n  },\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchHighwayInfoRequest = ProtoMessage.of({\n  reqBody: ProtoField(0x501, {\n    uin: ProtoField(1, 'uint32'),\n    idcId: ProtoField(2, 'uint32'),\n    appid: ProtoField(3, 'uint32'),\n    loginSigType: ProtoField(4, 'uint32'),\n    loginSigTicket: ProtoField(5, 'bytes'),\n    requestFlag: ProtoField(6, 'uint32'),\n    serviceTypes: ProtoField(7, 'uint32', 'repeated'),\n    bid: ProtoField(8, 'uint32'),\n    field9: ProtoField(9, 'uint32'),\n    field10: ProtoField(10, 'uint32'),\n    field11: ProtoField(11, 'uint32'),\n    version: ProtoField(15, 'string'),\n  }),\n});\n\nexport const FetchHighwayInfoResponse = ProtoMessage.of({\n  respBody: ProtoField(0x501, {\n    sigSession: ProtoField(1, 'bytes'),\n    sessionKey: ProtoField(2, 'bytes'),\n    addrs: ProtoField(3, {\n      serviceType: ProtoField(1, 'uint32'),\n      addrs: ProtoField(2, {\n        type: ProtoField(1, 'uint32'),\n        ip: ProtoField(2, 'fixed32'),\n        port: ProtoField(3, 'uint32'),\n        area: ProtoField(4, 'uint32'),\n      }, 'repeated'),\n    }, 'repeated'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchPSKeyRequest = ProtoMessage.of({\n  domains: ProtoField(1, 'string', 'repeated'),\n});\n\nexport const FetchPSKeyResponse = ProtoMessage.of({\n  psKeyEntries: ProtoField(1, ['string', 'string']),\n});\n\nexport const FetchClientKeyResponse = ProtoMessage.of({\n  clientKey: ProtoField(3, 'string'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchFaceDetailsRequest = ProtoMessage.of({\n  field1: ProtoField(1, 'uint32'),\n  field2: ProtoField(2, 'uint32'),\n  field3: ProtoField(3, 'string'),\n});\n\nconst FaceResourceUrl = ProtoMessage.of({\n  baseUrl: ProtoField(1, 'string'),\n  advUrl: ProtoField(2, 'string'),\n});\n\nconst FaceEmoji = ProtoMessage.of({\n  qSid: ProtoField(1, 'string'),\n  qDes: ProtoField(2, 'string'),\n  emCode: ProtoField(3, 'string'),\n  qCid: ProtoField(4, 'uint32'),\n  aniStickerType: ProtoField(5, 'uint32'),\n  aniStickerPackId: ProtoField(6, 'uint32'),\n  aniStickerId: ProtoField(7, 'uint32'),\n  url: ProtoField(8, FaceResourceUrl),\n  emojiNameAlias: ProtoField(9, 'string', 'repeated'),\n  unknown10: ProtoField(10, 'uint32'),\n  aniStickerWidth: ProtoField(13, 'uint32'),\n  aniStickerHeight: ProtoField(14, 'uint32'),\n});\n\nconst FaceResponseContent = ProtoMessage.of({\n  emojiList: ProtoField(1, {\n    emojiPackName: ProtoField(1, 'string'),\n    emojiDetail: ProtoField(2, FaceEmoji, 'repeated'),\n  }, 'repeated'),\n  resourceUrl: ProtoField(2, FaceResourceUrl),\n});\n\nexport const FetchFaceDetailsResponse = ProtoMessage.of({\n  field1: ProtoField(1, 'uint32'),\n  commonFace: ProtoField(2, FaceResponseContent),\n  specialBigFace: ProtoField(3, FaceResponseContent),\n  specialMagicFace: ProtoField(4, {\n    field1: ProtoField(1, {\n      emojiList: ProtoField(2, FaceEmoji, 'repeated'),\n    }),\n    resourceUrl: ProtoField(2, FaceResourceUrl),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const IncPullCookie = ProtoMessage.of({\n  nextUin: ProtoField(1, 'uint32', 'optional'),\n});\n\nexport const IncPullRequest = ProtoMessage.of({\n  reqCount: ProtoField(2, 'uint32'),\n  time: ProtoField(3, 'uint32'),\n  localSeq: ProtoField(4, 'uint32'),\n  cookie: ProtoField(5, IncPullCookie, 'optional'),\n  flag: ProtoField(6, 'uint32'),\n  proxySeq: ProtoField(7, 'uint32'),\n  requestBiz: ProtoField(10001, ['uint32', {\n    extBusi: ProtoField(1, 'uint32', 'repeated'),\n  }]),\n  extSnsFlagKey: ProtoField(10002, 'uint32'),\n  extPrivateIdListKey: ProtoField(10003, 'uint32'),\n});\n\nexport const IncPullResponse = ProtoMessage.of({\n  seq: ProtoField(1, 'uint32'),\n  cookie: ProtoField(2, IncPullCookie, 'optional'),\n  isEnd: ProtoField(3, 'bool'),\n  time: ProtoField(6, 'uint32'),\n  selfUin: ProtoField(7, 'uint32'),\n  smallSeq: ProtoField(8, 'uint32'),\n  friendList: ProtoField(101, () => IncPullResponseFriend, 'repeated'),\n  categoryList: ProtoField(102, () => IncPullResponseCategory, 'repeated'),\n});\n\nexport const IncPullResponseFriend = ProtoMessage.of({\n  uid: ProtoField(1, 'string'),\n  categoryId: ProtoField(2, 'uint32'),\n  uin: ProtoField(3, 'uint32'),\n  subBizMap: ProtoField(10001, ['uint32', {\n    numberProps: ProtoField(1, ['uint32', 'uint32']),\n    stringProps: ProtoField(2, ['uint32', 'string']),\n  }]),\n});\n\nexport const IncPullResponseCategory = ProtoMessage.of({\n  categoryId: ProtoField(1, 'uint32'),\n  categoryName: ProtoField(2, 'string'),\n  categoryMemberCount: ProtoField(3, 'uint32'),\n  categorySortId: ProtoField(4, 'uint32'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchUserInfoByUidRequest = ProtoMessage.of({\n  uid: ProtoField(1, 'string'),\n  keys: ProtoField(3, {\n    key: ProtoField(1, 'uint32'),\n  }, 'repeated'),\n});\n\nexport const FetchUserInfoResponse = ProtoMessage.of({\n  body: ProtoField(1, {\n    properties: ProtoField(2, {\n      numberProps: ProtoField(1, ['uint32', 'uint32']),\n      stringProps: ProtoField(2, ['uint32', 'string']),\n    }),\n    uin: ProtoField(3, 'uint32'),\n  }),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchGroupDataRequest = ProtoMessage.of({\n  config: ProtoField(1, {\n    config1: ProtoField(1, {\n      groupOwner: ProtoField(1, 'bool'),\n      field2: ProtoField(2, 'bool'),\n      memberMax: ProtoField(3, 'bool'),\n      memberCount: ProtoField(4, 'bool'),\n      groupName: ProtoField(5, 'bool'),\n      field8: ProtoField(8, 'bool'),\n      field9: ProtoField(9, 'bool'),\n      field10: ProtoField(10, 'bool'),\n      field11: ProtoField(11, 'bool'),\n      field12: ProtoField(12, 'bool'),\n      field13: ProtoField(13, 'bool'),\n      field14: ProtoField(14, 'bool'),\n      field15: ProtoField(15, 'bool'),\n      field16: ProtoField(16, 'bool'),\n      field17: ProtoField(17, 'bool'),\n      field18: ProtoField(18, 'bool'),\n      question: ProtoField(19, 'bool'),\n      field20: ProtoField(20, 'bool'),\n      field22: ProtoField(22, 'bool'),\n      field23: ProtoField(23, 'bool'),\n      field24: ProtoField(24, 'bool'),\n      field25: ProtoField(25, 'bool'),\n      field26: ProtoField(26, 'bool'),\n      field27: ProtoField(27, 'bool'),\n      field28: ProtoField(28, 'bool'),\n      field29: ProtoField(29, 'bool'),\n      field30: ProtoField(30, 'bool'),\n      field31: ProtoField(31, 'bool'),\n      field32: ProtoField(32, 'bool'),\n      field5001: ProtoField(5001, 'bool'),\n      field5002: ProtoField(5002, 'bool'),\n      field5003: ProtoField(5003, 'bool'),\n    }),\n    config2: ProtoField(2, {\n      field1: ProtoField(1, 'bool'),\n      field2: ProtoField(2, 'bool'),\n      field3: ProtoField(3, 'bool'),\n      field4: ProtoField(4, 'bool'),\n      field5: ProtoField(5, 'bool'),\n      field6: ProtoField(6, 'bool'),\n      field7: ProtoField(7, 'bool'),\n      field8: ProtoField(8, 'bool'),\n    }),\n    config3: ProtoField(3, {\n      field5: ProtoField(5, 'bool'),\n      field6: ProtoField(6, 'bool'),\n    }),\n  }),\n});\n\nexport const FetchGroupDataResponse = ProtoMessage.of({\n  groups: ProtoField(2, {\n    groupUin: ProtoField(3, 'uint32'),\n    info: ProtoField(4, {\n      createdTime: ProtoField(2, 'uint32'),\n      memberMax: ProtoField(3, 'uint32'),\n      memberCount: ProtoField(4, 'uint32'),\n      groupName: ProtoField(5, 'string'),\n      question: ProtoField(19, 'string', 'optional'),\n      description: ProtoField(21, 'string', 'optional'),\n      announcement: ProtoField(30, 'string', 'optional'),\n    }),\n    customInfo: ProtoField(5, {\n      remark: ProtoField(3, 'string', 'optional'),\n    }),\n  }, 'repeated'),\n});\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FetchGroupMemberDataRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  field2: ProtoField(2, 'uint32'),\n  field3: ProtoField(3, 'uint32'),\n  body: ProtoField(4, {\n    memberName: ProtoField(10, 'bool'),\n    memberCard: ProtoField(11, 'bool'),\n    level: ProtoField(12, 'bool'),\n    specialTitle: ProtoField(17, 'bool'),\n    joinTimestamp: ProtoField(100, 'bool'),\n    lastMsgTimestamp: ProtoField(101, 'bool'),\n    shutUpTimestamp: ProtoField(102, 'bool'),\n    permission: ProtoField(107, 'bool'),\n  }),\n  cookie: ProtoField(15, 'bytes', 'optional'),\n});\n\nexport const FetchGroupMemberDataResponse = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  members: ProtoField(2, {\n    id: ProtoField(1, {\n      uid: ProtoField(2, 'string'),\n      uin: ProtoField(4, 'uint32'),\n    }),\n    memberName: ProtoField(10, 'string'),\n    memberCard: ProtoField(11, {\n      memberCard: ProtoField(2, 'string', 'optional'),\n    }),\n    level: ProtoField(12, {\n      level: ProtoField(2, 'uint32'),\n    }),\n    specialTitle: ProtoField(17, 'string', 'optional'),\n    joinTimestamp: ProtoField(100, 'uint32'),\n    lastMsgTimestamp: ProtoField(101, 'uint32'),\n    shutUpTimestamp: ProtoField(102, 'uint32', 'optional'),\n    permission: ProtoField(107, 'uint32'),\n  }, 'repeated'),\n  cookie: ProtoField(15, 'bytes', 'optional'),\n});\n","export function uint32ToIpv4(value: number): string {\n  return [value & 0xff, (value >>> 8) & 0xff, (value >>> 16) & 0xff, (value >>> 24) & 0xff].join('.');\n}\n","import { BotUserInfoKey, defineOidbService, defineService } from '../../common';\nimport type { BotFriendData, BotGroupData, BotGroupMemberData } from '../../entity';\nimport { FetchHighwayInfoRequest, FetchHighwayInfoResponse } from '../proto/httpconn';\nimport { FetchClientKeyResponse, FetchPSKeyRequest, FetchPSKeyResponse } from '../proto/oidb/0x102a';\nimport { FetchFaceDetailsRequest, FetchFaceDetailsResponse } from '../proto/oidb/0x9154';\nimport { IncPullRequest, IncPullResponse } from '../proto/oidb/0xfd4';\nimport { FetchUserInfoByUidRequest, FetchUserInfoResponse } from '../proto/oidb/0xfe1';\nimport { FetchGroupDataRequest, FetchGroupDataResponse } from '../proto/oidb/0xfe5';\nimport { FetchGroupMemberDataRequest, FetchGroupMemberDataResponse } from '../proto/oidb/0xfe7';\nimport { uint32ToIpv4 } from '../util/ipv4';\n\nexport interface BotFaceDetail {\n  qSid: string;\n  qDes: string;\n  emCode: string;\n  qCid: number;\n  aniStickerType: number;\n  aniStickerPackId: number;\n  aniStickerId: number;\n  baseUrl: string;\n  advUrl: string;\n  emojiNameAlias: string[];\n  aniStickerWidth: number;\n  aniStickerHeight: number;\n}\n\nexport const FetchFriendData = defineOidbService({\n  command: 0xfd4,\n  service: 1,\n  build(_, nextUin?: number) {\n    return IncPullRequest.encode({\n      reqCount: 300,\n      cookie: { nextUin },\n      flag: 1,\n      requestBiz: new Map([\n        [\n          1,\n          {\n            extBusi: [\n              BotUserInfoKey.Bio,\n              BotUserInfoKey.Remark,\n              BotUserInfoKey.Nickname,\n              BotUserInfoKey.Qid,\n              BotUserInfoKey.Age,\n              BotUserInfoKey.Gender,\n            ],\n          },\n        ],\n        [\n          4,\n          {\n            extBusi: [100, 101, 102],\n          },\n        ],\n      ]),\n    });\n  },\n  parse(_, payload) {\n    const response = IncPullResponse.decode(payload);\n    const categories = new Map(response.categoryList.map((c) => [c.categoryId, c.categoryName]));\n    return {\n      dataList: response.friendList.map<BotFriendData>((friend) => {\n        const subBiz = friend.subBizMap.get(1);\n        return {\n          uin: friend.uin,\n          uid: friend.uid,\n          nickname: subBiz?.stringProps.get(BotUserInfoKey.Nickname) ?? '',\n          remark: subBiz?.stringProps.get(BotUserInfoKey.Remark) ?? '',\n          bio: subBiz?.stringProps.get(BotUserInfoKey.Bio) ?? '',\n          qid: subBiz?.stringProps.get(BotUserInfoKey.Qid) ?? '',\n          age: subBiz?.numberProps.get(BotUserInfoKey.Age) ?? 0,\n          gender: subBiz?.numberProps.get(BotUserInfoKey.Gender) ?? 0,\n          categoryId: friend.categoryId,\n          categoryName: categories.get(friend.categoryId) ?? '',\n        };\n      }),\n      nextUin: response.cookie?.nextUin,\n    };\n  },\n});\n\nexport const FetchGroupData = defineOidbService({\n  command: 0xfe5,\n  service: 2,\n  build() {\n    return FetchGroupDataRequest.encode({\n      config: {\n        config1: {\n          groupOwner: true,\n          field2: true,\n          memberMax: true,\n          memberCount: true,\n          groupName: true,\n          field8: true,\n          field9: true,\n          field10: true,\n          field11: true,\n          field12: true,\n          field13: true,\n          field14: true,\n          field15: true,\n          field16: true,\n          field17: true,\n          field18: true,\n          question: true,\n          field20: true,\n          field22: true,\n          field23: true,\n          field24: true,\n          field25: true,\n          field26: true,\n          field27: true,\n          field28: true,\n          field29: true,\n          field30: true,\n          field31: true,\n          field32: true,\n          field5001: true,\n          field5002: true,\n          field5003: true,\n        },\n        config2: {\n          field1: true,\n          field2: true,\n          field3: true,\n          field4: true,\n          field5: true,\n          field6: true,\n          field7: true,\n          field8: true,\n        },\n        config3: {\n          field5: true,\n          field6: true,\n        },\n      },\n    });\n  },\n  parse(_, payload) {\n    const response = FetchGroupDataResponse.decode(payload);\n    return response.groups.map<BotGroupData>((group) => ({\n      uin: group.groupUin,\n      name: group.info.groupName,\n      remark: group.customInfo.remark ?? '',\n      memberCount: group.info.memberCount,\n      maxMemberCount: group.info.memberMax,\n      createdTime: group.info.createdTime,\n      description: group.info.description ?? '',\n      question: group.info.question ?? '',\n      announcement: group.info.announcement ?? '',\n    }));\n  },\n});\n\nexport const FetchGroupMemberData = defineOidbService({\n  command: 0xfe7,\n  service: 3,\n  build(_, groupUin: number, cookie?: Buffer) {\n    return FetchGroupMemberDataRequest.encode({\n      groupUin,\n      field2: 5,\n      field3: 2,\n      body: {\n        memberName: true,\n        memberCard: true,\n        level: true,\n        specialTitle: true,\n        joinTimestamp: true,\n        lastMsgTimestamp: true,\n        shutUpTimestamp: true,\n        permission: true,\n      },\n      cookie,\n    });\n  },\n  parse(_, payload) {\n    const response = FetchGroupMemberDataResponse.decode(payload);\n    return {\n      cookie: response.cookie,\n      dataList: response.members.map<BotGroupMemberData>((member) => ({\n        uin: member.id.uin,\n        uid: member.id.uid,\n        nickname: member.memberName,\n        card: member.memberCard.memberCard ?? '',\n        specialTitle: member.specialTitle ?? '',\n        level: member.level.level,\n        joinedAt: member.joinTimestamp,\n        lastSpokeAt: member.lastMsgTimestamp,\n        mutedUntil: member.shutUpTimestamp,\n        role: member.permission,\n      })),\n    };\n  },\n});\n\nexport const FetchUserInfoByUid = defineOidbService({\n  command: 0xfe1,\n  service: 2,\n  build(_, uid: string) {\n    return FetchUserInfoByUidRequest.encode({\n      uid,\n      keys: [\n        BotUserInfoKey.Nickname,\n        BotUserInfoKey.Bio,\n        BotUserInfoKey.Gender,\n        BotUserInfoKey.Remark,\n        BotUserInfoKey.Level,\n        BotUserInfoKey.Country,\n        BotUserInfoKey.City,\n        BotUserInfoKey.School,\n        BotUserInfoKey.RegisterTime,\n        BotUserInfoKey.Age,\n        BotUserInfoKey.Qid,\n      ].map((key) => ({ key })),\n    });\n  },\n  parse(_, payload) {\n    const response = FetchUserInfoResponse.decode(payload);\n    const properties = response.body.properties;\n    return {\n      uin: response.body.uin,\n      nickname: properties.stringProps.get(BotUserInfoKey.Nickname) ?? '',\n      bio: properties.stringProps.get(BotUserInfoKey.Bio) ?? '',\n      gender: properties.numberProps.get(BotUserInfoKey.Gender) ?? 0,\n      remark: properties.stringProps.get(BotUserInfoKey.Remark) ?? '',\n      level: properties.numberProps.get(BotUserInfoKey.Level) ?? 0,\n      country: properties.stringProps.get(BotUserInfoKey.Country) ?? '',\n      city: properties.stringProps.get(BotUserInfoKey.City) ?? '',\n      school: properties.stringProps.get(BotUserInfoKey.School) ?? '',\n      registerTime: properties.numberProps.get(BotUserInfoKey.RegisterTime) ?? 0,\n      age: properties.numberProps.get(BotUserInfoKey.Age) ?? 0,\n      qid: properties.stringProps.get(BotUserInfoKey.Qid) ?? '',\n    };\n  },\n});\n\nexport const FetchHighwayInfo = defineService({\n  command: 'HttpConn.0x6ff_501',\n  build(bot) {\n    return FetchHighwayInfoRequest.encode({\n      reqBody: {\n        uin: bot.uin,\n        idcId: 0,\n        appid: 16,\n        loginSigType: 1,\n        loginSigTicket: Buffer.alloc(0),\n        requestFlag: 3,\n        serviceTypes: [1, 5, 10, 21],\n        bid: 2,\n        field9: 9,\n        field10: 8,\n        field11: 0,\n        version: '1.0.1',\n      },\n    });\n  },\n  parse(_, payload): { sigSession: Buffer; servers: Map<number, { host: string; port: number }[]> } {\n    const response = FetchHighwayInfoResponse.decode(payload).respBody;\n    return {\n      sigSession: response.sigSession,\n      servers: new Map(\n        response.addrs.map((srvAddresses) => [\n          srvAddresses.serviceType,\n          srvAddresses.addrs.map((address) => ({\n            host: uint32ToIpv4(address.ip),\n            port: address.port,\n          })),\n        ]),\n      ),\n    };\n  },\n});\n\nexport const FetchClientKey = defineOidbService({\n  command: 0x102a,\n  service: 1,\n  build() {\n    return Buffer.alloc(0);\n  },\n  parse(_, payload) {\n    return FetchClientKeyResponse.decode(payload).clientKey;\n  },\n});\n\nexport const FetchPSKey = defineOidbService({\n  command: 0x102a,\n  service: 0,\n  build(_, domains: string[]) {\n    return FetchPSKeyRequest.encode({ domains });\n  },\n  parse(_, payload) {\n    return FetchPSKeyResponse.decode(payload).psKeyEntries;\n  },\n});\n\nexport const FetchFaceDetails = defineOidbService({\n  command: 0x9154,\n  service: 1,\n  build() {\n    return FetchFaceDetailsRequest.encode({\n      field1: 0,\n      field2: 7,\n      field3: '0',\n    });\n  },\n  parse(_, payload): BotFaceDetail[] {\n    const response = FetchFaceDetailsResponse.decode(payload);\n    return [\n      ...response.commonFace.emojiList.flatMap((list) => list.emojiDetail),\n      ...response.specialBigFace.emojiList.flatMap((list) => list.emojiDetail),\n      ...response.specialMagicFace.field1.emojiList,\n    ].map((face) => ({\n      qSid: face.qSid,\n      qDes: face.qDes,\n      emCode: face.emCode,\n      qCid: face.qCid,\n      aniStickerType: face.aniStickerType,\n      aniStickerPackId: face.aniStickerPackId,\n      aniStickerId: face.aniStickerId,\n      baseUrl: face.url.baseUrl,\n      advUrl: face.url.advUrl,\n      emojiNameAlias: face.emojiNameAlias,\n      aniStickerWidth: face.aniStickerWidth,\n      aniStickerHeight: face.aniStickerHeight,\n    }));\n  },\n});\n","import { Mutex } from 'async-mutex';\n\nimport type { Bot } from '..';\nimport { FetchClientKey, FetchPSKey } from './service/system';\n\nclass KeyWithLifetime {\n  static dummy(): KeyWithLifetime {\n    return new KeyWithLifetime('', 0);\n  }\n\n  static create(value: string, lifetimeSeconds: number): KeyWithLifetime {\n    return new KeyWithLifetime(value, currentEpochSeconds() + lifetimeSeconds);\n  }\n\n  constructor(value: string, expireTime: number) {\n    this.value = value;\n    this.expireTime = expireTime;\n  }\n\n  value: string;\n  expireTime: number;\n\n  isValid(): boolean {\n    return currentEpochSeconds() < this.expireTime;\n  }\n\n  refreshWith(value: string, lifetimeSeconds: number): void {\n    this.value = value;\n    this.expireTime = currentEpochSeconds() + lifetimeSeconds;\n  }\n}\n\nexport class TicketHolder {\n  private readonly currentSKey = KeyWithLifetime.dummy();\n  private readonly psKeyCache = new Map<string, KeyWithLifetime>();\n  private readonly sKeyQueryMutex = new Mutex();\n  private readonly psKeyQueryMutex = new Mutex();\n\n  constructor(private readonly bot: Bot) {}\n\n  async getSKey(): Promise<string> {\n    if (this.currentSKey.isValid()) {\n      return this.currentSKey.value;\n    }\n\n    return this.sKeyQueryMutex.runExclusive(async () => {\n      if (this.currentSKey.isValid()) {\n        return this.currentSKey.value;\n      }\n\n      const clientKey = await this.bot.callService(FetchClientKey);\n      const jumpTarget = new URL('https://h5.qzone.qq.com/qqnt/qzoneinpcqq/friend');\n      jumpTarget.searchParams.set('refresh', '0');\n      jumpTarget.searchParams.set('clientuin', '0');\n      jumpTarget.searchParams.set('darkMode', '0');\n\n      const url = new URL('https://ssl.ptlogin2.qq.com/jump');\n      url.searchParams.set('ptlang', '1033');\n      url.searchParams.set('clientuin', String(this.bot.uin));\n      url.searchParams.set('clientkey', clientKey);\n      url.searchParams.set('u1', jumpTarget.toString());\n      url.searchParams.set('keyindex', '19');\n      url.searchParams.set('random', '2599');\n\n      const response = await fetch(url, { redirect: 'manual' });\n      const sKey = response.headers\n        .getSetCookie()\n        .map((cookie) => cookie.split(';', 1)[0])\n        .find((cookie) => cookie.startsWith('skey='))\n        ?.slice('skey='.length);\n      if (sKey === undefined) {\n        throw new Error(`Failed to fetch SKey, status=${response.status}`);\n      }\n\n      this.currentSKey.refreshWith(sKey, 86400);\n      return this.currentSKey.value;\n    });\n  }\n\n  async getCsrfToken(): Promise<number> {\n    const sKey = await this.getSKey();\n    let hash = 5381;\n    for (let i = 0; i < sKey.length; i++) {\n      hash = (hash + (hash << 5) + sKey.charCodeAt(i)) | 0;\n    }\n    return hash & 0x7fffffff;\n  }\n\n  async getPSKey(domain: string): Promise<string> {\n    const cachedKey = this.psKeyCache.get(domain);\n    if (cachedKey?.isValid() === true) {\n      return cachedKey.value;\n    }\n\n    return this.psKeyQueryMutex.runExclusive(async () => {\n      const refreshedKey = this.psKeyCache.get(domain);\n      if (refreshedKey?.isValid() === true) {\n        return refreshedKey.value;\n      }\n\n      const keys = await this.bot.callService(FetchPSKey, [domain]);\n      const psKey = keys.get(domain);\n      if (psKey === undefined) {\n        throw new Error(`Failed to fetch PSKey for ${domain}`);\n      }\n\n      this.psKeyCache.set(domain, KeyWithLifetime.create(psKey, 86400));\n      return psKey;\n    });\n  }\n}\n\nfunction currentEpochSeconds(): number {\n  return Math.floor(Date.now() / 1000);\n}\n","import { match } from 'ts-pattern';\nimport z from 'zod';\n\nimport type { BotEssenceMessage, BotEssenceSegment, BotGroupAnnouncement } from '../../entity';\n\nexport const GroupAnnounceImage = z.object({\n  h: z.string(),\n  w: z.string(),\n  id: z.string(),\n});\nexport type GroupAnnounceImage = z.infer<typeof GroupAnnounceImage>;\n\nconst GroupAnnounceFeed = z.object({\n  fid: z.string(),\n  u: z.number(),\n  pubt: z.number(),\n  msg: z.object({\n    text: z.string(),\n    pics: z.array(GroupAnnounceImage),\n  }),\n});\nexport type GroupAnnounceFeed = z.infer<typeof GroupAnnounceFeed>;\n\nexport const GroupAnnounceResponse = z.object({\n  feeds: z.array(GroupAnnounceFeed),\n  inst: z.array(GroupAnnounceFeed),\n});\n\nexport const GroupAnnounceSendResponse = z.object({\n  new_fid: z.string(),\n});\n\nexport const GroupAnnounceUploadResponse = z.object({\n  ec: z.number(),\n  id: z.string(),\n});\n\nconst GroupEssenceSegment = z.discriminatedUnion('msg_type', [\n  z.object({\n    msg_type: z.literal(1),\n    text: z.string(),\n  }),\n  z.object({\n    msg_type: z.literal(2),\n    face_index: z.number(),\n  }),\n  z.object({\n    msg_type: z.literal(3),\n    image_url: z.string(),\n  }),\n  z.object({\n    msg_type: z.literal(4),\n    file_thumbnail_url: z.string(),\n  }),\n]);\n\nconst GroupEssenceMsgItem = z.object({\n  msg_seq: z.number(),\n  sender_uin: z.string(),\n  sender_nick: z.string(),\n  sender_time: z.number(),\n  add_digest_uin: z.string(),\n  add_digest_nick: z.string(),\n  add_digest_time: z.number(),\n  msg_content: z.array(GroupEssenceSegment),\n});\nexport type GroupEssenceMsgItem = z.infer<typeof GroupEssenceMsgItem>;\n\nexport const GroupEssenceResponse = z.object({\n  data: z.object({\n    msg_list: z.array(GroupEssenceMsgItem).nullable(),\n    is_end: z.boolean(),\n  }),\n});\n\nexport function parseGroupAnnouncement(groupUin: number, feed: GroupAnnounceFeed): BotGroupAnnouncement {\n  const imageId = feed.msg.pics[0]?.id;\n  return {\n    groupUin,\n    announcementId: feed.fid,\n    senderId: feed.u,\n    time: feed.pubt,\n    content: unescapeHttp(feed.msg.text),\n    imageUrl: imageId === undefined ? undefined : `https://gdynamic.qpic.cn/gdynamic/${imageId}/0`,\n  };\n}\n\nexport function parseGroupEssenceMessage(groupUin: number, item: GroupEssenceMsgItem): BotEssenceMessage | undefined {\n  const segments = item.msg_content\n    .map((element): BotEssenceSegment | undefined => {\n      return match(element)\n        .returnType<BotEssenceSegment | undefined>()\n        .with({ msg_type: 1 }, (content) => ({ type: 'text', text: content.text }))\n        .with({ msg_type: 2 }, (content) => ({\n          type: 'face',\n          faceId: content.face_index,\n        }))\n        .with({ msg_type: 3 }, (content) => ({\n          type: 'image',\n          imageUrl: content.image_url,\n        }))\n        .with({ msg_type: 4 }, (content) => ({\n          type: 'video',\n          thumbnailUrl: content.file_thumbnail_url,\n        }))\n        .exhaustive();\n    })\n    .filter((segment) => segment !== undefined);\n  if (segments.length === 0) {\n    return undefined;\n  }\n\n  return {\n    groupUin,\n    messageSeq: item.msg_seq,\n    messageTime: item.sender_time,\n    senderUin: Number(item.sender_uin),\n    senderName: item.sender_nick,\n    operatorUin: Number(item.add_digest_uin),\n    operatorName: item.add_digest_nick,\n    operationTime: item.add_digest_time,\n    segments,\n  };\n}\n\nexport function unescapeHttp(value: string): string {\n  return value.replace(/&(#x[\\da-f]+|#\\d+|nbsp|lt|gt|amp|quot|apos);/gi, (source, entity: string) => {\n    if (entity.startsWith('#x') || entity.startsWith('#X')) {\n      const code = Number.parseInt(entity.slice(2), 16);\n      return Number.isNaN(code) ? source : String.fromCharCode(code);\n    }\n    if (entity.startsWith('#')) {\n      const code = Number.parseInt(entity.slice(1), 10);\n      return Number.isNaN(code) ? source : String.fromCharCode(code);\n    }\n    return (\n      (\n        {\n          nbsp: '\\u00a0',\n          lt: '<',\n          gt: '>',\n          amp: '&',\n          quot: '\"',\n          apos: \"'\",\n        } as Record<string, string>\n      )[entity.toLowerCase()] ?? source\n    );\n  });\n}\n","import type { InferProtoModel } from '@saltify/typeproto';\nimport { XMLParser } from 'fast-xml-parser';\nimport { match } from 'ts-pattern';\nimport z from 'zod';\n\nimport type {\n  BotForwardedMessage,\n  BotIncomingMessage,\n  BotIncomingMessageExtraInfo,\n  BotIncomingSegment,\n  MessageScene,\n} from '../../../entity';\nimport { CommonMessage, PushMsgType } from '../../proto/message/common';\nimport {\n  type Elem,\n  GroupFileExtra,\n  MsgInfo,\n  PrivateFileExtra,\n  QBigFaceExtra,\n  QSmallFaceExtra,\n  SourceMsgPbReserve,\n  TextResvAttr,\n} from '../../proto/message/elem';\n\nimport { inflateSync } from 'node:zlib';\n\ntype RawMessage = InferProtoModel<typeof CommonMessage>;\ntype RawElem = InferProtoModel<typeof Elem>;\ntype SegmentType = BotIncomingSegment['type'];\ntype SegmentOf<T extends SegmentType> = Extract<BotIncomingSegment, { type: T }>;\ntype SegmentParser = (ctx: MessageParsingContext) => BotIncomingSegment | undefined;\n\ninterface ForwardXmlPayload {\n  msg?: {\n    m_resid?: string;\n    item?: ForwardXmlItem | ForwardXmlItem[];\n  };\n}\n\ninterface ForwardXmlItem {\n  title?: string | string[];\n  summary?: string | string[];\n}\n\nconst forwardXmlParser = new XMLParser({\n  ignoreAttributes: true,\n  parseTagValue: false,\n  trimValues: false,\n});\n\nconst ForwardLightAppPayload = z.object({\n  app: z.literal('com.tencent.multimsg'),\n  meta: z.object({\n    detail: z.object({\n      resid: z.string(),\n      source: z.string(),\n      news: z.array(z.object({ text: z.string() })),\n      summary: z.string(),\n    }),\n  }),\n});\n\nconst LightAppPayloadSchema = z.object({\n  app: z.string(),\n});\n\nexport function parseIncomingMessage(raw: RawMessage, selfUin: number): BotIncomingMessage | undefined {\n  const draft = buildDraftMessage(raw, selfUin);\n  if (draft === undefined) {\n    return undefined;\n  }\n\n  let extraInfo: BotIncomingMessageExtraInfo | undefined;\n  const segments =\n    raw.contentHead.type === PushMsgType.FriendFileMessage\n      ? parsePrivateFileMessage(raw)\n      : buildSegments(raw.messageBody.richText.elems, draft.scene, (extra) => {\n          extraInfo = extra;\n        });\n\n  if (segments.length === 0) {\n    return undefined;\n  }\n\n  return {\n    ...draft,\n    segments,\n    extraInfo,\n  };\n}\n\nexport function parseForwardedMessage(raw: RawMessage): BotForwardedMessage | undefined {\n  const senderName = raw.routingHead.commonC2C.name || raw.routingHead.group.groupCard || 'QQ用户';\n  const segments = buildSegments(raw.messageBody.richText.elems, 'friend');\n  if (segments.length === 0) {\n    return undefined;\n  }\n\n  return {\n    sequence: raw.contentHead.sequence,\n    senderName,\n    avatarUrl: raw.contentHead.forwardExt.avatar,\n    timestamp: raw.contentHead.time,\n    segments,\n  };\n}\n\nfunction buildDraftMessage(\n  raw: RawMessage,\n  selfUin: number,\n): Omit<BotIncomingMessage, 'segments' | 'extraInfo'> | undefined {\n  const { routingHead, contentHead } = raw;\n\n  return match(contentHead.type)\n    .with(PushMsgType.FriendMessage, PushMsgType.FriendRecordMessage, PushMsgType.FriendFileMessage, () => {\n      const isSelfSend = routingHead.fromUin === selfUin;\n      return {\n        scene: 'friend' as const,\n        peerUin: isSelfSend ? routingHead.toUin : routingHead.fromUin,\n        peerUid: isSelfSend ? routingHead.toUid : routingHead.fromUid,\n        sequence: contentHead.clientSequence,\n        timestamp: contentHead.time,\n        senderUin: routingHead.fromUin,\n        senderUid: routingHead.fromUid,\n        clientSequence: contentHead.sequence,\n        random: contentHead.random,\n        messageUid: contentHead.msgUid,\n      };\n    })\n    .with(PushMsgType.GroupMessage, () => ({\n      scene: 'group' as const,\n      peerUin: routingHead.group.groupCode,\n      peerUid: routingHead.toUid,\n      sequence: contentHead.sequence,\n      timestamp: contentHead.time,\n      senderUin: routingHead.fromUin,\n      senderUid: routingHead.fromUid,\n      clientSequence: contentHead.clientSequence,\n      random: contentHead.random,\n      messageUid: contentHead.msgUid,\n    }))\n    .otherwise(() => undefined);\n}\n\nfunction buildSegments(\n  elems: RawElem[],\n  scene: MessageScene,\n  onExtraInfo: (extra: BotIncomingMessageExtraInfo) => void = () => {},\n): BotIncomingSegment[] {\n  const segments: BotIncomingSegment[] = [];\n  const ctx = new MessageParsingContext(scene, elems);\n\n  while (ctx.hasNext()) {\n    const extraInfo = ctx.peek().extraInfo;\n    if (extraInfo !== undefined) {\n      onExtraInfo({\n        nick: extraInfo.nick,\n        card: extraInfo.groupCard,\n        specialTitle: extraInfo.senderTitle,\n      });\n      ctx.consume();\n      continue;\n    }\n\n    let matched = false;\n    for (const parser of segmentParsers) {\n      const segment = parser(ctx);\n      if (segment === undefined) {\n        continue;\n      }\n\n      segments.push(segment);\n      matched = true;\n      break;\n    }\n\n    if (!matched) {\n      ctx.skip();\n    }\n  }\n\n  return segments;\n}\n\nfunction defineSegmentParser<T extends SegmentType>(\n  segmentType: T,\n  parser: (ctx: MessageParsingContext) => Omit<SegmentOf<T>, 'type'> | undefined,\n): SegmentParser {\n  return (ctx) => {\n    const checkpoint = ctx.checkpoint();\n    try {\n      const parsed = parser(ctx);\n      if (parsed === undefined) {\n        ctx.restore(checkpoint);\n        return undefined;\n      }\n      return { type: segmentType, ...parsed } as SegmentOf<T>;\n    } catch {\n      ctx.restore(checkpoint);\n      return undefined;\n    }\n  };\n}\n\nclass MessageParsingContext {\n  private currentIndex = 0;\n\n  constructor(\n    readonly scene: MessageScene,\n    private readonly elems: RawElem[],\n  ) {}\n\n  get remainingCount(): number {\n    return this.elems.length - this.currentIndex;\n  }\n\n  hasNext(): boolean {\n    return this.currentIndex < this.elems.length;\n  }\n\n  peek(): RawElem {\n    return this.elems[this.currentIndex];\n  }\n\n  checkpoint(): number {\n    return this.currentIndex;\n  }\n\n  restore(checkpoint: number): void {\n    this.currentIndex = checkpoint;\n  }\n\n  skip(count = 1): void {\n    if (this.currentIndex + count > this.elems.length) {\n      throw new RangeError(\n        `Cannot skip ${count} elements from index ${this.currentIndex}, size is ${this.elems.length}`,\n      );\n    }\n    this.currentIndex += count;\n  }\n\n  consume(): void {\n    this.skip();\n  }\n}\n\nconst segmentParsers: SegmentParser[] = [\n  defineSegmentParser('text', (ctx) => {\n    const text = ctx.peek().text;\n    if (text === undefined || text.attr6Buf.length !== 0) {\n      return undefined;\n    }\n    ctx.consume();\n    return { text: text.textMsg };\n  }),\n\n  defineSegmentParser('mention', (ctx) => {\n    const at = ctx.peek().text;\n    if (at === undefined || at.attr6Buf.length < 11 || at.pbReserve.length === 0) {\n      return undefined;\n    }\n\n    ctx.consume();\n    const attr = TextResvAttr.decode(at.pbReserve);\n    return {\n      uin: attr.atMemberUin === 0 ? undefined : attr.atMemberUin,\n      name: at.textMsg,\n    };\n  }),\n\n  defineSegmentParser('face', (ctx) => {\n    const face = ctx.peek().face;\n    if (face !== undefined) {\n      ctx.consume();\n      return {\n        faceId: face.index,\n        summary: '[表情]',\n        isLarge: false,\n      };\n    }\n\n    const common = ctx.peek().commonElem;\n    if (common === undefined) {\n      return undefined;\n    }\n\n    return match(common.serviceType)\n      .with(33, () => {\n        ctx.consume();\n        const extra = QSmallFaceExtra.decode(common.pbElem);\n        return {\n          faceId: extra.faceId,\n          summary: `[${extra.text.replace(/^\\//, '') || '表情'}]`,\n          isLarge: false,\n        };\n      })\n      .with(37, () => {\n        ctx.consume();\n        const extra = QBigFaceExtra.decode(common.pbElem);\n        if (ctx.hasNext() && ctx.peek().text !== undefined) {\n          ctx.skip();\n        }\n        return {\n          faceId: extra.faceId,\n          summary: `[${extra.preview.replace(/^\\//, '') || '超级表情'}]`,\n          isLarge: true,\n        };\n      })\n      .otherwise(() => undefined);\n  }),\n\n  defineSegmentParser('reply', (ctx) => {\n    const reply = ctx.peek().srcMsg;\n    if (reply === undefined) {\n      return undefined;\n    }\n\n    ctx.consume();\n    if (ctx.remainingCount >= 2) {\n      if (ctx.peek().generalFlags !== undefined) {\n        ctx.skip(\n          match(ctx.scene)\n            .with('friend', () => 2)\n            .with('group', () => Math.min(4, ctx.remainingCount))\n            .otherwise(() => 0),\n        );\n      } else if (ctx.scene === 'group') {\n        ctx.skip(2);\n      }\n    }\n\n    let senderName: string | undefined;\n    if (reply.srcMsg !== undefined && reply.srcMsg.length > 0) {\n      senderName = CommonMessage.decode(reply.srcMsg).routingHead.group.groupCard || undefined;\n    }\n\n    return {\n      sequence: match(ctx.scene)\n        .with('group', () => reply.origSeqs[0] ?? 0)\n        .otherwise(() => (reply.pbReserve.length > 0 ? SourceMsgPbReserve.decode(reply.pbReserve).friendSequence : 0)),\n      senderUin: reply.senderUin,\n      senderName,\n      timestamp: reply.time,\n      segments: buildSegments(reply.elems, ctx.scene),\n    };\n  }),\n\n  defineSegmentParser('image', (ctx) => {\n    const common = ctx.peek().commonElem;\n    if (common === undefined || (common.businessType !== 10 && common.businessType !== 20)) {\n      return undefined;\n    }\n\n    ctx.consume();\n    const msgInfo = MsgInfo.decode(common.pbElem);\n    const index = msgInfo.msgInfoBody[0]?.index;\n    if (index === undefined) {\n      return undefined;\n    }\n\n    return {\n      fileId: index.fileUuid,\n      width: index.info.width,\n      height: index.info.height,\n      subType: msgInfo.extBizInfo.pic.bizType,\n      summary: msgInfo.extBizInfo.pic.textSummary || '[图片]',\n    };\n  }),\n\n  defineSegmentParser('record', (ctx) => {\n    const common = ctx.peek().commonElem;\n    if (common === undefined || (common.businessType !== 12 && common.businessType !== 22)) {\n      return undefined;\n    }\n\n    ctx.consume();\n    const index = MsgInfo.decode(common.pbElem).msgInfoBody[0]?.index;\n    if (index === undefined) {\n      return undefined;\n    }\n\n    return {\n      fileId: index.fileUuid,\n      duration: index.info.time,\n    };\n  }),\n\n  defineSegmentParser('video', (ctx) => {\n    const common = ctx.peek().commonElem;\n    if (common === undefined || (common.businessType !== 11 && common.businessType !== 21)) {\n      return undefined;\n    }\n\n    ctx.consume();\n    const index = MsgInfo.decode(common.pbElem).msgInfoBody[0]?.index;\n    if (index === undefined) {\n      return undefined;\n    }\n\n    return {\n      fileId: index.fileUuid,\n      duration: index.info.time,\n      width: index.info.width,\n      height: index.info.height,\n    };\n  }),\n\n  defineSegmentParser('file', (ctx) => {\n    if (ctx.scene !== 'group') {\n      return undefined;\n    }\n\n    const trans = ctx.peek().transElemInfo;\n    if (trans === undefined || trans.elemType !== 24 || trans.elemValue.length < 3) {\n      return undefined;\n    }\n\n    ctx.consume();\n    const length = trans.elemValue.readUInt16BE(1);\n    const extra = GroupFileExtra.decode(trans.elemValue.subarray(3, 3 + length));\n    const info = extra.inner.info;\n    return {\n      fileId: info.fileId,\n      fileName: info.fileName,\n      fileSize: Number(info.fileSize),\n    };\n  }),\n\n  defineSegmentParser('forward', (ctx) => {\n    const richMsg = ctx.peek().richMsg;\n    if (richMsg !== undefined && richMsg.bytesTemplate1.length > 1) {\n      ctx.consume();\n      const xml = inflateSync(richMsg.bytesTemplate1.subarray(1)).toString();\n      const payload = forwardXmlParser.parse(xml) as ForwardXmlPayload;\n      const item = Array.isArray(payload.msg?.item) ? payload.msg.item[0] : payload.msg?.item;\n      const titles = item?.title === undefined ? [] : Array.isArray(item.title) ? item.title : [item.title];\n      const summary = Array.isArray(item?.summary) ? (item.summary[0] ?? '') : (item?.summary ?? '');\n      return {\n        resId: payload.msg?.m_resid ?? '',\n        title: titles[0] ?? '',\n        preview: titles.slice(1),\n        summary,\n      };\n    }\n\n    const elem = ctx.peek().lightAppElem;\n    if (elem === undefined || elem.bytesData.length <= 1) {\n      return undefined;\n    }\n\n    const jsonPayload = inflateSync(elem.bytesData.subarray(1)).toString();\n    const payload = ForwardLightAppPayload.parse(JSON.parse(jsonPayload));\n\n    ctx.consume();\n    const detail = payload.meta.detail;\n\n    return {\n      resId: detail.resid,\n      title: detail.source,\n      preview: detail.news.map((item) => item.text),\n      summary: detail.summary,\n    };\n  }),\n\n  defineSegmentParser('marketFace', (ctx) => {\n    const market = ctx.peek().marketFace;\n    if (market === undefined) {\n      return undefined;\n    }\n\n    ctx.consume();\n    if (ctx.hasNext() && ctx.peek().text?.textMsg === market.summary) {\n      ctx.skip();\n    }\n\n    const faceIdHex = market.faceId.toString('hex');\n    return {\n      url: `https://gxh.vip.qq.com/club/item/parcel/item/${faceIdHex.slice(0, 2)}/${faceIdHex}/raw300.gif`,\n      summary: market.summary,\n      emojiId: faceIdHex,\n      emojiPackageId: market.tabId,\n      key: market.key,\n    };\n  }),\n\n  defineSegmentParser('lightApp', (ctx) => {\n    const elem = ctx.peek().lightAppElem;\n    if (elem === undefined || elem.bytesData.length <= 1) {\n      return undefined;\n    }\n\n    ctx.consume();\n    if (ctx.hasNext() && ctx.peek().text !== undefined) {\n      ctx.skip();\n    }\n\n    const jsonPayload = inflateSync(elem.bytesData.subarray(1)).toString();\n    const payload = LightAppPayloadSchema.parse(JSON.parse(jsonPayload));\n\n    return {\n      appName: payload.app,\n      jsonPayload,\n    };\n  }),\n];\n\nfunction parsePrivateFileMessage(raw: RawMessage): BotIncomingSegment[] {\n  const extra = PrivateFileExtra.decode(raw.messageBody.msgContent);\n  const file = extra.notOnlineFile;\n  return [\n    {\n      type: 'file',\n      fileId: file.fileUuid,\n      fileName: file.fileName,\n      fileSize: Number(file.fileSize),\n      fileHash: file.fileIdCrcMedia || undefined,\n    },\n  ];\n}\n","import type { InferProtoModelInput } from '@saltify/typeproto';\nimport { match } from 'ts-pattern';\n\nimport type { Bot } from '../../..';\nimport { ImageFormat, ImageSubType } from '../../../common';\nimport {\n  type BotOutgoingForwardNode,\n  type BotOutgoingSegment,\n  type MessageScene,\n  outgoingSegmentPreview,\n} from '../../../entity';\nimport { type CommonMessage, PushMsgType } from '../../proto/message/common';\nimport { type Elem, QBigFaceExtra, QSmallFaceExtra, SourceMsgResvAttr, TextResvAttr } from '../../proto/message/elem';\nimport { NTV2RichMediaHighwayExt, RichMediaMsgInfo } from '../../proto/oidb/media';\nimport { RichMediaUpload, type RichMediaUploadResponse } from '../../service/media';\nimport { FetchFriendMessages, FetchGroupMessages, SendLongMsg } from '../../service/message';\nimport { uint32ToIpv4 } from '../../util/ipv4';\n\nimport { createHash, randomInt, randomUUID } from 'node:crypto';\nimport { deflateSync } from 'node:zlib';\n\ntype OutgoingScene = Extract<MessageScene, 'friend' | 'group'>;\ntype RawElem = InferProtoModelInput<typeof Elem>;\ntype RawMessageInput = InferProtoModelInput<typeof CommonMessage>;\ntype SegmentType = BotOutgoingSegment['type'];\ntype SegmentOf<T extends SegmentType> = Extract<BotOutgoingSegment, { type: T }>;\ntype SegmentEncoder = (bot: Bot, ctx: OutgoingMessageContext, segment: BotOutgoingSegment) => Promise<RawElem[]>;\n\ninterface OutgoingMessageContext {\n  scene: OutgoingScene;\n  peerUin: number;\n  peerUid: string;\n  nestedForwardTrace?: Map<string, RawMessageInput[]>;\n}\n\nexport async function encodeOutgoingMessage(\n  this: Bot,\n  scene: OutgoingScene,\n  peerUin: number,\n  peerUid: string,\n  segments: BotOutgoingSegment[],\n  nestedForwardTrace?: Map<string, RawMessageInput[]>,\n): Promise<RawElem[]> {\n  const ctx: OutgoingMessageContext = { scene, peerUin, peerUid, nestedForwardTrace };\n  const encoded = await Promise.all(segments.map((segment) => encodeSegment(this, ctx, segment)));\n  return encoded.flat();\n}\n\nexport function defineOutgoingSegmentEncoder<T extends SegmentType>(\n  segmentType: T,\n  encoder: (bot: Bot, ctx: OutgoingMessageContext, segment: SegmentOf<T>) => Promise<RawElem[]>,\n): SegmentEncoder {\n  return async (bot, ctx, segment) => {\n    if (segment.type !== segmentType) {\n      return [];\n    }\n    return encoder(bot, ctx, segment as SegmentOf<T>);\n  };\n}\n\nconst segmentEncoders: SegmentEncoder[] = [\n  defineOutgoingSegmentEncoder('text', async (_, __, segment) => [\n    {\n      text: {\n        textMsg: segment.text,\n      },\n    },\n  ]),\n\n  defineOutgoingSegmentEncoder('mention', async (bot, ctx, segment) => [\n    {\n      text: {\n        textMsg: `@${segment.name}`,\n        pbReserve: TextResvAttr.encode({\n          atType: segment.uin === undefined ? 1 : 2,\n          atMemberUin: segment.uin ?? 0,\n          atMemberUid:\n            segment.uin === undefined\n              ? ''\n              : await bot.getUidByUin(segment.uin, ctx.scene === 'group' ? ctx.peerUin : undefined),\n        }),\n      },\n    },\n  ]),\n\n  defineOutgoingSegmentEncoder('face', async (bot, _, segment) => {\n    if (segment.isLarge === true) {\n      const detail = bot.faceDetailMap.get(String(segment.faceId));\n      if (detail === undefined) {\n        throw new Error(`Face detail not found: ${segment.faceId}`);\n      }\n      return [\n        {\n          commonElem: {\n            serviceType: 37,\n            pbElem: QBigFaceExtra.encode({\n              aniStickerPackId: String(detail.aniStickerPackId),\n              aniStickerId: String(detail.aniStickerId),\n              faceId: segment.faceId,\n              field4: 1,\n              aniStickerType: detail.aniStickerType,\n              field6: '',\n              preview: detail.qDes,\n              field9: 1,\n            }),\n            businessType: detail.aniStickerType,\n          },\n        },\n      ];\n    }\n\n    if (segment.faceId >= 260) {\n      const detail = bot.faceDetailMap.get(String(segment.faceId));\n      if (detail === undefined) {\n        throw new Error(`Face detail not found: ${segment.faceId}`);\n      }\n      return [\n        {\n          commonElem: {\n            serviceType: 33,\n            pbElem: QSmallFaceExtra.encode({\n              faceId: segment.faceId,\n              text: detail.qDes,\n              compatText: detail.qDes,\n            }),\n            businessType: detail.aniStickerType,\n          },\n        },\n      ];\n    }\n\n    return [\n      {\n        face: {\n          index: segment.faceId,\n        },\n      },\n    ];\n  }),\n\n  defineOutgoingSegmentEncoder('reply', async (bot, ctx, segment) => {\n    const messages = await match(ctx.scene)\n      .with('friend', () => bot.callService(FetchFriendMessages, ctx.peerUid, segment.sequence, segment.sequence))\n      .with('group', () => bot.callService(FetchGroupMessages, ctx.peerUin, segment.sequence, segment.sequence))\n      .exhaustive();\n    const replied = messages[0];\n    if (replied === undefined) {\n      return [];\n    }\n\n    const srcMsgElem: RawElem = {\n      srcMsg: {\n        origSeqs: [replied.contentHead.sequence],\n        senderUin: replied.routingHead.fromUin,\n        time: replied.contentHead.time,\n        flag: 0,\n        elems: replied.messageBody.richText.elems,\n        pbReserve: SourceMsgResvAttr.encode({\n          oriMsgType: 2,\n          sourceMsgId: replied.contentHead.msgUid,\n          senderUid: replied.routingHead.fromUid,\n        }),\n      },\n    };\n\n    if (ctx.scene === 'friend') {\n      return [srcMsgElem];\n    }\n\n    return [\n      srcMsgElem,\n      {\n        text: {\n          textMsg: `@${replied.routingHead.fromUin}`,\n          pbReserve: TextResvAttr.encode({\n            atType: 2,\n            atMemberUin: replied.routingHead.fromUin,\n            atMemberUid: replied.routingHead.fromUid,\n          }),\n        },\n      },\n      {\n        text: {\n          textMsg: ' ',\n        },\n      },\n    ];\n  }),\n\n  defineOutgoingSegmentEncoder('image', async (bot, ctx, segment) => {\n    const { md5, sha1 } = digest(segment.data);\n    const uploadResp = await match(ctx.scene)\n      .with('friend', () =>\n        bot.callService(RichMediaUpload.PrivateImage, {\n          imageSize: segment.data.length,\n          imageMd5: md5.hex,\n          imageSha1: sha1.hex,\n          imageExt: `.${imageFormatExt(segment.format)}`,\n          width: segment.width,\n          height: segment.height,\n          picFormat: segment.format,\n          subType: segment.subType ?? ImageSubType.Normal,\n          textSummary: segment.summary ?? '',\n        }),\n      )\n      .with('group', () =>\n        bot.callService(RichMediaUpload.GroupImage, {\n          imageSize: segment.data.length,\n          imageMd5: md5.hex,\n          imageSha1: sha1.hex,\n          imageExt: `.${imageFormatExt(segment.format)}`,\n          width: segment.width,\n          height: segment.height,\n          picFormat: segment.format,\n          subType: segment.subType ?? ImageSubType.Normal,\n          textSummary: segment.summary ?? '',\n          groupUin: ctx.peerUin,\n        }),\n      )\n      .exhaustive();\n\n    if (uploadResp.uKey.length > 0) {\n      await bot.uploadHighway(\n        buildHighwayUploadOptions(ctx.scene, 'image'),\n        segment.data,\n        md5.bytes,\n        buildHighwayExtendInfo(uploadResp, sha1.bytes),\n      );\n    }\n\n    return [\n      match(ctx.scene)\n        .with('friend', () => ({ notOnlineImage: uploadResp.compatQMsg }))\n        .with('group', () => ({ customFace: uploadResp.compatQMsg }))\n        .exhaustive(),\n      {\n        commonElem: {\n          serviceType: 48,\n          pbElem: uploadResp.msgInfoBuf,\n          businessType: ctx.scene === 'friend' ? 10 : 20,\n        },\n      },\n    ];\n  }),\n\n  defineOutgoingSegmentEncoder('record', async (bot, ctx, segment) => {\n    const { md5, sha1 } = digest(segment.data);\n    const uploadResp = await match(ctx.scene)\n      .with('friend', () =>\n        bot.callService(RichMediaUpload.PrivateRecord, {\n          audioSize: segment.data.length,\n          audioMd5: md5.hex,\n          audioSha1: sha1.hex,\n          audioDuration: segment.duration,\n        }),\n      )\n      .with('group', () =>\n        bot.callService(RichMediaUpload.GroupRecord, {\n          audioSize: segment.data.length,\n          audioMd5: md5.hex,\n          audioSha1: sha1.hex,\n          audioDuration: segment.duration,\n          groupUin: ctx.peerUin,\n        }),\n      )\n      .exhaustive();\n\n    if (uploadResp.uKey.length > 0) {\n      await bot.uploadHighway(\n        buildHighwayUploadOptions(ctx.scene, 'record'),\n        segment.data,\n        md5.bytes,\n        buildHighwayExtendInfo(uploadResp, sha1.bytes),\n      );\n    }\n\n    return [\n      {\n        commonElem: {\n          serviceType: 48,\n          pbElem: uploadResp.msgInfoBuf,\n          businessType: ctx.scene === 'friend' ? 12 : 22,\n        },\n      },\n    ];\n  }),\n\n  defineOutgoingSegmentEncoder('video', async (bot, ctx, segment) => {\n    const videoDigest = digest(segment.data);\n    const thumbDigest = digest(segment.thumb);\n    const uploadResp = await match(ctx.scene)\n      .with('friend', () =>\n        bot.callService(RichMediaUpload.PrivateVideo, {\n          videoSize: segment.data.length,\n          videoMd5: videoDigest.md5.hex,\n          videoSha1: videoDigest.sha1.hex,\n          videoWidth: segment.width,\n          videoHeight: segment.height,\n          videoDuration: segment.duration,\n          thumbnailSize: segment.thumb.length,\n          thumbnailMd5: thumbDigest.md5.hex,\n          thumbnailSha1: thumbDigest.sha1.hex,\n          thumbnailExt: imageFormatExt(segment.thumbFormat),\n          thumbnailPicFormat: segment.thumbFormat,\n        }),\n      )\n      .with('group', () =>\n        bot.callService(RichMediaUpload.GroupVideo, {\n          videoSize: segment.data.length,\n          videoMd5: videoDigest.md5.hex,\n          videoSha1: videoDigest.sha1.hex,\n          videoWidth: segment.width,\n          videoHeight: segment.height,\n          videoDuration: segment.duration,\n          thumbnailSize: segment.thumb.length,\n          thumbnailMd5: thumbDigest.md5.hex,\n          thumbnailSha1: thumbDigest.sha1.hex,\n          thumbnailExt: imageFormatExt(segment.thumbFormat),\n          thumbnailPicFormat: segment.thumbFormat,\n          groupUin: ctx.peerUin,\n        }),\n      )\n      .exhaustive();\n\n    if (uploadResp.uKey.length > 0) {\n      const success = await bot.uploadFlashTransfer(\n        uploadResp.uKey,\n        ctx.scene === 'friend' ? 1413 : 1415,\n        segment.data,\n      );\n      if (!success) {\n        throw new Error('Video upload failed');\n      }\n    }\n\n    if ((uploadResp.subFileInfos[0]?.uKey ?? '').length > 0) {\n      await bot.uploadHighway(\n        buildHighwayUploadOptions(ctx.scene, 'videoThumb'),\n        segment.thumb,\n        thumbDigest.md5.bytes,\n        buildHighwayExtendInfo(uploadResp, thumbDigest.sha1.bytes, 0),\n      );\n    }\n\n    return [\n      {\n        commonElem: {\n          serviceType: 48,\n          pbElem: uploadResp.msgInfoBuf,\n          businessType: ctx.scene === 'friend' ? 11 : 21,\n        },\n      },\n    ];\n  }),\n\n  defineOutgoingSegmentEncoder('forward', async (bot, ctx, segment) => {\n    const forwardTrace = ctx.nestedForwardTrace ?? new Map<string, RawMessageInput[]>();\n    const messages = await buildForwardMessages(bot, { ...ctx, nestedForwardTrace: forwardTrace }, segment.nodes);\n    const uuid = randomUUID();\n    if (ctx.nestedForwardTrace !== undefined) {\n      ctx.nestedForwardTrace.set(uuid, messages);\n    }\n\n    const resId = await bot.callService(\n      SendLongMsg,\n      ctx.scene,\n      ctx.peerUin,\n      ctx.peerUid,\n      messages,\n      ctx.nestedForwardTrace === undefined ? forwardTrace : new Map(),\n    );\n\n    return [\n      {\n        lightAppElem: {\n          bytesData: encodeLightAppData(\n            JSON.stringify({\n              app: 'com.tencent.multimsg',\n              config: {\n                autosize: 1,\n                forward: 1,\n                round: 1,\n                type: 'normal',\n                width: 300,\n              },\n              meta: {\n                detail: {\n                  news: (\n                    segment.preview ??\n                    segment.nodes\n                      .slice(0, 4)\n                      .map((node) => `${node.senderName}: ${node.segments.map(outgoingSegmentPreview).join('')}`)\n                  ).map((text) => ({ text })),\n                  resid: resId,\n                  source: segment.title ?? '群聊的聊天记录',\n                  summary: segment.summary ?? `查看${segment.nodes.length}条转发消息`,\n                  uniseq: uuid,\n                },\n              },\n              desc: '[聊天记录]',\n              extra: JSON.stringify({\n                filename: uuid,\n                tsum: segment.nodes.length,\n              }),\n              prompt: segment.prompt ?? '[聊天记录]',\n              ver: '0.0.0.5',\n              view: 'contact',\n            }),\n          ),\n        },\n      },\n    ];\n  }),\n\n  defineOutgoingSegmentEncoder('lightApp', async (_, __, segment) => [\n    {\n      lightAppElem: {\n        bytesData: encodeLightAppData(segment.jsonPayload),\n      },\n    },\n  ]),\n];\n\nasync function encodeSegment(bot: Bot, ctx: OutgoingMessageContext, segment: BotOutgoingSegment): Promise<RawElem[]> {\n  for (const encoder of segmentEncoders) {\n    const elems = await encoder(bot, ctx, segment);\n    if (elems.length > 0) {\n      return elems;\n    }\n  }\n\n  throw new Error(`Unsupported outgoing segment: ${(segment as { type: string }).type}`);\n}\n\nasync function buildForwardMessages(\n  bot: Bot,\n  ctx: OutgoingMessageContext,\n  nodes: BotOutgoingForwardNode[],\n): Promise<RawMessageInput[]> {\n  return Promise.all(\n    nodes.map(async (node) => {\n      const elems = await encodeOutgoingMessage.call(\n        bot,\n        ctx.scene,\n        ctx.peerUin,\n        ctx.peerUid,\n        node.segments,\n        ctx.nestedForwardTrace,\n      );\n      const sequence = randomInt(1_000_000, 10_000_000);\n      return {\n        routingHead: {\n          fromUin: node.senderUin,\n          toUid: bot.uid,\n          commonC2C: ctx.scene === 'friend' ? { name: node.senderName } : undefined,\n          group:\n            ctx.scene === 'group'\n              ? {\n                  groupCode: ctx.peerUin,\n                  groupCard: node.senderName,\n                  groupCardType: 2,\n                }\n              : undefined,\n        },\n        contentHead: {\n          type: ctx.scene === 'friend' ? PushMsgType.FriendMessage : PushMsgType.GroupMessage,\n          random: randomInt(0x7fffffff),\n          sequence,\n          time: Math.floor(Date.now() / 1000),\n          clientSequence: sequence,\n          msgUid: BigInt(randomInt(1_000_000_000_000, 10_000_000_000_000)),\n          forwardExt: {\n            field3: 2,\n            avatar: `https://q.qlogo.cn/headimg_dl?dst_uin=${node.senderUin}&spec=640&img_type=jpg`,\n          },\n        },\n        messageBody: {\n          richText: {\n            elems,\n          },\n        },\n      };\n    }),\n  );\n}\n\nfunction digest(data: Buffer) {\n  const md5 = createHash('md5').update(data).digest();\n  const sha1 = createHash('sha1').update(data).digest();\n  return {\n    md5: { bytes: md5, hex: md5.toString('hex') },\n    sha1: { bytes: sha1, hex: sha1.toString('hex') },\n  };\n}\n\nfunction imageFormatExt(format: ImageFormat): string {\n  return match(format)\n    .with(ImageFormat.PNG, () => 'png')\n    .with(ImageFormat.GIF, () => 'gif')\n    .with(ImageFormat.JPEG, () => 'jpg')\n    .with(ImageFormat.BMP, () => 'bmp')\n    .with(ImageFormat.WEBP, () => 'webp')\n    .with(ImageFormat.TIFF, () => 'tiff')\n    .otherwise(() => {\n      throw new Error(`Unsupported image format: ${format}`);\n    });\n}\n\nfunction buildHighwayUploadOptions(scene: OutgoingScene, type: 'image' | 'record' | 'videoThumb'): number {\n  return match(type)\n    .with('image', () => (scene === 'friend' ? 1003 : 1004))\n    .with('record', () => (scene === 'friend' ? 1007 : 1008))\n    .with('videoThumb', () => (scene === 'friend' ? 1002 : 1006))\n    .exhaustive();\n}\n\nfunction buildHighwayExtendInfo(uploadResp: RichMediaUploadResponse, sha1: Buffer, subFileInfoIndex?: number): Buffer {\n  const msgInfo = RichMediaMsgInfo.decode(uploadResp.msgInfoBuf);\n  const subFileInfo = subFileInfoIndex === undefined ? undefined : uploadResp.subFileInfos[subFileInfoIndex];\n  return NTV2RichMediaHighwayExt.encode({\n    fileUuid: msgInfo.msgInfoBody[0]?.index.fileUuid ?? '',\n    uKey: subFileInfo?.uKey ?? uploadResp.uKey,\n    network: {\n      ipv4s: (subFileInfo?.ipv4s ?? uploadResp.ipv4s).map((ip) => ({\n        domain: {\n          isEnable: true,\n          ip: uint32ToIpv4(ip.outIP),\n        },\n        port: ip.outPort,\n      })),\n    },\n    msgInfoBody: msgInfo.msgInfoBody,\n    blockSize: 1024 * 1024,\n    hash: {\n      fileSha1: [sha1],\n    },\n  });\n}\n\nfunction encodeLightAppData(jsonPayload: string): Buffer {\n  return Buffer.concat([Buffer.from([0x01]), deflateSync(Buffer.from(jsonPayload))]);\n}\n","import { match } from 'ts-pattern';\n\nimport type { Bot } from '../..';\nimport { RequestState } from '../../common';\nimport type { BotFriendRequest, BotGroupNotification } from '../../entity';\nimport type { FetchFilteredFriendRequests, FetchNormalFriendRequests } from '../service/friend';\nimport type { FetchGroupNotificationsNormal } from '../service/group';\n\nexport async function parseFriendRequest(\n  this: Bot,\n  raw: Awaited<ReturnType<NonNullable<typeof FetchNormalFriendRequests.parse>>>[number],\n): Promise<BotFriendRequest> {\n  return {\n    time: raw.timestamp,\n    initiatorUin: await this.getUinByUid(raw.sourceUid),\n    initiatorUid: raw.sourceUid,\n    targetUserUin: await this.getUinByUid(raw.targetUid),\n    targetUserUid: raw.targetUid,\n    state: raw.state,\n    comment: raw.comment,\n    via: raw.source,\n    isFiltered: false,\n  };\n}\n\nexport async function parseFilteredFriendRequest(\n  this: Bot,\n  raw: Awaited<ReturnType<NonNullable<typeof FetchFilteredFriendRequests.parse>>>[number],\n): Promise<BotFriendRequest> {\n  const selfInfo = await this.client.getSelfInfo();\n  return {\n    time: raw.timestamp,\n    initiatorUin: await this.getUinByUid(raw.sourceUid),\n    initiatorUid: raw.sourceUid,\n    targetUserUin: Number(selfInfo.uin),\n    targetUserUid: selfInfo.uid,\n    state: RequestState.Pending,\n    comment: raw.comment,\n    via: raw.source,\n    isFiltered: true,\n  };\n}\n\nexport async function parseGroupNotification(\n  this: Bot,\n  raw: Awaited<ReturnType<NonNullable<typeof FetchGroupNotificationsNormal.parse>>>['notifications'][number],\n  isFiltered: boolean,\n): Promise<BotGroupNotification | undefined> {\n  const groupUin = raw.group.groupUin;\n  const user1Uid = raw.user1.uid;\n\n  return match(raw.notifyType)\n    .returnType<Promise<BotGroupNotification | undefined> | undefined>()\n    .with(1, async () => {\n      const operatorUid = raw.user2?.uid;\n      return {\n        type: 'joinRequest',\n        groupUin,\n        notificationSeq: raw.sequence,\n        isFiltered,\n        initiatorUin: await this.getUinByUid(user1Uid),\n        initiatorUid: user1Uid,\n        state: raw.requestState,\n        operatorUin: operatorUid ? await this.getUinByUid(operatorUid) : undefined,\n        operatorUid,\n        comment: raw.comment,\n      };\n    })\n    .with(3, 16, async () => {\n      if (!raw.user2) {\n        return undefined;\n      }\n      return {\n        type: 'adminChange',\n        groupUin,\n        notificationSeq: raw.sequence,\n        targetUserUin: await this.getUinByUid(user1Uid),\n        targetUserUid: user1Uid,\n        isSet: raw.notifyType === 3,\n        operatorUin: await this.getUinByUid(raw.user2.uid),\n        operatorUid: raw.user2.uid,\n      };\n    })\n    .with(6, async () => {\n      const operator = raw.user2 ?? raw.user3;\n      if (!operator) {\n        return undefined;\n      }\n      return {\n        type: 'kick',\n        groupUin,\n        notificationSeq: raw.sequence,\n        targetUserUin: await this.getUinByUid(user1Uid),\n        targetUserUid: user1Uid,\n        operatorUin: await this.getUinByUid(operator.uid),\n        operatorUid: operator.uid,\n      };\n    })\n    .with(13, async () => {\n      return {\n        type: 'quit',\n        groupUin,\n        notificationSeq: raw.sequence,\n        targetUserUin: await this.getUinByUid(user1Uid),\n        targetUserUid: user1Uid,\n      };\n    })\n    .with(22, async () => {\n      if (!raw.user2) {\n        return undefined;\n      }\n      const operatorUid = raw.user3?.uid;\n      return {\n        type: 'invitedJoinRequest',\n        groupUin,\n        notificationSeq: raw.sequence,\n        initiatorUin: await this.getUinByUid(raw.user2.uid),\n        initiatorUid: raw.user2.uid,\n        targetUserUin: await this.getUinByUid(user1Uid),\n        targetUserUid: user1Uid,\n        state: raw.requestState,\n        operatorUin: operatorUid ? await this.getUinByUid(operatorUid) : undefined,\n        operatorUid,\n      };\n    })\n    .otherwise(() => undefined);\n}\n","import { ProtoField, ProtoMessage } from '@saltify/typeproto';\n\nexport const FriendRequest = ProtoMessage.of({\n  body: ProtoField(1, {\n    fromUid: ProtoField(2, 'string'),\n    message: ProtoField(10, 'string'),\n    via: ProtoField(11, 'string', 'optional'),\n  }, 'optional'),\n});\n\nexport const FriendRequestExtractVia = ProtoMessage.of({\n  body: ProtoField(1, {\n    via: ProtoField(5, 'string'),\n  }, 'optional'),\n});\n\nexport const GeneralGrayTip = ProtoMessage.of({\n  bizType: ProtoField(1, 'uint32'),\n  templateParams: ProtoField(7, ['string', 'string']),\n});\n\nexport const FriendRecall = ProtoMessage.of({\n  body: ProtoField(1, {\n    fromUid: ProtoField(1, 'string'),\n    toUid: ProtoField(2, 'string'),\n    clientSequence: ProtoField(3, 'uint32'),\n    tipInfo: ProtoField(13, {\n      tip: ProtoField(2, 'string'),\n    }, 'optional'),\n    sequence: ProtoField(20, 'uint32'),\n  }, 'optional'),\n});\n\nexport const FriendDeleteOrPinChanged = ProtoMessage.of({\n  body: ProtoField(1, {\n    type: ProtoField(2, 'uint32'),\n    pinChanged: ProtoField(20, {\n      body: ProtoField(1, {\n        uid: ProtoField(1, 'string'),\n        groupUin: ProtoField(2, 'uint32', 'optional'),\n        info: ProtoField(400, {\n          timestamp: ProtoField(2, 'bytes'),\n        }),\n      }),\n    }, 'optional'),\n  }),\n});\n\nexport const GroupJoinRequest = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  memberUid: ProtoField(3, 'string'),\n});\n\nexport const GroupInvitedJoinRequest = ProtoMessage.of({\n  command: ProtoField(1, 'uint32'),\n  info: ProtoField(2, {\n    inner: ProtoField(1, {\n      groupUin: ProtoField(1, 'uint32'),\n      targetUid: ProtoField(5, 'string'),\n      invitorUid: ProtoField(6, 'string'),\n    }, 'optional'),\n  }, 'optional'),\n});\n\nexport const GroupAdminChange = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  body: ProtoField(4, {\n    unset: ProtoField(1, {\n      targetUid: ProtoField(1, 'string'),\n    }, 'optional'),\n    set: ProtoField(2, {\n      targetUid: ProtoField(1, 'string'),\n    }, 'optional'),\n  }, 'optional'),\n});\n\nexport const GroupMemberChange = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  memberUid: ProtoField(3, 'string'),\n  type: ProtoField(4, 'uint32'),\n  operatorInfo: ProtoField(5, 'bytes', 'optional'),\n});\n\nexport const GroupMemberChangeOperatorInfo = ProtoMessage.of({\n  body: ProtoField(1, {\n    uid: ProtoField(1, 'string'),\n  }, 'optional'),\n});\n\nexport const GroupMute = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  operatorUid: ProtoField(4, 'string'),\n  info: ProtoField(5, {\n    timestamp: ProtoField(1, 'uint32'),\n    state: ProtoField(3, {\n      targetUid: ProtoField(1, 'string', 'optional'),\n      duration: ProtoField(2, 'uint32'),\n    }, 'optional'),\n  }, 'optional'),\n});\n\nexport const GroupEssenceMessageChange = ProtoMessage.of({\n  groupUin: ProtoField(1, 'uint32'),\n  msgSequence: ProtoField(2, 'uint32'),\n  random: ProtoField(3, 'uint32'),\n  setFlag: ProtoField(4, 'uint32'),\n  memberUin: ProtoField(5, 'uint32'),\n  operatorUin: ProtoField(6, 'uint32'),\n});\n\nexport const GroupRecall = ProtoMessage.of({\n  operatorUid: ProtoField(1, 'string'),\n  recallMessages: ProtoField(3, {\n    sequence: ProtoField(1, 'uint32'),\n    time: ProtoField(2, 'uint32'),\n    random: ProtoField(3, 'uint32'),\n    type: ProtoField(4, 'uint32'),\n    flag: ProtoField(5, 'uint32'),\n    authorUid: ProtoField(6, 'string'),\n  }, 'repeated'),\n  userDef: ProtoField(5, 'bytes', 'optional'),\n  groupType: ProtoField(6, 'uint32'),\n  opType: ProtoField(7, 'uint32'),\n  tipInfo: ProtoField(9, {\n    tip: ProtoField(2, 'string', 'optional'),\n  }, 'optional'),\n});\n\nexport const GroupReaction = ProtoMessage.of({\n  data: ProtoField(1, {\n    data: ProtoField(1, {\n      target: ProtoField(2, {\n        sequence: ProtoField(1, 'uint32'),\n      }, 'optional'),\n      data: ProtoField(3, {\n        code: ProtoField(1, 'string'),\n        reactionType: ProtoField(2, 'uint32'),\n        count: ProtoField(3, 'uint32'),\n        operatorUid: ProtoField(4, 'string'),\n        type: ProtoField(5, 'uint32'),\n      }, 'optional'),\n    }, 'optional'),\n  }, 'optional'),\n});\n\nexport const GroupNameChange = ProtoMessage.of({\n  name: ProtoField(2, 'string'),\n});\n\nexport const GroupGeneral0x2DCBody = ProtoMessage.of({\n  type: ProtoField(1, 'uint32'),\n  groupUin: ProtoField(4, 'uint32'),\n  eventParam: ProtoField(5, 'bytes', 'optional'),\n  recall: ProtoField(11, GroupRecall, 'optional'),\n  field13: ProtoField(13, 'uint32', 'optional'),\n  operatorUid: ProtoField(21, 'string', 'optional'),\n  generalGrayTip: ProtoField(26, GeneralGrayTip, 'optional'),\n  essenceMessageChange: ProtoField(33, GroupEssenceMessageChange, 'optional'),\n  msgSequence: ProtoField(37, 'uint32'),\n  reaction: ProtoField(44, GroupReaction, 'optional'),\n});\n\nexport function decodeGroupGeneral0x2DC(buffer: Buffer) {\n  return {\n    groupUin: buffer.readUInt32BE(0),\n    body: GroupGeneral0x2DCBody.decode(buffer.subarray(7)),\n  };\n}\n","import type { InferProtoModel } from '@saltify/typeproto';\nimport { match } from 'ts-pattern';\nimport z from 'zod';\n\nimport type { Bot } from '../..';\nimport { BotGroupMemberRole, RequestState } from '../../common';\nimport type { BotEvent } from '../../entity';\nimport { type CommonMessage, PushMsgType } from '../proto/message/common';\nimport {\n  decodeGroupGeneral0x2DC,\n  FriendDeleteOrPinChanged,\n  FriendRecall,\n  FriendRequest,\n  FriendRequestExtractVia,\n  GeneralGrayTip,\n  GroupAdminChange,\n  GroupInvitedJoinRequest,\n  GroupJoinRequest,\n  GroupMemberChange,\n  GroupMemberChangeOperatorInfo,\n  GroupMute,\n  GroupNameChange,\n} from '../proto/message/event';\nimport { parseIncomingMessage } from './message/incoming';\n\ntype RawMessage = InferProtoModel<typeof CommonMessage>;\n\nexport type BotEventEmission = {\n  [K in keyof BotEvent]: {\n    type: K;\n    payload: BotEvent[K];\n  };\n}[keyof BotEvent];\n\nconst GroupInvitationPayload = z.object({\n  bizsrc: z.literal('qun.invite'),\n  meta: z.object({\n    news: z.object({\n      jumpUrl: z.string(),\n    }),\n  }),\n});\n\nexport async function parsePushEvents(this: Bot, raw: RawMessage): Promise<BotEventEmission[]> {\n  return await match(raw.contentHead.type)\n    .returnType<Promise<BotEventEmission[]>>()\n    .with(\n      PushMsgType.FriendMessage,\n      PushMsgType.FriendRecordMessage,\n      PushMsgType.FriendFileMessage,\n      PushMsgType.GroupMessage,\n      () => parseMessageEvents.call(this, raw),\n    )\n    .with(PushMsgType.GroupJoinRequest, () => parseGroupJoinRequest.call(this, raw.messageBody.msgContent))\n    .with(PushMsgType.GroupInvitedJoinRequest, () =>\n      parseGroupInvitedJoinRequest.call(this, raw.messageBody.msgContent),\n    )\n    .with(PushMsgType.GroupAdminChange, () => parseGroupAdminChange.call(this, raw.messageBody.msgContent))\n    .with(PushMsgType.GroupMemberIncrease, () => parseGroupMemberIncrease.call(this, raw.messageBody.msgContent))\n    .with(PushMsgType.GroupMemberDecrease, () => parseGroupMemberDecrease.call(this, raw.messageBody.msgContent))\n    .with(PushMsgType.Event0x210, () =>\n      parseEvent0x210.call(this, raw.routingHead.fromUin, raw.contentHead.subType, raw.messageBody.msgContent),\n    )\n    .with(PushMsgType.Event0x2DC, () => parseEvent0x2DC.call(this, raw.contentHead.subType, raw.messageBody.msgContent))\n    .otherwise(async () => []);\n}\n\nfunction emit<K extends keyof BotEvent>(type: K, payload: BotEvent[K]): BotEventEmission {\n  return { type, payload } as BotEventEmission;\n}\n\nasync function parseMessageEvents(this: Bot, raw: RawMessage): Promise<BotEventEmission[]> {\n  const message = parseIncomingMessage(raw, this.uin);\n  if (message === undefined) {\n    return [];\n  }\n\n  const events: BotEventEmission[] = [emit('messageReceive', { message })];\n  const lightApp = message.segments.find((segment) => segment.type === 'lightApp');\n  if (\n    lightApp !== undefined &&\n    (lightApp.appName === 'com.tencent.qun.invite' || lightApp.appName === 'com.tencent.tuwen.lua')\n  ) {\n    const payload = GroupInvitationPayload.parse(JSON.parse(lightApp.jsonPayload));\n    const url = new URL(payload.meta.news.jumpUrl);\n    const groupCode = url.searchParams.get('groupcode');\n    const msgSeq = url.searchParams.get('msgseq');\n    if (groupCode !== null && msgSeq !== null) {\n      events.push(\n        emit('groupInvitation', {\n          groupUin: Number(groupCode),\n          invitationSeq: Number(msgSeq),\n          initiatorUin: message.senderUin,\n          initiatorUid: message.senderUid,\n        }),\n      );\n    }\n  }\n\n  const file = message.segments.find((segment) => segment.type === 'file');\n  if (file !== undefined) {\n    if (message.scene === 'friend') {\n      events.push(\n        emit('friendFileUpload', {\n          userUin: message.senderUin,\n          userUid: message.senderUid,\n          fileId: file.fileId,\n          fileName: file.fileName,\n          fileSize: file.fileSize,\n          fileHash: file.fileHash ?? '',\n          isSelf: message.senderUin === this.uin,\n        }),\n      );\n    } else if (message.scene === 'group') {\n      events.push(\n        emit('groupFileUpload', {\n          groupUin: message.peerUin,\n          userUin: message.senderUin,\n          userUid: message.senderUid,\n          fileId: file.fileId,\n          fileName: file.fileName,\n          fileSize: file.fileSize,\n        }),\n      );\n    }\n  }\n\n  return events;\n}\n\nasync function parseGroupJoinRequest(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  const content = GroupJoinRequest.decode(msgContent);\n  const memberUin = await this.getUinByUid(content.memberUid);\n  const notifications = [\n    ...(await this.getGroupNotifications(undefined, false, 30)).notifications,\n    ...(await this.getGroupNotifications(undefined, true, 10)).notifications,\n  ];\n  const notification = notifications.find((item) => {\n    return (\n      item.type === 'joinRequest' &&\n      item.groupUin === content.groupUin &&\n      item.initiatorUin === memberUin &&\n      item.state === RequestState.Pending\n    );\n  });\n\n  if (notification === undefined || notification.type !== 'joinRequest') {\n    return [];\n  }\n\n  return [\n    emit('groupJoinRequest', {\n      groupUin: content.groupUin,\n      notificationSeq: notification.notificationSeq,\n      isFiltered: notification.isFiltered,\n      initiatorUin: memberUin,\n      initiatorUid: content.memberUid,\n      comment: notification.comment,\n    }),\n  ];\n}\n\nasync function parseGroupInvitedJoinRequest(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  const content = GroupInvitedJoinRequest.decode(msgContent);\n  if (content.command !== 87 || content.info?.inner === undefined) {\n    return [];\n  }\n\n  const { groupUin, targetUid, invitorUid } = content.info.inner;\n  const targetUin = await this.getUinByUid(targetUid);\n  const invitorUin = await this.getUinByUid(invitorUid);\n  const notifications = [\n    ...(await this.getGroupNotifications(undefined, false, 30)).notifications,\n    ...(await this.getGroupNotifications(undefined, true, 10)).notifications,\n  ];\n  const notification = notifications.find((item) => {\n    return (\n      item.type === 'invitedJoinRequest' &&\n      item.groupUin === groupUin &&\n      item.initiatorUin === invitorUin &&\n      item.targetUserUin === targetUin &&\n      item.state === RequestState.Pending\n    );\n  });\n\n  if (notification === undefined || notification.type !== 'invitedJoinRequest') {\n    return [];\n  }\n\n  return [\n    emit('groupInvitedJoinRequest', {\n      groupUin,\n      notificationSeq: notification.notificationSeq,\n      initiatorUin: invitorUin,\n      initiatorUid: invitorUid,\n      targetUserUin: targetUin,\n      targetUserUid: targetUid,\n    }),\n  ];\n}\n\nasync function parseGroupAdminChange(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  const content = GroupAdminChange.decode(msgContent);\n  const target = content.body?.set ?? content.body?.unset;\n  if (target === undefined) {\n    return [];\n  }\n\n  const group = await this.getGroup(content.groupUin);\n  const owner = (await group?.getMembers())?.find((member) => member.role === BotGroupMemberRole.Owner);\n  if (owner === undefined) {\n    return [];\n  }\n\n  return [\n    emit('groupAdminChange', {\n      groupUin: content.groupUin,\n      userUin: await this.getUinByUid(target.targetUid),\n      userUid: target.targetUid,\n      operatorUin: owner.uin,\n      operatorUid: owner.uid,\n      isSet: content.body?.set !== undefined,\n    }),\n  ];\n}\n\nasync function parseGroupMemberIncrease(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  const content = GroupMemberChange.decode(msgContent);\n  if (content.operatorInfo === undefined) {\n    return [];\n  }\n\n  const memberUin = await this.getUinByUid(content.memberUid);\n  const operatorUid = content.operatorInfo.toString();\n  const operatorUin = await this.getUinByUid(operatorUid);\n\n  return match(content.type)\n    .returnType<BotEventEmission[]>()\n    .with(130, () => [\n      emit('groupMemberIncrease', {\n        groupUin: content.groupUin,\n        userUin: memberUin,\n        userUid: content.memberUid,\n        operatorUin,\n        operatorUid,\n      }),\n    ])\n    .with(131, () => [\n      emit('groupMemberIncrease', {\n        groupUin: content.groupUin,\n        userUin: memberUin,\n        userUid: content.memberUid,\n        invitorUin: operatorUin,\n        invitorUid: operatorUid,\n      }),\n    ])\n    .otherwise(() => []);\n}\n\nasync function parseGroupMemberDecrease(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  const content = GroupMemberChange.decode(msgContent);\n  const operatorUid =\n    content.operatorInfo === undefined\n      ? undefined\n      : GroupMemberChangeOperatorInfo.decode(content.operatorInfo).body?.uid;\n  return [\n    emit('groupMemberDecrease', {\n      groupUin: content.groupUin,\n      userUin: await this.getUinByUid(content.memberUid),\n      userUid: content.memberUid,\n      operatorUin: operatorUid === undefined ? undefined : await this.getUinByUid(operatorUid),\n      operatorUid,\n    }),\n  ];\n}\n\nasync function parseEvent0x210(this: Bot, fromUin: number, subType: number, msgContent: Buffer) {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  return await match(subType)\n    .returnType<Promise<BotEventEmission[]>>()\n    .with(35, async () => parseFriendRequest(fromUin, msgContent))\n    .with(290, async () => parseFriendNudge.call(this, fromUin, msgContent))\n    .with(138, 139, async () => parseFriendRecall.call(this, subType, msgContent))\n    .with(39, async () => parseFriendDeleteOrPinChanged.call(this, msgContent))\n    .otherwise(async () => []);\n}\n\nfunction parseFriendRequest(fromUin: number, msgContent: Buffer): BotEventEmission[] {\n  const content = FriendRequest.decode(msgContent);\n  if (content.body === undefined) {\n    return [];\n  }\n\n  return [\n    emit('friendRequest', {\n      initiatorUin: fromUin,\n      initiatorUid: content.body.fromUid,\n      comment: content.body.message,\n      via: content.body.via ?? FriendRequestExtractVia.decode(msgContent).body?.via ?? '',\n    }),\n  ];\n}\n\nasync function parseFriendNudge(this: Bot, fromUin: number, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const content = GeneralGrayTip.decode(msgContent);\n  if (content.bizType !== 12) {\n    return [];\n  }\n\n  const uin1 = Number(content.templateParams.get('uin_str1'));\n  const uin2 = Number(content.templateParams.get('uin_str2'));\n  if (!Number.isFinite(uin1) || !Number.isFinite(uin2)) {\n    return [];\n  }\n\n  return [\n    emit('friendNudge', {\n      userUin: fromUin,\n      userUid: await this.getUidByUin(fromUin),\n      isSelfSend: uin1 === this.uin,\n      isSelfReceive: uin2 === this.uin,\n      displayAction: content.templateParams.get('action_str') ?? content.templateParams.get('alt_str1') ?? '',\n      displaySuffix: content.templateParams.get('suffix_str') ?? '',\n      displayActionImgUrl: content.templateParams.get('action_img_url') ?? '',\n    }),\n  ];\n}\n\nasync function parseFriendRecall(this: Bot, subType: number, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const content = FriendRecall.decode(msgContent);\n  if (content.body === undefined) {\n    return [];\n  }\n\n  const fromUin = await this.getUinByUid(content.body.fromUid);\n  const toUin = await this.getUinByUid(content.body.toUid);\n  return [\n    emit('messageRecall', {\n      scene: 'friend',\n      peerUin: subType === 0x122 ? toUin : fromUin,\n      messageSeq: content.body.sequence,\n      senderUin: fromUin,\n      senderUid: content.body.fromUid,\n      operatorUin: fromUin,\n      operatorUid: content.body.fromUid,\n      displaySuffix: content.body.tipInfo?.tip ?? '',\n    }),\n  ];\n}\n\nasync function parseFriendDeleteOrPinChanged(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const pinBody = FriendDeleteOrPinChanged.decode(msgContent).body.pinChanged?.body;\n  if (pinBody === undefined) {\n    return [];\n  }\n\n  if (pinBody.groupUin !== undefined) {\n    return [\n      emit('pinChanged', {\n        scene: 'group',\n        peerUin: pinBody.groupUin,\n        isPinned: pinBody.info.timestamp.length > 0,\n      }),\n    ];\n  }\n\n  const peerUin = await this.getUinByUid(pinBody.uid).catch(() => undefined);\n  if (peerUin === undefined) {\n    return [];\n  }\n\n  return [\n    emit('pinChanged', {\n      scene: 'friend',\n      peerUin,\n      isPinned: pinBody.info.timestamp.length > 0,\n    }),\n  ];\n}\n\nasync function parseEvent0x2DC(this: Bot, subType: number, msgContent: Buffer) {\n  if (msgContent.length === 0) {\n    return [];\n  }\n\n  return await match(subType)\n    .returnType<Promise<BotEventEmission[]>>()\n    .with(12, async () => parseGroupMute.call(this, msgContent))\n    .with(20, async () => parseGroupGrayTip.call(this, msgContent))\n    .with(21, async () => parseGroupEssenceMessageChange(msgContent))\n    .with(17, async () => parseGroupRecall.call(this, msgContent))\n    .with(16, async () => parseGroupSubType16.call(this, msgContent))\n    .otherwise(async () => []);\n}\n\nasync function parseGroupMute(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const content = GroupMute.decode(msgContent);\n  const state = content.info?.state;\n  if (state === undefined) {\n    return [];\n  }\n\n  const operatorUin = await this.getUinByUid(content.operatorUid);\n  if (state.targetUid === undefined) {\n    return [\n      emit('groupWholeMute', {\n        groupUin: content.groupUin,\n        operatorUin,\n        operatorUid: content.operatorUid,\n        isMute: state.duration !== 0,\n      }),\n    ];\n  }\n\n  const targetUin = await this.getUinByUid(state.targetUid);\n  const member = await (await this.getGroup(content.groupUin))?.getMember(targetUin);\n  member?.updateBinding({\n    ...member.data,\n    mutedUntil: Math.floor(Date.now() / 1000),\n  });\n\n  return [\n    emit('groupMute', {\n      groupUin: content.groupUin,\n      userUin: targetUin,\n      userUid: state.targetUid,\n      operatorUin,\n      operatorUid: content.operatorUid,\n      duration: state.duration,\n    }),\n  ];\n}\n\nasync function parseGroupGrayTip(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const wrapper = decodeGroupGeneral0x2DC(msgContent);\n  const content = wrapper.body.generalGrayTip;\n  if (content === undefined || content.bizType !== 12) {\n    return [];\n  }\n\n  const groupUin = wrapper.body.groupUin || wrapper.groupUin;\n  const uin1 = Number(content.templateParams.get('uin_str1'));\n  const uin2 = Number(content.templateParams.get('uin_str2'));\n  if (!Number.isFinite(uin1) || !Number.isFinite(uin2)) {\n    return [];\n  }\n\n  return [\n    emit('groupNudge', {\n      groupUin,\n      senderUin: uin1,\n      senderUid: await this.getUidByUin(uin1, groupUin),\n      receiverUin: uin2,\n      receiverUid: await this.getUidByUin(uin2, groupUin),\n      displayAction: content.templateParams.get('action_str') ?? content.templateParams.get('alt_str1') ?? '',\n      displaySuffix: content.templateParams.get('suffix_str') ?? '',\n      displayActionImgUrl: content.templateParams.get('action_img_url') ?? '',\n    }),\n  ];\n}\n\nfunction parseGroupEssenceMessageChange(msgContent: Buffer): BotEventEmission[] {\n  const wrapper = decodeGroupGeneral0x2DC(msgContent);\n  const content = wrapper.body.essenceMessageChange;\n  if (content === undefined) {\n    return [];\n  }\n\n  return [\n    emit('groupEssenceMessageChange', {\n      groupUin: content.groupUin,\n      messageSeq: content.msgSequence,\n      operatorUin: content.operatorUin,\n      isSet: content.setFlag === 1,\n    }),\n  ];\n}\n\nasync function parseGroupRecall(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const wrapper = decodeGroupGeneral0x2DC(msgContent);\n  const content = wrapper.body.recall;\n  if (content === undefined) {\n    return [];\n  }\n\n  const groupUin = wrapper.body.groupUin || wrapper.groupUin;\n  const operatorUin = await this.getUinByUid(content.operatorUid);\n  const recalls = await Promise.all(\n    content.recallMessages.map(async (recall) => {\n      const senderUin = await this.getUinByUid(recall.authorUid);\n      return emit('messageRecall', {\n        scene: 'group',\n        peerUin: groupUin,\n        messageSeq: recall.sequence,\n        senderUin,\n        senderUid: recall.authorUid,\n        operatorUin,\n        operatorUid: content.operatorUid,\n        displaySuffix: content.tipInfo?.tip ?? '',\n      });\n    }),\n  );\n  return recalls;\n}\n\nasync function parseGroupSubType16(this: Bot, msgContent: Buffer): Promise<BotEventEmission[]> {\n  const wrapper = decodeGroupGeneral0x2DC(msgContent);\n  return await match(wrapper.body.field13)\n    .returnType<Promise<BotEventEmission[]>>()\n    .with(35, async () => parseGroupReaction.call(this, wrapper))\n    .with(12, async () => parseGroupNameChange.call(this, wrapper))\n    .otherwise(async () => []);\n}\n\nasync function parseGroupReaction(\n  this: Bot,\n  wrapper: ReturnType<typeof decodeGroupGeneral0x2DC>,\n): Promise<BotEventEmission[]> {\n  const content = wrapper.body.reaction?.data?.data;\n  if (content?.target === undefined || content.data === undefined) {\n    return [];\n  }\n\n  const groupUin = wrapper.body.groupUin || wrapper.groupUin;\n  const operatorUin = await this.getUinByUid(content.data.operatorUid);\n  return [\n    emit('groupMessageReaction', {\n      groupUin,\n      userUin: operatorUin,\n      userUid: content.data.operatorUid,\n      messageSeq: content.target.sequence,\n      faceId: content.data.code,\n      type: content.data.reactionType,\n      isAdd: content.data.type === 1,\n    }),\n  ];\n}\n\nasync function parseGroupNameChange(\n  this: Bot,\n  wrapper: ReturnType<typeof decodeGroupGeneral0x2DC>,\n): Promise<BotEventEmission[]> {\n  if (wrapper.body.eventParam === undefined || wrapper.body.operatorUid === undefined) {\n    return [];\n  }\n\n  const groupUin = wrapper.body.groupUin || wrapper.groupUin;\n  return [\n    emit('groupNameChange', {\n      groupUin,\n      newGroupName: GroupNameChange.decode(wrapper.body.eventParam).name,\n      operatorUin: await this.getUinByUid(wrapper.body.operatorUid),\n      operatorUid: wrapper.body.operatorUid,\n    }),\n  ];\n}\n","import { Mutex } from 'async-mutex';\nimport mitt from 'mitt';\nimport { match } from 'ts-pattern';\nimport type { ZodType } from 'zod';\n\nimport {\n  type AppInfo,\n  createLogger,\n  ImageFormat,\n  type IncomingSsoPacket,\n  type LogEmitter,\n  type LogMessage,\n  MessageSendError,\n  type PacketClient,\n  type SelfInfo,\n  type Service,\n  ServiceError,\n  WebApiError,\n} from './common';\nimport {\n  BotEntityHolder,\n  type BotEssenceMessageResult,\n  type BotEvent,\n  type BotForwardedMessage,\n  BotFriend,\n  type BotFriendData,\n  type BotFriendRequest,\n  BotGroup,\n  type BotGroupAnnouncement,\n  type BotGroupData,\n  type BotGroupMember,\n  type BotGroupMemberData,\n  type BotGroupNotification,\n  type BotHistoryMessages,\n  type BotIncomingMessage,\n  type BotOutgoingMessageOptions,\n  type BotOutgoingMessageResult,\n  type BotOutgoingSegment,\n} from './entity';\nimport { FlashTransferClient } from './internal/flash-transfer';\nimport { HighwayClient } from './internal/highway';\nimport { GroupAvatarExtra } from './internal/proto/highway';\nimport { PushMsg } from './internal/proto/message/common';\nimport { FileId } from './internal/proto/misc';\nimport {\n  DeleteFriend,\n  FetchFilteredFriendRequests,\n  FetchNormalFriendRequests,\n  SendFriendNudge,\n  SendProfileLike,\n  SetFilteredFriendRequest,\n  SetNormalFriendRequest,\n} from './internal/service/friend';\nimport {\n  FetchGroupExtraInfo,\n  FetchGroupNotificationsFiltered,\n  FetchGroupNotificationsNormal,\n  KickMember,\n  QuitGroup,\n  SendGroupNudge,\n  SetGroupEssenceMessageSet,\n  SetGroupEssenceMessageUnset,\n  SetGroupMessageReactionAdd,\n  SetGroupMessageReactionRemove,\n  SetGroupName,\n  SetGroupRequestFiltered,\n  SetGroupRequestNormal,\n  SetGroupWholeMute,\n  SetMemberAdmin,\n  SetMemberCard,\n  SetMemberMute,\n  SetMemberTitle,\n} from './internal/service/group';\nimport { RichMediaDownload } from './internal/service/media';\nimport {\n  FetchFriendMessages,\n  FetchGroupMessages,\n  GetFriendLatestSequence,\n  RecallFriendMessage,\n  RecallGroupMessage,\n  RecvLongMsg,\n  SendFriendMessage,\n  SendGroupMessage,\n} from './internal/service/message';\nimport {\n  type BotFaceDetail,\n  FetchFaceDetails,\n  FetchFriendData,\n  FetchGroupData,\n  FetchGroupMemberData,\n  FetchHighwayInfo,\n  FetchUserInfoByUid,\n} from './internal/service/system';\nimport { TicketHolder } from './internal/ticket';\nimport {\n  GroupAnnounceImage,\n  GroupAnnounceResponse,\n  GroupAnnounceSendResponse,\n  GroupAnnounceUploadResponse,\n  GroupEssenceResponse,\n  parseGroupAnnouncement,\n  parseGroupEssenceMessage,\n  unescapeHttp,\n} from './internal/transform/group';\nimport { parseForwardedMessage, parseIncomingMessage } from './internal/transform/message/incoming';\nimport { encodeOutgoingMessage } from './internal/transform/message/outgoing';\nimport {\n  parseFilteredFriendRequest,\n  parseFriendRequest,\n  parseGroupNotification,\n} from './internal/transform/notification';\nimport { parsePushEvents } from './internal/transform/event';\n\nimport { createHash, randomInt } from 'node:crypto';\n\nexport class Bot<C extends PacketClient = PacketClient> {\n  private packetSeq: number;\n  private selfInfo: SelfInfo | undefined;\n  private highwayClient: HighwayClient | undefined;\n  private readonly flashTransferClient = new FlashTransferClient();\n  private readonly ticketHolder: TicketHolder;\n\n  private readonly friendHolder: BotEntityHolder<number, BotFriend, BotFriendData>;\n  private readonly groupHolder: BotEntityHolder<number, BotGroup, BotGroupData>;\n  private readonly idMapQueryMutex = new Mutex();\n  private readonly uin2uidMap = new Map<number, string>();\n  private readonly uid2uinMap = new Map<string, number>();\n  /** @hidden */\n  readonly faceDetailMap = new Map<string, BotFaceDetail>();\n\n  private readonly logBus: LogEmitter = mitt();\n  private readonly eventBus = mitt<{ [K in keyof BotEvent]: BotEvent[K] }>();\n  private readonly messageHandlerMap = new WeakMap<\n    (message: BotIncomingMessage) => void,\n    (event: BotEvent['messageReceive']) => void\n  >();\n  private readonly logger = createLogger(this.logBus, this.constructor.name);\n  private readonly pushHandler = (packet: IncomingSsoPacket) => {\n    void this.handlePush(packet);\n  };\n\n  get uin(): number {\n    if (!this.selfInfo) {\n      throw new Error('Bot is not initialized yet');\n    }\n    return this.selfInfo.uin;\n  }\n\n  get uid(): string {\n    if (!this.selfInfo) {\n      throw new Error('Bot is not initialized yet');\n    }\n    return this.selfInfo.uid;\n  }\n\n  get isInitialized(): boolean {\n    return this.selfInfo !== undefined;\n  }\n\n  constructor(\n    readonly appinfo: AppInfo,\n    readonly client: C,\n  ) {\n    this.packetSeq = randomInt(10000, 100000);\n    this.ticketHolder = new TicketHolder(this);\n\n    this.friendHolder = new BotEntityHolder(\n      this,\n      async (currentBot) => {\n        const friends = await currentBot.fetchFriendData();\n        return new Map(friends.map((friend) => [friend.uin, friend]));\n      },\n      (currentBot, data) => new BotFriend(currentBot, data),\n    );\n\n    this.groupHolder = new BotEntityHolder(\n      this,\n      async (currentBot) => {\n        const groups = await currentBot.fetchGroupData();\n        return new Map(groups.map((group) => [group.uin, group]));\n      },\n      (currentBot, data) => new BotGroup(currentBot, data),\n    );\n  }\n\n  async initialize(): Promise<void> {\n    this.selfInfo = await this.client.getSelfInfo();\n    this.client.onPush(this.pushHandler);\n\n    await this.ticketHolder.getSKey();\n    await Promise.all([this.friendHolder.update(), this.groupHolder.update()]);\n\n    const faceDetails = await this.callService(FetchFaceDetails);\n    this.faceDetailMap.clear();\n    for (const detail of faceDetails) {\n      this.faceDetailMap.set(detail.qSid, detail);\n    }\n\n    const info = await this.callService(FetchHighwayInfo);\n    const serverInfo = info.servers.get(1);\n    if (serverInfo === undefined || serverInfo.length === 0) {\n      throw new Error('No available highway server');\n    }\n    this.highwayClient = new HighwayClient(this.selfInfo.uin, serverInfo[0].host, serverInfo[0].port, info.sigSession);\n    this.logger.info(`Highway 初始化完成, host=${serverInfo[0].host}, port=${serverInfo[0].port}`);\n\n    this.logger.info(`初始化完成, uin=${this.selfInfo.uin}, uid=${this.selfInfo.uid}`);\n  }\n\n  async fetchFriendData(): Promise<BotFriendData[]> {\n    let nextUin: number | undefined;\n    const dataList: BotFriendData[] = [];\n    do {\n      const response = await this.callService(FetchFriendData, nextUin);\n      dataList.push(...response.dataList);\n      nextUin = response.nextUin;\n    } while (nextUin);\n    this.updateUinUidCache(dataList);\n    return dataList;\n  }\n\n  async fetchGroupData(): Promise<BotGroupData[]> {\n    return this.callService(FetchGroupData);\n  }\n\n  async fetchGroupMemberData(groupUin: number): Promise<BotGroupMemberData[]> {\n    let cookie: Buffer | undefined;\n    const dataList: BotGroupMemberData[] = [];\n    do {\n      const response = await this.callService(FetchGroupMemberData, groupUin, cookie);\n      dataList.push(...response.dataList);\n      cookie = response.cookie && response.cookie.length > 0 ? response.cookie : undefined;\n    } while (cookie !== undefined);\n    this.updateUinUidCache(dataList);\n    return dataList;\n  }\n\n  async getFriends(forceUpdate = false): Promise<BotFriend[]> {\n    return Array.from(await this.friendHolder.getAll(forceUpdate));\n  }\n\n  async getFriend(uin: number, forceUpdate = false): Promise<BotFriend | undefined> {\n    return this.friendHolder.get(uin, forceUpdate);\n  }\n\n  async getGroups(forceUpdate = false): Promise<BotGroup[]> {\n    return Array.from(await this.groupHolder.getAll(forceUpdate));\n  }\n\n  async getGroup(uin: number, forceUpdate = false): Promise<BotGroup | undefined> {\n    return this.groupHolder.get(uin, forceUpdate);\n  }\n\n  async getGroupMembers(groupUin: number, forceUpdate = false): Promise<BotGroupMember[] | undefined> {\n    const group = await this.getGroup(groupUin, forceUpdate);\n    return group?.getMembers(forceUpdate);\n  }\n\n  async getGroupMember(groupUin: number, memberUin: number, forceUpdate = false): Promise<BotGroupMember | undefined> {\n    const group = await this.getGroup(groupUin, forceUpdate);\n    return group?.getMember(memberUin, forceUpdate);\n  }\n\n  async getUinByUid(uid: string): Promise<number> {\n    const cachedUin = this.uid2uinMap.get(uid);\n    if (cachedUin !== undefined) {\n      return cachedUin;\n    }\n\n    return this.idMapQueryMutex.runExclusive(async () => {\n      const refreshedUin = this.uid2uinMap.get(uid);\n      if (refreshedUin !== undefined) {\n        return refreshedUin;\n      }\n\n      const userInfo = await this.callService(FetchUserInfoByUid, uid);\n      this.updateUinUidCache([{ uin: userInfo.uin, uid }]);\n      return userInfo.uin;\n    });\n  }\n\n  async getUidByUin(uin: number, mayComeFromGroupUin?: number): Promise<string> {\n    const cachedUid = this.uin2uidMap.get(uin);\n    if (cachedUid !== undefined) {\n      return cachedUid;\n    }\n\n    return this.idMapQueryMutex.runExclusive(async () => {\n      const refreshedUid = this.uin2uidMap.get(uin);\n      if (refreshedUid !== undefined) {\n        return refreshedUid;\n      }\n\n      if (mayComeFromGroupUin !== undefined) {\n        await this.fetchGroupMemberData(mayComeFromGroupUin);\n      } else {\n        await this.fetchFriendData();\n      }\n\n      const resolvedUid = this.uin2uidMap.get(uin);\n      if (resolvedUid === undefined) {\n        throw new Error(`Cannot resolve uid for uin ${uin}`);\n      }\n\n      return resolvedUid;\n    });\n  }\n\n  getCachedUinByUid(uid: string): number | undefined {\n    return this.uid2uinMap.get(uid);\n  }\n\n  getCachedUidByUin(uin: number): string | undefined {\n    return this.uin2uidMap.get(uin);\n  }\n\n  async getSKey(): Promise<string> {\n    return this.ticketHolder.getSKey();\n  }\n\n  async getPSKey(domain: string): Promise<string> {\n    return this.ticketHolder.getPSKey(domain);\n  }\n\n  async getCookies(domain: string): Promise<Record<string, string>> {\n    return {\n      p_uin: `o${this.uin}`,\n      p_skey: await this.getPSKey(domain),\n      skey: await this.getSKey(),\n      uin: String(this.uin),\n    };\n  }\n\n  async getCsrfToken(): Promise<number> {\n    return this.ticketHolder.getCsrfToken();\n  }\n\n  async sendFriendMessage(\n    friendUin: number,\n    segments: BotOutgoingSegment[],\n    options: BotOutgoingMessageOptions = {},\n  ): Promise<BotOutgoingMessageResult> {\n    const clientSequence = options.clientSequence ?? randomInt(1, 0x7fffffff);\n    const random = options.random ?? randomInt(1, 0x7fffffff);\n    const friendUid = await this.getUidByUin(friendUin);\n    const elems = await encodeOutgoingMessage.call(this, 'friend', friendUin, friendUid, segments);\n    const response = await this.callService(SendFriendMessage, friendUin, friendUid, elems, clientSequence, random);\n    if (response.result !== 0) {\n      throw new MessageSendError(response.result, response.errMsg);\n    }\n    return {\n      sequence: response.sequence,\n      sendTime: response.sendTime,\n    };\n  }\n\n  async sendGroupMessage(\n    groupUin: number,\n    segments: BotOutgoingSegment[],\n    options: BotOutgoingMessageOptions = {},\n  ): Promise<BotOutgoingMessageResult> {\n    const clientSequence = options.clientSequence ?? randomInt(1, 0x7fffffff);\n    const random = options.random ?? randomInt(1, 0x7fffffff);\n    const elems = await encodeOutgoingMessage.call(this, 'group', groupUin, String(groupUin), segments);\n    const response = await this.callService(SendGroupMessage, groupUin, elems, clientSequence, random);\n    if (response.result !== 0) {\n      throw new MessageSendError(response.result, response.errMsg);\n    }\n    return {\n      sequence: response.sequence,\n      sendTime: response.sendTime,\n    };\n  }\n\n  async recallFriendMessage(friendUin: number, sequence: number): Promise<void> {\n    const friendUid = await this.getUidByUin(friendUin);\n    const raw = (await this.callService(FetchFriendMessages, friendUid, sequence, sequence))[0];\n    if (raw === undefined) {\n      throw new Error('Message not found');\n    }\n\n    await this.callService(\n      RecallFriendMessage,\n      friendUid,\n      raw.contentHead.sequence,\n      sequence,\n      raw.contentHead.random,\n      raw.contentHead.time,\n    );\n  }\n\n  async recallGroupMessage(groupUin: number, sequence: number): Promise<void> {\n    await this.callService(RecallGroupMessage, groupUin, sequence);\n  }\n\n  async getFriendHistoryMessages(\n    friendUin: number,\n    limit: number,\n    startSequence?: number,\n  ): Promise<BotHistoryMessages> {\n    if (limit < 1 || limit > 30) {\n      throw new Error('limit must be between 1 and 30');\n    }\n\n    const friendUid = await this.getUidByUin(friendUin);\n    const endSequence = startSequence ?? (await this.callService(GetFriendLatestSequence, friendUid));\n    const start = Math.max(endSequence - limit + 1, 1);\n    const rawMessages = await this.callService(FetchFriendMessages, friendUid, start, endSequence);\n    const messages = rawMessages\n      .map((message) => parseIncomingMessage(message, this.uin))\n      .filter((message) => message !== undefined);\n\n    return {\n      messages,\n      nextStartSequence: start > 1 ? start - 1 : undefined,\n    };\n  }\n\n  async getGroupHistoryMessages(groupUin: number, limit: number, startSequence?: number): Promise<BotHistoryMessages> {\n    if (limit < 1 || limit > 30) {\n      throw new Error('limit must be between 1 and 30');\n    }\n\n    const endSequence = startSequence ?? (await this.callService(FetchGroupExtraInfo, groupUin)).latestMessageSeq;\n    const start = Math.max(endSequence - limit + 1, 1);\n    const rawMessages = await this.callService(FetchGroupMessages, groupUin, start, endSequence);\n    const messages = rawMessages\n      .map((message) => parseIncomingMessage(message, this.uin))\n      .filter((message) => message !== undefined);\n\n    return {\n      messages,\n      nextStartSequence: start > 1 ? start - 1 : undefined,\n    };\n  }\n\n  async getForwardedMessages(resId: string): Promise<BotForwardedMessage[]> {\n    const rawMessages = await this.callService(RecvLongMsg, resId);\n    return rawMessages.map((message) => parseForwardedMessage(message)).filter((message) => message !== undefined);\n  }\n\n  async getDownloadUrl(resourceId: string): Promise<string> {\n    if (resourceId.startsWith('http://') || resourceId.startsWith('https://')) {\n      return resourceId;\n    }\n\n    const normalizedBase64 = resourceId\n      .replaceAll('-', '+')\n      .replaceAll('_', '/')\n      .padEnd(Math.ceil(resourceId.length / 4) * 4, '=');\n    const fileId = FileId.decode(Buffer.from(normalizedBase64, 'base64'));\n    const indexNode = {\n      fileUuid: resourceId,\n      storeId: fileId.storeId,\n      ttl: fileId.ttl,\n    };\n\n    return match(fileId.appId)\n      .with(1402, () => this.callService(RichMediaDownload.PrivateRecord, indexNode))\n      .with(1403, () => this.callService(RichMediaDownload.GroupRecord, indexNode))\n      .with(1406, () => this.callService(RichMediaDownload.PrivateImage, indexNode))\n      .with(1407, () => this.callService(RichMediaDownload.GroupImage, indexNode))\n      .with(1413, () => this.callService(RichMediaDownload.PrivateVideo, indexNode))\n      .with(1415, () => this.callService(RichMediaDownload.GroupVideo, indexNode))\n      .otherwise(() => {\n        throw new Error(`Unsupported resource type ${fileId.appId}`);\n      });\n  }\n\n  async sendFriendNudge(friendUin: number, isSelf = false): Promise<void> {\n    const selfUin = Number((await this.client.getSelfInfo()).uin);\n    await this.callService(SendFriendNudge, friendUin, isSelf ? selfUin : friendUin);\n  }\n\n  async sendProfileLike(friendUin: number, count = 1): Promise<void> {\n    await this.callService(SendProfileLike, await this.getUidByUin(friendUin), count);\n  }\n\n  async deleteFriend(friendUin: number, block = false): Promise<void> {\n    await this.callService(DeleteFriend, await this.getUidByUin(friendUin), block);\n  }\n\n  async getFriendRequests(isFiltered = false, limit = 20): Promise<BotFriendRequest[]> {\n    if (isFiltered) {\n      const requests = await this.callService(FetchFilteredFriendRequests, limit);\n      const parsed: Array<BotFriendRequest | undefined> = await Promise.all(\n        requests.map(async (request) => {\n          try {\n            return await parseFilteredFriendRequest.call(this, request);\n          } catch {\n            return undefined;\n          }\n        }),\n      );\n      return parsed.filter((request) => request !== undefined);\n    }\n\n    const requests = await this.callService(FetchNormalFriendRequests, (await this.client.getSelfInfo()).uid, limit);\n    const parsed: Array<BotFriendRequest | undefined> = await Promise.all(\n      requests.map(async (request) => {\n        try {\n          return await parseFriendRequest.call(this, request);\n        } catch {\n          return undefined;\n        }\n      }),\n    );\n    return parsed.filter((request): request is BotFriendRequest => request !== undefined);\n  }\n\n  async setFriendRequest(initiatorUid: string, accept: boolean, isFiltered = false): Promise<void> {\n    if (isFiltered) {\n      if (accept) {\n        await this.callService(SetFilteredFriendRequest, (await this.client.getSelfInfo()).uid, initiatorUid);\n      }\n      return;\n    }\n\n    await this.callService(SetNormalFriendRequest, initiatorUid, accept);\n  }\n\n  async setGroupName(groupUin: number, groupName: string): Promise<void> {\n    await this.callService(SetGroupName, groupUin, groupName);\n  }\n\n  async setGroupAvatar(groupUin: number, imageData: Buffer): Promise<void> {\n    await this.uploadHighway(\n      3000,\n      imageData,\n      createHash('md5').update(imageData).digest(),\n      GroupAvatarExtra.encode({\n        type: 101,\n        groupUin,\n        field3: {\n          field1: 1,\n        },\n        field5: 3,\n        field6: 1,\n      }),\n    );\n  }\n\n  async setGroupMemberCard(groupUin: number, memberUin: number, card: string): Promise<void> {\n    await this.callService(SetMemberCard, groupUin, await this.getUidByUin(memberUin, groupUin), card);\n  }\n\n  async setGroupMemberSpecialTitle(groupUin: number, memberUin: number, specialTitle: string): Promise<void> {\n    if (Buffer.byteLength(specialTitle) > 18) {\n      throw new Error('Special title cannot exceed 18 bytes');\n    }\n    await this.callService(SetMemberTitle, groupUin, await this.getUidByUin(memberUin, groupUin), specialTitle);\n  }\n\n  async setGroupMemberAdmin(groupUin: number, memberUin: number, isAdmin: boolean): Promise<void> {\n    await this.callService(SetMemberAdmin, groupUin, await this.getUidByUin(memberUin, groupUin), isAdmin);\n  }\n\n  async setGroupMemberMute(groupUin: number, memberUin: number, duration: number): Promise<void> {\n    await this.callService(SetMemberMute, groupUin, await this.getUidByUin(memberUin, groupUin), duration);\n  }\n\n  async setGroupWholeMute(groupUin: number, isMute: boolean): Promise<void> {\n    await this.callService(SetGroupWholeMute, groupUin, isMute);\n  }\n\n  async kickGroupMember(groupUin: number, memberUin: number, rejectAddRequest = false, reason = ''): Promise<void> {\n    await this.callService(KickMember, groupUin, await this.getUidByUin(memberUin, groupUin), rejectAddRequest, reason);\n  }\n\n  async quitGroup(groupUin: number): Promise<void> {\n    await this.callService(QuitGroup, groupUin);\n  }\n\n  async setGroupMessageReaction(\n    groupUin: number,\n    sequence: number,\n    code: string,\n    type = 1,\n    isAdd = true,\n  ): Promise<void> {\n    await this.callService(\n      isAdd ? SetGroupMessageReactionAdd : SetGroupMessageReactionRemove,\n      groupUin,\n      sequence,\n      code,\n      type,\n    );\n  }\n\n  async sendGroupNudge(groupUin: number, targetUin: number): Promise<void> {\n    await this.callService(SendGroupNudge, groupUin, targetUin);\n  }\n\n  async getGroupAnnouncements(groupUin: number): Promise<BotGroupAnnouncement[]> {\n    const url = new URL('https://web.qun.qq.com/cgi-bin/announce/get_t_list');\n    url.searchParams.set('qid', String(groupUin));\n    url.searchParams.set('ft', '23');\n    url.searchParams.set('ni', '1');\n    url.searchParams.set('i', '1');\n    url.searchParams.set('log_read', '1');\n    url.searchParams.set('platform', '1');\n    url.searchParams.set('s', '-1');\n    url.searchParams.set('n', '20');\n\n    const response = await this.fetchWebJson(url, 'qun.qq.com', '获取群公告失败', GroupAnnounceResponse);\n    return [...response.feeds, ...response.inst].map((feed) => parseGroupAnnouncement(groupUin, feed));\n  }\n\n  async sendGroupAnnouncement(\n    groupUin: number,\n    content: string,\n    options: {\n      imageData?: Buffer;\n      imageFormat?: ImageFormat;\n      showEditCard?: boolean;\n      showTipWindow?: boolean;\n      confirmRequired?: boolean;\n      isPinned?: boolean;\n    } = {},\n  ): Promise<string> {\n    let announceImage: GroupAnnounceImage | undefined;\n    if (options.imageData !== undefined) {\n      if (options.imageFormat === undefined) {\n        throw new Error('imageFormat is required when imageData is provided');\n      }\n      announceImage = await this.uploadGroupAnnouncementImage(options.imageData, options.imageFormat);\n    }\n    const bkn = await this.getCsrfToken();\n    const body = new URLSearchParams({\n      qid: String(groupUin),\n      bkn: String(bkn),\n      text: content,\n      pinned: options.isPinned === true ? '1' : '0',\n      type: '1',\n      settings: JSON.stringify({\n        is_show_edit_card: options.showEditCard === true ? 1 : 0,\n        tip_window_type: options.showTipWindow === false ? 0 : 1,\n        confirm_required: options.confirmRequired === false ? 0 : 1,\n      }),\n    });\n    if (announceImage !== undefined) {\n      body.set('pic', announceImage.id ?? '');\n      body.set('imgWidth', announceImage.w ?? '');\n      body.set('imgHeight', announceImage.h ?? '');\n    }\n\n    const response = await this.fetchWebJson(\n      new URL('https://web.qun.qq.com/cgi-bin/announce/add_qun_notice'),\n      'qun.qq.com',\n      '发送群公告失败',\n      GroupAnnounceSendResponse,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n          'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; PCRT00 Build/N2G48H)',\n        },\n        body,\n      },\n    );\n    return response.new_fid;\n  }\n\n  async deleteGroupAnnouncement(groupUin: number, announcementId: string): Promise<void> {\n    const url = new URL('https://web.qun.qq.com/cgi-bin/announce/del_feed');\n    url.searchParams.set('fid', announcementId);\n    url.searchParams.set('qid', String(groupUin));\n    url.searchParams.set('ft', '23');\n    url.searchParams.set('op', '1');\n    await this.fetchWeb(url, 'qun.qq.com', '删除群公告失败');\n  }\n\n  async getGroupEssenceMessages(\n    groupUin: number,\n    pageIndex: number,\n    pageSize: number,\n  ): Promise<BotEssenceMessageResult> {\n    const url = new URL('https://qun.qq.com/cgi-bin/group_digest/digest_list');\n    url.searchParams.set('random', '7800');\n    url.searchParams.set('X-CROSS-ORIGIN', 'fetch');\n    url.searchParams.set('group_code', String(groupUin));\n    url.searchParams.set('page_start', String(pageIndex));\n    url.searchParams.set('page_limit', String(pageSize));\n    const response = await this.fetchWebJson(url, 'qun.qq.com', '获取群精华消息失败', GroupEssenceResponse);\n\n    return {\n      messages: (response.data.msg_list ?? [])\n        .map((item) => parseGroupEssenceMessage(groupUin, item))\n        .filter((message) => message !== undefined),\n      isEnd: response.data.is_end,\n    };\n  }\n\n  async setGroupEssenceMessage(groupUin: number, sequence: number, isSet: boolean): Promise<void> {\n    const random = (await this.getGroupHistoryMessages(groupUin, 1, sequence)).messages[0]?.random;\n    if (random === undefined) {\n      throw new Error('Message not found, cannot resolve random field');\n    }\n    await this.callService(isSet ? SetGroupEssenceMessageSet : SetGroupEssenceMessageUnset, groupUin, sequence, random);\n  }\n\n  async getGroupNotifications(\n    startSequence: number | undefined = undefined,\n    isFiltered = false,\n    count = 20,\n  ): Promise<{ notifications: BotGroupNotification[]; nextSequence?: number }> {\n    const response = await this.callService(\n      isFiltered ? FetchGroupNotificationsFiltered : FetchGroupNotificationsNormal,\n      startSequence ?? 0,\n      count,\n    );\n    const parsed = await Promise.all(\n      response.notifications.map(async (notification) => {\n        try {\n          return await parseGroupNotification.call(this, notification, isFiltered);\n        } catch {\n          return undefined;\n        }\n      }),\n    );\n    return {\n      notifications: parsed.filter((notification) => notification !== undefined),\n      nextSequence: response.nextSequence || undefined,\n    };\n  }\n\n  async setGroupRequest(\n    groupUin: number,\n    sequence: number,\n    eventType: number,\n    accept: boolean,\n    isFiltered = false,\n    reason = '',\n  ): Promise<void> {\n    await this.callService(\n      isFiltered ? SetGroupRequestFiltered : SetGroupRequestNormal,\n      groupUin,\n      sequence,\n      eventType,\n      accept ? 1 : 2,\n      reason,\n    );\n  }\n\n  async setGroupInvitation(groupUin: number, invitationSeq: number, accept: boolean): Promise<void> {\n    await this.callService(SetGroupRequestNormal, groupUin, invitationSeq, 2, accept ? 1 : 2, '');\n  }\n\n  createLogger(module: string) {\n    return createLogger(this.logBus, module);\n  }\n\n  onEvent<K extends keyof BotEvent>(type: K, handler: (event: BotEvent[K]) => void): void {\n    this.eventBus.on(type, handler);\n  }\n\n  offEvent<K extends keyof BotEvent>(type: K, handler: (event: BotEvent[K]) => void): void {\n    this.eventBus.off(type, handler);\n  }\n\n  onMessage(handler: (message: BotIncomingMessage) => void): void {\n    const existingHandler = this.messageHandlerMap.get(handler);\n    if (existingHandler !== undefined) {\n      this.eventBus.off('messageReceive', existingHandler);\n    }\n\n    const eventHandler = (event: BotEvent['messageReceive']) => {\n      handler(event.message);\n    };\n    this.messageHandlerMap.set(handler, eventHandler);\n    this.eventBus.on('messageReceive', eventHandler);\n  }\n\n  offMessage(handler: (message: BotIncomingMessage) => void): void {\n    const eventHandler = this.messageHandlerMap.get(handler);\n    if (eventHandler === undefined) {\n      return;\n    }\n\n    this.eventBus.off('messageReceive', eventHandler);\n    this.messageHandlerMap.delete(handler);\n  }\n\n  onLog(handler: (logMessage: LogMessage) => void) {\n    this.logBus.on('log', handler);\n  }\n\n  offLog(handler: (logMessage: LogMessage) => void) {\n    this.logBus.off('log', handler);\n  }\n\n  /** @hidden */\n  async callService<T extends Array<unknown>, R>(service: Service<T, R, C>, ...args: T): Promise<R> {\n    const seq = this.packetSeq++;\n    this.logger.trace(`发送 SSO 数据包 ${service.command}, seq=${seq}`);\n    const payload = service.build(this, ...args);\n    const responsePacket = await this.client.send({\n      command: service.command,\n      sequence: seq,\n      payload: payload,\n      overrides: service.overrides,\n    });\n    if (responsePacket.retcode !== 0) {\n      throw new ServiceError(service.command, responsePacket.retcode, responsePacket.extra);\n    }\n    if (service.parse) {\n      return service.parse(this, responsePacket.payload);\n    } else {\n      return undefined as R;\n    }\n  }\n\n  /** @hidden */\n  async uploadHighway(commandId: number, data: Buffer, fileMd5: Buffer, extendInfo: Buffer): Promise<void> {\n    if (this.highwayClient === undefined) {\n      throw new Error('Highway client is not initialized yet');\n    }\n    await this.highwayClient.upload({ commandId, data, fileMd5, extendInfo });\n  }\n\n  /** @hidden */\n  async uploadFlashTransfer(uKey: string, appId: number, data: Buffer): Promise<boolean> {\n    return this.flashTransferClient.uploadFile({ uKey, appId, data });\n  }\n\n  private async uploadGroupAnnouncementImage(imageData: Buffer, imageFormat: ImageFormat): Promise<GroupAnnounceImage> {\n    const contentType = match(imageFormat)\n      .with(ImageFormat.PNG, () => 'image/png')\n      .with(ImageFormat.JPEG, () => 'image/jpeg')\n      .otherwise(() => {\n        throw new Error('Group announcement image only supports PNG and JPEG');\n      });\n    const extension = imageFormat === ImageFormat.PNG ? 'png' : 'jpg';\n    const body = new FormData();\n    body.set('bkn', String(await this.getCsrfToken()));\n    body.set('source', 'troopNotice');\n    body.set('m', '0');\n    body.set('pic_up', new Blob([imageData], { type: contentType }), `group-announcement.${extension}`);\n\n    const response = await this.fetchWebJson(\n      new URL('https://web.qun.qq.com/cgi-bin/announce/upload_img'),\n      'qun.qq.com',\n      '上传群公告图片失败',\n      GroupAnnounceUploadResponse,\n      {\n        method: 'POST',\n        body,\n      },\n    );\n    if (response.ec !== 0) {\n      throw new WebApiError('上传群公告图片失败', response.ec);\n    }\n    return GroupAnnounceImage.parse(JSON.parse(unescapeHttp(response.id)));\n  }\n\n  private async fetchWebJson<T>(\n    url: URL,\n    cookieDomain: string,\n    errorMessage: string,\n    schema: ZodType<T>,\n    init: RequestInit = {},\n  ): Promise<T> {\n    const response = await this.fetchWeb(url, cookieDomain, errorMessage, init);\n    return schema.parse(await response.json());\n  }\n\n  private async fetchWeb(\n    url: URL,\n    cookieDomain: string,\n    errorMessage: string,\n    init: RequestInit = {},\n  ): Promise<Response> {\n    url.searchParams.set('bkn', String(await this.getCsrfToken()));\n    const cookies = await this.getCookies(cookieDomain);\n    const headers = new Headers(init.headers);\n    headers.set(\n      'Cookie',\n      Object.entries(cookies)\n        .map(([key, value]) => `${key}=${value}`)\n        .join('; '),\n    );\n    const response = await fetch(url, { ...init, headers });\n    if (!response.ok) {\n      throw new WebApiError(errorMessage, response.status);\n    }\n    return response;\n  }\n\n  private async handlePush(packet: IncomingSsoPacket): Promise<void> {\n    if (packet.command !== 'trpc.msg.olpush.OlPushService.MsgPush') {\n      return;\n    }\n    try {\n      const events = await parsePushEvents.call(this, PushMsg.decode(packet.payload).message);\n      for (const event of events) {\n        this.eventBus.emit(event.type, event.payload);\n        if (event.type === 'messageReceive' && event.payload.message.scene === 'group') {\n          void this.refreshGroupMemberExtraInfo(event.payload.message);\n        }\n      }\n    } catch (error) {\n      this.logger.warn(`处理消息推送失败, command=${packet.command}`, error);\n    }\n  }\n\n  private async refreshGroupMemberExtraInfo(message: BotIncomingMessage): Promise<void> {\n    try {\n      if (message.extraInfo === undefined) {\n        return;\n      }\n      const group = await this.getGroup(message.peerUin);\n      const member = await group?.getMember(message.senderUin);\n      member?.updateBinding({\n        ...member.data,\n        ...message.extraInfo,\n      });\n    } catch (error) {\n      this.logger.trace('刷新群成员消息元信息失败', error);\n    }\n  }\n\n  private updateUinUidCache(entries: Iterable<{ uin: number; uid: string }>) {\n    for (const entry of entries) {\n      this.uin2uidMap.set(entry.uin, entry.uid);\n      this.uid2uinMap.set(entry.uid, entry.uin);\n    }\n  }\n}\n\nexport * from './common';\nexport * from './entity';\n"],"mappings":"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"}