Forráskód Böngészése

[Review] NudgeEvent: Simplify and stabilize NudgeEvent, remove all XXXNudgeEvent, add single NudgeEvent

Him188 5 éve
szülő
commit
4e2108d841

+ 12 - 137
mirai-core-api/src/commonMain/kotlin/event/events/bot.kt

@@ -136,149 +136,24 @@ public data class BotNickChangedEvent(
 ) : BotEvent, Packet, AbstractEvent()
 
 
-@MiraiExperimentalApi
-public sealed class BotNudgedEvent : AbstractEvent(), BotEvent, Packet {
-    /**
-     * 戳一戳的发起人,为 [Bot] 的某一好友, 或某一群员, 或 [Bot.asFriend]
-     */
-    public abstract val from: UserOrBot
-
-    /** 戳一戳的动作名称 */
-    public abstract val action: String
-
-    /** 戳一戳中设置的自定义后缀 */
-    public abstract val suffix: String
-
-    @MiraiExperimentalApi
-    /** [Bot] 在群聊中被戳 */
-    public sealed class InGroup : BotNudgedEvent(), GroupMemberEvent {
-        abstract override val from: Member
-        override val bot: Bot get() = from.bot
-
-        /** [Bot] 在 [Group] 中被 [Member] 戳了 */
-        public data class ByMember internal constructor(
-            override val action: String,
-            override val suffix: String,
-            override val member: Member
-        ) : InGroup() {
-            override val from: Member
-                get() = member
-
-            override fun toString(): String {
-                return "BotNudgedEvent.InGroup.ByMember(member=$member, action=$action, suffix=$suffix)"
-            }
-        }
-
-        /** [Bot] 在 [Group] 中自己戳了自己 */
-        public data class ByBot internal constructor(
-            override val action: String,
-            override val suffix: String,
-            override val group: Group
-        ) : InGroup() {
-            override val member: Member get() = group.botAsMember
-            override val from: Member get() = member
-
-            override fun toString(): String {
-                return "BotNudgedEvent.InGroup.ByBot(group=$group, action=$action, suffix=$suffix)"
-            }
-        }
-    }
-
-    @MiraiExperimentalApi
-    /** [Bot] 在私聊中被戳 */
-    public sealed class InPrivateSession : BotNudgedEvent() {
-        abstract override val from: User
-        override val bot: Bot get() = from.bot
-
-        /** 在私聊中 [Friend] 戳了 [Bot] */
-        public data class ByFriend internal constructor(
-            override val friend: Friend,
-            override val action: String,
-            override val suffix: String
-        ) : InPrivateSession(), FriendEvent {
-            override val from: Friend get() = friend
-            override val bot: Bot get() = from.bot
-
-            override fun toString(): String {
-                return "BotNudgedEvent.InPrivateSession.ByFriend(friend=$friend, action=$action, suffix=$suffix)"
-            }
-        }
-
-        /** 在私聊中 [Stranger] 戳了 [Bot] */
-        public data class ByStranger internal constructor(
-            override val stranger: Stranger,
-            override val action: String,
-            override val suffix: String
-        ) : InPrivateSession(), StrangerEvent {
-            override val from: Stranger get() = stranger
-            override val bot: Bot get() = stranger.bot
-
-            override fun toString(): String {
-                return "BotNudgedEvent.InPrivateSession.ByFriend(friend=$stranger, action=$action, suffix=$suffix)"
-            }
-        }
-
-        /** [Bot] 在私聊中自己戳了自己 */
-        public data class ByBot internal constructor(
-            /** [Bot] 的对话对象 */
-            /** 可能是 [Stranger] 或 [Friend] */
-            val user: User,
-            override val action: String,
-            override val suffix: String
-        ) : InPrivateSession(), BotEvent {
-            override val from: User
-                get() = if (user is Stranger) {
-                    bot.asStranger
-                } else {
-                    bot.asFriend
-                }
-
-            override fun toString(): String {
-                return "BotNudgedEvent.InPrivateSession.ByBot(friend=$user, action=$action, suffix=$suffix)"
-            }
-        }
-    }
-}
-
-/*
 /**
- * [Bot] 被 [戳][Nudge] 的事件.
+ * 戳一戳事件
  */
