diff --git a/package.json b/package.json index 9b1837b..185817b 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "deploy-win": "cmd /c \"xcopy /C /S /Y dist\\* %LITELOADERQQNT_PROFILE%\\plugins\\LLOneBot\\\"", "format": "prettier -cw .", "check": "tsc", - "compile:proto": "pbjs --no-create --no-convert --no-delimited --no-verify -t static-module -w es6 -p src/ntqqapi/proto -o src/ntqqapi/proto/compiled.js profileLikeTip.proto groupNotify.proto message.proto richMedia.proto && pbts -o src/ntqqapi/proto/compiled.d.ts src/ntqqapi/proto/compiled.js" + "compile:proto": "pbjs --no-create --no-convert --no-delimited --no-verify -t static-module -w es6 -p src/ntqqapi/proto -o src/ntqqapi/proto/compiled.js profileLikeTip.proto groupNotify.proto message.proto richMedia.proto oidb.proto && pbts -o src/ntqqapi/proto/compiled.d.ts src/ntqqapi/proto/compiled.js" }, "author": "", "license": "MIT", @@ -42,7 +42,7 @@ "electron-vite": "^2.3.0", "protobufjs-cli": "^1.1.3", "typescript": "^5.6.3", - "vite": "^5.4.10", + "vite": "^5.4.11", "vite-plugin-cp": "^4.0.8" }, "packageManager": "yarn@4.5.1" diff --git a/src/common/utils/misc.ts b/src/common/utils/misc.ts index 3649051..0884802 100644 --- a/src/common/utils/misc.ts +++ b/src/common/utils/misc.ts @@ -17,6 +17,11 @@ export function getBuildVersion(): number { return +globalThis.LiteLoader.package.qqnt.buildVersion } +/** QQ Full Version */ +export function getFullVersion(): string { + return globalThis.LiteLoader.versions.qqnt +} + /** 在保证老对象已有的属性不变化的情况下将新对象的属性复制到老对象 */ export function mergeNewProperties(newObj: Dict, oldObj: Dict) { Object.keys(newObj).forEach((key) => { diff --git a/src/ntqqapi/api/msg.ts b/src/ntqqapi/api/msg.ts index fa04a68..a45325e 100644 --- a/src/ntqqapi/api/msg.ts +++ b/src/ntqqapi/api/msg.ts @@ -284,4 +284,8 @@ export class NTQQMsgApi extends Service { async fetchUnitedCommendConfig(groups: string[]) { return await invoke('nodeIKernelUnitedConfigService/fetchUnitedCommendConfig', [{ groups }]) } + + async sendSsoCmdReqByContend(ssoCmd: string, content: string) { + return await invoke('nodeIKernelMsgService/sendSsoCmdReqByContend', [{ ssoCmd, content }]) + } } diff --git a/src/ntqqapi/helper/offset.json b/src/ntqqapi/helper/offset.json new file mode 100644 index 0000000..ea4aaeb --- /dev/null +++ b/src/ntqqapi/helper/offset.json @@ -0,0 +1,86 @@ +{ + "3.2.12-28418-x64": { + "recv": "A0723E0", + "send": "A06EAE0" + }, + "9.9.15-28418-x64": { + "recv": "37A9004", + "send": "37A4BD0" + }, + "6.9.56-28418-x64": { + "send": "4471360", + "recv": "4473BCC" + }, + "6.9.56-28418-arm64": { + "send": "3FBDBF8", + "recv": "3FC0410" + }, + "9.9.15-28498-x64": { + "recv": "37A9004", + "send": "37A4BD0" + }, + "9.9.16-28788-x64": { + "send": "38076D0", + "recv": "380BB04" + }, + "3.2.13-28788-x64": { + "send": "A0CEC20", + "recv": "A0D2520" + }, + "3.2.13-28788-arm64": { + "send": "6E91018", + "recv": "6E94850" + }, + "9.9.16-28971-x64": { + "send": "38079F0", + "recv": "380BE24" + }, + "3.2.13-28971-x64": { + "send": "A0CEF60", + "recv": "A0D2860" + }, + "3.2.12-28971-arm64": { + "send": "6E91318", + "recv": "6E94B50" + }, + "6.9.58-28971-x64": { + "send": "449ACA0", + "recv": "449D50C" + }, + "6.9.58-28971-arm64": { + "send": "3FE0DB0", + "recv": "3FE35C8" + }, + "9.9.16-29271-x64": { + "send": "3833510", + "recv": "3837944" + }, + "3.2.13-29271-x64": { + "send": "A11E680", + "recv": "A121F80" + }, + "3.2.13-29271-arm64": { + "send": "6ECA098", + "recv": "6ECD8D0" + }, + "9.9.16-29456-x64": { + "send": "3835CD0", + "recv": "383A104" + }, + "3.2.13-29456-x64": { + "send": "A11E820", + "recv": "A122120" + }, + "3.2.13-29456-arm64": { + "send": "6ECA130", + "recv": "6ECD968" + }, + "6.9.59-29456-x64": { + "send": "44C57A0", + "recv": "44C800C" + }, + "6.9.59-29456-arm64": { + "send": "4005FE8", + "recv": "4008800" + } +} diff --git a/src/ntqqapi/native/moehoo/external/MoeHoo.darwin.arm64.node b/src/ntqqapi/native/moehoo/external/MoeHoo.darwin.arm64.node new file mode 100644 index 0000000..829749c Binary files /dev/null and b/src/ntqqapi/native/moehoo/external/MoeHoo.darwin.arm64.node differ diff --git a/src/ntqqapi/native/moehoo/external/MoeHoo.linux.arm64.node b/src/ntqqapi/native/moehoo/external/MoeHoo.linux.arm64.node new file mode 100644 index 0000000..73d9a01 Binary files /dev/null and b/src/ntqqapi/native/moehoo/external/MoeHoo.linux.arm64.node differ diff --git a/src/ntqqapi/native/moehoo/external/MoeHoo.linux.x64.node b/src/ntqqapi/native/moehoo/external/MoeHoo.linux.x64.node new file mode 100644 index 0000000..70ca668 Binary files /dev/null and b/src/ntqqapi/native/moehoo/external/MoeHoo.linux.x64.node differ diff --git a/src/ntqqapi/native/moehoo/external/MoeHoo.win32.x64.node b/src/ntqqapi/native/moehoo/external/MoeHoo.win32.x64.node new file mode 100644 index 0000000..ab1701c Binary files /dev/null and b/src/ntqqapi/native/moehoo/external/MoeHoo.win32.x64.node differ diff --git a/src/ntqqapi/native/moehoo/index.ts b/src/ntqqapi/native/moehoo/index.ts new file mode 100644 index 0000000..ccb1f6d --- /dev/null +++ b/src/ntqqapi/native/moehoo/index.ts @@ -0,0 +1,138 @@ +import { Context } from 'cordis' +import { arch } from 'node:os' +import { getFullVersion, getBuildVersion } from '@/common/utils/misc' +import { selfInfo, TEMP_DIR } from '@/common/globalVars' +import { Dict } from 'cosmokit' +import { copyFile } from 'node:fs/promises' +import { createHash } from 'node:crypto' +import { Oidb } from '@/ntqqapi/proto/compiled' +import path from 'node:path' +import offset from '@/ntqqapi/helper/offset.json' + +interface Offset { + [key: string]: { + recv: string + send: string + } +} + +export class Native { + available = false + moehoo?: Dict + + constructor(private ctx: Context) { + ctx.on('ready', async () => { + this.init() + }) + } + + private async init() { + const key = getFullVersion() + '-' + arch() + const currOffset = (offset as Offset)[key] + if (!currOffset) { + return + } + const platform = process.platform + '.' + process.arch + try { + const fileName = 'MoeHoo.' + platform + '.node' + const src = path.join(__dirname, 'Moehoo', fileName) + const dest = path.join(TEMP_DIR, fileName) + try { + await copyFile(src, dest) + } catch (e) { + // resource busy or locked? + this.ctx.logger.warn(e) + } + this.moehoo = require(dest) + this.moehoo!.InitHook(currOffset.send, currOffset.recv, () => { + }) + this.available = true + } catch (e) { + this.ctx.logger.warn('moehoo 加载失败', e) + } + } + + private async sendPacket(cmd: string, data: string) { + const traceId = `${Date.now()}${data}`.slice(0, data.length / 2) + const traceIdMd5 = createHash('md5').update(traceId).digest('hex') + this.moehoo!.SendPacket(cmd, data, traceIdMd5) + const res = await this.ctx.ntMsgApi.sendSsoCmdReqByContend(cmd, traceId) + if (res.result !== 0) { + throw new Error(res.errMsg) + } + } + + private check() { + if (this.available) { + return + } + const minVersion = 28418 + const maxVersion = 29456 + const currVersion = getBuildVersion() + if (currVersion < minVersion || currVersion > maxVersion) { + throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 ${minVersion}—${maxVersion}`) + } else { + throw new Error('packet backend 当前不可用') + } + } + + async groupPoke(groupCode: number, uin: number) { + this.check() + const data = Oidb.Oidb_0xED3_1.encode({ + uin, + groupCode + }).finish() + const req = buildOidbRequest(0xED3, 1, data) + await this.sendPacket(req.cmd, req.data) + } + + async friendPoke(uin: number) { + this.check() + const data = Oidb.Oidb_0xED3_1.encode({ + uin, + friendUin: uin + }).finish() + const req = buildOidbRequest(0xED3, 1, data) + await this.sendPacket(req.cmd, req.data) + } + + async groupSign(groupCode: string) { + this.check() + const data = Oidb.Oidb_0xEB7_1.encode({ + body: { + uin: selfInfo.uin, + groupCode + } + }).finish() + const req = buildOidbRequest(0xEB7, 1, data) + await this.sendPacket(req.cmd, req.data) + } + + async setGroupSpecialTitle(groupCode: number, uid: string, title: string) { + this.check() + const data = Oidb.Oidb_0X8FC_2.encode({ + groupCode, + body: { + targetUid: uid, + specialTitle: title, + expiredTime: -1, + uinName: title + } + }).finish() + const req = buildOidbRequest(0X8FC, 2, data, false) + await this.sendPacket(req.cmd, req.data) + } +} + +function buildOidbRequest(cmd: number, subCmd: number, body: Uint8Array, reserved = true) { + const data = Oidb.Base.encode({ + command: cmd, + subCommand: subCmd, + body, + isReserved: reserved ? 1 : 0 + }).finish() + return { + cmd: `OidbSvcTrpcTcp.0x${cmd.toString(16).toUpperCase()}_${subCmd}`, + data: Buffer.from(data).toString('hex') + } +} diff --git a/src/ntqqapi/proto/compiled.d.ts b/src/ntqqapi/proto/compiled.d.ts index 191d1dc..349a529 100644 --- a/src/ntqqapi/proto/compiled.d.ts +++ b/src/ntqqapi/proto/compiled.d.ts @@ -2186,3 +2186,367 @@ export namespace RichMedia { public static getTypeUrl(typeUrlPrefix?: string): string; } } + +/** Namespace Oidb. */ +export namespace Oidb { + + /** Properties of a Base. */ + interface IBase { + + /** Base command */ + command?: (number|null); + + /** Base subCommand */ + subCommand?: (number|null); + + /** Base errorCode */ + errorCode?: (number|null); + + /** Base body */ + body?: (Uint8Array|null); + + /** Base errorMsg */ + errorMsg?: (string|null); + + /** Base isReserved */ + isReserved?: (number|null); + } + + /** Represents a Base. */ + class Base implements IBase { + + /** + * Constructs a new Base. + * @param [properties] Properties to set + */ + constructor(properties?: Oidb.IBase); + + /** Base command. */ + public command: number; + + /** Base subCommand. */ + public subCommand: number; + + /** Base errorCode. */ + public errorCode: number; + + /** Base body. */ + public body: Uint8Array; + + /** Base errorMsg. */ + public errorMsg?: (string|null); + + /** Base isReserved. */ + public isReserved: number; + + /** + * Encodes the specified Base message. Does not implicitly {@link Oidb.Base.verify|verify} messages. + * @param message Base message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: Oidb.IBase, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Base message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Base + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Oidb.Base; + + /** + * Gets the default type url for Base + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of an Oidb_0xED3_1. */ + interface IOidb_0xED3_1 { + + /** Oidb_0xED3_1 uin */ + uin?: (number|null); + + /** Oidb_0xED3_1 groupCode */ + groupCode?: (number|null); + + /** Oidb_0xED3_1 friendUin */ + friendUin?: (number|null); + + /** Oidb_0xED3_1 ext */ + ext?: (number|null); + } + + /** Represents an Oidb_0xED3_1. */ + class Oidb_0xED3_1 implements IOidb_0xED3_1 { + + /** + * Constructs a new Oidb_0xED3_1. + * @param [properties] Properties to set + */ + constructor(properties?: Oidb.IOidb_0xED3_1); + + /** Oidb_0xED3_1 uin. */ + public uin: number; + + /** Oidb_0xED3_1 groupCode. */ + public groupCode: number; + + /** Oidb_0xED3_1 friendUin. */ + public friendUin: number; + + /** Oidb_0xED3_1 ext. */ + public ext?: (number|null); + + /** + * Encodes the specified Oidb_0xED3_1 message. Does not implicitly {@link Oidb.Oidb_0xED3_1.verify|verify} messages. + * @param message Oidb_0xED3_1 message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: Oidb.IOidb_0xED3_1, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Oidb_0xED3_1 message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Oidb_0xED3_1 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Oidb.Oidb_0xED3_1; + + /** + * Gets the default type url for Oidb_0xED3_1 + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of an Oidb_0xEB7_1. */ + interface IOidb_0xEB7_1 { + + /** Oidb_0xEB7_1 body */ + body?: (Oidb.IOidb_0xEB7_1_Body|null); + } + + /** Represents an Oidb_0xEB7_1. */ + class Oidb_0xEB7_1 implements IOidb_0xEB7_1 { + + /** + * Constructs a new Oidb_0xEB7_1. + * @param [properties] Properties to set + */ + constructor(properties?: Oidb.IOidb_0xEB7_1); + + /** Oidb_0xEB7_1 body. */ + public body?: (Oidb.IOidb_0xEB7_1_Body|null); + + /** + * Encodes the specified Oidb_0xEB7_1 message. Does not implicitly {@link Oidb.Oidb_0xEB7_1.verify|verify} messages. + * @param message Oidb_0xEB7_1 message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: Oidb.IOidb_0xEB7_1, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Oidb_0xEB7_1 message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Oidb_0xEB7_1 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Oidb.Oidb_0xEB7_1; + + /** + * Gets the default type url for Oidb_0xEB7_1 + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of an Oidb_0xEB7_1_Body. */ + interface IOidb_0xEB7_1_Body { + + /** Oidb_0xEB7_1_Body uin */ + uin?: (string|null); + + /** Oidb_0xEB7_1_Body groupCode */ + groupCode?: (string|null); + + /** Oidb_0xEB7_1_Body version */ + version?: (string|null); + } + + /** Represents an Oidb_0xEB7_1_Body. */ + class Oidb_0xEB7_1_Body implements IOidb_0xEB7_1_Body { + + /** + * Constructs a new Oidb_0xEB7_1_Body. + * @param [properties] Properties to set + */ + constructor(properties?: Oidb.IOidb_0xEB7_1_Body); + + /** Oidb_0xEB7_1_Body uin. */ + public uin: string; + + /** Oidb_0xEB7_1_Body groupCode. */ + public groupCode: string; + + /** Oidb_0xEB7_1_Body version. */ + public version: string; + + /** + * Encodes the specified Oidb_0xEB7_1_Body message. Does not implicitly {@link Oidb.Oidb_0xEB7_1_Body.verify|verify} messages. + * @param message Oidb_0xEB7_1_Body message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: Oidb.IOidb_0xEB7_1_Body, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Oidb_0xEB7_1_Body message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Oidb_0xEB7_1_Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Oidb.Oidb_0xEB7_1_Body; + + /** + * Gets the default type url for Oidb_0xEB7_1_Body + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of an Oidb_0X8FC_2. */ + interface IOidb_0X8FC_2 { + + /** Oidb_0X8FC_2 groupCode */ + groupCode?: (number|null); + + /** Oidb_0X8FC_2 body */ + body?: (Oidb.IOidb_0X8FC_2_Body|null); + } + + /** Represents an Oidb_0X8FC_2. */ + class Oidb_0X8FC_2 implements IOidb_0X8FC_2 { + + /** + * Constructs a new Oidb_0X8FC_2. + * @param [properties] Properties to set + */ + constructor(properties?: Oidb.IOidb_0X8FC_2); + + /** Oidb_0X8FC_2 groupCode. */ + public groupCode: number; + + /** Oidb_0X8FC_2 body. */ + public body?: (Oidb.IOidb_0X8FC_2_Body|null); + + /** + * Encodes the specified Oidb_0X8FC_2 message. Does not implicitly {@link Oidb.Oidb_0X8FC_2.verify|verify} messages. + * @param message Oidb_0X8FC_2 message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: Oidb.IOidb_0X8FC_2, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Oidb_0X8FC_2 message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Oidb_0X8FC_2 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Oidb.Oidb_0X8FC_2; + + /** + * Gets the default type url for Oidb_0X8FC_2 + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of an Oidb_0X8FC_2_Body. */ + interface IOidb_0X8FC_2_Body { + + /** Oidb_0X8FC_2_Body targetUid */ + targetUid?: (string|null); + + /** Oidb_0X8FC_2_Body specialTitle */ + specialTitle?: (string|null); + + /** Oidb_0X8FC_2_Body expiredTime */ + expiredTime?: (number|null); + + /** Oidb_0X8FC_2_Body uinName */ + uinName?: (string|null); + + /** Oidb_0X8FC_2_Body targetName */ + targetName?: (string|null); + } + + /** Represents an Oidb_0X8FC_2_Body. */ + class Oidb_0X8FC_2_Body implements IOidb_0X8FC_2_Body { + + /** + * Constructs a new Oidb_0X8FC_2_Body. + * @param [properties] Properties to set + */ + constructor(properties?: Oidb.IOidb_0X8FC_2_Body); + + /** Oidb_0X8FC_2_Body targetUid. */ + public targetUid: string; + + /** Oidb_0X8FC_2_Body specialTitle. */ + public specialTitle: string; + + /** Oidb_0X8FC_2_Body expiredTime. */ + public expiredTime: number; + + /** Oidb_0X8FC_2_Body uinName. */ + public uinName: string; + + /** Oidb_0X8FC_2_Body targetName. */ + public targetName: string; + + /** + * Encodes the specified Oidb_0X8FC_2_Body message. Does not implicitly {@link Oidb.Oidb_0X8FC_2_Body.verify|verify} messages. + * @param message Oidb_0X8FC_2_Body message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: Oidb.IOidb_0X8FC_2_Body, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Oidb_0X8FC_2_Body message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Oidb_0X8FC_2_Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Oidb.Oidb_0X8FC_2_Body; + + /** + * Gets the default type url for Oidb_0X8FC_2_Body + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } +} diff --git a/src/ntqqapi/proto/compiled.js b/src/ntqqapi/proto/compiled.js index ce5d785..f123a50 100644 --- a/src/ntqqapi/proto/compiled.js +++ b/src/ntqqapi/proto/compiled.js @@ -5421,4 +5421,841 @@ export const RichMedia = $root.RichMedia = (() => { return RichMedia; })(); +export const Oidb = $root.Oidb = (() => { + + /** + * Namespace Oidb. + * @exports Oidb + * @namespace + */ + const Oidb = {}; + + Oidb.Base = (function() { + + /** + * Properties of a Base. + * @memberof Oidb + * @interface IBase + * @property {number|null} [command] Base command + * @property {number|null} [subCommand] Base subCommand + * @property {number|null} [errorCode] Base errorCode + * @property {Uint8Array|null} [body] Base body + * @property {string|null} [errorMsg] Base errorMsg + * @property {number|null} [isReserved] Base isReserved + */ + + /** + * Constructs a new Base. + * @memberof Oidb + * @classdesc Represents a Base. + * @implements IBase + * @constructor + * @param {Oidb.IBase=} [properties] Properties to set + */ + function Base(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Base command. + * @member {number} command + * @memberof Oidb.Base + * @instance + */ + Base.prototype.command = 0; + + /** + * Base subCommand. + * @member {number} subCommand + * @memberof Oidb.Base + * @instance + */ + Base.prototype.subCommand = 0; + + /** + * Base errorCode. + * @member {number} errorCode + * @memberof Oidb.Base + * @instance + */ + Base.prototype.errorCode = 0; + + /** + * Base body. + * @member {Uint8Array} body + * @memberof Oidb.Base + * @instance + */ + Base.prototype.body = $util.newBuffer([]); + + /** + * Base errorMsg. + * @member {string|null|undefined} errorMsg + * @memberof Oidb.Base + * @instance + */ + Base.prototype.errorMsg = null; + + /** + * Base isReserved. + * @member {number} isReserved + * @memberof Oidb.Base + * @instance + */ + Base.prototype.isReserved = 0; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + // Virtual OneOf for proto3 optional field + Object.defineProperty(Base.prototype, "_errorMsg", { + get: $util.oneOfGetter($oneOfFields = ["errorMsg"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Encodes the specified Base message. Does not implicitly {@link Oidb.Base.verify|verify} messages. + * @function encode + * @memberof Oidb.Base + * @static + * @param {Oidb.IBase} message Base message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Base.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.command != null && Object.hasOwnProperty.call(message, "command")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.command); + if (message.subCommand != null && Object.hasOwnProperty.call(message, "subCommand")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.subCommand); + if (message.errorCode != null && Object.hasOwnProperty.call(message, "errorCode")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.errorCode); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.body); + if (message.errorMsg != null && Object.hasOwnProperty.call(message, "errorMsg")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.errorMsg); + if (message.isReserved != null && Object.hasOwnProperty.call(message, "isReserved")) + writer.uint32(/* id 12, wireType 0 =*/96).uint32(message.isReserved); + return writer; + }; + + /** + * Decodes a Base message from the specified reader or buffer. + * @function decode + * @memberof Oidb.Base + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Oidb.Base} Base + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Base.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Oidb.Base(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.command = reader.uint32(); + break; + } + case 2: { + message.subCommand = reader.uint32(); + break; + } + case 3: { + message.errorCode = reader.uint32(); + break; + } + case 4: { + message.body = reader.bytes(); + break; + } + case 5: { + message.errorMsg = reader.string(); + break; + } + case 12: { + message.isReserved = reader.uint32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Gets the default type url for Base + * @function getTypeUrl + * @memberof Oidb.Base + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Base.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/Oidb.Base"; + }; + + return Base; + })(); + + Oidb.Oidb_0xED3_1 = (function() { + + /** + * Properties of an Oidb_0xED3_1. + * @memberof Oidb + * @interface IOidb_0xED3_1 + * @property {number|null} [uin] Oidb_0xED3_1 uin + * @property {number|null} [groupCode] Oidb_0xED3_1 groupCode + * @property {number|null} [friendUin] Oidb_0xED3_1 friendUin + * @property {number|null} [ext] Oidb_0xED3_1 ext + */ + + /** + * Constructs a new Oidb_0xED3_1. + * @memberof Oidb + * @classdesc Represents an Oidb_0xED3_1. + * @implements IOidb_0xED3_1 + * @constructor + * @param {Oidb.IOidb_0xED3_1=} [properties] Properties to set + */ + function Oidb_0xED3_1(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Oidb_0xED3_1 uin. + * @member {number} uin + * @memberof Oidb.Oidb_0xED3_1 + * @instance + */ + Oidb_0xED3_1.prototype.uin = 0; + + /** + * Oidb_0xED3_1 groupCode. + * @member {number} groupCode + * @memberof Oidb.Oidb_0xED3_1 + * @instance + */ + Oidb_0xED3_1.prototype.groupCode = 0; + + /** + * Oidb_0xED3_1 friendUin. + * @member {number} friendUin + * @memberof Oidb.Oidb_0xED3_1 + * @instance + */ + Oidb_0xED3_1.prototype.friendUin = 0; + + /** + * Oidb_0xED3_1 ext. + * @member {number|null|undefined} ext + * @memberof Oidb.Oidb_0xED3_1 + * @instance + */ + Oidb_0xED3_1.prototype.ext = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + // Virtual OneOf for proto3 optional field + Object.defineProperty(Oidb_0xED3_1.prototype, "_ext", { + get: $util.oneOfGetter($oneOfFields = ["ext"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Encodes the specified Oidb_0xED3_1 message. Does not implicitly {@link Oidb.Oidb_0xED3_1.verify|verify} messages. + * @function encode + * @memberof Oidb.Oidb_0xED3_1 + * @static + * @param {Oidb.IOidb_0xED3_1} message Oidb_0xED3_1 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Oidb_0xED3_1.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.uin != null && Object.hasOwnProperty.call(message, "uin")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.uin); + if (message.groupCode != null && Object.hasOwnProperty.call(message, "groupCode")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.groupCode); + if (message.friendUin != null && Object.hasOwnProperty.call(message, "friendUin")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.friendUin); + if (message.ext != null && Object.hasOwnProperty.call(message, "ext")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.ext); + return writer; + }; + + /** + * Decodes an Oidb_0xED3_1 message from the specified reader or buffer. + * @function decode + * @memberof Oidb.Oidb_0xED3_1 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Oidb.Oidb_0xED3_1} Oidb_0xED3_1 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Oidb_0xED3_1.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Oidb.Oidb_0xED3_1(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.uin = reader.uint32(); + break; + } + case 2: { + message.groupCode = reader.uint32(); + break; + } + case 5: { + message.friendUin = reader.uint32(); + break; + } + case 6: { + message.ext = reader.uint32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Gets the default type url for Oidb_0xED3_1 + * @function getTypeUrl + * @memberof Oidb.Oidb_0xED3_1 + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Oidb_0xED3_1.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/Oidb.Oidb_0xED3_1"; + }; + + return Oidb_0xED3_1; + })(); + + Oidb.Oidb_0xEB7_1 = (function() { + + /** + * Properties of an Oidb_0xEB7_1. + * @memberof Oidb + * @interface IOidb_0xEB7_1 + * @property {Oidb.IOidb_0xEB7_1_Body|null} [body] Oidb_0xEB7_1 body + */ + + /** + * Constructs a new Oidb_0xEB7_1. + * @memberof Oidb + * @classdesc Represents an Oidb_0xEB7_1. + * @implements IOidb_0xEB7_1 + * @constructor + * @param {Oidb.IOidb_0xEB7_1=} [properties] Properties to set + */ + function Oidb_0xEB7_1(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Oidb_0xEB7_1 body. + * @member {Oidb.IOidb_0xEB7_1_Body|null|undefined} body + * @memberof Oidb.Oidb_0xEB7_1 + * @instance + */ + Oidb_0xEB7_1.prototype.body = null; + + /** + * Encodes the specified Oidb_0xEB7_1 message. Does not implicitly {@link Oidb.Oidb_0xEB7_1.verify|verify} messages. + * @function encode + * @memberof Oidb.Oidb_0xEB7_1 + * @static + * @param {Oidb.IOidb_0xEB7_1} message Oidb_0xEB7_1 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Oidb_0xEB7_1.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + $root.Oidb.Oidb_0xEB7_1_Body.encode(message.body, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Decodes an Oidb_0xEB7_1 message from the specified reader or buffer. + * @function decode + * @memberof Oidb.Oidb_0xEB7_1 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Oidb.Oidb_0xEB7_1} Oidb_0xEB7_1 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Oidb_0xEB7_1.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Oidb.Oidb_0xEB7_1(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + message.body = $root.Oidb.Oidb_0xEB7_1_Body.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Gets the default type url for Oidb_0xEB7_1 + * @function getTypeUrl + * @memberof Oidb.Oidb_0xEB7_1 + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Oidb_0xEB7_1.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/Oidb.Oidb_0xEB7_1"; + }; + + return Oidb_0xEB7_1; + })(); + + Oidb.Oidb_0xEB7_1_Body = (function() { + + /** + * Properties of an Oidb_0xEB7_1_Body. + * @memberof Oidb + * @interface IOidb_0xEB7_1_Body + * @property {string|null} [uin] Oidb_0xEB7_1_Body uin + * @property {string|null} [groupCode] Oidb_0xEB7_1_Body groupCode + * @property {string|null} [version] Oidb_0xEB7_1_Body version + */ + + /** + * Constructs a new Oidb_0xEB7_1_Body. + * @memberof Oidb + * @classdesc Represents an Oidb_0xEB7_1_Body. + * @implements IOidb_0xEB7_1_Body + * @constructor + * @param {Oidb.IOidb_0xEB7_1_Body=} [properties] Properties to set + */ + function Oidb_0xEB7_1_Body(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Oidb_0xEB7_1_Body uin. + * @member {string} uin + * @memberof Oidb.Oidb_0xEB7_1_Body + * @instance + */ + Oidb_0xEB7_1_Body.prototype.uin = ""; + + /** + * Oidb_0xEB7_1_Body groupCode. + * @member {string} groupCode + * @memberof Oidb.Oidb_0xEB7_1_Body + * @instance + */ + Oidb_0xEB7_1_Body.prototype.groupCode = ""; + + /** + * Oidb_0xEB7_1_Body version. + * @member {string} version + * @memberof Oidb.Oidb_0xEB7_1_Body + * @instance + */ + Oidb_0xEB7_1_Body.prototype.version = ""; + + /** + * Encodes the specified Oidb_0xEB7_1_Body message. Does not implicitly {@link Oidb.Oidb_0xEB7_1_Body.verify|verify} messages. + * @function encode + * @memberof Oidb.Oidb_0xEB7_1_Body + * @static + * @param {Oidb.IOidb_0xEB7_1_Body} message Oidb_0xEB7_1_Body message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Oidb_0xEB7_1_Body.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.uin != null && Object.hasOwnProperty.call(message, "uin")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.uin); + if (message.groupCode != null && Object.hasOwnProperty.call(message, "groupCode")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.groupCode); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.version); + return writer; + }; + + /** + * Decodes an Oidb_0xEB7_1_Body message from the specified reader or buffer. + * @function decode + * @memberof Oidb.Oidb_0xEB7_1_Body + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Oidb.Oidb_0xEB7_1_Body} Oidb_0xEB7_1_Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Oidb_0xEB7_1_Body.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Oidb.Oidb_0xEB7_1_Body(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.uin = reader.string(); + break; + } + case 2: { + message.groupCode = reader.string(); + break; + } + case 3: { + message.version = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Gets the default type url for Oidb_0xEB7_1_Body + * @function getTypeUrl + * @memberof Oidb.Oidb_0xEB7_1_Body + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Oidb_0xEB7_1_Body.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/Oidb.Oidb_0xEB7_1_Body"; + }; + + return Oidb_0xEB7_1_Body; + })(); + + Oidb.Oidb_0X8FC_2 = (function() { + + /** + * Properties of an Oidb_0X8FC_2. + * @memberof Oidb + * @interface IOidb_0X8FC_2 + * @property {number|null} [groupCode] Oidb_0X8FC_2 groupCode + * @property {Oidb.IOidb_0X8FC_2_Body|null} [body] Oidb_0X8FC_2 body + */ + + /** + * Constructs a new Oidb_0X8FC_2. + * @memberof Oidb + * @classdesc Represents an Oidb_0X8FC_2. + * @implements IOidb_0X8FC_2 + * @constructor + * @param {Oidb.IOidb_0X8FC_2=} [properties] Properties to set + */ + function Oidb_0X8FC_2(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Oidb_0X8FC_2 groupCode. + * @member {number} groupCode + * @memberof Oidb.Oidb_0X8FC_2 + * @instance + */ + Oidb_0X8FC_2.prototype.groupCode = 0; + + /** + * Oidb_0X8FC_2 body. + * @member {Oidb.IOidb_0X8FC_2_Body|null|undefined} body + * @memberof Oidb.Oidb_0X8FC_2 + * @instance + */ + Oidb_0X8FC_2.prototype.body = null; + + /** + * Encodes the specified Oidb_0X8FC_2 message. Does not implicitly {@link Oidb.Oidb_0X8FC_2.verify|verify} messages. + * @function encode + * @memberof Oidb.Oidb_0X8FC_2 + * @static + * @param {Oidb.IOidb_0X8FC_2} message Oidb_0X8FC_2 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Oidb_0X8FC_2.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupCode != null && Object.hasOwnProperty.call(message, "groupCode")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.groupCode); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + $root.Oidb.Oidb_0X8FC_2_Body.encode(message.body, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Decodes an Oidb_0X8FC_2 message from the specified reader or buffer. + * @function decode + * @memberof Oidb.Oidb_0X8FC_2 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Oidb.Oidb_0X8FC_2} Oidb_0X8FC_2 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Oidb_0X8FC_2.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Oidb.Oidb_0X8FC_2(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.groupCode = reader.uint32(); + break; + } + case 3: { + message.body = $root.Oidb.Oidb_0X8FC_2_Body.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Gets the default type url for Oidb_0X8FC_2 + * @function getTypeUrl + * @memberof Oidb.Oidb_0X8FC_2 + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Oidb_0X8FC_2.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/Oidb.Oidb_0X8FC_2"; + }; + + return Oidb_0X8FC_2; + })(); + + Oidb.Oidb_0X8FC_2_Body = (function() { + + /** + * Properties of an Oidb_0X8FC_2_Body. + * @memberof Oidb + * @interface IOidb_0X8FC_2_Body + * @property {string|null} [targetUid] Oidb_0X8FC_2_Body targetUid + * @property {string|null} [specialTitle] Oidb_0X8FC_2_Body specialTitle + * @property {number|null} [expiredTime] Oidb_0X8FC_2_Body expiredTime + * @property {string|null} [uinName] Oidb_0X8FC_2_Body uinName + * @property {string|null} [targetName] Oidb_0X8FC_2_Body targetName + */ + + /** + * Constructs a new Oidb_0X8FC_2_Body. + * @memberof Oidb + * @classdesc Represents an Oidb_0X8FC_2_Body. + * @implements IOidb_0X8FC_2_Body + * @constructor + * @param {Oidb.IOidb_0X8FC_2_Body=} [properties] Properties to set + */ + function Oidb_0X8FC_2_Body(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Oidb_0X8FC_2_Body targetUid. + * @member {string} targetUid + * @memberof Oidb.Oidb_0X8FC_2_Body + * @instance + */ + Oidb_0X8FC_2_Body.prototype.targetUid = ""; + + /** + * Oidb_0X8FC_2_Body specialTitle. + * @member {string} specialTitle + * @memberof Oidb.Oidb_0X8FC_2_Body + * @instance + */ + Oidb_0X8FC_2_Body.prototype.specialTitle = ""; + + /** + * Oidb_0X8FC_2_Body expiredTime. + * @member {number} expiredTime + * @memberof Oidb.Oidb_0X8FC_2_Body + * @instance + */ + Oidb_0X8FC_2_Body.prototype.expiredTime = 0; + + /** + * Oidb_0X8FC_2_Body uinName. + * @member {string} uinName + * @memberof Oidb.Oidb_0X8FC_2_Body + * @instance + */ + Oidb_0X8FC_2_Body.prototype.uinName = ""; + + /** + * Oidb_0X8FC_2_Body targetName. + * @member {string} targetName + * @memberof Oidb.Oidb_0X8FC_2_Body + * @instance + */ + Oidb_0X8FC_2_Body.prototype.targetName = ""; + + /** + * Encodes the specified Oidb_0X8FC_2_Body message. Does not implicitly {@link Oidb.Oidb_0X8FC_2_Body.verify|verify} messages. + * @function encode + * @memberof Oidb.Oidb_0X8FC_2_Body + * @static + * @param {Oidb.IOidb_0X8FC_2_Body} message Oidb_0X8FC_2_Body message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Oidb_0X8FC_2_Body.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.targetUid != null && Object.hasOwnProperty.call(message, "targetUid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.targetUid); + if (message.specialTitle != null && Object.hasOwnProperty.call(message, "specialTitle")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.specialTitle); + if (message.expiredTime != null && Object.hasOwnProperty.call(message, "expiredTime")) + writer.uint32(/* id 6, wireType 0 =*/48).sint32(message.expiredTime); + if (message.uinName != null && Object.hasOwnProperty.call(message, "uinName")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.uinName); + if (message.targetName != null && Object.hasOwnProperty.call(message, "targetName")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.targetName); + return writer; + }; + + /** + * Decodes an Oidb_0X8FC_2_Body message from the specified reader or buffer. + * @function decode + * @memberof Oidb.Oidb_0X8FC_2_Body + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Oidb.Oidb_0X8FC_2_Body} Oidb_0X8FC_2_Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Oidb_0X8FC_2_Body.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Oidb.Oidb_0X8FC_2_Body(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.targetUid = reader.string(); + break; + } + case 5: { + message.specialTitle = reader.string(); + break; + } + case 6: { + message.expiredTime = reader.sint32(); + break; + } + case 7: { + message.uinName = reader.string(); + break; + } + case 8: { + message.targetName = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Gets the default type url for Oidb_0X8FC_2_Body + * @function getTypeUrl + * @memberof Oidb.Oidb_0X8FC_2_Body + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Oidb_0X8FC_2_Body.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/Oidb.Oidb_0X8FC_2_Body"; + }; + + return Oidb_0X8FC_2_Body; + })(); + + return Oidb; +})(); + export { $root as default }; diff --git a/src/ntqqapi/proto/oidb.proto b/src/ntqqapi/proto/oidb.proto new file mode 100644 index 0000000..2359013 --- /dev/null +++ b/src/ntqqapi/proto/oidb.proto @@ -0,0 +1,41 @@ +syntax = "proto3"; +package Oidb; + +message Base { + uint32 command = 1; + uint32 subCommand = 2; + uint32 errorCode = 3; + bytes body = 4; + optional string errorMsg = 5; + uint32 isReserved = 12; +} + +message Oidb_0xED3_1 { + uint32 uin = 1; + uint32 groupCode = 2; + uint32 friendUin = 5; + optional uint32 ext = 6; +} + +message Oidb_0xEB7_1 { + Oidb_0xEB7_1_Body body = 2; +} + +message Oidb_0xEB7_1_Body { + string uin = 1; + string groupCode = 2; + string version = 3; +} + +message Oidb_0X8FC_2 { + uint32 groupCode = 1; + Oidb_0X8FC_2_Body body = 3; +} + +message Oidb_0X8FC_2_Body { + string targetUid = 1; + string specialTitle = 5; + sint32 expiredTime = 6; + string uinName = 7; + string targetName = 8; +}