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 ...@@ -11,15 +11,13 @@ import net.mamoe.mirai.contact.internal.Group
import net.mamoe.mirai.contact.internal.QQ import net.mamoe.mirai.contact.internal.QQ
import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler 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.GroupPacket
import net.mamoe.mirai.network.protocol.tim.packet.action.RawGroupInfo 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.LoginResult
import net.mamoe.mirai.network.protocol.tim.packet.login.isSuccess import net.mamoe.mirai.network.protocol.tim.packet.login.isSuccess
import net.mamoe.mirai.network.qqAccount import net.mamoe.mirai.network.qqAccount
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.internal.PositiveNumbers import net.mamoe.mirai.utils.internal.PositiveNumbers
import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail
import net.mamoe.mirai.utils.io.inline import net.mamoe.mirai.utils.io.inline
...@@ -165,10 +163,10 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo ...@@ -165,10 +163,10 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
val bot: Bot get() = this@Bot val bot: Bot get() = this@Bot
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
val groups: ContactList<Group> = ContactList(MutableContactList<Group>()) val groups: ContactList<Group> = ContactList(MutableContactList())
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
val qqs: ContactList<QQ> = ContactList(MutableContactList<QQ>()) val qqs: ContactList<QQ> = ContactList(MutableContactList())
/** /**
* 线程安全地获取缓存的 QQ 对象. 若没有对应的缓存, 则会创建一个. * 线程安全地获取缓存的 QQ 对象. 若没有对应的缓存, 则会创建一个.
...@@ -192,10 +190,15 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo ...@@ -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 { suspend fun getGroup(id: GroupId): Group = groups.delegate.getOrNull(id.value) ?: inline {
val info: RawGroupInfo = try { 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) { } catch (e: Exception) {
throw IllegalStateException("Cannot obtain group info for id ${id.value.toLong()}", e) throw IllegalStateException("Cannot obtain group info for id ${id.value.toLong()}", e)
} }
......
...@@ -4,12 +4,14 @@ package net.mamoe.mirai.network.protocol.tim.packet.event ...@@ -4,12 +4,14 @@ package net.mamoe.mirai.network.protocol.tim.packet.event
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact import kotlinx.io.core.discardExact
import kotlinx.io.core.readBytes
import kotlinx.io.core.readUInt import kotlinx.io.core.readUInt
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.getGroup import net.mamoe.mirai.getGroup
import net.mamoe.mirai.qqAccount import net.mamoe.mirai.qqAccount
import net.mamoe.mirai.utils.io.toUHexString
// region mute // region mute
/** /**
...@@ -73,15 +75,23 @@ sealed class UnmuteEvent : EventOfMute() { ...@@ -73,15 +75,23 @@ sealed class UnmuteEvent : EventOfMute() {
// endregion // 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 { sealed class EventOfMute : EventPacket {
abstract val operator: Member abstract val operator: Member
abstract val group: Group abstract val group: Group
} }
// TODO: 2019/12/14 这可能不只是禁言的包.
internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandler<EventOfMute>(0x02DCu) { internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandler<EventOfMute>(0x02DCu) {
override suspend fun ByteReadPacket.parse(bot: Bot, identity: EventPacketIdentity): EventOfMute { 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 // 01 01
// 22 96 29 7B // 22 96 29 7B
// 0C 01 // 0C 01
...@@ -92,7 +102,8 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl ...@@ -92,7 +102,8 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
// 00 00 00 00 // 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
// 01 // 01
// 22 96 29 7B // 22 96 29 7B
...@@ -104,28 +115,43 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl ...@@ -104,28 +115,43 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
// 01 // 01
// 76 E4 B8 DD // 76 E4 B8 DD
// 00 27 8D 00 // 00 27 8D 00
discardExact(19)
discardExact(2) discardExact(3)
val group = bot.getGroup(readUInt()) val flag = readByte().toUInt()
discardExact(2) return when (flag) {
val operator = group.getMember(readUInt()) 0x0Eu -> {
discardExact(4) //time //00 00 00 0E 00 08 00 02 00 01 00
discardExact(2) // 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
val memberQQ = readUInt() `Unknown0x02DCPacket_falg=0x0E_MaybeMutePacket`
val durationSeconds = readUInt().toInt()
return if (durationSeconds == 0) {
if (memberQQ == bot.qqAccount) {
BeingUnmutedEvent(operator)
} else {
MemberUnmuteEvent(group.getMember(memberQQ), operator)
} }
} else {
if (memberQQ == bot.qqAccount) { 0x11u -> {
BeingMutedEvent(durationSeconds, operator) discardExact(15)
} else { discardExact(2)
MemberMuteEvent(group.getMember(memberQQ), durationSeconds, operator) val group = bot.getGroup(readUInt())
discardExact(2)
val operator = group.getMember(readUInt())
discardExact(4) //time
discardExact(2)
val memberQQ = readUInt()
val durationSeconds = readUInt().toInt()
if (durationSeconds == 0) {
if (memberQQ == bot.qqAccount) {
BeingUnmutedEvent(operator)
} else {
MemberUnmuteEvent(group.getMember(memberQQ), operator)
}
} else {
if (memberQQ == bot.qqAccount) {
BeingMutedEvent(durationSeconds, operator)
} else {
MemberMuteEvent(group.getMember(memberQQ), durationSeconds, operator)
}
}
} }
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