-@MiraiExperimentalAPI
-public data class BotNudgedEvent internal constructor(
+public data class NudgeEvent @MiraiInternalApi constructor(
     /**
-     * 戳一戳发起人,为 [Bot] 的某一好友, 或某一群员, 或 [Bot.selfQQ]
+     * 戳一戳发起人
      */
-    public val from: User,
+    public val from: UserOrBot,
     /**
-     * 戳一戳的动作名称
+     * 戳一戳目标, 可能与 [from] 相同.
      */
-    public val action: String,
+    public val target: UserOrBot,
     /**
-     * 戳一戳中设置的自定义后缀
+     * 消息语境, 同 [MessageEvent.subject]. 可能为 [Group], [Stranger], [Friend], [Member].
      */
+    public val subject: Contact,
+    public val action: String,
     public val suffix: String,
-) : BotEvent, Packet, AbstractEvent() {
-    /**
-     * 戳一戳的目标
-     */
-    public override val bot: Bot get() = from.bot
-
-}
-*/
-
-/**
- * 戳一戳发起的会话环境, 可能是 [Friend] 或者 [Group]
- *
- * @see MessageEvent.subject
- */
-@MiraiExperimentalApi
-public val BotNudgedEvent.subject: ContactOrBot
-    get() = when (val inlineFrom = from) {
-        is Member -> inlineFrom.group
-        else -> inlineFrom
-    }
-
-// region 图片
-
-// endregion
+) : AbstractEvent(), BotEvent, Packet {
+    override val bot: Bot get() = from.bot
+}

+ 2 - 57
mirai-core-api/src/commonMain/kotlin/event/events/friend.kt

@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2020 Mamoe Technologies and contributors.
+ * Copyright 2019-2021 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.
@@ -21,8 +21,6 @@ import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.User
 import net.mamoe.mirai.event.AbstractEvent
 import net.mamoe.mirai.internal.network.Packet
-import net.mamoe.mirai.message.action.Nudge
-import net.mamoe.mirai.utils.MiraiExperimentalApi
 import java.util.concurrent.atomic.AtomicBoolean
 
 
@@ -119,57 +117,4 @@ public data class FriendInputStatusChangedEvent internal constructor(
     public override val friend: Friend,
     public val inputting: Boolean
 
-) : FriendEvent, Packet, AbstractEvent()
-
-/**
- * 在 [Friend] 与 [Bot] 的对话中, [Friend] 被 [戳][Nudge] 事件
- *
- * 注: 此事件仅可能在私聊中发生
- */
-@MiraiExperimentalApi
-public sealed class FriendNudgedEvent : AbstractEvent(), FriendEvent, Packet {
-    /**
-     * 戳一戳的发起人, 为 [Bot] 的某一好友, 或是 [Bot.asFriend]
-     */
-    public abstract val from: Friend
-
-    /**
-     * 戳一戳的动作名称
-     */
-    public abstract val action: String
-
-    /**
-     * 戳一戳中设置的自定义后缀
-     */
-    public abstract val suffix: String
-
-    /** 在 [Bot] 与 [Friend] 的对话中 [Friend] 戳了自己事件 */
-    @MiraiExperimentalApi
-    public data class NudgedByHimself internal constructor(
-        override val friend: Friend,
-        override val action: String,
-        override val suffix: String
-    ) : FriendNudgedEvent() {
-        override fun toString(): String {
-            return "FriendNudgedEvent.NudgedByHimself(friend=$friend, action=$action, suffix=$suffix)"
-        }
-
-        override val from: Friend
-            get() = friend
-    }
-
-    /** [Bot] 戳了 [Friend] */
-    @MiraiExperimentalApi
-    public data class NudgedByBot internal constructor(
-        override val friend: Friend,
-        override val action: String,
-        override val suffix: String
-    ) : FriendNudgedEvent() {
-        override fun toString(): String {
-            return "FriendNudgedEvent.NudgedByBot(friend=$friend, action=$action, suffix=$suffix)"
-        }
-
-        override val from: Friend
-            get() = bot.asFriend
-    }
-}
+) : FriendEvent, Packet, AbstractEvent()

+ 1 - 30
mirai-core-api/src/commonMain/kotlin/event/events/group.kt

@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2020 Mamoe Technologies and contributors.
+ * Copyright 2019-2021 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.
@@ -21,7 +21,6 @@ import net.mamoe.mirai.data.GroupHonorType
 import net.mamoe.mirai.event.AbstractEvent
 import net.mamoe.mirai.event.BroadcastControllable
 import net.mamoe.mirai.internal.network.Packet
-import net.mamoe.mirai.message.action.Nudge
 import net.mamoe.mirai.utils.MiraiExperimentalApi
 import net.mamoe.mirai.utils.MiraiInternalApi
 import java.util.concurrent.atomic.AtomicBoolean
