From 6f67edfdfa95c53a0806dd151082a374d786b2d4 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Wed, 5 Feb 2020 21:31:22 +0800 Subject: [PATCH] GetGroupOperationInfo --- .../net/mamoe/mirai/qqandroid/ContactImpl.kt | 11 ++++---- .../network/QQAndroidBotNetworkHandler.kt | 28 ++++++++++++++----- .../network/protocol/packet/PacketFactory.kt | 4 +-- .../protocol/packet/chat/TroopManagement.kt | 24 +++++++++++----- .../kotlin/test/ProtoBufDataClassGenerator.kt | 2 +- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt index 6fca26a11..1aaee6040 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt @@ -1,6 +1,5 @@ package net.mamoe.mirai.qqandroid -import kotlinx.coroutines.async import kotlinx.coroutines.launch import net.mamoe.mirai.contact.* import net.mamoe.mirai.data.FriendNameRemark @@ -134,7 +133,7 @@ internal class GroupImpl( if (this.botPermission != MemberPermission.MEMBER && oldValue != newValue) { this.bot.launch { bot.network.run { - TroopManagement.updateGroupInfo.name( + TroopManagement.GroupOperation.name( client = bot.client, groupCode = id, newName = newValue @@ -148,7 +147,7 @@ internal class GroupImpl( if (this.botPermission != MemberPermission.MEMBER && oldValue != newValue) { this.bot.launch { bot.network.run { - TroopManagement.updateGroupInfo.memo( + TroopManagement.GroupOperation.memo( client = bot.client, groupCode = id, newMemo = newValue @@ -163,7 +162,7 @@ internal class GroupImpl( if (this.botPermission != MemberPermission.MEMBER && oldValue != newValue) { this.bot.launch { bot.network.run { - TroopManagement.updateGroupInfo.allowMemberInvite( + TroopManagement.GroupOperation.allowMemberInvite( client = bot.client, groupCode = id, switch = newValue @@ -185,7 +184,7 @@ internal class GroupImpl( if (this.botPermission != MemberPermission.MEMBER && oldValue != newValue) { this.bot.launch { bot.network.run { - TroopManagement.updateGroupInfo.confessTalk( + TroopManagement.GroupOperation.confessTalk( client = bot.client, groupCode = id, switch = newValue @@ -200,7 +199,7 @@ internal class GroupImpl( if (this.botPermission != MemberPermission.MEMBER && oldValue != newValue) { this.bot.launch { bot.network.run { - TroopManagement.updateGroupInfo.muteAll( + TroopManagement.GroupOperation.muteAll( client = bot.client, groupCode = id, switch = newValue diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index 58ff17323..5650d5404 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -161,6 +161,20 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler val toGet: MutableMap> = mutableMapOf() troopData.groups.forEach { val contactList = ContactList(LockFreeLinkedList()) + val groupInfoResponse = try { + TroopManagement.GetGroupOperationInfo( + client = bot.client, + groupCode = it.groupCode + ).sendAndExpect() + } catch (e: Exception) { + bot.logger.info("获取" + it.groupCode + "的群设置失败") + TroopManagement.GetGroupOperationInfo.Response( + allowAnonymousChat = false, + allowMemberInvite = false, + autoApprove = false, + confessTalk = false + ) + } val group = GroupImpl( bot = bot, @@ -169,11 +183,11 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler uin = it.groupUin, initName = it.groupName, initAnnouncement = it.groupMemo, - initAllowMemberInvite = false, - initConfessTalk = false, - initMuteAll = false, - initAutoApprove = false, - initAnonymousChat = false, + initAllowMemberInvite = groupInfoResponse.allowMemberInvite, + initConfessTalk = groupInfoResponse.confessTalk, + initMuteAll = false,//todo + initAutoApprove = groupInfoResponse.autoApprove, + initAnonymousChat = groupInfoResponse.allowAnonymousChat, members = contactList ) group.owner = @@ -244,10 +258,10 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler } suspend fun getGroupInfo(uin: Long) { - val data = TroopManagement.getGroupInfo( + val data = TroopManagement.GetGroupOperationInfo( client = bot.client, groupCode = uin - ).sendAndExpect(timeoutMillis = 3000) + ).sendAndExpect(timeoutMillis = 3000) } suspend fun getTroopMemberList(group: GroupImpl, list: ContactList, owner: Long): ContactList { diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt index a79dccefb..6fb982654 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt @@ -127,8 +127,8 @@ internal object KnownPacketFactories { LongConn.OffPicDown, TroopManagement.EditNametag, TroopManagement.Mute, - TroopManagement.updateGroupInfo, - TroopManagement.getGroupInfo + TroopManagement.GroupOperation, + TroopManagement.GetGroupOperationInfo ) object IncomingFactories : List> by mutableListOf( diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt index 685064d7a..ae0db6fd6 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt @@ -6,6 +6,7 @@ import kotlinx.io.core.readBytes import kotlinx.io.core.toByteArray import net.mamoe.mirai.data.Packet import net.mamoe.mirai.qqandroid.QQAndroidBot +import net.mamoe.mirai.qqandroid.io.serialization.loadAs import net.mamoe.mirai.qqandroid.io.serialization.toByteArray import net.mamoe.mirai.qqandroid.io.serialization.writeProtoBuf import net.mamoe.mirai.qqandroid.network.QQAndroidClient @@ -18,7 +19,6 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket import net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket import net.mamoe.mirai.utils.daysToSeconds -import net.mamoe.mirai.utils.io.debugPrintThis internal object TroopManagement { @@ -58,9 +58,13 @@ internal object TroopManagement { } - internal object getGroupInfo : OutgoingPacketFactory("OidbSvc.0x88d_7") { - - class Response() : Packet + internal object GetGroupOperationInfo : OutgoingPacketFactory("OidbSvc.0x88d_7") { + class Response( + val allowAnonymousChat: Boolean, + val allowMemberInvite: Boolean, + val autoApprove: Boolean, + val confessTalk: Boolean + ) : Packet operator fun invoke( client: QQAndroidClient, @@ -104,12 +108,18 @@ internal object TroopManagement { } override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response { - debugPrintThis() - return Response() + with(this.readBytes().loadAs(OidbSso.OIDBSSOPkg.serializer()).bodybuffer.loadAs(Oidb0x88d.RspBody.serializer()).stzrspgroupinfo!![0].stgroupinfo!!) { + return Response( + allowMemberInvite = (this.groupFlagExt?.and(0x000000c0) != 0), + allowAnonymousChat = (this.groupFlagExt?.and(0x40000000) == 0), + autoApprove = (this.groupFlagext3?.and(0x00100000) == 0), + confessTalk = (this.groupFlagext3?.and(0x00002000) == 0) + ) + } } } - internal object updateGroupInfo : OutgoingPacketFactory("OidbSvc.0x89a_0") { + internal object GroupOperation : OutgoingPacketFactory("OidbSvc.0x89a_0") { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response { return Response } diff --git a/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt b/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt index 532eca0cf..2a576e6d4 100644 --- a/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt +++ b/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt @@ -6,7 +6,7 @@ import java.io.File fun main() { println( - File("""/Users/jiahua.liu/Desktop/QQAndroid-F/app/src/main/java/tencent/im/oidb/cmd0x88d/""") + File("""/Users/jiahua.liu/Desktop/QQAndroid-F/app/src/main/java/tencent/im/oidb/""") .generateUnarrangedClasses().toMutableList().arrangeClasses().joinToString("\n\n") ) }