Commit 16c44043 authored by Him188's avatar Him188

Introduce `AbstractEvent` acting as all events' super class

parent b47955a8
/*
* 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()
\ No newline at end of file
......@@ -26,7 +26,6 @@ import net.mamoe.mirai.network.UnsupportedSMSLoginException
import net.mamoe.mirai.network.WrongPasswordException
import net.mamoe.mirai.qqandroid.QQAndroidBot
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.proto.MsgSvc
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 BroadcastControllable) {
if (packet.shouldBroadcast) packet.broadcast()
......
......@@ -23,6 +23,7 @@ import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.events.BotJoinGroupEvent
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.checkIsMemberImpl
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.QQAndroidClient
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.NewContact
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.readUniPacket
import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray
......@@ -129,7 +129,10 @@ internal class MessageSvc {
*/
@MiraiInternalAPI
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 =
"MessageSvc.PbGetMsg.Response(syncFlagFromServer=$syncFlagFromServer, messages=<Iterable>))"
}
......
......@@ -17,6 +17,7 @@ import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.contact.nameCardOrNick
import net.mamoe.mirai.data.FriendInfo
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.*
......@@ -57,7 +58,7 @@ internal class OnlinePush {
internal class SendGroupMessageReceipt(
val messageRandom: Int,
val sequenceId: Int
) : Packet, Event, Packet.NoLog {
) : Packet, Event, Packet.NoLog, AbstractEvent() {
override fun toString(): String {
return "OnlinePush.PbPushGroupMsg.SendGroupMessageReceipt(messageRandom=$messageRandom, sequenceId=$sequenceId)"
}
......
......@@ -12,6 +12,7 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
import kotlinx.io.core.ByteReadPacket
import kotlinx.serialization.Serializable
import kotlinx.serialization.protobuf.ProtoId
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.Packet
......@@ -39,7 +40,7 @@ internal class ConfigPushSvc {
) {
override val canBeCached: Boolean get() = false
sealed class PushReqResponse : Packet, Event {
sealed class PushReqResponse : Packet, Event, AbstractEvent() {
class Success(
val struct: PushReqJceStruct
) : PushReqResponse() {
......
......@@ -11,14 +11,20 @@
package net.mamoe.mirai.event
import kotlinx.atomicfu.atomic
import net.mamoe.mirai.event.internal.broadcastInternal
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval
import net.mamoe.mirai.utils.SinceMirai
import kotlin.jvm.JvmSynthetic
/**
* 可被监听的类, 可以是任何 class 或 object.
*
* 若监听这个类, 监听器将会接收所有事件的广播.
*
* 所有 [Event] 都应继承 [AbstractEvent] 而不要直接实现 [Event]. 否则将无法广播也无法监听.
*
* @see subscribeAlways
* @see subscribeOnce
*
......@@ -27,40 +33,83 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
* @see [broadcast] 广播事件
* @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] 接口的类都应该继承的父类.
*/
interface CancellableEvent {
@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
val isCancelled: Boolean get() = _cancelled.value
/**
* 取消这个事件.
* 重复取消时不会抛出异常.
*/
fun cancel()
fun cancel() {
check(this is CancellableEvent) {
"Event $this is not cancellable"
}
_cancelled.value = true
}
}
/**
* 可被取消的事件的实现
* 可被取消的事件
*/
abstract class AbstractCancellableEvent : Event, CancellableEvent {
interface CancellableEvent : Event {
/**
* 事件是否已取消.
*/
override val isCancelled: Boolean get() = _cancelled
private var _cancelled: Boolean = false
val isCancelled: Boolean
/**
* 取消事件.
* 取消这个事件.
*/
override fun cancel() {
_cancelled = true
}
fun cancel()
}
/**
......@@ -81,9 +130,20 @@ suspend fun <E : Event> E.broadcast(): E = apply {
var EventDisabled = false
/**
* 可控制是否需要广播这个事件
* 可控制是否需要广播这个事件
*/
interface BroadcastControllable : Event {
/**
* 返回 `false` 时将不会广播这个事件.
*/
val shouldBroadcast: Boolean
get() = true
}
\ No newline at end of file
}
@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
......@@ -24,11 +24,8 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.io.ByteReadChannel
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.*
import net.mamoe.mirai.event.*
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.qqandroid.network.Packet
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")
)
@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() {
/**
* 接受到这条消息的
*/
......
......@@ -15,7 +15,7 @@ import net.mamoe.mirai.utils.internal.runBlocking
import kotlin.test.Test
import kotlin.test.assertTrue
class TestEvent : Event {
class TestEvent : Event, AbstractEvent() {
var triggered = false
}
......@@ -44,7 +44,7 @@ class EventTests {
}
open class ParentEvent : Event {
open class ParentEvent : Event, AbstractEvent() {
var triggered = false
}
......
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