mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-13 03:16:05 +08:00
Add extra generic type for sender
This commit is contained in:
parent
ca212ca716
commit
ff96ee7ebf
@ -48,7 +48,7 @@ object EventPacketFactory : PacketFactory<Packet, SessionKey>(SessionKey) {
|
||||
discardExact(2) // 1F 40
|
||||
|
||||
return with(matchEventPacketFactory(readUShort())) { parse(handler.bot, eventIdentity) }.also {
|
||||
if (it is MessagePacket<*>) {
|
||||
if (it is MessagePacket<*, *>) {
|
||||
it.botVar = handler.bot
|
||||
}
|
||||
|
||||
|
@ -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.action.ImageLink
|
||||
import net.mamoe.mirai.utils.*
|
||||
import net.mamoe.mirai.utils.io.printTLVMap
|
||||
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.utils.io.*
|
||||
import net.mamoe.mirai.withSession
|
||||
import kotlin.jvm.JvmName
|
||||
|
||||
@ -28,10 +25,10 @@ import kotlin.jvm.JvmName
|
||||
* 平台相关扩展
|
||||
*/
|
||||
@UseExperimental(MiraiInternalAPI::class)
|
||||
expect abstract class MessagePacket<TSubject : Contact>() : MessagePacketBase<TSubject>
|
||||
expect abstract class MessagePacket<TSender : QQ, TSubject : Contact>() : MessagePacketBase<TSender, TSubject>
|
||||
|
||||
@MiraiInternalAPI
|
||||
abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() {
|
||||
abstract class MessagePacketBase<TSender : QQ, TSubject : Contact> : EventPacket, BotEvent() {
|
||||
internal lateinit var botVar: Bot
|
||||
|
||||
override val bot: Bot get() = botVar
|
||||
@ -49,7 +46,7 @@ abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() {
|
||||
/**
|
||||
* 发送人
|
||||
*/
|
||||
abstract val sender: QQ
|
||||
abstract val sender: TSender
|
||||
|
||||
abstract val message: MessageChain
|
||||
|
||||
@ -97,7 +94,7 @@ abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() {
|
||||
|
||||
// region group message
|
||||
|
||||
@Suppress("unused")
|
||||
@Suppress("unused", "NOTHING_TO_INLINE")
|
||||
data class GroupMessage(
|
||||
val group: Group,
|
||||
val senderName: String,
|
||||
@ -105,16 +102,17 @@ data class GroupMessage(
|
||||
* 发送方权限.
|
||||
*/
|
||||
val permission: MemberPermission,
|
||||
override val sender: QQ,
|
||||
override val sender: Member,
|
||||
override val message: MessageChain
|
||||
) : MessagePacket<Group>() {
|
||||
) : MessagePacket<Member, Group>() {
|
||||
|
||||
override val subject: Group get() = group
|
||||
|
||||
|
||||
suspend inline fun At.member(): Member = group.getMember(this.target)
|
||||
suspend inline fun UInt.member(): Member = group.getMember(this)
|
||||
suspend inline fun Long.member(): Member = group.getMember(this.toUInt())
|
||||
inline fun At.member(): Member = group.getMember(this.target)
|
||||
inline fun UInt.member(): Member = group.getMember(this)
|
||||
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)")
|
||||
@ -128,38 +126,43 @@ internal object GroupMessageEventParserAndHandler : KnownEventParserAndHandler<G
|
||||
discardExact(48)
|
||||
readUShortLVByteArray()
|
||||
discardExact(2)//2个0x00
|
||||
val message = readMessageChain()
|
||||
|
||||
var senderPermission: MemberPermission = MemberPermission.MEMBER
|
||||
var senderName = ""
|
||||
val map = readTLVMap(true)
|
||||
if (map.containsKey(18u)) {
|
||||
map.getValue(18u).read {
|
||||
val tlv = readTLVMap(true)
|
||||
senderPermission = when (tlv.takeIf { it.containsKey(0x04u) }?.get(0x04u)?.getOrNull(3)?.toUInt()) {
|
||||
null -> MemberPermission.MEMBER
|
||||
0x08u -> MemberPermission.OWNER
|
||||
0x10u -> MemberPermission.OPERATOR
|
||||
else -> {
|
||||
tlv.printTLVMap("TLV(tag=18) Map")
|
||||
MiraiLogger.warning("Could not determine member permission, default permission MEMBER is being used")
|
||||
MemberPermission.MEMBER
|
||||
with(this.debugPrint("群消息")) {
|
||||
val message = readMessageChain()
|
||||
|
||||
var senderPermission: MemberPermission = MemberPermission.MEMBER
|
||||
var senderName = ""
|
||||
val map = readTLVMap(true)
|
||||
if (map.containsKey(18u)) {
|
||||
map.getValue(18u).read {
|
||||
val tlv = readTLVMap(true)
|
||||
senderPermission = when (tlv.takeIf { it.containsKey(0x04u) }?.get(0x04u)?.getOrNull(3)?.toUInt()) {
|
||||
null -> MemberPermission.MEMBER
|
||||
0x08u -> MemberPermission.OWNER
|
||||
0x10u -> MemberPermission.ADMINISTRATOR
|
||||
else -> {
|
||||
tlv.printTLVMap("TLV(tag=18) Map")
|
||||
MiraiLogger.warning("Could not determine member permission, default permission MEMBER is being used")
|
||||
MemberPermission.MEMBER
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
senderName = when {
|
||||
tlv.containsKey(0x01u) -> String(tlv.getValue(0x01u))//这个人的qq昵称
|
||||
tlv.containsKey(0x02u) -> String(tlv.getValue(0x02u))//这个人的群名片
|
||||
else -> {
|
||||
tlv.printTLVMap("TLV(tag=18) Map")
|
||||
MiraiLogger.warning("Could not determine senderName")
|
||||
"null"
|
||||
senderName = when {
|
||||
tlv.containsKey(0x01u) -> String(tlv.getValue(0x01u))//这个人的qq昵称
|
||||
tlv.containsKey(0x02u) -> String(tlv.getValue(0x02u))//这个人的群名片
|
||||
else -> {
|
||||
tlv.printTLVMap("TLV(tag=18) Map")
|
||||
MiraiLogger.warning("Could not determine senderName")
|
||||
"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(
|
||||
val previous: Boolean,
|
||||
override val sender: QQ,
|
||||
override val message: MessageChain
|
||||
) : MessagePacket<QQ>(), BroadcastControllable {
|
||||
) : MessagePacket<QQ, QQ>(), BroadcastControllable {
|
||||
/**
|
||||
* 是否应被自动广播. 此为内部 API
|
||||
*/
|
||||
@ -205,7 +208,7 @@ internal object FriendMessageEventParserAndHandler : KnownEventParserAndHandler<
|
||||
previous = previous,
|
||||
sender = bot.getQQ(identity.from),
|
||||
message = message
|
||||
)
|
||||
).apply { this.botVar = bot }
|
||||
}
|
||||
}
|
||||
// endregion
|
@ -8,6 +8,7 @@ import kotlinx.io.core.Input
|
||||
import kotlinx.io.core.use
|
||||
import kotlinx.io.streams.inputStream
|
||||
import net.mamoe.mirai.contact.Contact
|
||||
import net.mamoe.mirai.contact.QQ
|
||||
import net.mamoe.mirai.message.*
|
||||
import net.mamoe.mirai.utils.ExternalImage
|
||||
import net.mamoe.mirai.utils.MiraiInternalAPI
|
||||
@ -23,7 +24,7 @@ import javax.imageio.ImageIO
|
||||
* JVM 平台相关扩展
|
||||
*/
|
||||
@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: URL): Image = subject.uploadImage(image)
|
||||
suspend inline fun uploadImage(image: Input): Image = subject.uploadImage(image)
|
||||
|
Loading…
Reference in New Issue
Block a user