diff --git a/client.js b/client.js index cbd5ae1f..5d353de1 100644 --- a/client.js +++ b/client.js @@ -570,7 +570,7 @@ class AndroidClient extends Client { try { this.friend_list_lock = true; this.friend_list = new Map(); - let start = 0, limit = 250; + let start = 0, limit = 5000; while (1) { const total = await this.send(outgoing.buildFriendListRequestPacket(start, limit, this)); start += limit; diff --git a/docs/api.md b/docs/api.md index 57898665..a40394ea 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,7 +1,6 @@ # API和事件 + [oicq.createClient(uin[,config])](#oicq.createClient(uin[,config])) -+ [oicq.setGlobalConfig(config)](#oicq.setGlobalConfig(config)) + [Class: oicq.Client](#Class-Client) + [Events](#Events) + [Event: system](#Event-system) @@ -12,6 +11,7 @@ + [client.captchaLogin(captcha)](#client.captchaLogin(captcha)) + [client.terminate()](#client.terminate()) + [APIs](#APIs) ++ [oicq.setGlobalConfig(config)](#oicq.setGlobalConfig(config)) ---- @@ -20,7 +20,7 @@ + `uin` \ + `config` \ -创建一个实例: +创建client一个实例: ```js const oicq = require("oicq"); @@ -40,32 +40,6 @@ const config = { }; ``` -※ 不建议在单个工作线程中运行多个实例。如果确实有需要,建议使用 [Worker threads](https://nodejs.org/dist/latest/docs/api/worker_threads.html) 或 [Child process](https://nodejs.org/dist/latest/docs/api/child_process.html) 管理实例。 - ----- - -## oicq.setGlobalConfig(config) - -+ `config` \ - -全局设置 - -```js -//要使用默认配置请勿传递该字段 -oicq.setGlobalConfig({ - web_image_timeout: 0, //下载网络图片的超时时间(0表示系统自己判断) - web_record_timeout: 0, //下载网络语音的超时时间 - cache_root: "", //缓存文件夹根目录,需要可写权限,默认主目录下的data文件夹 - debug: false, -}); -``` - ----- - -## Class: `Client` - -只能使用工厂方法 createClient 创建实例。 - ---- ## Events @@ -73,29 +47,36 @@ oicq.setGlobalConfig({ 使用 `client.on()` 来监听一个事件: ```js -client.on("system.login", (data)=>{ +client.on("system.login.captcha", (data)=>{ console.log(data); }); ``` -事件为冒泡传递,例如 `request.group.add` 事件,若未监听会沿着 `request.group` 传递到 `request` +事件为冒泡传递,例如 `request.group.add` 事件,若未监听会沿着二级分类 `request.group` 传递到一级分类 `request` 事件使用cqhttp风格命名和参数,所有事件数据都为json对象,并包含以下共通字段: + `self_id` + `time` + `post_type` 一级分类 system, message, request, notice -+ `{post_type}_type` 二级分类如 system.login, request.group -+ `sub_type` 三级分类,有时会没有 ++ `{post_type}_type` 二级分类 如:login, online, offline, group, friend, private 等 ++ `sub_type` 三级分类 如:captcha, add, invite 等,有时会没有 + +之后只列出其他非共通的字段。 ---- ## Event: `system` + `system.login` - + `system.login.captcha` 收到验证码 `image` 字段为图像Buffer - + `system.login.device` 需要解设备锁 `url` 字段为设备锁验证地址 - + `system.login.error` 其他原因如密码错误 `message` 字段为失败原因 + + `system.login.captcha` 收到验证码 + + *`image`* 图片数据(Buffer) + + `system.login.device` 需要解设备锁 + + *`url`* 设备锁验证地址(string) + + `system.login.error` 其他原因导致登陆失败 + + *`message`* "密码错误"等(string) + + `system.online` 上线事件,可以开始处理消息 + + `system.offline` 下线事件 + `system.offline.network` 网络断开 + `system.offline.frozen` 被冻结 @@ -105,28 +86,86 @@ client.on("system.login", (data)=>{ ---- -以下事件与 [CQHTTP](https://github.com/howmanybots/onebot/blob/master/v11/specs/event/README.md) 大同小异 +以下事件使用 [CQHTTP](https://github.com/howmanybots/onebot/blob/master/v11/specs/event/README.md) 风格的命名和字段 ## Event: `message` -+ `message.private` ++ **message.private** + + `message.private.friend` 好友消息 + `message.private.single` 单向好友消息(对方未加你) + `message.private.group` 群临时会话 + `message.private.other` 其他临时会话 -+ `message.group` + + *`message_id`* string型 + + *`user_id`* 对方QQ号(number) + + *`font`* 字体名称(string),如:"微软雅黑" + + *`message`* 数组格式的消息 + + *`raw_message`* 字符串格式的消息(CQ码已转义) + + *`sender`* + + *`user_id`* + + *`nickname`* 昵称(string) + + *`remark`* 备注 + + *`sex`* "male"或"female"或"unknown" + + *`age`* 年龄(number) + ++ **message.group** + + `message.group.normal` 群消息 + `message.group.anonymous` 群匿名消息 + + *`message_id`* string型 + + *`group_id`* 群号(number) + + *`group_name`* 群名(string) + + *`user_id`* 对方QQ号(number) + + *`anonymous`* 非匿名消息时为null + + *`id`* 暂时为0 + + *`name`* 匿名者的名字 + + *`flag`* 暂时为空 + + *`font`* 字体名称(string),如:"微软雅黑" + + *`message`* 数组格式的消息 + + *`raw_message`* 字符串格式的消息(CQ码已转义) + + *`sender`* + + *`user_id`* + + *`nickname`* 昵称(string) + + *`card`* 群名片 + + *`sex`* "male"或"female"或"unknown" + + *`age`* 年龄(number) + + *`area`* 暂时为"unknown" + + *`level`* 群等级(number) + + *`role`* "owner"或"admin"或"member" + + *`title`* 群头衔(string) ---- ## Event: `request` -+ `request.friend` ++ **request.friend** + + `request.friend.add` 好友请求 -+ `request.group` + + *`user_id`* + + *`nickname`* + + *`source`* 来源(某QQ群或搜索等)(string) + + *`comment`* + + *`sex`* + + *`age`* + + *`flag`* 用于处理请求时传入(string) + ++ **request.group** + + `request.group.add` 加群请求 + + *`group_id`* + + *`group_name`* + + *`user_id`* + + *`nickname`* + + *`comment`* + + *`flag`* + + `request.group.invite` 加群邀请 + + *`group_id`* + + *`group_name`* + + *`user_id`* + + *`nickname`* + + *`role`* 邀请者的权限(admin或member) + + *`flag`* ---- @@ -134,21 +173,102 @@ client.on("system.login", (data)=>{ 为了统一风格,notice事件的命名和原版cqhttp有一定出入 -+ `notice.friend` ++ **notice.friend** + + `notice.friend.increase` 好友增加 - + `notice.friend.decrease` 好友减少(被拉黑或自己删除) + + *`user_id`* + + *`nickname`* + + + `notice.friend.decrease` 好友减少(被拉黑或自己删除都会触发) + + *`user_id`* + + *`nickname`* + + `notice.friend.recall` 消息撤回事件 -+ `notice.group` + + *`user_id`* + + *`message_id`* + ++ **notice.group** + + `notice.group.increase` 群员增加 - + `notice.group.decrease` 群员减少 - + `notice.group.recall` 消息撤回事件 - + `notice.group.admin` 管理变更事件 + + *`group_id`* + + *`user_id`* + + *`nickname`* + + + `notice.group.decrease` 群员减少(bot在其他客户端自己退群,事件不会触发) + + *`group_id`* + + *`operator_id`* 操作者,自己退群的时候和user_id相同 + + *`user_id`* + + *`dismiss`* 是否是解散(boolean型) + + + `notice.group.recall` 群消息撤回事件 + + *`group_id`* + + *`operator_id`* + + *`user_id`* + + *`message_id`* + + + `notice.group.admin` 管理变更事件(bot是群主,在其他客户端设置管理,事件不会触发) + + *`group_id`* + + *`user_id`* + + *`set`* boolean型 + + `notice.group.ban` 群禁言事件 + + *`group_id`* + + *`operator_id`* + + *`user_id`* + + *`duration`* 时间(0为解禁) + + `notice.group.transfer` 群转让事件 + + *`group_id`* + + *`operator_id`* 旧群主 + + *`user_id`* 新群主 + + `notice.group.notice` 收到群公告 + + *`group_id`* + + *`user_id`* + + *`title`* + + *`content`* + + `notice.group.file` 收到群文件 + + *`group_id`* + + *`user_id`* + + *`file`* + + *`name`* + + *`url`* + + *`size`* + + *`md5`* + + *`duration`* + + `notice.group.name` 群名变更事件 + + *`group_id`* + + *`user_id`* + + *`new_name`* + + + `notice.group.title` 群头衔变更事件 + + *`group_id`* + + *`user_id`* + + *`new_title`* + + `notice.group.poke` 群戳一戳事件 + + *`group_id`* + + *`operator_id`* 操作者 + + *`user_id`* 目标 + + *`action`* 动作名 + + *`suffix`* 动作后缀 + + + `notice.group.setting` 群设置变更事件,以下带有enable的字段都为 `boolean` + + *`enable_guest`* 允许游客进入 + + *`enable_anonymous`* 允许匿名 + + *`enable_upload_album`* 允许群员上传相册 + + *`enable_upload_file`* 允许群员上传文件 + + *`enable_temp_chat`* 允许临时会话 + + *`enable_new_group`* 允许发起新群聊 + + *`enable_show_honor`* 展示群互动标识(龙王等) + + *`enable_show_level`* 展示群等级 + + *`enable_show_title`* 展示群头衔 + + *`enable_confess`* 开启坦白说 + + *`enable_cowrite`* 开启一起写 + + *`group_id`* + + *`user_id`* 操作者不明的时候为 -1 ---- @@ -156,7 +276,7 @@ client.on("system.login", (data)=>{ ## `client.login(password_md5)` 密码登陆 -+ `password_md5` \ md5后的密码,可以是字符串或Buffer ++ `password_md5` \ md5后的密码,hex字符串或Buffer ---- @@ -172,7 +292,7 @@ client.on("system.login", (data)=>{ ## APIs -(与 [CQHTTP](https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md) 大同小异) +(使用 [CQHTTP](https://github.com/howmanybots/onebot/blob/master/v11/specs/api/public.md) 风格的命名和参数) 同步函数会直接返回。异步函数标注为 `async` ,返回的是 `Promise` ,返回值为以下格式的json对象: @@ -265,3 +385,21 @@ message可以使用 `Array` 格式或 `String` 格式,支持CQ码 + `client.getLoginInfo()` ---- + +## oicq.setGlobalConfig(config) + ++ `config` \ + +全局设置 + +```js +//要使用默认配置请勿传递该字段 +oicq.setGlobalConfig({ + web_image_timeout: 0, //下载网络图片的超时时间(0表示系统自己判断) + web_record_timeout: 0, //下载网络语音的超时时间 + cache_root: "", //缓存文件夹根目录,需要可写权限,默认主目录下的data文件夹 + debug: false, +}); +``` + +---- \ No newline at end of file diff --git a/docs/project.md b/docs/project.md index fe97ce66..cc0fb3b2 100644 --- a/docs/project.md +++ b/docs/project.md @@ -34,7 +34,7 @@ |修改名片|◯|✕| |修改群名|◯|◯| |群公告|◯|◯| -|其他设置|✕|✕| +|其他设置|✕|◯| |群文件|✕|◯| |设置头衔|◯|✕| |设置管理|◯|◯| diff --git a/lib/incoming.js b/lib/incoming.js index 51ffb451..9c0c06d1 100644 --- a/lib/incoming.js +++ b/lib/incoming.js @@ -242,7 +242,7 @@ function decodeClientRegisterResponse(blob, c) { const parent = jce.decode(nested); return parent[9]?true:false; } -function decodePushReqEvent(blob, c) { +function decodePushReqEvent(blob, c, seq) { const nested = jce.decodeWrapper(blob); const parent = jce.decode(nested); // var a=jce.decode(parent[2]) @@ -257,7 +257,7 @@ function decodePushReqEvent(blob, c) { // else // common.log(a[k]) // } - c.write(outgoing.buildConfPushResponsePacket(parent[1], parent[3], parent[2], c)); + c.write(outgoing.buildConfPushResponsePacket(parent[1], parent[3], parent[2], seq, c)); } //---------------------------------------------------------------------------------------------------- @@ -279,9 +279,7 @@ function decodeMessageSvcResponse(blob, c) { for (let msg of v.messages) { const head = msg.head, body = msg.body; const type = head.msgType; - const rrr = head; - rrr.msgType = 187; - rubbish.push(rrr); + rubbish.push(head); if (!c.sync_finished) continue; if (v.lastReadTime === -1 || v.lastReadTime > head.msgTime) @@ -629,19 +627,17 @@ function decodeNewGroupResponse(blob, c) { //---------------------------------------------------------------------------------------------------- -function decodeFriendAndGroupEvent(blob, c) { +function decodeFriendAndGroupEvent(blob, c, seq) { if (!c.sync_finished) return; const nested = jce.decodeWrapper(blob); const parent = jce.decode(nested); - if (c.seq_cache["ReqPush"].has(parent[3])) - return; - c.seq_cache["ReqPush"].add(parent[3]); - setTimeout(()=>{ - c.seq_cache["ReqPush"].delete(parent[3]); - }, 30000); const list = parent[2]; + const rubbish = []; for (let v of list) { v = jce.decode(v); + rubbish.push(jce.encodeNested([ + c.uin, v[1], v[3], v[8], 0,0,0,0,0,0,0 + ])) if (v[2] === 528) { let data = jce.decode(v[6]); if (data[0] === 0x8A || data[0] === 0x8B) { @@ -649,8 +645,7 @@ function decodeFriendAndGroupEvent(blob, c) { data = data.msgInfo[0]; const user_id = toInt(data.fromUin); event.emit(c, "notice.friend.recall", { - user_id: user_id, - message_id: common.genGroupMessageId(user_id, data.msgSeq, data.msgRandom) + user_id, message_id: common.genGroupMessageId(user_id, data.msgSeq, data.msgRandom) }); } else if (data[0] === 0xB3) { data = pb.decode("SubB3", data[10]); @@ -662,13 +657,17 @@ function decodeFriendAndGroupEvent(blob, c) { })(); } else if (data[0] === 0xD4) { data = pb.decode("SubD4", data[10]) - const group_id = toInt(data.uin); + const group_id = toInt(data.groupCode); c.group_list.delete(group_id); c.group_member_list.delete(group_id); } if (data[0] === 0x3B) { - // 显示头衔 - // 隐藏头衔 + data = pb.decode("Sub3B", data[10]) + const group_id = toInt(data.groupCode); + event.emit(c, "notice.group.setting", { + group_id, user_id: -1, + enable_show_title: data.enableShowTitle > 0 + }); } if (data[0] === 0x44) {} if (data[0] === 0x27) { @@ -697,11 +696,7 @@ function decodeFriendAndGroupEvent(blob, c) { user_id, nickname }); } - // 修改群名 // 加群头像 - // 好友减少 - // 好友增加 - // 好友增加 } } else if (v[2] === 732) { const group_id = v[6].readUInt32BE(); @@ -747,42 +742,77 @@ function decodeFriendAndGroupEvent(blob, c) { }); } } - // common.log(v[6].toString("hex").replace(/(.)(.)/g, '$1$2 ')) - // <44 25 6e 9f>是群号 <16 3a 37 f5>是qq号 - // 群文件上传权限 允许所有人 - // 群文件上传权限 仅管理员 - // 群相册上传权限 允许所有人 - // 群相册上传权限 仅管理员 - // 允许游客 进入但不能发言 - // 允许匿名 - // 禁止匿名 + + const o = v[6]; + let user_id, field, enable; + if (o[4] === 0x06 && o[5] === 1) { + field = "enable_guest", enable = o[10] > 0; + user_id = o.readUInt32BE(6); + } + else if (o[4] === 0x0e && o[5] === 1) { + field = "enable_anonymous", enable = o[10] === 0; + user_id = o.readUInt32BE(6); + } + else if (o[4] === 0x0f && o[5] === 0) { + if (o[12] === 1) + field = "enable_upload_album"; + else if (o[12] === 2) + field = "enable_upload_file"; + enable = o[8] === 0; + user_id = c.group_list.get(group_id).owner_id; + } + else if (o[4] === 0x10) { + if (o[6] === 0x3b) { + const str = o.slice(33).toString(); + if (str.includes("坦白说")) { + field = "enable_confess"; + enable = str.includes("开启"); + user_id = -1; + } + else if (str.includes("临时会话")) { + field = "enable_temp_chat"; + enable = str.includes("允许"); + user_id = c.group_list.get(group_id).owner_id; + } + } + if (o[6] === 0x41) { + field = "enable_new_group"; + enable = !o.slice(33).toString().includes("禁止"); + user_id = c.group_list.get(group_id).owner_id; + } + if (o[6] === 0x23 || o[6] === 0x26) { + field = "enable_cowrite"; + enable = o[6] === 0x23; + user_id = -1; + } + if (o[6] === 0x22) { + if (o[o.length - 2] === 0x08) + field = "enable_show_honor"; + if (o[o.length - 2] === 0x10) + field = "enable_show_level"; + enable = o[o.length - 1] === 0; + user_id = -1; + } + } else { + continue; + } + if (field && enable !== undefined) { + const e = { + group_id, user_id + }; + e[field] = enable; + event.emit(c, "notice.group.setting", e); + } // 改群分类 - // 允许临会 - // 禁止临会 - // 允许新群 - // 禁止新群 - // 开一起写 - // 关一起写 - // 开坦白说 - // 关坦白说 - // 开互动标 - // 关互动标 - // 展示等级 - // 隐藏等级 // 头衔变更 } } + c.write(outgoing.buildOnlinePushResponsePacket(parent[3], seq, rubbish, c)); } -function decodeGroupMemberEvent(blob, c) { - if (!c.sync_finished) return; +function decodeGroupMemberEvent(blob, c, seq) { const o = pb.decode("TransMsgInfo", blob); - // common.log(o); - if (c.seq_cache["PbPush"].has(o.msgSeq)) - return; - c.seq_cache["PbPush"].add(o.msgSeq); - setTimeout(()=>{ - c.seq_cache["PbPush"].delete(o.msgSeq); - }, 30000); + c.write(outgoing.buildOnlinePushResponsePacket(o.svrIp, seq, [], c)); + if (!c.sync_finished) return; const buf = o.msgData; const group_id = buf.readUInt32BE(); if (o.msgType === 44) { @@ -1061,7 +1091,7 @@ module.exports = function parseIncomingPacket(packet, c) { if (flag2 === 2) sso.payload = parseOICQ(sso.payload); if (decoders.has(sso.command_name)) - ret = decoders.get(sso.command_name)(sso.payload, c); + ret = decoders.get(sso.command_name)(sso.payload, c, sso.seq_id); if (c.handlers.has(sso.seq_id)) c.handlers.get(sso.seq_id)(ret); }; diff --git a/lib/outgoing.js b/lib/outgoing.js index 1f94c1bd..cfab2636 100644 --- a/lib/outgoing.js +++ b/lib/outgoing.js @@ -46,7 +46,7 @@ const CMD = { GROUP_MSG: "OnlinePush.PbPushGroupMsg", //recv(event) PUSH_NOTIFY: "MessageSvc.PushNotify", //recv(event) ONLINE_PUSH: "OnlinePush.ReqPush", //recv(event) - // ONLINE_PUSHR: "OnlinePush.RespPush", //send 意味不明 + ONLINE_PUSHR: "OnlinePush.RespPush", //send ONLINE_PB_PUSH: "OnlinePush.PbPushTransMsg", //recv(event) GROUP_LEAVE: "ProfileService.GroupMngReq", //send,recv @@ -81,6 +81,7 @@ const CMD = { // StatSvc.SvcReqMSFLoginNotify // MultiVideo.s2c // QualityTest.PushList +// OnlinePush.SidTicketExpired /** * @param {Client} c @@ -335,16 +336,17 @@ function buildChangeStatusRequestPacket(status, c) { } /** - * @param {Number} type UInt8 - * @param {Number} seq UInt32 + * @param {Number} jcetype UInt8 + * @param {Number} jceseq UInt32 * @param {Buffer} jcebuf */ -function buildConfPushResponsePacket(type, seq, jcebuf, c) { +function buildConfPushResponsePacket(jcetype, jceseq, jcebuf, seq, c) { c.nextSeq(); const PushResp = jce.encodeStruct([ - null, type, seq, jcebuf + null, jcetype, jceseq, jcebuf ]); const extra = { + req_id: seq, service: "QQService.ConfigPushSvc.MainServant", method: "PushResp", }; @@ -352,30 +354,25 @@ function buildConfPushResponsePacket(type, seq, jcebuf, c) { return commonUNI(c, CMD.PUSH_RESP, body); } -// /** -// * @param {Number} seq -// * @param {Buffer[]} msg -// * @param {Buffer} jcebuf -// */ -// function buildOnlinePushResponsePacket(svrip, seq, msg, c) { -// // c.nextSeq(); -// const resp = jce.encodeStruct([ -// c.uin, msg, 0, BUF0, 0, jce.encode([ -// BUF0, "", "", "", "", "" -// ]) -// ]); -// const extra = { -// req_id: seq, -// service: "OnlinePush", -// method: "SvcRespPushMsg", -// }; -// const body = jce.encodeWrapper({resp}, extra); -// return commonUNI(c, CMD.ONLINE_PUSHR, body, BUF0, seq); -// } -// function buildOnlinePushTransResponsePacket(seq, c) { -// const body = BUF0; -// return commonUNI(c, CMD.ONLINE_PUSHR, body, BUF0, seq); -// } +/** + * @param {Number} svrip + * @param {Number} seq + * @param {Buffer[]} rubbish + * @param {Buffer} jcebuf + */ +function buildOnlinePushResponsePacket(svrip, seq, rubbish, c) { + c.nextSeq(); + const resp = jce.encodeStruct([ + c.uin, rubbish, svrip, null, 0 + ]); + const extra = { + req_id: seq, + service: "OnlinePush", + method: "SvcRespPushMsg", + }; + const body = jce.encodeWrapper({resp}, extra); + return commonUNI(c, CMD.ONLINE_PUSHR, body, BUF0); +} //获取和删除消息---------------------------------------------------------------------------------------------------- @@ -422,19 +419,19 @@ function buildDeleteMessageRequestPacket(items ,c) { function buildFriendListRequestPacket(start, limit, c) { const d50 = pb.encode("D50ReqBody", { - appid: 1002, + appid: 10002, reqMusicSwitch: 1, reqMutualmarkAlienation: 1, reqKsingSwitch: 1, reqMutualmarkLbsshare: 1, + reqC8C77A: 1, }); const FL = jce.encodeStruct([ 3, - start?1:0, c.uin, start, limit, 0, 0, 0, 0, 0, 1, - 27, [], 0, 0, 0, d50, BUF0, [13580, 13581, 13582] + 1, c.uin, start, limit, 0, 0, 0, 0, 0, 1, + 31, null, 0, 0, 0, d50, BUF0, [13580, 13581, 13582] ]); const extra = { - pkt_type:0x003, req_id: c.nextSeq(), service: "mqq.IMService.FriendListServiceServantObj", method: "GetFriendListReq", @@ -445,10 +442,9 @@ function buildFriendListRequestPacket(start, limit, c) { function buildGroupListRequestPacket(c) { const GetTroopListReqV2Simplify = jce.encodeStruct([ - c.uin, 1, BUF0, [], 1, 7, 0, 1, 1 + c.uin, 1, null, [], 1, 8, 0, 1, 1 ]); const extra = { - pkt_type:0x00, req_id: c.nextSeq(), service: "mqq.IMService.FriendListServiceServantObj", method: "GetTroopListReqV2Simplify", @@ -1306,7 +1302,7 @@ module.exports = { buildHeartbeatRequestPacket, buildClientRegisterRequestPacket, buildConfPushResponsePacket, buildChangeStatusRequestPacket, // send&recv message - buildGetMessageRequestPacket, buildDeleteMessageRequestPacket, commonMessage, //buildOnlinePushResponsePacket, buildOnlinePushTransResponsePacket, + buildGetMessageRequestPacket, buildDeleteMessageRequestPacket, commonMessage, buildOnlinePushResponsePacket, // get list&info buildFriendListRequestPacket, buildGroupListRequestPacket, buildGroupMemberListRequestPacket, buildGroupInfoRequestPacket, diff --git a/lib/pb.js b/lib/pb.js index 4add1d1f..4ec5c309 100644 --- a/lib/pb.js +++ b/lib/pb.js @@ -632,6 +632,10 @@ var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $pr reqMutualmarkLbsshare: { type: "int32", id: 181001 + }, + reqC8C77A: { + type: "int32", + id: 251001 } } }, @@ -1382,9 +1386,21 @@ var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $pr } } }, + Sub3B: { + fields: { + groupCode: { + type: "int64", + id: 2 + }, + enableShowTitle: { + type: "int32", + id: 3 + }, + } + }, SubD4: { fields: { - uin: { + groupCode: { type: "int64", id: 1 } diff --git a/package-lock.json b/package-lock.json index 6a170ffb..990427dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "oicq", - "version": "1.6.0", + "version": "1.5.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2669ddc8..6bd33e67 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oicq", - "version": "1.6.0", + "version": "1.5.3", "description": "QQ protocol!", "main": "client.js", "scripts": {