Commit 408accb8 authored by Him188's avatar Him188

Add GroupNotFound, fix #15

parent 5be14fdc
......@@ -11,15 +11,13 @@ import net.mamoe.mirai.contact.internal.Group
import net.mamoe.mirai.contact.internal.QQ
import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler
import net.mamoe.mirai.network.protocol.tim.packet.action.GroupNotFound
import net.mamoe.mirai.network.protocol.tim.packet.action.GroupPacket
import net.mamoe.mirai.network.protocol.tim.packet.action.RawGroupInfo
import net.mamoe.mirai.network.protocol.tim.packet.login.LoginResult
import net.mamoe.mirai.network.protocol.tim.packet.login.isSuccess
import net.mamoe.mirai.network.qqAccount
import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.internal.PositiveNumbers
import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail
import net.mamoe.mirai.utils.io.inline
......@@ -165,10 +163,10 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
val bot: Bot get() = this@Bot
@UseExperimental(MiraiInternalAPI::class)
val groups: ContactList<Group> = ContactList(MutableContactList<Group>())
val groups: ContactList<Group> = ContactList(MutableContactList())
@UseExperimental(MiraiInternalAPI::class)
val qqs: ContactList<QQ> = ContactList(MutableContactList<QQ>())
val qqs: ContactList<QQ> = ContactList(MutableContactList())
/**
* 线程安全地获取缓存的 QQ 对象. 若没有对应的缓存, 则会创建一个.
......@@ -192,10 +190,15 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
/**
* 线程安全地获取缓存的群对象. 若没有对应的缓存, 则会创建一个.
*/
@UseExperimental(MiraiInternalAPI::class)
@UseExperimental(MiraiInternalAPI::class, ExperimentalUnsignedTypes::class)
suspend fun getGroup(id: GroupId): Group = groups.delegate.getOrNull(id.value) ?: inline {
val info: RawGroupInfo = try {
bot.withSession { GroupPacket.QueryGroupInfo(qqAccount, id.toInternalId(), sessionKey).sendAndExpect() }
when (val response =
bot.withSession { GroupPacket.QueryGroupInfo(qqAccount, id.toInternalId(), sessionKey).sendAndExpect<GroupPacket.InfoResponse>() }) {
is RawGroupInfo -> response
is GroupNotFound -> throw GroupNotFoundException("id=${id.value.toLong()}")
else -> assertUnreachable()
}
} catch (e: Exception) {
throw IllegalStateException("Cannot obtain group info for id ${id.value.toLong()}", e)
}
......
......@@ -36,6 +36,10 @@ class GroupInfo(
"GroupInfo(id=${group.id}, owner=$owner, name=$name, announcement=$announcement, members=${members.idContentString}"
}
internal object GroupNotFound : GroupPacket.InfoResponse {
override fun toString(): String = "GroupPacket.InfoResponse.GroupNotFound"
}
internal data class RawGroupInfo(
val group: UInt,
val owner: UInt,
......@@ -45,17 +49,21 @@ internal data class RawGroupInfo(
* 含群主
*/
val members: Map<UInt, MemberPermission>
) : GroupPacket.GroupPacketResponse {
) : GroupPacket.InfoResponse {
@Suppress("NOTHING_TO_INLINE") // this function it only executed in one place.
@UseExperimental(MiraiInternalAPI::class)
suspend inline fun parseBy(group: Group): GroupInfo = group.bot.withSession {
inline fun parseBy(group: Group): GroupInfo = group.bot.withSession {
val memberList = MutableContactList<Member>()
members.forEach { entry: Map.Entry<UInt, MemberPermission> ->
entry.key.qq().let { group.Member(it, entry.value, it.coroutineContext) }
}
return GroupInfo(
group,
this@RawGroupInfo.owner.qq().let { Member(it, group, MemberPermission.OWNER, it.coroutineContext) },
this@RawGroupInfo.owner.qq().let { group.Member(it, MemberPermission.OWNER, it.coroutineContext) },
this@RawGroupInfo.name,
this@RawGroupInfo.announcement,
ContactList(this@RawGroupInfo.members.mapValuesTo(MutableContactList()) { entry: Map.Entry<UInt, MemberPermission> ->
entry.key.qq().let { Member(it,group, entry.value, it.coroutineContext) }
})
ContactList(memberList)
)
}
}
......@@ -159,6 +167,8 @@ internal object GroupPacket : SessionPacketFactory<GroupPacket.GroupPacketRespon
override fun toString(): String = "GroupPacket.MuteResponse"
}
internal interface InfoResponse : Packet, GroupPacketResponse
@PacketVersion(date = "2019.11.27", timVersion = "2.3.2 (21173)")
@UseExperimental(ExperimentalStdlibApi::class)
override suspend fun ByteReadPacket.decode(
......@@ -166,7 +176,7 @@ internal object GroupPacket : SessionPacketFactory<GroupPacket.GroupPacketRespon
sequenceId: UShort,
handler: BotNetworkHandler<*>
): GroupPacketResponse {
return when (readUByte().toUInt()) {
return when (val packetType = readUByte().toUInt()) {
0x2Au -> MessageResponse
0x7Eu -> MuteResponse // 成功: 7E 00 22 96 29 7B;
......@@ -179,7 +189,9 @@ internal object GroupPacket : SessionPacketFactory<GroupPacket.GroupPacketRespon
}
0x72u -> {
discardExact(1) // 00
when (val flag = readByte().toInt()) {
0x02 -> GroupNotFound
0x00 -> {
discardExact(4) // group internal id
val group = readUInt() // group id
......@@ -351,8 +363,11 @@ internal object GroupPacket : SessionPacketFactory<GroupPacket.GroupPacketRespon
* C5 15 BE BE 00 00
*/
}
else -> unsupportedFlag("GroupPacketResponse typed 0x72", flag.toUHexString())
}
}
else -> unsupported()
else -> unsupportedType("GroupPacketResponse", packetType.toUHexString())
}
}
}
\ No newline at end of file
......@@ -4,12 +4,14 @@ package net.mamoe.mirai.network.protocol.tim.packet.event
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact
import kotlinx.io.core.readBytes
import kotlinx.io.core.readUInt
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.getGroup
import net.mamoe.mirai.qqAccount
import net.mamoe.mirai.utils.io.toUHexString
// region mute
/**
......@@ -73,15 +75,23 @@ sealed class UnmuteEvent : EventOfMute() {
// endregion
internal object `Unknown0x02DCPacket_falg=0x0E_MaybeMutePacket` : EventOfMute() {
override val operator: Member get() = error("Getting a field from Unknown0x02DCPacket_MaybeMutePacket")
override val group: Group get() = error("Getting a field from Unknown0x02DCPacket_MaybeMutePacket")
}
sealed class EventOfMute : EventPacket {
abstract val operator: Member
abstract val group: Group
}
// TODO: 2019/12/14 这可能不只是禁言的包.
internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandler<EventOfMute>(0x02DCu) {
override suspend fun ByteReadPacket.parse(bot: Bot, identity: EventPacketIdentity): EventOfMute {
//取消
//00 00 00 11 00 0A 00 04 01 00 00 00 00 0C 00 05 00 01 00
//00 00 00 11 00
// 0A 00 04 01 00 00 00 00 0C 00 05 00 01 00
// 01 01
// 22 96 29 7B
// 0C 01
......@@ -92,7 +102,8 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
// 00 00 00 00
// 禁言
//00 00 00 11 00 0A 00 04 01 00 00 00 00 0C 00 05 00 01 00
//00 00 00 11 00
// 0A 00 04 01 00 00 00 00 0C 00 05 00 01 00
// 01
// 01
// 22 96 29 7B
......@@ -104,7 +115,18 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
// 01
// 76 E4 B8 DD
// 00 27 8D 00
discardExact(19)
discardExact(3)
val flag = readByte().toUInt()
return when (flag) {
0x0Eu -> {
//00 00 00 0E 00 08 00 02 00 01 00
// 0A 00 04 01 00 00 00 35 DB 60 A2 11 00 3E 08 07 20 A2 C1 ED AE 03 5A 34 08 A2 FF 8C F0 03 1A 19 08 F4 0E 10 FE 8C D3 EF 05 18 84 A1 F8 F9 06 20 00 28 00 30 A2 FF 8C F0 03 2A 0D 08 00 12 09 08 F4 0E 10 00 18 01 20 00 30 00 38 00
`Unknown0x02DCPacket_falg=0x0E_MaybeMutePacket`
}
0x11u -> {
discardExact(15)
discardExact(2)
val group = bot.getGroup(readUInt())
discardExact(2)
......@@ -114,7 +136,7 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
val memberQQ = readUInt()
val durationSeconds = readUInt().toInt()
return if (durationSeconds == 0) {
if (durationSeconds == 0) {
if (memberQQ == bot.qqAccount) {
BeingUnmutedEvent(operator)
} else {
......@@ -128,4 +150,8 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
}
}
}
else -> error("Unsupported flag in 0x02DC packet. flag=$flag, remainning=${readBytes().toUHexString()}")
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment