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 #286
This commit is contained in:
parent
1018f1e80e
commit
19e8d8c6ed
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid
mirai-core/src/commonMain/kotlin/net.mamoe.mirai
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -148,7 +148,7 @@ internal object KnownPacketFactories {
|
||||
TroopManagement.EditSpecialTitle,
|
||||
TroopManagement.Mute,
|
||||
TroopManagement.GroupOperation,
|
||||
TroopManagement.GetGroupInfo,
|
||||
// TroopManagement.GetGroupInfo,
|
||||
TroopManagement.EditGroupNametag,
|
||||
TroopManagement.Kick,
|
||||
Heartbeat.Alive,
|
||||
|
@ -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()
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -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] 查看群成员.
|
||||
|
Loading…
Reference in New Issue
Block a user