Commit 4d77951a authored by Him188's avatar Him188

Redesign event structure

parent a322ce73
...@@ -24,7 +24,7 @@ import net.mamoe.mirai.contact.MemberPermission ...@@ -24,7 +24,7 @@ import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MultiPacket import net.mamoe.mirai.data.MultiPacket
import net.mamoe.mirai.data.Packet import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.* 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.network.BotNetworkHandler
import net.mamoe.mirai.qqandroid.GroupImpl import net.mamoe.mirai.qqandroid.GroupImpl
import net.mamoe.mirai.qqandroid.MemberImpl import net.mamoe.mirai.qqandroid.MemberImpl
...@@ -119,7 +119,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler ...@@ -119,7 +119,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
@UseExperimental(MiraiExperimentalAPI::class, ExperimentalTime::class) @UseExperimental(MiraiExperimentalAPI::class, ExperimentalTime::class)
override suspend fun init(): Unit = coroutineScope { override suspend fun init(): Unit = coroutineScope {
this@QQAndroidBotNetworkHandler.subscribeAlways<ForceOfflineEvent> { this@QQAndroidBotNetworkHandler.subscribeAlways<BotForceOfflineEvent> {
if (this@QQAndroidBotNetworkHandler.bot == this.bot) { if (this@QQAndroidBotNetworkHandler.bot == this.bot) {
this.bot.logger.error("被挤下线") this.bot.logger.error("被挤下线")
close() close()
......
...@@ -11,10 +11,10 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive ...@@ -11,10 +11,10 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact import kotlinx.io.core.discardExact
import net.mamoe.mirai.event.events.ForceOfflineEvent
import net.mamoe.mirai.data.MultiPacket import net.mamoe.mirai.data.MultiPacket
import net.mamoe.mirai.data.Packet import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.BroadcastControllable import net.mamoe.mirai.event.BroadcastControllable
import net.mamoe.mirai.event.events.BotForceOfflineEvent
import net.mamoe.mirai.message.FriendMessage import net.mamoe.mirai.message.FriendMessage
import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
...@@ -178,10 +178,10 @@ internal class MessageSvc { ...@@ -178,10 +178,10 @@ internal class MessageSvc {
/** /**
* 被挤下线 * 被挤下线
*/ */
internal object PushForceOffline : OutgoingPacketFactory<ForceOfflineEvent>("MessageSvc.PushForceOffline") { internal object PushForceOffline : OutgoingPacketFactory<BotForceOfflineEvent>("MessageSvc.PushForceOffline") {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): ForceOfflineEvent { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): BotForceOfflineEvent {
val struct = this.decodeUniPacket(RequestPushForceOffline.serializer()) val struct = this.decodeUniPacket(RequestPushForceOffline.serializer())
return ForceOfflineEvent(bot, title = struct.title ?: "", tips = struct.tips ?: "") return BotForceOfflineEvent(bot, title = struct.title ?: "", tips = struct.tips ?: "")
} }
} }
......
...@@ -9,29 +9,45 @@ ...@@ -9,29 +9,45 @@
package net.mamoe.mirai.event.events package net.mamoe.mirai.event.events
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.QQ 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 * [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 ReceiveFriendAddRequestEvent( class BotMuteMemberEvent(override val member: Member) : GroupMemberEvent, BotActiveEvent()
_qq: QQ,
/** /**
* 验证消息 * 机器人取消禁言某个群成员
*/ */
val message: String class BotUnmuteMemberEvent(override val member: Member) : GroupMemberEvent, BotActiveEvent()
) : EventPacket {
val qq: QQ by _qq.unsafeWeakRef() // endregion
\ No newline at end of file
/**
* 同意这个请求
*
* @param remark 备注名, 不设置则需为 `null`
*/
@JvmOverloads
suspend fun approve(remark: String? = null): Unit = qq.bot.approveFriendAddRequest(qq.id, remark)
}
/*
* 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
}
...@@ -14,55 +14,36 @@ import net.mamoe.mirai.contact.Group ...@@ -14,55 +14,36 @@ 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.Packet import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.Event
/** // region Bot 在线状态
* 有关一个 [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( data class BotForceOfflineEvent(
override val bot: Bot, override val bot: Bot,
val title: String, val title: String,
val tips: String val tips: String
) : BotEvent, Packet ) : BotPassiveEvent, Packet
// endregion
// region 群
/** /**
* 有关群的事件 * Bot 在群里的权限被改变. 操作人一定是群主
*/ */
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( data class BotGroupPermissionChangeEvent(
override val group: Group, override val group: Group,
val origin: MemberPermission, val origin: MemberPermission,
val new: MemberPermission val new: MemberPermission
) : BotEvent, GroupEvent ) : BotPassiveEvent, GroupEvent
// region 群设置
interface GroupSettingChangeEvent<T> : GroupEvent { /**
* 群设置改变
*/
interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent {
val operator: Member val operator: Member
val origin: T val origin: T
val new: T val new: T
...@@ -71,48 +52,53 @@ interface GroupSettingChangeEvent<T> : GroupEvent { ...@@ -71,48 +52,53 @@ interface GroupSettingChangeEvent<T> : GroupEvent {
get() = operator.group get() = operator.group
} }
/**
* 群名改变
*/
data class GroupNameChangeEvent( data class GroupNameChangeEvent(
override val operator: Member, override val operator: Member,
override val origin: String, override val origin: String,
override val new: String override val new: String
) : BotEvent, GroupSettingChangeEvent<String> ) : GroupSettingChangeEvent<String>, BotPassiveEvent
/** /**
* 群 "全员禁言" 功能开启 * 群 "全员禁言" 功能状态改变
*/ */
data class GroupMuteAllEvent( data class GroupMuteAllEvent(
override val operator: Member, override val operator: Member,
override val origin: Boolean, override val origin: Boolean,
override val new: Boolean override val new: Boolean
) : BotEvent, GroupSettingChangeEvent<Boolean> ) : GroupSettingChangeEvent<Boolean>, BotPassiveEvent
/**
* 群 "坦白说" 功能状态改变
*/
data class GroupConfessTalkEvent( data class GroupConfessTalkEvent(
override val operator: Member, override val operator: Member,
override val origin: Boolean, override val origin: Boolean,
override val new: Boolean override val new: Boolean
) : BotEvent, GroupSettingChangeEvent<Boolean> ) : GroupSettingChangeEvent<Boolean>, BotPassiveEvent
// endregion
/**
* 有关群成员的事件 // region 群成员
*/
interface GroupMemberEvent : GroupEvent { // region 成员变更
val member: Member
override val group: Group
get() = member.group
}
/** /**
* 成员加入群的事件 * 成员加入群的事件
*/ */
data class MemberJoinEvent(override val member: Member) : BotEvent, GroupMemberEvent data class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent
/** /**
* 成员离开群的事件 * 成员离开群的事件
*/ */
sealed class MemberLeftEvent : BotEvent, GroupMemberEvent { sealed class MemberLeftEvent : GroupMemberEvent, BotPassiveEvent {
/** /**
* 成员被踢出群 * 成员被踢出群. 成员不可能是机器人自己.
*
* @see BotKickMemberEvent 机器人踢出一个人
*/ */
data class Kick(override val member: Member, val operator: Member) : MemberLeftEvent() data class Kick(override val member: Member, val operator: Member) : MemberLeftEvent()
...@@ -122,11 +108,48 @@ sealed class MemberLeftEvent : BotEvent, GroupMemberEvent { ...@@ -122,11 +108,48 @@ sealed class MemberLeftEvent : BotEvent, GroupMemberEvent {
data class Quit(override val member: Member) : MemberLeftEvent() data class Quit(override val member: Member) : MemberLeftEvent()
} }
// endregion
// region 成员权限
/**
* 成员权限改变的事件. 成员不可能是机器人自己.
*/
data class MemberPermissionChangeEvent( data class MemberPermissionChangeEvent(
override val bot: Bot, override val bot: Bot,
override val member: Member, override val member: Member,
val origin: MemberPermission, val origin: MemberPermission,
val new: MemberPermission val new: MemberPermission
) : BotEvent, GroupMemberEvent ) : 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
\ No newline at end of file
...@@ -9,11 +9,55 @@ ...@@ -9,11 +9,55 @@
package net.mamoe.mirai.event.events 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.contact.QQ
import net.mamoe.mirai.data.EventPacket import net.mamoe.mirai.event.AbstractCancellableEvent
import net.mamoe.mirai.data.OnlineStatus import net.mamoe.mirai.event.Event
data class FriendStatusChanged( /**
val qq: QQ, * 有关一个 [Bot] 的事件
val status: OnlineStatus */
) : EventPacket 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
}
\ No newline at end of file
...@@ -21,7 +21,7 @@ import net.mamoe.mirai.alsoLogin ...@@ -21,7 +21,7 @@ import net.mamoe.mirai.alsoLogin
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.event.Event 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.subscribeAlways
import net.mamoe.mirai.event.subscribeGroupMessages import net.mamoe.mirai.event.subscribeGroupMessages
import net.mamoe.mirai.event.subscribeMessages import net.mamoe.mirai.event.subscribeMessages
...@@ -54,8 +54,8 @@ suspend fun main() { ...@@ -54,8 +54,8 @@ suspend fun main() {
} }
// 全局范围订阅事件, 不受 bot 实例影响 // 全局范围订阅事件, 不受 bot 实例影响
GlobalScope.subscribeAlways<ReceiveFriendAddRequestEvent> { GlobalScope.subscribeAlways<BotEvent> {
it.approve()
} }
// 订阅来自这个 bot 的群消息事件 // 订阅来自这个 bot 的群消息事件
......
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