Commit ff96ee7e authored by Him188's avatar Him188

Add extra generic type for sender

parent ca212ca7
...@@ -48,7 +48,7 @@ object EventPacketFactory : PacketFactory<Packet, SessionKey>(SessionKey) { ...@@ -48,7 +48,7 @@ object EventPacketFactory : PacketFactory<Packet, SessionKey>(SessionKey) {
discardExact(2) // 1F 40 discardExact(2) // 1F 40
return with(matchEventPacketFactory(readUShort())) { parse(handler.bot, eventIdentity) }.also { return with(matchEventPacketFactory(readUShort())) { parse(handler.bot, eventIdentity) }.also {
if (it is MessagePacket<*>) { if (it is MessagePacket<*, *>) {
it.botVar = handler.bot it.botVar = handler.bot
} }
......
...@@ -17,10 +17,7 @@ import net.mamoe.mirai.message.internal.readMessageChain ...@@ -17,10 +17,7 @@ import net.mamoe.mirai.message.internal.readMessageChain
import net.mamoe.mirai.network.protocol.tim.packet.PacketVersion import net.mamoe.mirai.network.protocol.tim.packet.PacketVersion
import net.mamoe.mirai.network.protocol.tim.packet.action.ImageLink import net.mamoe.mirai.network.protocol.tim.packet.action.ImageLink
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.io.printTLVMap import net.mamoe.mirai.utils.io.*
import net.mamoe.mirai.utils.io.read
import net.mamoe.mirai.utils.io.readTLVMap
import net.mamoe.mirai.utils.io.readUShortLVByteArray
import net.mamoe.mirai.withSession import net.mamoe.mirai.withSession
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
...@@ -28,10 +25,10 @@ import kotlin.jvm.JvmName ...@@ -28,10 +25,10 @@ import kotlin.jvm.JvmName
* 平台相关扩展 * 平台相关扩展
*/ */
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
expect abstract class MessagePacket<TSubject : Contact>() : MessagePacketBase<TSubject> expect abstract class MessagePacket<TSender : QQ, TSubject : Contact>() : MessagePacketBase<TSender, TSubject>
@MiraiInternalAPI @MiraiInternalAPI
abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() { abstract class MessagePacketBase<TSender : QQ, TSubject : Contact> : EventPacket, BotEvent() {
internal lateinit var botVar: Bot internal lateinit var botVar: Bot
override val bot: Bot get() = botVar override val bot: Bot get() = botVar
...@@ -49,7 +46,7 @@ abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() { ...@@ -49,7 +46,7 @@ abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() {
/** /**
* 发送人 * 发送人
*/ */
abstract val sender: QQ abstract val sender: TSender
abstract val message: MessageChain abstract val message: MessageChain
...@@ -97,7 +94,7 @@ abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() { ...@@ -97,7 +94,7 @@ abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() {
// region group message // region group message
@Suppress("unused") @Suppress("unused", "NOTHING_TO_INLINE")
data class GroupMessage( data class GroupMessage(
val group: Group, val group: Group,
val senderName: String, val senderName: String,
...@@ -105,16 +102,17 @@ data class GroupMessage( ...@@ -105,16 +102,17 @@ data class GroupMessage(
* 发送方权限. * 发送方权限.
*/ */
val permission: MemberPermission, val permission: MemberPermission,
override val sender: QQ, override val sender: Member,
override val message: MessageChain override val message: MessageChain
) : MessagePacket<Group>() { ) : MessagePacket<Member, Group>() {
override val subject: Group get() = group override val subject: Group get() = group
inline fun At.member(): Member = group.getMember(this.target)
suspend inline fun At.member(): Member = group.getMember(this.target) inline fun UInt.member(): Member = group.getMember(this)
suspend inline fun UInt.member(): Member = group.getMember(this) inline fun Long.member(): Member = group.getMember(this.toUInt())
suspend inline fun Long.member(): Member = group.getMember(this.toUInt()) override fun toString(): String =
"GroupMessage(group=${group.id}, senderName=$senderName, sender=${sender.id}, permission=${permission.name}, message=$message)"
} }
@PacketVersion(date = "2019.11.2", timVersion = "2.3.2 (21173)") @PacketVersion(date = "2019.11.2", timVersion = "2.3.2 (21173)")
...@@ -128,38 +126,43 @@ internal object GroupMessageEventParserAndHandler : KnownEventParserAndHandler<G ...@@ -128,38 +126,43 @@ internal object GroupMessageEventParserAndHandler : KnownEventParserAndHandler<G
discardExact(48) discardExact(48)
readUShortLVByteArray() readUShortLVByteArray()
discardExact(2)//2个0x00 discardExact(2)//2个0x00
val message = readMessageChain()
var senderPermission: MemberPermission = MemberPermission.MEMBER with(this.debugPrint("群消息")) {
var senderName = "" val message = readMessageChain()
val map = readTLVMap(true)
if (map.containsKey(18u)) { var senderPermission: MemberPermission = MemberPermission.MEMBER
map.getValue(18u).read { var senderName = ""
val tlv = readTLVMap(true) val map = readTLVMap(true)
senderPermission = when (tlv.takeIf { it.containsKey(0x04u) }?.get(0x04u)?.getOrNull(3)?.toUInt()) { if (map.containsKey(18u)) {
null -> MemberPermission.MEMBER map.getValue(18u).read {
0x08u -> MemberPermission.OWNER val tlv = readTLVMap(true)
0x10u -> MemberPermission.OPERATOR senderPermission = when (tlv.takeIf { it.containsKey(0x04u) }?.get(0x04u)?.getOrNull(3)?.toUInt()) {
else -> { null -> MemberPermission.MEMBER
tlv.printTLVMap("TLV(tag=18) Map") 0x08u -> MemberPermission.OWNER
MiraiLogger.warning("Could not determine member permission, default permission MEMBER is being used") 0x10u -> MemberPermission.ADMINISTRATOR
MemberPermission.MEMBER else -> {
tlv.printTLVMap("TLV(tag=18) Map")
MiraiLogger.warning("Could not determine member permission, default permission MEMBER is being used")
MemberPermission.MEMBER
}
} }
}
senderName = when { senderName = when {
tlv.containsKey(0x01u) -> String(tlv.getValue(0x01u))//这个人的qq昵称 tlv.containsKey(0x01u) -> String(tlv.getValue(0x01u))//这个人的qq昵称
tlv.containsKey(0x02u) -> String(tlv.getValue(0x02u))//这个人的群名片 tlv.containsKey(0x02u) -> String(tlv.getValue(0x02u))//这个人的群名片
else -> { else -> {
tlv.printTLVMap("TLV(tag=18) Map") tlv.printTLVMap("TLV(tag=18) Map")
MiraiLogger.warning("Could not determine senderName") MiraiLogger.warning("Could not determine senderName")
"null" "null"
}
} }
} }
} }
val group = bot.getGroup(groupNumber)
return GroupMessage(group, senderName, senderPermission, group.getMember(qq), message).apply { this.botVar = bot }
} }
return GroupMessage(bot.getGroup(groupNumber), senderName, senderPermission, bot.getQQ(qq), message)
} }
} }
...@@ -174,7 +177,7 @@ data class FriendMessage( ...@@ -174,7 +177,7 @@ data class FriendMessage(
val previous: Boolean, val previous: Boolean,
override val sender: QQ, override val sender: QQ,
override val message: MessageChain override val message: MessageChain
) : MessagePacket<QQ>(), BroadcastControllable { ) : MessagePacket<QQ, QQ>(), BroadcastControllable {
/** /**
* 是否应被自动广播. 此为内部 API * 是否应被自动广播. 此为内部 API
*/ */
...@@ -205,7 +208,7 @@ internal object FriendMessageEventParserAndHandler : KnownEventParserAndHandler< ...@@ -205,7 +208,7 @@ internal object FriendMessageEventParserAndHandler : KnownEventParserAndHandler<
previous = previous, previous = previous,
sender = bot.getQQ(identity.from), sender = bot.getQQ(identity.from),
message = message message = message
) ).apply { this.botVar = bot }
} }
} }
// endregion // endregion
\ No newline at end of file
...@@ -8,6 +8,7 @@ import kotlinx.io.core.Input ...@@ -8,6 +8,7 @@ import kotlinx.io.core.Input
import kotlinx.io.core.use import kotlinx.io.core.use
import kotlinx.io.streams.inputStream import kotlinx.io.streams.inputStream
import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.message.* import net.mamoe.mirai.message.*
import net.mamoe.mirai.utils.ExternalImage import net.mamoe.mirai.utils.ExternalImage
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
...@@ -23,7 +24,7 @@ import javax.imageio.ImageIO ...@@ -23,7 +24,7 @@ import javax.imageio.ImageIO
* JVM 平台相关扩展 * JVM 平台相关扩展
*/ */
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
actual abstract class MessagePacket<TSubject : Contact> : MessagePacketBase<TSubject>() { actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> : MessagePacketBase<TSender, TSubject>() {
suspend inline fun uploadImage(image: BufferedImage): Image = subject.uploadImage(image) suspend inline fun uploadImage(image: BufferedImage): Image = subject.uploadImage(image)
suspend inline fun uploadImage(image: URL): Image = subject.uploadImage(image) suspend inline fun uploadImage(image: URL): Image = subject.uploadImage(image)
suspend inline fun uploadImage(image: Input): Image = subject.uploadImage(image) suspend inline fun uploadImage(image: Input): Image = subject.uploadImage(image)
......
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