Introduce AbstractEvent acting as all events' super class

This commit is contained in:
Him188 2020-05-01 14:44:12 +08:00
parent b47955a824
commit 16c440433f
9 changed files with 136 additions and 94 deletions

View File

@ -1,19 +0,0 @@
/*
* Copyright 2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
package net.mamoe.mirai.qqandroid.event
import net.mamoe.mirai.qqandroid.network.Packet
import net.mamoe.mirai.event.AbstractCancellableEvent
import net.mamoe.mirai.event.Event
/**
* 接收到数据包
*/
data class PacketReceivedEvent(val packet: Packet) : Event, AbstractCancellableEvent()

View File

@ -26,7 +26,6 @@ import net.mamoe.mirai.network.UnsupportedSMSLoginException
import net.mamoe.mirai.network.WrongPasswordException import net.mamoe.mirai.network.WrongPasswordException
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.contact.* import net.mamoe.mirai.qqandroid.contact.*
import net.mamoe.mirai.qqandroid.event.PacketReceivedEvent
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopNum import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopNum
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.MsgSvc import net.mamoe.mirai.qqandroid.network.protocol.data.proto.MsgSvc
import net.mamoe.mirai.qqandroid.network.protocol.packet.* import net.mamoe.mirai.qqandroid.network.protocol.packet.*
@ -511,10 +510,6 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo
} }
} }
if (packet != null && PacketReceivedEvent(packet).broadcast().isCancelled) {
return
}
if (packet is Event) { if (packet is Event) {
if (packet is BroadcastControllable) { if (packet is BroadcastControllable) {
if (packet.shouldBroadcast) packet.broadcast() if (packet.shouldBroadcast) packet.broadcast()

View File

@ -23,6 +23,7 @@ import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.events.BotJoinGroupEvent import net.mamoe.mirai.event.events.BotJoinGroupEvent
import net.mamoe.mirai.event.events.BotOfflineEvent import net.mamoe.mirai.event.events.BotOfflineEvent
@ -36,7 +37,7 @@ import net.mamoe.mirai.qqandroid.contact.GroupImpl
import net.mamoe.mirai.qqandroid.contact.checkIsFriendImpl import net.mamoe.mirai.qqandroid.contact.checkIsFriendImpl
import net.mamoe.mirai.qqandroid.contact.checkIsMemberImpl import net.mamoe.mirai.qqandroid.contact.checkIsMemberImpl
import net.mamoe.mirai.qqandroid.message.* import net.mamoe.mirai.qqandroid.message.*
import net.mamoe.mirai.qqandroid.network.MultiPacketByIterable import net.mamoe.mirai.qqandroid.network.MultiPacket
import net.mamoe.mirai.qqandroid.network.Packet import net.mamoe.mirai.qqandroid.network.Packet
import net.mamoe.mirai.qqandroid.network.QQAndroidClient import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPushForceOffline import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPushForceOffline
@ -50,7 +51,6 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.*
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact
import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList
import net.mamoe.mirai.qqandroid.utils._miraiContentToString
import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
import net.mamoe.mirai.qqandroid.utils.io.serialization.readUniPacket import net.mamoe.mirai.qqandroid.utils.io.serialization.readUniPacket
import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray
@ -129,7 +129,10 @@ internal class MessageSvc {
*/ */
@MiraiInternalAPI @MiraiInternalAPI
open class Response(internal val syncFlagFromServer: MsgSvc.SyncFlag, delegate: List<Packet>) : open class Response(internal val syncFlagFromServer: MsgSvc.SyncFlag, delegate: List<Packet>) :
MultiPacketByIterable<Packet>(delegate) { AbstractEvent(),
MultiPacket<Packet>,
Iterable<Packet> by (delegate) {
override fun toString(): String = override fun toString(): String =
"MessageSvc.PbGetMsg.Response(syncFlagFromServer=$syncFlagFromServer, messages=<Iterable>))" "MessageSvc.PbGetMsg.Response(syncFlagFromServer=$syncFlagFromServer, messages=<Iterable>))"
} }

View File

@ -17,6 +17,7 @@ import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.contact.nameCardOrNick import net.mamoe.mirai.contact.nameCardOrNick
import net.mamoe.mirai.data.FriendInfo import net.mamoe.mirai.data.FriendInfo
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.* import net.mamoe.mirai.event.events.*
@ -57,7 +58,7 @@ internal class OnlinePush {
internal class SendGroupMessageReceipt( internal class SendGroupMessageReceipt(
val messageRandom: Int, val messageRandom: Int,
val sequenceId: Int val sequenceId: Int
) : Packet, Event, Packet.NoLog { ) : Packet, Event, Packet.NoLog, AbstractEvent() {
override fun toString(): String { override fun toString(): String {
return "OnlinePush.PbPushGroupMsg.SendGroupMessageReceipt(messageRandom=$messageRandom, sequenceId=$sequenceId)" return "OnlinePush.PbPushGroupMsg.SendGroupMessageReceipt(messageRandom=$messageRandom, sequenceId=$sequenceId)"
} }

View File

@ -12,6 +12,7 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.protobuf.ProtoId import kotlinx.serialization.protobuf.ProtoId
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Event
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.Packet import net.mamoe.mirai.qqandroid.network.Packet
@ -39,7 +40,7 @@ internal class ConfigPushSvc {
) { ) {
override val canBeCached: Boolean get() = false override val canBeCached: Boolean get() = false
sealed class PushReqResponse : Packet, Event { sealed class PushReqResponse : Packet, Event, AbstractEvent() {
class Success( class Success(
val struct: PushReqJceStruct val struct: PushReqJceStruct
) : PushReqResponse() { ) : PushReqResponse() {

View File

@ -11,14 +11,20 @@
package net.mamoe.mirai.event package net.mamoe.mirai.event
import kotlinx.atomicfu.atomic
import net.mamoe.mirai.event.internal.broadcastInternal import net.mamoe.mirai.event.internal.broadcastInternal
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval
import net.mamoe.mirai.utils.SinceMirai
import kotlin.jvm.JvmSynthetic
/** /**
* 可被监听的类, 可以是任何 class object. * 可被监听的类, 可以是任何 class object.
* *
* 若监听这个类, 监听器将会接收所有事件的广播. * 若监听这个类, 监听器将会接收所有事件的广播.
* *
* 所有 [Event] 都应继承 [AbstractEvent] 而不要直接实现 [Event]. 否则将无法广播也无法监听.
*
* @see subscribeAlways * @see subscribeAlways
* @see subscribeOnce * @see subscribeOnce
* *
@ -27,12 +33,74 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
* @see [broadcast] 广播事件 * @see [broadcast] 广播事件
* @see [subscribe] 监听事件 * @see [subscribe] 监听事件
*/ */
interface Event interface Event {
@Deprecated("""
Don't implement Event but extend AbstractEvent instead.
""", level = DeprecationLevel.HIDDEN) // so Kotlin class won't be compiled.
@Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION", "PropertyName")
@get:JvmSynthetic // so Java user won't see it
internal val DoNotImplementThisClassButExtendAbstractEvent: Nothing
}
/**
* 所有实现了 [Event] 接口的类都应该继承的父类.
*/
@SinceMirai("1.0.0")
abstract class AbstractEvent : Event {
@Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION", "PropertyName")
@get:JvmSynthetic // so Java user won't see it
@Deprecated("", level = DeprecationLevel.HIDDEN)
final override val DoNotImplementThisClassButExtendAbstractEvent: Nothing
get() = throw Error("Shouldn't be reached")
private val _intercepted = atomic(false)
private val _cancelled = atomic(false)
/**
* 事件是否已被拦截.
*
* 所有事件都可以被拦截, 拦截后低优先级的监听器将不会处理到这个事件.
*/
@SinceMirai("1.0.0")
val isIntercepted: Boolean
get() = _intercepted.value
/**
* 拦截这个事件.
* 重复拦截时不会抛出异常.
*/
@SinceMirai("1.0.0")
fun intercept() {
_intercepted.value = true
}
/**
* 事件是否已取消.
*
* 事件需实现 [CancellableEvent] 接口才可以被取消,
* 否则此属性固定返回 false.
*/
val isCancelled: Boolean get() = _cancelled.value
/**
* 取消这个事件.
* 重复取消时不会抛出异常.
*/
fun cancel() {
check(this is CancellableEvent) {
"Event $this is not cancellable"
}
_cancelled.value = true
}
}
/** /**
* 可被取消的事件 * 可被取消的事件
*/ */
interface CancellableEvent { interface CancellableEvent : Event {
/** /**
* 事件是否已取消. * 事件是否已取消.
*/ */
@ -44,25 +112,6 @@ interface CancellableEvent {
fun cancel() fun cancel()
} }
/**
* 可被取消的事件的实现
*/
abstract class AbstractCancellableEvent : Event, CancellableEvent {
/**
* 事件是否已取消.
*/
override val isCancelled: Boolean get() = _cancelled
private var _cancelled: Boolean = false
/**
* 取消事件.
*/
override fun cancel() {
_cancelled = true
}
}
/** /**
* 广播一个事件的唯一途径. * 广播一个事件的唯一途径.
*/ */
@ -81,9 +130,20 @@ suspend fun <E : Event> E.broadcast(): E = apply {
var EventDisabled = false var EventDisabled = false
/** /**
* 可控制是否需要广播这个事件 * 可控制是否需要广播这个事件
*/ */
interface BroadcastControllable : Event { interface BroadcastControllable : Event {
/**
* 返回 `false` 时将不会广播这个事件.
*/
val shouldBroadcast: Boolean val shouldBroadcast: Boolean
get() = true get() = true
} }
@PlannedRemoval("1.1.0")
@Deprecated(
"use AbstractEvent and implement CancellableEvent",
level = DeprecationLevel.ERROR,
replaceWith = ReplaceWith("AbstractEvent", "net.mamoe.mirai.event.AbstractEvent"))
abstract class AbstractCancellableEvent : AbstractEvent(), CancellableEvent

View File

@ -15,7 +15,7 @@ package net.mamoe.mirai.event.events
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.JavaFriendlyAPI
import net.mamoe.mirai.contact.* import net.mamoe.mirai.contact.*
import net.mamoe.mirai.event.AbstractCancellableEvent import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.BroadcastControllable import net.mamoe.mirai.event.BroadcastControllable
import net.mamoe.mirai.event.CancellableEvent import net.mamoe.mirai.event.CancellableEvent
import net.mamoe.mirai.event.events.ImageUploadEvent.Failed import net.mamoe.mirai.event.events.ImageUploadEvent.Failed
@ -49,12 +49,12 @@ class EventCancelledException : RuntimeException {
/** /**
* [Bot] 登录完成, 好友列表, 群组列表初始化完成 * [Bot] 登录完成, 好友列表, 群组列表初始化完成
*/ */
data class BotOnlineEvent(override val bot: Bot) : BotActiveEvent data class BotOnlineEvent(override val bot: Bot) : BotActiveEvent, AbstractEvent()
/** /**
* [Bot] 离线. * [Bot] 离线.
*/ */
sealed class BotOfflineEvent : BotEvent { sealed class BotOfflineEvent : BotEvent, AbstractEvent() {
/** /**
* 主动离线 * 主动离线
@ -85,7 +85,7 @@ sealed class BotOfflineEvent : BotEvent {
data class BotReloginEvent( data class BotReloginEvent(
override val bot: Bot, override val bot: Bot,
val cause: Throwable? val cause: Throwable?
) : BotEvent, BotActiveEvent ) : BotEvent, BotActiveEvent, AbstractEvent()
// endregion // endregion
@ -94,7 +94,7 @@ data class BotReloginEvent(
/** /**
* 主动发送消息 * 主动发送消息
*/ */
sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractCancellableEvent() { sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractEvent() {
abstract val target: Contact abstract val target: Contact
final override val bot: Bot final override val bot: Bot
get() = target.bot get() = target.bot
@ -115,7 +115,7 @@ sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractCancellableEve
/** /**
* 消息撤回事件. 可是任意消息被任意人撤回. * 消息撤回事件. 可是任意消息被任意人撤回.
*/ */
sealed class MessageRecallEvent : BotEvent { sealed class MessageRecallEvent : BotEvent, AbstractEvent() {
/** /**
* 消息原发送人 * 消息原发送人
*/ */
@ -197,7 +197,7 @@ val MessageRecallEvent.isByBot: Boolean
data class BeforeImageUploadEvent( data class BeforeImageUploadEvent(
val target: Contact, val target: Contact,
val source: ExternalImage val source: ExternalImage
) : BotEvent, BotActiveEvent, AbstractCancellableEvent() { ) : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent {
override val bot: Bot override val bot: Bot
get() = target.bot get() = target.bot
} }
@ -208,7 +208,7 @@ data class BeforeImageUploadEvent(
* @see Succeed * @see Succeed
* @see Failed * @see Failed
*/ */
sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractCancellableEvent() { sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent() {
abstract val target: Contact abstract val target: Contact
abstract val source: ExternalImage abstract val source: ExternalImage
override val bot: Bot override val bot: Bot
@ -218,14 +218,14 @@ sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractCancellableEve
override val target: Contact, override val target: Contact,
override val source: ExternalImage, override val source: ExternalImage,
val image: Image val image: Image
) : ImageUploadEvent(), CancellableEvent ) : ImageUploadEvent()
data class Failed( data class Failed(
override val target: Contact, override val target: Contact,
override val source: ExternalImage, override val source: ExternalImage,
val errno: Int, val errno: Int,
val message: String val message: String
) : ImageUploadEvent(), CancellableEvent ) : ImageUploadEvent()
} }
// endregion // endregion
@ -236,7 +236,7 @@ sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractCancellableEve
* 机器人被踢出群或在其他客户端主动退出一个群. 在事件广播前 [Bot.groups] 就已删除这个群. * 机器人被踢出群或在其他客户端主动退出一个群. 在事件广播前 [Bot.groups] 就已删除这个群.
*/ */
@SinceMirai("0.36.0") @SinceMirai("0.36.0")
sealed class BotLeaveEvent : BotEvent, Packet { sealed class BotLeaveEvent : BotEvent, Packet, AbstractEvent() {
abstract val group: Group abstract val group: Group
/** /**
@ -261,7 +261,7 @@ data class BotGroupPermissionChangeEvent(
override val group: Group, override val group: Group,
val origin: MemberPermission, val origin: MemberPermission,
val new: MemberPermission val new: MemberPermission
) : BotPassiveEvent, GroupEvent, Packet ) : BotPassiveEvent, GroupEvent, Packet, AbstractEvent()
/** /**
* Bot 被禁言 * Bot 被禁言
@ -272,7 +272,7 @@ data class BotMuteEvent(
* 操作人. * 操作人.
*/ */
val operator: Member val operator: Member
) : GroupEvent, Packet, BotPassiveEvent { ) : GroupEvent, Packet, BotPassiveEvent, AbstractEvent() {
override val group: Group override val group: Group
get() = operator.group get() = operator.group
} }
@ -285,7 +285,7 @@ data class BotUnmuteEvent(
* 操作人. * 操作人.
*/ */
val operator: Member val operator: Member
) : GroupEvent, Packet, BotPassiveEvent { ) : GroupEvent, Packet, BotPassiveEvent, AbstractEvent() {
override val group: Group override val group: Group
get() = operator.group get() = operator.group
} }
@ -296,7 +296,7 @@ data class BotUnmuteEvent(
@MiraiExperimentalAPI @MiraiExperimentalAPI
data class BotJoinGroupEvent( data class BotJoinGroupEvent(
override val group: Group override val group: Group
) : BotPassiveEvent, GroupEvent, Packet ) : BotPassiveEvent, GroupEvent, Packet, AbstractEvent()
// region 群设置 // region 群设置
@ -323,7 +323,7 @@ data class GroupNameChangeEvent(
*/ */
@SinceMirai("0.37.3") @SinceMirai("0.37.3")
override val operator: Member? override val operator: Member?
) : GroupSettingChangeEvent<String>, Packet, GroupOperableEvent { ) : GroupSettingChangeEvent<String>, Packet, GroupOperableEvent, AbstractEvent() {
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
val isByBot: Boolean val isByBot: Boolean
get() = operator == null get() = operator == null
@ -340,7 +340,7 @@ data class GroupEntranceAnnouncementChangeEvent(
* 操作人. null 时则是机器人操作 * 操作人. null 时则是机器人操作
*/ */
override val operator: Member? override val operator: Member?
) : GroupSettingChangeEvent<String>, Packet, GroupOperableEvent ) : GroupSettingChangeEvent<String>, Packet, GroupOperableEvent, AbstractEvent()
/** /**
@ -354,7 +354,7 @@ data class GroupMuteAllEvent(
* 操作人. null 时则是机器人操作 * 操作人. null 时则是机器人操作
*/ */
override val operator: Member? override val operator: Member?
) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent ) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent, AbstractEvent()
/** /**
@ -368,7 +368,7 @@ data class GroupAllowAnonymousChatEvent(
* 操作人. null 时则是机器人操作 * 操作人. null 时则是机器人操作
*/ */
override val operator: Member? override val operator: Member?
) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent ) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent, AbstractEvent()
/** /**
@ -379,7 +379,7 @@ data class GroupAllowConfessTalkEvent(
override val new: Boolean, override val new: Boolean,
override val group: Group, override val group: Group,
val isByBot: Boolean // 无法获取操作人 val isByBot: Boolean // 无法获取操作人
) : GroupSettingChangeEvent<Boolean>, Packet ) : GroupSettingChangeEvent<Boolean>, Packet, AbstractEvent()
/** /**
* "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成. * "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成.
@ -392,7 +392,7 @@ data class GroupAllowMemberInviteEvent(
* 操作人. null 时则是机器人操作 * 操作人. null 时则是机器人操作
*/ */
override val operator: Member? override val operator: Member?
) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent ) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent, AbstractEvent()
// endregion // endregion
@ -405,7 +405,7 @@ data class GroupAllowMemberInviteEvent(
/** /**
* 成员已经加入群的事件 * 成员已经加入群的事件
*/ */
sealed class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent, Packet { sealed class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent() {
/** /**
* 被邀请加入群 * 被邀请加入群
*/ */
@ -422,7 +422,7 @@ sealed class MemberJoinEvent(override val member: Member) : GroupMemberEvent, Bo
/** /**
* 成员已经离开群的事件. 在事件广播前成员就已经从 [Group.members] 中删除 * 成员已经离开群的事件. 在事件广播前成员就已经从 [Group.members] 中删除
*/ */
sealed class MemberLeaveEvent : GroupMemberEvent { sealed class MemberLeaveEvent : GroupMemberEvent, AbstractEvent() {
/** /**
* 成员被踢出群. 成员不可能是机器人自己. * 成员被踢出群. 成员不可能是机器人自己.
*/ */
@ -468,7 +468,7 @@ data class BotInvitedJoinGroupRequestEvent(
* 邀请人昵称 * 邀请人昵称
*/ */
val invitorNick: String val invitorNick: String
) : BotEvent, Packet { ) : BotEvent, Packet, AbstractEvent() {
val invitor: Friend = this.bot.getFriend(invitorId) val invitor: Friend = this.bot.getFriend(invitorId)
@JvmField @JvmField
@ -515,7 +515,7 @@ data class MemberJoinRequestEvent(
* 申请人昵称 * 申请人昵称
*/ */
val fromNick: String val fromNick: String
) : BotEvent, Packet { ) : BotEvent, Packet, AbstractEvent() {
val group: Group = this.bot.getGroup(groupId) val group: Group = this.bot.getGroup(groupId)
@JvmField @JvmField
@ -574,8 +574,9 @@ data class MemberCardChangeEvent(
@PlannedRemoval("1.0.0") @PlannedRemoval("1.0.0")
@Deprecated("operator is always unknown", level = DeprecationLevel.ERROR) @Deprecated("operator is always unknown", level = DeprecationLevel.ERROR)
override val operator: Member? override val operator: Member?
) : GroupMemberEvent, Packet, ) : GroupMemberEvent, Packet, AbstractEvent(),
@Deprecated("operator is always unknown", level = DeprecationLevel.ERROR) GroupOperableEvent @Deprecated("operator is always unknown", level = DeprecationLevel.ERROR)
GroupOperableEvent
/** /**
* 成员群头衔改动. 一定为群主操作 * 成员群头衔改动. 一定为群主操作
@ -599,7 +600,7 @@ data class MemberSpecialTitleChangeEvent(
* null 时则是机器人操作. * null 时则是机器人操作.
*/ */
override val operator: Member? override val operator: Member?
) : GroupMemberEvent, GroupOperableEvent ) : GroupMemberEvent, GroupOperableEvent, AbstractEvent()
// endregion // endregion
@ -613,7 +614,7 @@ data class MemberPermissionChangeEvent(
override val member: Member, override val member: Member,
val origin: MemberPermission, val origin: MemberPermission,
val new: MemberPermission val new: MemberPermission
) : GroupMemberEvent, BotPassiveEvent, Packet ) : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent()
// endregion // endregion
@ -630,7 +631,7 @@ data class MemberMuteEvent(
* 操作人. null 则为机器人操作 * 操作人. null 则为机器人操作
*/ */
override val operator: Member? override val operator: Member?
) : GroupMemberEvent, Packet, GroupOperableEvent ) : GroupMemberEvent, Packet, GroupOperableEvent, AbstractEvent()
/** /**
* 群成员被取消禁言事件. 被禁言的成员都不可能是机器人本人 * 群成员被取消禁言事件. 被禁言的成员都不可能是机器人本人
@ -641,7 +642,7 @@ data class MemberUnmuteEvent(
* 操作人. null 则为机器人操作 * 操作人. null 则为机器人操作
*/ */
override val operator: Member? override val operator: Member?
) : GroupMemberEvent, Packet, GroupOperableEvent ) : GroupMemberEvent, Packet, GroupOperableEvent, AbstractEvent()
// endregion // endregion
@ -659,8 +660,9 @@ data class FriendRemarkChangeEvent(
override val bot: Bot, override val bot: Bot,
val friend: Friend, val friend: Friend,
val newName: String val newName: String
) : BotEvent, Packet { ) : BotEvent, Packet, AbstractEvent() {
@PlannedRemoval("1.0.0")
@Deprecated("", level = DeprecationLevel.HIDDEN) @Deprecated("", level = DeprecationLevel.HIDDEN)
@get:JvmSynthetic @get:JvmSynthetic
@get:JvmName("getFriend") @get:JvmName("getFriend")
@ -678,9 +680,10 @@ data class FriendAddEvent(
* 新好友. 已经添加到 [Bot.friends] * 新好友. 已经添加到 [Bot.friends]
*/ */
val friend: Friend val friend: Friend
) : BotEvent, Packet { ) : BotEvent, Packet, AbstractEvent() {
override val bot: Bot get() = friend.bot override val bot: Bot get() = friend.bot
@PlannedRemoval("1.0.0")
@Deprecated("", level = DeprecationLevel.HIDDEN) @Deprecated("", level = DeprecationLevel.HIDDEN)
@get:JvmSynthetic @get:JvmSynthetic
@get:JvmName("getFriend") @get:JvmName("getFriend")
@ -695,9 +698,10 @@ data class FriendAddEvent(
@SinceMirai("0.36.0") @SinceMirai("0.36.0")
data class FriendDeleteEvent( data class FriendDeleteEvent(
val friend: Friend val friend: Friend
) : BotEvent, Packet { ) : BotEvent, Packet, AbstractEvent() {
override val bot: Bot get() = friend.bot override val bot: Bot get() = friend.bot
@PlannedRemoval("1.0.0")
@Deprecated("", level = DeprecationLevel.HIDDEN) @Deprecated("", level = DeprecationLevel.HIDDEN)
@get:JvmSynthetic @get:JvmSynthetic
@get:JvmName("getFriend") @get:JvmName("getFriend")
@ -732,7 +736,7 @@ data class NewFriendRequestEvent(
* 群名片或好友昵称 * 群名片或好友昵称
*/ */
val fromNick: String val fromNick: String
) : BotEvent, Packet { ) : BotEvent, Packet, AbstractEvent() {
@JvmField @JvmField
internal val responded: MiraiAtomicBoolean = MiraiAtomicBoolean(false) internal val responded: MiraiAtomicBoolean = MiraiAtomicBoolean(false)

View File

@ -24,11 +24,8 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.io.ByteReadChannel import kotlinx.coroutines.io.ByteReadChannel
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.* import net.mamoe.mirai.contact.*
import net.mamoe.mirai.event.*
import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.event.selectMessages
import net.mamoe.mirai.event.syncFromEvent
import net.mamoe.mirai.event.syncFromEventOrNull
import net.mamoe.mirai.event.whileSelectMessages
import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.qqandroid.network.Packet import net.mamoe.mirai.qqandroid.network.Packet
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
@ -71,7 +68,7 @@ expect abstract class MessagePacket<TSender : User, TSubject : Contact> construc
replaceWith = ReplaceWith("ContactMessage", "net.mamoe.mirai.message.ContactMessage") replaceWith = ReplaceWith("ContactMessage", "net.mamoe.mirai.message.ContactMessage")
) )
@Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") @Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST")
abstract class MessagePacketBase<out TSender : User, out TSubject : Contact> : Packet, BotEvent { abstract class MessagePacketBase<out TSender : User, out TSubject : Contact> : Packet, BotEvent, AbstractEvent() {
/** /**
* 接受到这条消息的 * 接受到这条消息的
*/ */

View File

@ -15,7 +15,7 @@ import net.mamoe.mirai.utils.internal.runBlocking
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertTrue import kotlin.test.assertTrue
class TestEvent : Event { class TestEvent : Event, AbstractEvent() {
var triggered = false var triggered = false
} }
@ -44,7 +44,7 @@ class EventTests {
} }
open class ParentEvent : Event { open class ParentEvent : Event, AbstractEvent() {
var triggered = false var triggered = false
} }