Redesign event structure

This commit is contained in:
Him188 2020-02-11 13:14:40 +08:00
parent a322ce735b
commit 4d77951ae4
10 changed files with 280 additions and 281 deletions

View File

@ -24,7 +24,7 @@ import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MultiPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.*
import net.mamoe.mirai.event.events.ForceOfflineEvent
import net.mamoe.mirai.event.events.BotForceOfflineEvent
import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.qqandroid.GroupImpl
import net.mamoe.mirai.qqandroid.MemberImpl
@ -119,7 +119,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
@UseExperimental(MiraiExperimentalAPI::class, ExperimentalTime::class)
override suspend fun init(): Unit = coroutineScope {
this@QQAndroidBotNetworkHandler.subscribeAlways<ForceOfflineEvent> {
this@QQAndroidBotNetworkHandler.subscribeAlways<BotForceOfflineEvent> {
if (this@QQAndroidBotNetworkHandler.bot == this.bot) {
this.bot.logger.error("被挤下线")
close()

View File

@ -11,10 +11,10 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact
import net.mamoe.mirai.event.events.ForceOfflineEvent
import net.mamoe.mirai.data.MultiPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.BroadcastControllable
import net.mamoe.mirai.event.events.BotForceOfflineEvent
import net.mamoe.mirai.message.FriendMessage
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.qqandroid.QQAndroidBot
@ -178,10 +178,10 @@ internal class MessageSvc {
/**
* 被挤下线
*/
internal object PushForceOffline : OutgoingPacketFactory<ForceOfflineEvent>("MessageSvc.PushForceOffline") {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): ForceOfflineEvent {
internal object PushForceOffline : OutgoingPacketFactory<BotForceOfflineEvent>("MessageSvc.PushForceOffline") {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): BotForceOfflineEvent {
val struct = this.decodeUniPacket(RequestPushForceOffline.serializer())
return ForceOfflineEvent(bot, title = struct.title ?: "", tips = struct.tips ?: "")
return BotForceOfflineEvent(bot, title = struct.title ?: "", tips = struct.tips ?: "")
}
}

View File

@ -0,0 +1,53 @@
/*
* 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.event.events
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.QQ
/**
* [Bot] 登录完成, 好友列表, 群组列表初始化完成
*/
data class BotLoginSucceedEvent(override val bot: Bot) : BotActiveEvent()
/**
* [Bot] 主动离线.
*/
data class BotOfflineEvent(override val bot: Bot) : BotActiveEvent()
// region 好友
/**
* [Bot] 删除一个好友
*/
class BotRemoveFriendEvent(override val friend: QQ) : FriendEvent, BotActiveEvent()
// endregion
// region 群
/**
* 机器人踢出某个群员
*/
class BotKickMemberEvent(override val member: Member) : GroupMemberEvent, BotActiveEvent()
/**
* 机器人禁言某个群成员
*/
class BotMuteMemberEvent(override val member: Member) : GroupMemberEvent, BotActiveEvent()
/**
* 机器人取消禁言某个群成员
*/
class BotUnmuteMemberEvent(override val member: Member) : GroupMemberEvent, BotActiveEvent()
// endregion

View File

@ -1,132 +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.event.events
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.Event
/**
* 有关一个 [Bot] 的事件
*/
interface BotEvent : Event {
val bot: Bot
}
/**
* [Bot] 登录完成, 好友列表, 群组列表初始化完成
*/
data class BotLoginSucceedEvent(override val bot: Bot) : BotEvent
/**
* [Bot] 离线.
*/
data class BotOfflineEvent(override val bot: Bot) : BotEvent
/**
* 被挤下线
*/
data class ForceOfflineEvent(
override val bot: Bot,
val title: String,
val tips: String
) : BotEvent, Packet
/**
* 有关群的事件
*/
interface GroupEvent : BotEvent {
val group: Group
override val bot: Bot
get() = group.bot
}
data class AddGroupEvent(override val group: Group) : BotEvent, GroupEvent
data class RemoveGroupEvent(override val group: Group) : BotEvent, GroupEvent
data class BotGroupPermissionChangeEvent(
override val group: Group,
val origin: MemberPermission,
val new: MemberPermission
) : BotEvent, GroupEvent
interface GroupSettingChangeEvent<T> : GroupEvent {
val operator: Member
val origin: T
val new: T
override val group: Group
get() = operator.group
}
data class GroupNameChangeEvent(
override val operator: Member,
override val origin: String,
override val new: String
) : BotEvent, GroupSettingChangeEvent<String>
/**
* "全员禁言" 功能开启
*/
data class GroupMuteAllEvent(
override val operator: Member,
override val origin: Boolean,
override val new: Boolean
) : BotEvent, GroupSettingChangeEvent<Boolean>
data class GroupConfessTalkEvent(
override val operator: Member,
override val origin: Boolean,
override val new: Boolean
) : BotEvent, GroupSettingChangeEvent<Boolean>
/**
* 有关群成员的事件
*/
interface GroupMemberEvent : GroupEvent {
val member: Member
override val group: Group
get() = member.group
}
/**
* 成员加入群的事件
*/
data class MemberJoinEvent(override val member: Member) : BotEvent, GroupMemberEvent
/**
* 成员离开群的事件
*/
sealed class MemberLeftEvent : BotEvent, GroupMemberEvent {
/**
* 成员被踢出群
*/
data class Kick(override val member: Member, val operator: Member) : MemberLeftEvent()
/**
* 成员主动离开
*/
data class Quit(override val member: Member) : MemberLeftEvent()
}
data class MemberPermissionChangeEvent(
override val bot: Bot,
override val member: Member,
val origin: MemberPermission,
val new: MemberPermission
) : BotEvent, GroupMemberEvent

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.event.events
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.data.EventPacket
import net.mamoe.mirai.data.OnlineStatus
data class FriendStatusChanged(
val qq: QQ,
val status: OnlineStatus
) : EventPacket

View File

@ -1,84 +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.event.events
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.data.EventPacket
// region mute
/**
* 某群成员被禁言事件
*/
@Suppress("unused", "MemberVisibilityCanBePrivate")
class MemberMuteEvent(
val member: Member,
override val durationSeconds: Int,
override val operator: Member
) : MuteEvent() {
override val group: Group get() = operator.group
override fun toString(): String = "MemberMuteEvent(member=${member.id}, group=${group.id}, operator=${operator.id}, duration=${durationSeconds}s"
}
/**
* 机器人被禁言事件
*/
class BeingMutedEvent(
override val durationSeconds: Int,
override val operator: Member
) : MuteEvent() {
override val group: Group get() = operator.group
override fun toString(): String = "BeingMutedEvent(group=${group.id}, operator=${operator.id}, duration=${durationSeconds}s"
}
sealed class MuteEvent : EventOfMute() {
abstract override val operator: Member
abstract override val group: Group
abstract val durationSeconds: Int
}
// endregion
// region unmute
/**
* 某群成员被解除禁言事件
*/
@Suppress("unused")
class MemberUnmuteEvent(
val member: Member,
override val operator: Member
) : UnmuteEvent() {
override val group: Group get() = operator.group
override fun toString(): String = "MemberUnmuteEvent(member=${member.id}, group=${group.id}, operator=${operator.id}"
}
/**
* 机器人被解除禁言事件
*/
@Suppress("SpellCheckingInspection")
class BeingUnmutedEvent(
override val operator: Member
) : UnmuteEvent() {
override val group: Group get() = operator.group
override fun toString(): String = "BeingUnmutedEvent(group=${group.id}, operator=${operator.id}"
}
sealed class UnmuteEvent : EventOfMute() {
abstract override val operator: Member
abstract override val group: Group
}
// endregion
abstract class EventOfMute : EventPacket {
abstract val operator: Member
abstract val group: Group
}

View File

@ -0,0 +1,155 @@
/*
* 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.event.events
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.Packet
// region Bot 在线状态
/**
* 被挤下线
*/
data class BotForceOfflineEvent(
override val bot: Bot,
val title: String,
val tips: String
) : BotPassiveEvent, Packet
// endregion
// region 群
/**
* Bot 在群里的权限被改变. 操作人一定是群主
*/
data class BotGroupPermissionChangeEvent(
override val group: Group,
val origin: MemberPermission,
val new: MemberPermission
) : BotPassiveEvent, GroupEvent
// region 群设置
/**
* 群设置改变
*/
interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent {
val operator: Member
val origin: T
val new: T
override val group: Group
get() = operator.group
}
/**
* 群名改变
*/
data class GroupNameChangeEvent(
override val operator: Member,
override val origin: String,
override val new: String
) : GroupSettingChangeEvent<String>, BotPassiveEvent
/**
* "全员禁言" 功能状态改变
*/
data class GroupMuteAllEvent(
override val operator: Member,
override val origin: Boolean,
override val new: Boolean
) : GroupSettingChangeEvent<Boolean>, BotPassiveEvent
/**
* "坦白说" 功能状态改变
*/
data class GroupConfessTalkEvent(
override val operator: Member,
override val origin: Boolean,
override val new: Boolean
) : GroupSettingChangeEvent<Boolean>, BotPassiveEvent
// endregion
// region 群成员
// region 成员变更
/**
* 成员加入群的事件
*/
data class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent
/**
* 成员离开群的事件
*/
sealed class MemberLeftEvent : GroupMemberEvent, BotPassiveEvent {
/**
* 成员被踢出群. 成员不可能是机器人自己.
*
* @see BotKickMemberEvent 机器人踢出一个人
*/
data class Kick(override val member: Member, val operator: Member) : MemberLeftEvent()
/**
* 成员主动离开
*/
data class Quit(override val member: Member) : MemberLeftEvent()
}
// endregion
// region 成员权限
/**
* 成员权限改变的事件. 成员不可能是机器人自己.
*/
data class MemberPermissionChangeEvent(
override val bot: Bot,
override val member: Member,
val origin: MemberPermission,
val new: MemberPermission
) : GroupMemberEvent, BotPassiveEvent
// endregion
// region 禁言
/**
* 群成员被禁言事件. 操作人和被禁言的成员都不可能是机器人本人
*
* @see BotMuteMemberEvent 机器人禁言一个人
*/
data class MemberMuteEvent(
override val member: Member,
val operator: Member,
val durationSeconds: Int
) : GroupMemberEvent, BotPassiveEvent {
override fun toString(): String = "MemberMuteEvent(member=${member.id}, group=${group.id}, operator=${operator.id}, duration=${durationSeconds}s"
}
/**
* 群成员被取消禁言事件. 操作人和被禁言的成员都不可能是机器人本人
*
* @see BotUnmuteMemberEvent 机器人取消禁言某个人
*/
data class MemberUnmuteEvent(override val member: Member, val operator: Member) : GroupMemberEvent, BotPassiveEvent
// endregion
// endregion
// endregion

View File

@ -1,37 +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.event.events
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.data.EventPacket
import net.mamoe.mirai.utils.getValue
import net.mamoe.mirai.utils.unsafeWeakRef
import kotlin.jvm.JvmOverloads
/**
* 陌生人请求添加机器人账号为好友
*/
class ReceiveFriendAddRequestEvent(
_qq: QQ,
/**
* 验证消息
*/
val message: String
) : EventPacket {
val qq: QQ by _qq.unsafeWeakRef()
/**
* 同意这个请求
*
* @param remark 备注名, 不设置则需为 `null`
*/
@JvmOverloads
suspend fun approve(remark: String? = null): Unit = qq.bot.approveFriendAddRequest(qq.id, remark)
}

View File

@ -0,0 +1,63 @@
/*
* 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.event.events
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.event.AbstractCancellableEvent
import net.mamoe.mirai.event.Event
/**
* 有关一个 [Bot] 的事件
*/
interface BotEvent : Event {
val bot: Bot
}
/**
* [Bot] 被动接收的事件. 这些事件可能与机器人有关
*/
interface BotPassiveEvent : BotEvent
/**
* [Bot] 主动发起的动作的事件
*/
abstract class BotActiveEvent : BotEvent, AbstractCancellableEvent()
/**
* 有关群的事件
*/
interface GroupEvent : BotEvent {
val group: Group
override val bot: Bot
get() = group.bot
}
/**
* 有关群成员的事件
*/
interface GroupMemberEvent : GroupEvent {
val member: Member
override val group: Group
get() = member.group
}
/**
* 有关群的事件
*/
interface FriendEvent : BotEvent {
val friend: QQ
override val bot: Bot
get() = friend.bot
}

View File

@ -21,7 +21,7 @@ import net.mamoe.mirai.alsoLogin
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.events.ReceiveFriendAddRequestEvent
import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.event.subscribeAlways
import net.mamoe.mirai.event.subscribeGroupMessages
import net.mamoe.mirai.event.subscribeMessages
@ -54,8 +54,8 @@ suspend fun main() {
}
// 全局范围订阅事件, 不受 bot 实例影响
GlobalScope.subscribeAlways<ReceiveFriendAddRequestEvent> {
it.approve()
GlobalScope.subscribeAlways<BotEvent> {
}
// 订阅来自这个 bot 的群消息事件