@@ -493,34 +492,6 @@ public data class MemberUnmuteEvent @MiraiInternalApi constructor(
 
 // endregion
 
-// region 戳一戳
-
-
-/**
- * [Member] 被 [戳][Nudge] 的事件.
- */
-@MiraiExperimentalApi
-public data class MemberNudgedEvent @MiraiInternalApi constructor(
-    /**
-     * 戳一戳的发起人, 不可能是 bot
-     */
-    public val from: Member,
-    /**
-     * 戳一戳的目标 (被戳的群员), 不可能是 bot
-     */
-    public override val member: Member,
-    /**
-     * 戳一戳的动作名称
-     */
-    public val action: String,
-    /**
-     * 戳一戳中设置的自定义后缀
-     */
-    public val suffix: String,
-) : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent()
-
-// endregion
-
 // region 群荣誉
 /**
  * [Member] 荣誉改变时的事件, 目前只支持龙王

+ 9 - 55
mirai-core-api/src/commonMain/kotlin/event/events/stranger.kt

@@ -1,3 +1,12 @@
+/*
+ * Copyright 2019-2021 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
@@ -5,8 +14,6 @@ import net.mamoe.mirai.contact.Friend
 import net.mamoe.mirai.contact.Stranger
 import net.mamoe.mirai.event.AbstractEvent
 import net.mamoe.mirai.internal.network.Packet
-import net.mamoe.mirai.message.action.Nudge
-import net.mamoe.mirai.utils.MiraiExperimentalApi
 
 /**
  * 新增陌生人的事件
@@ -58,57 +65,4 @@ public abstract class StrangerRelationChangeEvent(
         public val friend: Friend
     ) : StrangerRelationChangeEvent(stranger)
 
-}
-
-/**
- * 在 [Stranger] 与 [Bot] 的对话中, [Stranger] 被 [戳][Nudge] 事件
- *
- * 注: 此事件仅可能在私聊中发生
- */
-@MiraiExperimentalApi
-public sealed class StrangerNudgedEvent : AbstractEvent(), StrangerEvent, Packet {
-    /**
-     * 戳一戳的发起人, 为 [Bot] 的某一好友, 或是 [Bot.asFriend]
-     */
-    public abstract val from: Stranger
-
-    /**
-     * 戳一戳的动作名称
-     */
-    public abstract val action: String
-
-    /**
-     * 戳一戳中设置的自定义后缀
-     */
-    public abstract val suffix: String
-
-    /** 在 [Bot] 与 [Stranger] 的对话中 [Stranger] 戳了自己事件 */
-    @MiraiExperimentalApi
-    public data class NudgedByHimself internal constructor(
-        override val stranger: Stranger,
-        override val action: String,
-        override val suffix: String
-    ) : StrangerNudgedEvent() {
-        override fun toString(): String {
-            return "StrangerNudgedEvent.NudgedByHimself(stranger=$stranger, action=$action, suffix=$suffix)"
-        }
-
-        override val from: Stranger
-            get() = stranger
-    }
-
-    /** [Bot] 戳了 [Stranger] */
-    @MiraiExperimentalApi
-    public data class NudgedByBot internal constructor(
-        override val stranger: Stranger,
-        override val action: String,
-        override val suffix: String
-    ) : StrangerNudgedEvent() {
-        override fun toString(): String {
-            return "StrangerNudgedEvent.NudgedByBot(stranger=$stranger, action=$action, suffix=$suffix)"
-        }
-
-        override val from: Stranger
-            get() = bot.asStranger
-    }
 }

+ 3 - 6
mirai-core-api/src/commonMain/kotlin/message/action/Nudge.kt

@@ -12,8 +12,7 @@ import net.mamoe.kjbb.JvmBlockingBridge
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.Mirai
 import net.mamoe.mirai.contact.*
-import net.mamoe.mirai.event.events.BotNudgedEvent
-import net.mamoe.mirai.event.events.MemberNudgedEvent
+import net.mamoe.mirai.event.events.NudgeEvent
 import net.mamoe.mirai.utils.BotConfiguration
 import net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol
 
@@ -42,8 +41,7 @@ public sealed class Nudge {
      * @return 成功发送时为 `true`. 若对方禁用 "戳一戳" 功能, 返回 `false`.
      * @throws UnsupportedOperationException 当未使用 [安卓协议][MiraiProtocol.ANDROID_PHONE] 时抛出
      *
-     * @see MemberNudgedEvent 成员被戳事件
-     * @see BotNudgedEvent [Bot] 被戳事件
+     * @see NudgeEvent 事件
      * @see Contact.sendNudge
      */
     @JvmBlockingBridge
@@ -62,8 +60,7 @@ public sealed class Nudge {
          *
          * @throws UnsupportedOperationException 当未使用 [安卓协议][MiraiProtocol.ANDROID_PHONE] 时抛出
          *
-         * @see MemberNudgedEvent 成员被戳事件
-         * @see BotNudgedEvent [Bot] 被戳事件
+         * @see NudgeEvent 事件
          */
         @JvmSynthetic
         @JvmStatic

+ 26 - 44
mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt

@@ -268,15 +268,15 @@ private object Transformers732 : Map<Int, Lambda732> by mapOf(
                         }
                     }
                 }
-                if (target.id == bot.id) {
-                    return@lambda732 sequenceOf(
-                        if (from.id == bot.id)
-                            BotNudgedEvent.InGroup.ByBot(action, suffix, group)
-                        else
-                            BotNudgedEvent.InGroup.ByMember(action, suffix, from)
+                return@lambda732 sequenceOf(
+                    NudgeEvent(
+                        from = if (from.id == bot.id) bot else from,
+                        target = if (target.id == bot.id) bot else target,
+                        action = action,
+                        suffix = suffix,
+                        subject = group
                     )
-                }
-                return@lambda732 sequenceOf(MemberNudgedEvent(from, target, action, suffix))
+                )
             }
             //龙王
             10093L, 1053L, 1054L -> {
@@ -567,8 +567,8 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
                 var action = ""
                 var target: User? = null
                 var suffix = ""
-                body.msgTemplParam.asSequence().map {
-                    it.name.decodeToString() to it.value.decodeToString()
+                body.msgTemplParam.asSequence().map { param ->
+                    param.name.decodeToString() to param.value.decodeToString()
                 }.forEach { (key, value) ->
                     when (key) {
                         "action_str" -> action = value
@@ -579,44 +579,26 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
                         "suffix_str" -> suffix = value
                     }
                 }
-                val subject: User = bot.getFriend(msgInfo.lFromUin) ?: bot.getStranger(msgInfo.lFromUin)
-                ?: return@lambda528 emptySequence()
-                //机器人自己戳自己
-                if ((target == null && from == null) || (target?.id == from?.id && from?.id == bot.id)) {
-                    sequenceOf(BotNudgedEvent.InPrivateSession.ByBot(subject, action, suffix))
-                } else sequenceOf(
-                    when (subject) {
-                        is Friend -> when {
-                            //机器人自身为目标
-                            target == null || target!!.id == bot.id -> BotNudgedEvent.InPrivateSession.ByFriend(
-                                subject,
-                                action,
-                                suffix
-                            )
-                            //机器人自身为发起者
-                            from == null || from!!.id == bot.id -> FriendNudgedEvent.NudgedByBot(
-                                subject,
-                                action,
-                                suffix
-                            )
-                            else -> FriendNudgedEvent.NudgedByHimself(subject, action, suffix)
+
+                val subject: User = bot.getFriend(msgInfo.lFromUin)
+                    ?: bot.getStranger(msgInfo.lFromUin)
+                    ?: return@lambda528 emptySequence()
+
+                sequenceOf(
+                    when {
+                        target == null && from == null || target?.id == from?.id && from?.id == bot.id -> {
+                            //机器人自己戳自己
+                            NudgeEvent(from = bot, target = bot, subject = subject, action, suffix)
                         }
-                        is Stranger -> when {
+                        target == null || target!!.id == bot.id -> {
                             //机器人自身为目标
-                            target == null || target!!.id == bot.id -> BotNudgedEvent.InPrivateSession.ByStranger(
-                                subject,
-                                action,
-                                suffix
-                            )
+                            NudgeEvent(from = subject, target = bot, subject = subject, action, suffix)
+                        }
+                        from == null || from!!.id == bot.id -> {
                             //机器人自身为发起者
-                            from == null || from!!.id == bot.id -> StrangerNudgedEvent.NudgedByBot(
-                                subject,
-                                action,
-                                suffix
-                            )
-                            else -> StrangerNudgedEvent.NudgedByHimself(subject, action, suffix)
+                            NudgeEvent(from = bot, target = subject, subject = subject, action, suffix)
                         }
-                        else -> error("Internal Error: Unable to find nudge type")
+                        else -> NudgeEvent(from = subject, target = subject, subject = subject, action, suffix)
                     }
                 )
             }