1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-25 21:23:55 +08:00

Fix group info, e.g. isMuteAll, isAllowMemberInvite. Close

This commit is contained in:
Him188 2020-09-15 12:51:25 +08:00
parent 1018f1e80e
commit 19e8d8c6ed
8 changed files with 43 additions and 71 deletions
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid
mirai-core/src/commonMain/kotlin/net.mamoe.mirai

View File

@ -42,9 +42,13 @@ import net.mamoe.mirai.qqandroid.message.*
import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.highway.HighwayHelper
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopNum
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.LongMsg
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.*
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.MultiMsg
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.PbMessageSvc
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.calculateValidationDataForGroup
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.voice.PttStore
import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList
import net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils
@ -311,12 +315,22 @@ internal abstract class QQAndroidBotBase constructor(
}.groups.asSequence().map { it.groupUin.shl(32) and it.groupCode }
}
@Suppress(
"DeprecatedCallableAddReplaceWith",
"FunctionName",
"RedundantSuspendModifier",
"unused",
"unused_parameter"
)
@Deprecated("")
@OptIn(LowLevelAPI::class)
override suspend fun _lowLevelQueryGroupInfo(groupCode: Long): GroupInfo = network.run {
suspend fun _lowLevelQueryGroupInfo(groupCode: Long, stTroopNum: StTroopNum): GroupInfo = network.run {
error("This should not be invoked")
/*
TroopManagement.GetGroupInfo(
client = bot.client,
groupCode = groupCode
).sendAndExpect<GroupInfoImpl>(retry = 3)
).sendAndExpect<GroupInfoImpl>(retry = 3).also { it.stTroopNum = stTroopNum }*/
}
@OptIn(LowLevelAPI::class)

View File

@ -272,28 +272,11 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo
suspend fun StTroopNum.reloadGroup() {
retryCatching(3) {
bot.groups.delegate.addLast(
@Suppress("DuplicatedCode")
GroupImpl(
bot = bot,
coroutineContext = bot.coroutineContext,
id = groupCode,
groupInfo = bot._lowLevelQueryGroupInfo(groupCode).apply {
this as GroupInfoImpl
if (this.delegate.groupName == null) {
this.delegate.groupName = groupName
}
if (this.delegate.groupMemo == null) {
this.delegate.groupMemo = groupMemo
}
if (this.delegate.groupUin == null) {
this.delegate.groupUin = groupUin
}
this.delegate.groupCode = this@reloadGroup.groupCode
},
groupInfo = GroupInfoImpl(this),
members = bot._lowLevelQueryGroupMemberList(
groupUin,
groupCode,

View File

@ -172,13 +172,13 @@ internal class Oidb0x88d : ProtoBuf {
@ProtoNumber(12) @JvmField val groupDefaultPage: Int? = null,
@ProtoNumber(13) @JvmField val groupInfoSeq: Int? = null,
@ProtoNumber(14) @JvmField val groupRoamingTime: Int? = null,
@ProtoNumber(15) var groupName: String? = null,
@ProtoNumber(16) var groupMemo: String? = null,
@ProtoNumber(15) @JvmField val groupName: String? = null,
@ProtoNumber(16) @JvmField val groupMemo: String? = null,
@ProtoNumber(17) @JvmField val ingGroupFingerMemo: String? = null,
@ProtoNumber(18) @JvmField val ingGroupClassText: String? = null,
@ProtoNumber(19) @JvmField val groupAllianceCode: List<Int>? = null,
@ProtoNumber(20) @JvmField val groupExtraAdmNum: Int? = null,
@ProtoNumber(21) var groupUin: Long? = null,
@ProtoNumber(21) @JvmField val groupUin: Long? = null,
@ProtoNumber(22) @JvmField val groupCurMsgSeq: Int? = null,
@ProtoNumber(23) @JvmField val groupLastMsgTime: Int? = null,
@ProtoNumber(24) @JvmField val ingGroupQuestion: String? = null,
@ -258,7 +258,6 @@ internal class Oidb0x88d : ProtoBuf {
@ProtoNumber(98) @JvmField val cmduinRingtoneId: Int? = null,
@ProtoNumber(99) @JvmField val groupFlagext4: Int? = null,
@ProtoNumber(100) @JvmField val groupFreezeReason: Int? = null,
@ProtoNumber(101) var groupCode: Long? = null // mirai 添加
) : ProtoBuf
@Serializable

View File

@ -148,7 +148,7 @@ internal object KnownPacketFactories {
TroopManagement.EditSpecialTitle,
TroopManagement.Mute,
TroopManagement.GroupOperation,
TroopManagement.GetGroupInfo,
// TroopManagement.GetGroupInfo,
TroopManagement.EditGroupNametag,
TroopManagement.Kick,
Heartbeat.Alive,

View File

@ -14,13 +14,13 @@ import kotlinx.io.core.buildPacket
import kotlinx.io.core.readBytes
import kotlinx.io.core.toByteArray
import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.Packet
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.ModifyGroupCardReq
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPacket
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopNum
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.stUinInfo
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.*
import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
@ -32,19 +32,19 @@ import net.mamoe.mirai.data.GroupInfo as MiraiGroupInfo
@OptIn(LowLevelAPI::class)
internal class GroupInfoImpl(
internal val delegate: Oidb0x88d.GroupInfo
private val stTroopNum: StTroopNum
) : MiraiGroupInfo, Packet, Packet.NoLog {
override val uin: Long get() = delegate.groupUin ?: error("cannot find groupUin")
override val owner: Long get() = delegate.groupOwner ?: error("cannot find groupOwner")
override val groupCode: Long get() = Group.calculateGroupCodeByGroupUin(uin)
override val memo: String get() = delegate.groupMemo ?: error("cannot find groupMemo")
override val name: String get() = delegate.groupName ?: delegate.longGroupName ?: error("cannot find groupName")
override val allowMemberInvite get() = delegate.groupFlagExt?.and(0x000000c0) != 0
override val allowAnonymousChat get() = delegate.groupFlagExt?.and(0x40000000) == 0
override val autoApprove get() = delegate.groupFlagext3?.and(0x00100000) == 0
override val confessTalk get() = delegate.groupFlagext3?.and(0x00002000) == 0
override val muteAll: Boolean get() = delegate.shutupTimestamp != 0
override val botMuteTimestamp: Int get() = delegate.shutupTimestampMe ?: 0
override val uin: Long get() = stTroopNum.groupUin
override val owner: Long get() = stTroopNum.dwGroupOwnerUin
override val groupCode: Long get() = stTroopNum.groupCode
override val memo: String get() = stTroopNum.groupMemo
override val name: String get() = stTroopNum.groupName
override val allowMemberInvite get() = stTroopNum.dwGroupFlagExt?.and(0x000000c0) != 0L
override val allowAnonymousChat get() = stTroopNum.dwGroupFlagExt?.and(0x40000000) == 0L
override val autoApprove get() = stTroopNum.dwGroupFlagExt3?.and(0x00100000) == 0L
override val confessTalk get() = stTroopNum.dwGroupFlagExt3?.and(0x00002000) == 0L
override val muteAll: Boolean get() = stTroopNum.dwShutUpTimestamp != 0L
override val botMuteTimestamp: Int get() = stTroopNum.dwMyShutUpTimestamp?.toInt() ?: 0
}
internal class TroopManagement {
@ -88,6 +88,7 @@ internal class TroopManagement {
internal object GetGroupInfo : OutgoingPacketFactory<GroupInfoImpl>("OidbSvc.0x88d_7") {
@Deprecated("")
operator fun invoke(
client: QQAndroidClient,
groupCode: Long
@ -107,8 +108,8 @@ internal class TroopManagement {
groupFlagExt = 0,
groupFlagext4 = 0,
groupFlag = 0,
groupFlagext3 = 0,//获取confess
noFingerOpenFlag = 0,
groupFlagext3 = 1,//获取confess
noFingerOpenFlag = 1,
cmduinFlagEx2 = 0,
groupTypeFlag = 0,
appPrivilegeFlag = 0,
@ -135,12 +136,14 @@ internal class TroopManagement {
}
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): GroupInfoImpl {
error("deprecated")
/*
with(
this.readBytes()
.loadAs(OidbSso.OIDBSSOPkg.serializer()).bodybuffer.loadAs(Oidb0x88d.RspBody.serializer()).stzrspgroupinfo!![0].stgroupinfo!!
) {
return GroupInfoImpl(this)
}
return GroupInfoImpl()
}*/
}
}

View File

@ -454,28 +454,11 @@ internal suspend fun QQAndroidBot.getNewGroup(groupCode: Long): Group? {
.sendAndExpect<FriendList.GetTroopListSimplify.Response>(timeoutMillis = 10_000, retry = 5)
}.groups.firstOrNull { it.groupCode == groupCode } ?: return null
@Suppress("DuplicatedCode")
return GroupImpl(
bot = this,
coroutineContext = coroutineContext,
id = groupCode,
groupInfo = _lowLevelQueryGroupInfo(troopNum.groupCode).apply {
this as GroupInfoImpl
if (this.delegate.groupName == null) {
this.delegate.groupName = troopNum.groupName
}
if (this.delegate.groupMemo == null) {
this.delegate.groupMemo = troopNum.groupMemo
}
if (this.delegate.groupUin == null) {
this.delegate.groupUin = troopNum.groupUin
}
this.delegate.groupCode = troopNum.groupCode
},
groupInfo = GroupInfoImpl(troopNum),
members = _lowLevelQueryGroupMemberList(
troopNum.groupUin,
troopNum.groupCode,

View File

@ -9,13 +9,10 @@
package net.mamoe.mirai.data
import net.mamoe.mirai.Bot
import net.mamoe.mirai.LowLevelAPI
/**
* 群资料.
*
* 通过 [Bot._lowLevelQueryGroupInfo] 得到
*/
@LowLevelAPI
public interface GroupInfo {

View File

@ -55,13 +55,6 @@ public interface LowLevelBotAPIAccessor {
@LowLevelAPI
public suspend fun _lowLevelQueryGroupList(): Sequence<Long>
/**
* 向服务器查询群资料. 获得的仅为当前时刻的资料.
* 请优先使用 [Bot.getGroup] 然后查看群资料.
*/
@LowLevelAPI
public suspend fun _lowLevelQueryGroupInfo(groupCode: Long): GroupInfo
/**
* 向服务器查询群成员列表.
* 请优先使用 [Bot.getGroup], [Group.members] 查看群成员.