Commit 049cf306 authored by Him188's avatar Him188

New event design

parent 63b5785b
...@@ -4,7 +4,8 @@ import io.ktor.application.Application ...@@ -4,7 +4,8 @@ import io.ktor.application.Application
import io.ktor.application.call import io.ktor.application.call
import io.ktor.routing.routing import io.ktor.routing.routing
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import net.mamoe.mirai.api.http.data.* import net.mamoe.mirai.api.http.data.PermissionDeniedException
import net.mamoe.mirai.api.http.data.StateCode
import net.mamoe.mirai.api.http.data.common.DTO import net.mamoe.mirai.api.http.data.common.DTO
import net.mamoe.mirai.api.http.data.common.VerifyDTO import net.mamoe.mirai.api.http.data.common.VerifyDTO
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
...@@ -84,7 +85,7 @@ fun Application.groupManageModule() { ...@@ -84,7 +85,7 @@ fun Application.groupManageModule() {
miraiVerify<MemberInfoDTO>("/memberInfo") { dto -> miraiVerify<MemberInfoDTO>("/memberInfo") { dto ->
val member = dto.session.bot.getGroup(dto.target)[dto.memberId] val member = dto.session.bot.getGroup(dto.target)[dto.memberId]
with(dto.info) { with(dto.info) {
name?.let { member.groupCard = it } name?.let { member.nameCard = it }
specialTitle?.let { member.specialTitle = it } specialTitle?.let { member.specialTitle = it }
} }
call.respondStateCode(StateCode.Success) call.respondStateCode(StateCode.Success)
...@@ -145,5 +146,5 @@ private data class MemberDetailDTO( ...@@ -145,5 +146,5 @@ private data class MemberDetailDTO(
val name: String? = null, val name: String? = null,
val specialTitle: String? = null val specialTitle: String? = null
) : DTO { ) : DTO {
constructor(member: Member) : this(member.groupCard, member.specialTitle) constructor(member: Member) : this(member.nameCard, member.specialTitle)
} }
...@@ -14,6 +14,8 @@ import net.mamoe.mirai.contact.* ...@@ -14,6 +14,8 @@ import net.mamoe.mirai.contact.*
import net.mamoe.mirai.data.FriendNameRemark import net.mamoe.mirai.data.FriendNameRemark
import net.mamoe.mirai.data.PreviousNameList import net.mamoe.mirai.data.PreviousNameList
import net.mamoe.mirai.data.Profile import net.mamoe.mirai.data.Profile
import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.MemberCardChangeEvent
import net.mamoe.mirai.message.data.CustomFaceFromFile import net.mamoe.mirai.message.data.CustomFaceFromFile
import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.data.MessageChain
...@@ -149,13 +151,15 @@ internal class MemberImpl( ...@@ -149,13 +151,15 @@ internal class MemberImpl(
override val group: GroupImpl by group.unsafeWeakRef() override val group: GroupImpl by group.unsafeWeakRef()
val qq: QQImpl by qq.unsafeWeakRef() val qq: QQImpl by qq.unsafeWeakRef()
override var groupCard: String override var nameCard: String
get() = _groupCard get() = _groupCard
set(newValue) { set(newValue) {
group.checkBotPermissionOperator() group.checkBotPermissionOperator()
if (_groupCard != newValue) { if (_groupCard != newValue) {
val oldValue = _groupCard
_groupCard = newValue _groupCard = newValue
launch { launch {
MemberCardChangeEvent.ByBot(oldValue, newValue, this@MemberImpl).broadcast()
bot.network.run { bot.network.run {
TroopManagement.EditGroupNametag( TroopManagement.EditGroupNametag(
bot.client, bot.client,
......
...@@ -107,7 +107,7 @@ abstract class BotImpl<N : BotNetworkHandler> constructor( ...@@ -107,7 +107,7 @@ abstract class BotImpl<N : BotNetworkHandler> constructor(
logger.info("Initializing BotNetworkHandler") logger.info("Initializing BotNetworkHandler")
try { try {
if (::_network.isInitialized) { if (::_network.isInitialized) {
BotOfflineEvent(this).broadcast() BotOfflineEvent.Active(this, cause).broadcast()
_network.closeAndJoin(cause) _network.closeAndJoin(cause)
} }
} catch (e: Exception) { } catch (e: Exception) {
......
...@@ -11,8 +11,9 @@ ...@@ -11,8 +11,9 @@
package net.mamoe.mirai.contact package net.mamoe.mirai.contact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.events.MemberCardChangeEvent
import net.mamoe.mirai.utils.WeakRefProperty import net.mamoe.mirai.utils.WeakRefProperty
import kotlin.jvm.JvmName
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
...@@ -32,18 +33,21 @@ interface Member : QQ, Contact { ...@@ -32,18 +33,21 @@ interface Member : QQ, Contact {
val permission: MemberPermission val permission: MemberPermission
/** /**
* 群名片. 可能为空. * 群名片. 可能为空. 修改时将会触发事件
* *
* 在修改时将会异步上传至服务器. 无权限修改时将会抛出异常 [PermissionDeniedException] * 在修改时将会异步上传至服务器. 无权限修改时将会抛出异常 [PermissionDeniedException]
* *
* @see [groupCardOrNick] 获取非空群名片或昵称 * @see [groupCardOrNick] 获取非空群名片或昵称
* @see MemberCardChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件
*/ */
var groupCard: String var nameCard: String
/** /**
* 群头衔 * 群头衔
* *
* 在修改时将会异步上传至服务器. 无权限修改时将会抛出异常 [PermissionDeniedException] * 在修改时将会异步上传至服务器. 无权限修改时将会抛出异常 [PermissionDeniedException]
*
* @see MemberSpecialTitleChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件
*/ */
var specialTitle: String var specialTitle: String
...@@ -78,9 +82,9 @@ interface Member : QQ, Contact { ...@@ -78,9 +82,9 @@ interface Member : QQ, Contact {
/** /**
* 获取非空群名片或昵称. * 获取非空群名片或昵称.
* *
* 若 [群名片][Member.groupCard] 不为空则返回群名片, 为空则返回 [QQ.nick] * 若 [群名片][Member.nameCard] 不为空则返回群名片, 为空则返回 [QQ.nick]
*/ */
val Member.groupCardOrNick: String get() = this.groupCard.takeIf { it.isNotEmpty() } ?: this.nick val Member.groupCardOrNick: String get() = this.nameCard.takeIf { it.isNotEmpty() } ?: this.nick
@ExperimentalTime @ExperimentalTime
suspend inline fun Member.mute(duration: Duration): Boolean { suspend inline fun Member.mute(duration: Duration): Boolean {
......
/*
* 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
\ No newline at end of file
...@@ -13,18 +13,31 @@ import net.mamoe.mirai.Bot ...@@ -13,18 +13,31 @@ import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group 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
// region Bot 在线状态
// region Bot 状态
/**
* [Bot] 登录完成, 好友列表, 群组列表初始化完成
*/
data class BotOnlineEvent(override val bot: Bot) : BotActiveEvent
/** /**
* 被挤下线 * [Bot] 离线.
*/ */
data class BotForceOfflineEvent( sealed class BotOfflineEvent : BotActiveEvent {
override val bot: Bot,
val title: String, /**
val tips: String * 主动离线
) : BotPassiveEvent, Packet */
data class Active(override val bot: Bot, val cause: Throwable?) : BotOfflineEvent()
/**
* 被挤下线
*/
data class Force(override val bot: Bot) : BotOfflineEvent()
}
// endregion // endregion
// region 群 // region 群
...@@ -41,43 +54,93 @@ data class BotGroupPermissionChangeEvent( ...@@ -41,43 +54,93 @@ data class BotGroupPermissionChangeEvent(
// region 群设置 // region 群设置
/** /**
* 群设置改变 * 群设置改变. 此事件广播前修改就已经完成.
*/ */
interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent { interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent {
val operator: Member
val origin: T val origin: T
val new: T val new: T
override val group: Group
get() = operator.group
} }
/** /**
* 群名改变 * 群名改变. 此事件广播前修改就已经完成.
*/ */
data class GroupNameChangeEvent( sealed class GroupNameChangeEvent(
override val operator: Member, ) : GroupSettingChangeEvent<String>, BotPassiveEvent {
override val origin: String,
override val new: String /**
) : GroupSettingChangeEvent<String>, BotPassiveEvent * 由管理员操作
*/
data class ByOperator(
override val origin: String,
override val new: String,
val operator: Member
) : GroupNameChangeEvent() {
override val group: Group
get() = operator.group
}
/**
* 由机器人操作
*/
data class ByBot(
override val origin: String,
override val new: String,
override val group: Group
) : GroupNameChangeEvent()
}
/** /**
* 群 "全员禁言" 功能状态改变 * 群 "全员禁言" 功能状态改变. 此事件广播前修改就已经完成.
*/ */
data class GroupMuteAllEvent( sealed class GroupMuteAllEvent : GroupSettingChangeEvent<Boolean>, BotPassiveEvent {
override val operator: Member, /**
override val origin: Boolean, * 由管理员操作
override val new: Boolean */
) : GroupSettingChangeEvent<Boolean>, BotPassiveEvent data class ByOperator(
override val origin: Boolean,
override val new: Boolean,
val operator: Member
) : GroupMuteAllEvent() {
override val group: Group
get() = operator.group
}
/**
* 由机器人操作
*/
data class ByBot(
override val origin: Boolean,
override val new: Boolean,
override val group: Group
) : GroupMuteAllEvent()
}
/** /**
* 群 "坦白说" 功能状态改变 * 群 "坦白说" 功能状态改变. 此事件广播前修改就已经完成.
*/ */
data class GroupConfessTalkEvent( sealed class GroupConfessTalkEvent : GroupSettingChangeEvent<Boolean>, BotPassiveEvent {
override val operator: Member,
override val origin: Boolean, /**
override val new: Boolean * 由管理员操作
) : GroupSettingChangeEvent<Boolean>, BotPassiveEvent */
data class ByOperator(
override val origin: Boolean,
override val new: Boolean,
val operator: Member
) : GroupConfessTalkEvent() {
override val group: Group
get() = operator.group
}
/**
* 由机器人操作
*/
data class ByBot(
override val origin: Boolean,
override val new: Boolean,
override val group: Group
) : GroupConfessTalkEvent()
}
// endregion // endregion
...@@ -94,13 +157,26 @@ data class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotP ...@@ -94,13 +157,26 @@ data class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotP
/** /**
* 成员离开群的事件 * 成员离开群的事件
*/ */
sealed class MemberLeftEvent : GroupMemberEvent, BotPassiveEvent { sealed class MemberLeftEvent : GroupMemberEvent {
/** /**
* 成员被踢出群. 成员不可能是机器人自己. * 成员被踢出群. 成员不可能是机器人自己.
*
* @see BotKickMemberEvent 机器人踢出一个人
*/ */
data class Kick(override val member: Member, val operator: Member) : MemberLeftEvent() sealed class Kick : MemberLeftEvent() {
/**
* 被管理员踢出
*/
data class ByOperator(
override val member: Member,
val operator: Member
) : Kick(), BotPassiveEvent
/**
* 被机器人踢出
*/
data class ByBot(
override val member: Member
) : Kick(), BotActiveEvent
}
/** /**
* 成员主动离开 * 成员主动离开
...@@ -110,35 +186,70 @@ sealed class MemberLeftEvent : GroupMemberEvent, BotPassiveEvent { ...@@ -110,35 +186,70 @@ sealed class MemberLeftEvent : GroupMemberEvent, BotPassiveEvent {
// endregion // endregion
// region // region 名片和头衔
/** /**
* 群名片改动 * 群名片改动. 此事件广播前修改就已经完成.
*/ */
sealed class MemberCardChangeEvent : GroupMemberEvent, BotPassiveEvent { sealed class MemberCardChangeEvent : GroupMemberEvent {
/** /**
* 群名片 * 修改前
*/ */
abstract val card: String abstract val origin: String
/**
* 修改后
*/
abstract val new: String
abstract override val member: Member
/** /**
* 由管理员修改 * 由管理员修改
*/ */
data class ByOperator( data class ByOperator(
override val card: String, override val origin: String,
override val new: String,
override val member: Member, override val member: Member,
val operator: Member val operator: Member
) : MemberCardChangeEvent() ) : MemberCardChangeEvent(), BotPassiveEvent
/**
* 由 [Bot] 修改. 由 [Member.nameCard]
*/
data class ByBot(
override val origin: String,
override val new: String,
override val member: Member
) : MemberCardChangeEvent(), BotActiveEvent
/** /**
* 该成员自己修改 * 该成员自己修改
*/ */
data class BySelf( data class BySelf(
override val card: String, override val origin: String,
override val new: String,
override val member: Member override val member: Member
) : MemberCardChangeEvent() ) : MemberCardChangeEvent(), BotPassiveEvent
} }
/**
* 群头衔改动. 一定为群主操作
*/
data class MemberSpecialTitleChangeEvent(
/**
* 修改前
*/
val origin: String,
/**
* 修改后
*/
val new: String,
override val member: Member
) : GroupMemberEvent
// endregion // endregion
...@@ -148,7 +259,6 @@ sealed class MemberCardChangeEvent : GroupMemberEvent, BotPassiveEvent { ...@@ -148,7 +259,6 @@ sealed class MemberCardChangeEvent : GroupMemberEvent, BotPassiveEvent {
* 成员权限改变的事件. 成员不可能是机器人自己. * 成员权限改变的事件. 成员不可能是机器人自己.
*/ */
data class MemberPermissionChangeEvent( data class MemberPermissionChangeEvent(
override val bot: Bot,
override val member: Member, override val member: Member,
val origin: MemberPermission, val origin: MemberPermission,
val new: MemberPermission val new: MemberPermission
...@@ -161,23 +271,51 @@ data class MemberPermissionChangeEvent( ...@@ -161,23 +271,51 @@ data class MemberPermissionChangeEvent(
/** /**
* 群成员被禁言事件. 操作人和被禁言的成员都不可能是机器人本人 * 群成员被禁言事件. 操作人和被禁言的成员都不可能是机器人本人
*
* @see BotMuteMemberEvent 机器人禁言一个人
*/ */
data class MemberMuteEvent( sealed class MemberMuteEvent : GroupMemberEvent {
override val member: Member, abstract override val member: Member
val operator: Member,
val durationSeconds: Int abstract val durationSeconds: Int
) : GroupMemberEvent, BotPassiveEvent {
override fun toString(): String = "MemberMuteEvent(member=${member.id}, group=${group.id}, operator=${operator.id}, duration=${durationSeconds}s" /**
* 管理员禁言成员
*/
data class ByOperator(
override val member: Member,
override val durationSeconds: Int,
val operator: Member
) : MemberMuteEvent(), BotPassiveEvent
/**
* 机器人禁言成员. 通过 [Member.mute] 触发
*/
data class ByBot(
override val member: Member,
override var durationSeconds: Int
) : MemberMuteEvent(), BotActiveEvent
} }
/** /**
* 群成员被取消禁言事件. 操作人和被禁言的成员都不可能是机器人本人 * 群成员被取消禁言事件. 操作人和被禁言的成员都不可能是机器人本人
*
* @see BotUnmuteMemberEvent 机器人取消禁言某个人
*/ */
data class MemberUnmuteEvent(override val member: Member, val operator: Member) : GroupMemberEvent, BotPassiveEvent sealed class MemberUnmuteEvent : GroupMemberEvent, BotPassiveEvent {
abstract override val member: Member
/**
* 管理员禁言成员
*/
data class ByOperator(
override val member: Member,
val operator: Member
) : MemberUnmuteEvent(), BotPassiveEvent
/**
* 机器人禁言成员. 通过 [Member.unmute] 触发
*/
data class ByBot(
override val member: Member
) : MemberUnmuteEvent(), BotActiveEvent
}
// endregion // endregion
......
...@@ -13,7 +13,6 @@ import net.mamoe.mirai.Bot ...@@ -13,7 +13,6 @@ import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.event.AbstractCancellableEvent
import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Event
/** /**
...@@ -31,7 +30,7 @@ interface BotPassiveEvent : BotEvent ...@@ -31,7 +30,7 @@ interface BotPassiveEvent : BotEvent
/** /**
* 由 [Bot] 主动发起的动作的事件 * 由 [Bot] 主动发起的动作的事件
*/ */
abstract class BotActiveEvent : BotEvent, AbstractCancellableEvent() interface BotActiveEvent : BotEvent
/** /**
......
...@@ -11,7 +11,7 @@ package net.mamoe.mirai.imageplugin ...@@ -11,7 +11,7 @@ package net.mamoe.mirai.imageplugin
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import net.mamoe.mirai.event.events.BotLoginSucceedEvent import net.mamoe.mirai.event.events.BotOnlineEvent
import net.mamoe.mirai.event.subscribeAlways import net.mamoe.mirai.event.subscribeAlways
import net.mamoe.mirai.event.subscribeMessages import net.mamoe.mirai.event.subscribeMessages
import net.mamoe.mirai.plugin.PluginBase import net.mamoe.mirai.plugin.PluginBase
...@@ -22,7 +22,7 @@ class ImageSenderMain : PluginBase() { ...@@ -22,7 +22,7 @@ class ImageSenderMain : PluginBase() {
@MiraiExperimentalAPI @MiraiExperimentalAPI
override fun onEnable() { override fun onEnable() {
logger.info("Image Sender plugin enabled") logger.info("Image Sender plugin enabled")
GlobalScope.subscribeAlways<BotLoginSucceedEvent> { GlobalScope.subscribeAlways<BotOnlineEvent> {
logger.info("${this.bot.uin} login succeed, it will be controlled by Image Sender Plugin") logger.info("${this.bot.uin} login succeed, it will be controlled by Image Sender Plugin")
this.bot.subscribeMessages { this.bot.subscribeMessages {
......
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