123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- /*
- * 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
- */
- @file:JvmMultifileClass
- @file:JvmName("BotEventsKt")
- package net.mamoe.mirai.event.events
- import net.mamoe.mirai.Bot
- import net.mamoe.mirai.contact.*
- import net.mamoe.mirai.event.AbstractEvent
- import net.mamoe.mirai.event.Event
- import net.mamoe.mirai.internal.network.Packet
- import net.mamoe.mirai.message.data.MessageChain
- import net.mamoe.mirai.message.data.MessageSource
- import net.mamoe.mirai.message.data.OnlineMessageSource
- import net.mamoe.mirai.message.data.source
- import net.mamoe.mirai.message.isContextIdenticalWith
- import net.mamoe.mirai.utils.DeprecatedSinceMirai
- import net.mamoe.mirai.utils.MiraiInternalApi
- import kotlin.jvm.JvmMultifileClass
- import kotlin.jvm.JvmName
- /**
- * 一个消息事件.
- *
- * @see isContextIdenticalWith 判断语境相同
- */
- public sealed interface MessageEvent : Event, Packet, BotPassiveEvent {
- /**
- * 与这个消息事件相关的 [Bot]
- */
- public override val bot: Bot
- /**
- * 消息事件主体.
- *
- * - 对于私聊会话, 这个属性与 [sender] 相同;
- * - 对于群消息, 这个属性为 [Group] 的实例, 与 [GroupMessageEvent.group] 相同.
- *
- * 如果在 [GroupMessageEvent] 对 [sender] 发送消息, 将会通过私聊发送给群员, 而不会发送在群内.
- * 使用 [subject] 作为消息目标则可以确保消息发送到用户所在的场景.
- *
- * 在回复消息时, 可通过 [subject] 作为回复对象.
- */
- public val subject: Contact
- /**
- * 发送人.
- *
- * 在私聊消息时为相关 [User] 的实例, 在群消息时为 [Member] 的实例, 在其他客户端消息时为 [Bot.asFriend]
- */
- public val sender: User
- /**
- * 发送人名称. 由群员发送时为群员名片, 由好友发送时为好友昵称. 使用 [User.nameCardOrNick] 也能得到相同的结果.
- */
- public val senderName: String
- /**
- * 消息内容.
- *
- * 返回的消息链中一定包含 [MessageSource], 存储此消息的发送人, 发送时间, 收信人, 消息 ids 等数据. 随后的元素为拥有顺序的真实消息内容.
- *
- * 详细查看 [MessageChain]
- */
- public val message: MessageChain
- /** 消息发送时间戳, 单位为秒. 由服务器提供, 可能与本地有时差. */
- public val time: Int
- /**
- * 消息源. 来自 [message]. 相当于对 [message] 以 [MessageSource] 参数调用 [MessageChain.get].
- */
- public val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming
- }
- /**
- * 来自 [User] 的消息
- *
- * @see FriendMessageEvent
- * @see GroupTempMessageEvent
- */
- public sealed interface UserMessageEvent : MessageEvent {
- public override val subject: User
- }
- /**
- * 机器人收到的好友消息的事件
- *
- * @see MessageEvent
- */
- public class FriendMessageEvent constructor(
- public override val sender: Friend,
- public override val message: MessageChain,
- public override val time: Int
- ) : AbstractMessageEvent(), UserMessageEvent, FriendEvent {
- init {
- val source =
- message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message")
- check(source is OnlineMessageSource.Incoming.FromFriend) { "source provided to a FriendMessageEvent must be an instance of OnlineMessageSource.Incoming.FromFriend" }
- }
- public override val friend: Friend get() = sender
- public override val bot: Bot get() = super.bot
- public override val subject: Friend get() = sender
- public override val senderName: String get() = sender.nick
- public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend
- public override fun toString(): String = "FriendMessageEvent(sender=${sender.id}, message=$message)"
- }
- /**
- * 机器人收到的其他客户端消息的事件
- *
- * @see MessageEvent
- */
- public class OtherClientMessageEvent constructor(
- public override val client: OtherClient,
- public override val message: MessageChain,
- public override val time: Int
- ) : AbstractMessageEvent(), MessageEvent, OtherClientEvent {
- init {
- val source =
- message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message")
- check(source is OnlineMessageSource.Incoming.FromFriend) { "source provided to a OtherClientMessageEvent must be an instance of OnlineMessageSource.Incoming.FromFriend" }
- }
- public override val sender: User get() = client.bot.asFriend
- public override val bot: Bot get() = super.bot
- public override val subject: OtherClient get() = client
- public override val senderName: String get() = sender.nick
- /**
- * 为简化处理, 其他客户端消息的 [MessageSource] 被作为 [OnlineMessageSource.Incoming.FromFriend].
- */
- public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend
- public override fun toString(): String = "OtherClientMessageEvent(client=${client.platform}, message=$message)"
- }
- /**
- * 来自一个可以知道其 [Group] 的用户消息
- *
- * @see FriendMessageEvent
- * @see GroupTempMessageEvent
- */
- public sealed interface GroupAwareMessageEvent : MessageEvent {
- public val group: Group
- }
- /**
- * 机器人收到的群消息的事件
- *
- * @see MessageEvent
- */
- public class GroupMessageEvent(
- public override val senderName: String,
- /**
- * 发送方权限.
- */
- public val permission: MemberPermission,
- /**
- * 发送人. 可能是 [NormalMember] 或 [AnonymousMember]
- */
- public override val sender: Member,
- public override val message: MessageChain,
- public override val time: Int
- ) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageEvent, GroupEvent {
- init {
- val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
- check(source is OnlineMessageSource.Incoming.FromGroup) { "source provided to a GroupMessageEvent must be an instance of OnlineMessageSource.Incoming.FromGroup" }
- }
- public override val group: Group get() = sender.group
- public override val bot: Bot get() = sender.bot
- public override val subject: Group get() = group
- public override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup
- public override fun toString(): String =
- "GroupMessageEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, permission=${permission.name}, message=$message)"
- }
- /**
- * 机器人收到的群临时会话消息的事件
- *
- * @see MessageEvent
- */
- @Deprecated(
- "mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempMessageEvent 已更改为 GroupTempMessageEvent",
- replaceWith = ReplaceWith("GroupTempMessageEvent", "net.mamoe.mirai.event.events.GroupTempMessageEvent"),
- DeprecationLevel.HIDDEN
- )
- @DeprecatedSinceMirai(hiddenSince = "2.0") // maybe 2.0
- public sealed class TempMessageEvent constructor(
- public override val sender: NormalMember,
- public override val message: MessageChain,
- public override val time: Int
- ) : AbstractMessageEvent(), GroupAwareMessageEvent, UserMessageEvent
- // support by mirai 2.1
- //
- //public class UserTempMessageEvent(
- // sender: TempUser,
- // message: MessageChain,
- // time: Int
- //) : @Suppress("DEPRECATION_ERROR") TempMessageEvent(sender, message, time), GroupAwareMessageEvent, UserMessageEvent {
- //}
- /**
- * 群临时会话消息
- */
- public class GroupTempMessageEvent(
- public override val sender: NormalMember,
- public override val message: MessageChain,
- public override val time: Int
- ) : @Suppress("DEPRECATION_ERROR") TempMessageEvent(sender, message, time), GroupAwareMessageEvent, UserMessageEvent {
- init {
- val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
- check(source is OnlineMessageSource.Incoming.FromTemp) { "source provided to a GroupTempMessageEvent must be an instance of OnlineMessageSource.Incoming.FromTemp" }
- }
- public override val bot: Bot get() = sender.bot
- public override val subject: NormalMember get() = sender
- public override val group: Group get() = sender.group
- public override val senderName: String get() = sender.nameCardOrNick
- public override val source: OnlineMessageSource.Incoming.FromTemp get() = message.source as OnlineMessageSource.Incoming.FromTemp
- public override fun toString(): String =
- "GroupTempMessageEvent(sender=${sender.id} from group(${sender.group.id}), message=$message)"
- }
- /**
- * 机器人收到的陌生人消息的事件
- *
- * @see MessageEvent
- */
- public class StrangerMessageEvent constructor(
- public override val sender: Stranger,
- public override val message: MessageChain,
- public override val time: Int
- ) : AbstractMessageEvent(), UserMessageEvent, StrangerEvent {
- init {
- val source =
- message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message")
- check(source is OnlineMessageSource.Incoming.FromStranger) { "source provided to a StrangerMessageEvent must be an instance of OnlineMessageSource.Incoming.FromStranger" }
- }
- public override val stranger: Stranger get() = sender
- public override val bot: Bot get() = super.bot
- public override val subject: Stranger get() = sender
- public override val senderName: String get() = sender.nick
- public override val source: OnlineMessageSource.Incoming.FromStranger get() = message.source as OnlineMessageSource.Incoming.FromStranger
- public override fun toString(): String = "StrangerMessageEvent(sender=${sender.id}, message=$message)"
- }
- /**
- * 消息事件的公共抽象父类, 保留将来使用. 这是内部 API, 请不要使用.
- */
- @MiraiInternalApi
- public abstract class AbstractMessageEvent : MessageEvent, AbstractEvent()
|