mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-25 06:50:09 +08:00
Separate events to reduce file size
This commit is contained in:
parent
8333dfa52a
commit
6972a84007
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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.Contact
|
||||
import net.mamoe.mirai.contact.Contact.Companion.uploadImage
|
||||
import net.mamoe.mirai.event.AbstractEvent
|
||||
import net.mamoe.mirai.event.CancellableEvent
|
||||
import net.mamoe.mirai.event.events.ImageUploadEvent.Failed
|
||||
import net.mamoe.mirai.event.events.ImageUploadEvent.Succeed
|
||||
import net.mamoe.mirai.message.data.Image
|
||||
import net.mamoe.mirai.utils.ExternalResource
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
|
||||
|
||||
/**
|
||||
* 图片上传前. 可以阻止上传.
|
||||
*
|
||||
* 此事件总是在 [ImageUploadEvent] 之前广播.
|
||||
* 若此事件被取消, [ImageUploadEvent] 不会广播.
|
||||
*
|
||||
* @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径
|
||||
*/
|
||||
public data class BeforeImageUploadEvent @MiraiInternalApi constructor(
|
||||
public val target: Contact,
|
||||
public val source: ExternalResource
|
||||
) : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent {
|
||||
public override val bot: Bot
|
||||
get() = target.bot
|
||||
}
|
||||
|
||||
/**
|
||||
* 图片上传完成.
|
||||
*
|
||||
* 此事件总是在 [BeforeImageUploadEvent] 之后广播.
|
||||
* 若 [BeforeImageUploadEvent] 被取消, 此事件不会广播.
|
||||
*
|
||||
* @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径
|
||||
*
|
||||
* @see Succeed
|
||||
* @see Failed
|
||||
*/
|
||||
public sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent() {
|
||||
public abstract val target: Contact
|
||||
public abstract val source: ExternalResource
|
||||
public override val bot: Bot
|
||||
get() = target.bot
|
||||
|
||||
public data class Succeed @MiraiInternalApi constructor(
|
||||
override val target: Contact,
|
||||
override val source: ExternalResource,
|
||||
val image: Image
|
||||
) : ImageUploadEvent()
|
||||
|
||||
public data class Failed @MiraiInternalApi constructor(
|
||||
override val target: Contact,
|
||||
override val source: ExternalResource,
|
||||
val errno: Int,
|
||||
val message: String
|
||||
) : ImageUploadEvent()
|
||||
}
|
@ -0,0 +1,235 @@
|
||||
/*
|
||||
* 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.event.EventChannel
|
||||
import net.mamoe.mirai.event.subscribe
|
||||
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.MiraiInternalApi
|
||||
|
||||
|
||||
/**
|
||||
* 一个 (收到的) 消息事件.
|
||||
*
|
||||
* 它是一个 [BotEvent], 因此可以被 [监听][EventChannel.subscribe]
|
||||
*
|
||||
* @see isContextIdenticalWith 判断语境相同
|
||||
*/
|
||||
public interface MessageEvent : Event, Packet, BotPassiveEvent {
|
||||
/**
|
||||
* 与这个消息事件相关的 [Bot]
|
||||
*/
|
||||
public override val bot: Bot
|
||||
|
||||
/**
|
||||
* 消息事件主体.
|
||||
*
|
||||
* - 对于好友消息, 这个属性为 [Friend] 的实例, 与 [sender] 引用相同;
|
||||
* - 对于临时会话消息, 这个属性为 [Member] 的实例, 与 [sender] 引用相同;
|
||||
* - 对于陌生人消息, 这个属性为 [Stranger] 的实例, 与 [sender] 引用相同
|
||||
* - 对于群消息, 这个属性为 [Group] 的实例, 与 [GroupMessageEvent.group] 引用相同
|
||||
* - 对于其他客户端消息, 这个属性为 [OtherClient] 的实例, 与 [OtherClientMessageEvent.client] 引用相同
|
||||
*
|
||||
* 在回复消息时, 可通过 [subject] 作为回复对象
|
||||
*/
|
||||
public val subject: Contact
|
||||
|
||||
/**
|
||||
* 发送人.
|
||||
*
|
||||
* 在私聊消息时为相关 [User] 的实例, 在群消息时为 [Member] 的实例, 在其他客户端消息时为 [Bot.asFriend]
|
||||
*/
|
||||
public val sender: User
|
||||
|
||||
/**
|
||||
* 发送人名称
|
||||
*/
|
||||
public val senderName: String
|
||||
|
||||
/**
|
||||
* 消息内容.
|
||||
*
|
||||
* 第一个元素一定为 [MessageSource], 存储此消息的发送人, 发送时间, 收信人, 消息 ids 等数据.
|
||||
* 随后的元素为拥有顺序的真实消息内容.
|
||||
*/
|
||||
public val message: MessageChain
|
||||
|
||||
/** 消息发送时间 (由服务器提供, 可能与本地有时差) */
|
||||
public val time: Int
|
||||
|
||||
/**
|
||||
* 消息源. 来自 [message] 的第一个元素,
|
||||
*/
|
||||
public val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming
|
||||
}
|
||||
|
||||
/**
|
||||
* 来自 [User] 的消息
|
||||
*
|
||||
* @see FriendMessageEvent
|
||||
* @see TempMessageEvent
|
||||
*/
|
||||
public 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
|
||||
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 TempMessageEvent
|
||||
*/
|
||||
public interface GroupAwareMessageEvent : MessageEvent {
|
||||
public val group: Group
|
||||
}
|
||||
|
||||
/**
|
||||
* 机器人收到的群消息的事件
|
||||
*
|
||||
* @see MessageEvent
|
||||
*/
|
||||
public class GroupMessageEvent(
|
||||
public override val senderName: String,
|
||||
/**
|
||||
* 发送方权限.
|
||||
*/
|
||||
public val permission: MemberPermission,
|
||||
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
|
||||
*/
|
||||
public class TempMessageEvent(
|
||||
public override val sender: Member,
|
||||
public override val message: MessageChain,
|
||||
public override val time: Int
|
||||
) : AbstractMessageEvent(), GroupAwareMessageEvent, UserMessageEvent {
|
||||
init {
|
||||
val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
|
||||
check(source is OnlineMessageSource.Incoming.FromTemp) { "source provided to a TempMessageEvent must be an instance of OnlineMessageSource.Incoming.FromTemp" }
|
||||
}
|
||||
|
||||
public override val bot: Bot get() = sender.bot
|
||||
public override val subject: Member 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 =
|
||||
"TempMessageEvent(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)"
|
||||
}
|
||||
|
||||
@MiraiInternalApi
|
||||
public abstract class AbstractMessageEvent : MessageEvent, AbstractEvent()
|
@ -0,0 +1,188 @@
|
||||
/*
|
||||
* 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.CancellableEvent
|
||||
import net.mamoe.mirai.message.MessageReceipt
|
||||
import net.mamoe.mirai.message.data.MessageChain
|
||||
import net.mamoe.mirai.message.data.MessageSource
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
|
||||
|
||||
/**
|
||||
* 在发送消息后广播的事件, 总是在 [MessagePreSendEvent] 之后广播.
|
||||
*
|
||||
* 只要 [MessagePreSendEvent] 未被 [取消][CancellableEvent.cancel], [MessagePostSendEvent] 就一定会被广播, 并携带 [发送时产生的异常][MessagePostSendEvent.exception] (如果有).
|
||||
*
|
||||
* 在此事件广播前, 消息一定已经发送成功, 或产生一个异常.
|
||||
*
|
||||
* @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public sealed class MessagePostSendEvent<C : Contact> : BotEvent, BotActiveEvent, AbstractEvent() {
|
||||
/** 发信目标. */
|
||||
public abstract val target: C
|
||||
public final override val bot: Bot get() = target.bot
|
||||
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public abstract val message: MessageChain
|
||||
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public abstract val exception: Throwable?
|
||||
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public abstract val receipt: MessageReceipt<C>?
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指代这条已经发送的消息的 [MessageSource]. 若消息发送失败, 返回 `null`
|
||||
* @see MessagePostSendEvent.sourceResult
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.source: MessageSource?
|
||||
get() = receipt?.source
|
||||
|
||||
/**
|
||||
* 获取指代这条已经发送的消息的 [MessageSource], 并包装为 [kotlin.Result]
|
||||
* @see MessagePostSendEvent.result
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
@Suppress("RESULT_CLASS_IN_RETURN_TYPE")
|
||||
public inline val MessagePostSendEvent<*>.sourceResult: Result<MessageSource>
|
||||
get() = result.map { it.source }
|
||||
|
||||
/**
|
||||
* 在此消息发送成功时返回 `true`.
|
||||
* @see MessagePostSendEvent.exception
|
||||
* @see MessagePostSendEvent.result
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.isSuccess: Boolean
|
||||
get() = exception == null
|
||||
|
||||
/**
|
||||
* 在此消息发送失败时返回 `true`.
|
||||
* @see MessagePostSendEvent.exception
|
||||
* @see MessagePostSendEvent.result
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.isFailure: Boolean
|
||||
get() = exception != null
|
||||
|
||||
/**
|
||||
* 将 [MessagePostSendEvent.exception] 与 [MessagePostSendEvent.receipt] 表示为 [Result]
|
||||
*/
|
||||
@Suppress("RESULT_CLASS_IN_RETURN_TYPE")
|
||||
public inline val <C : Contact> MessagePostSendEvent<C>.result: Result<MessageReceipt<C>>
|
||||
get() = exception.let { exception -> if (exception != null) Result.failure(exception) else Result.success(receipt!!) }
|
||||
|
||||
/**
|
||||
* 在群消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class GroupMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Group,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Group>?
|
||||
) : MessagePostSendEvent<Group>()
|
||||
|
||||
/**
|
||||
* 在好友或群临时会话消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public sealed class UserMessagePostSendEvent<C : User> : MessagePostSendEvent<C>()
|
||||
|
||||
/**
|
||||
* 在好友消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class FriendMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Friend,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Friend>?
|
||||
) : UserMessagePostSendEvent<Friend>()
|
||||
|
||||
/**
|
||||
* 在群临时会话消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class TempMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Member,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Member>?
|
||||
) : UserMessagePostSendEvent<Member>() {
|
||||
public val group: Group get() = target.group
|
||||
}
|
||||
|
||||
/**
|
||||
* 在陌生人消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class StrangerMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Stranger,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Stranger>?
|
||||
) : UserMessagePostSendEvent<Stranger>()
|
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* 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.CancellableEvent
|
||||
import net.mamoe.mirai.message.data.Message
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
|
||||
|
||||
/**
|
||||
* 在发送消息前广播的事件. 可被 [取消][CancellableEvent.cancel].
|
||||
*
|
||||
* 此事件总是在 [MessagePostSendEvent] 之前广播.
|
||||
*
|
||||
* 当 [MessagePreSendEvent] 被 [取消][CancellableEvent.cancel] 后:
|
||||
* - [MessagePostSendEvent] 不会广播
|
||||
* - 消息不会发送.
|
||||
* - [Contact.sendMessage] 会抛出异常 [EventCancelledException]
|
||||
*
|
||||
* @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径
|
||||
*/
|
||||
public sealed class MessagePreSendEvent : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent {
|
||||
/** 发信目标. */
|
||||
public abstract val target: Contact
|
||||
public final override val bot: Bot get() = target.bot
|
||||
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public abstract var message: Message
|
||||
}
|
||||
|
||||
/**
|
||||
* 在发送群消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class GroupMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Group,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : MessagePreSendEvent()
|
||||
|
||||
/**
|
||||
* 在发送好友或群临时会话消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public sealed class UserMessagePreSendEvent : MessagePreSendEvent() {
|
||||
/** 发信目标. */
|
||||
public abstract override val target: User
|
||||
}
|
||||
|
||||
/**
|
||||
* 在发送好友消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class FriendMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Friend,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : UserMessagePreSendEvent()
|
||||
|
||||
/**
|
||||
* 在发送群临时会话消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class TempMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Member,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : UserMessagePreSendEvent() {
|
||||
public val group: Group get() = target.group
|
||||
}
|
||||
|
||||
/**
|
||||
* 在发送陌生人消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class StrangerMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Stranger,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : UserMessagePreSendEvent()
|
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* 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.internal.network.Packet
|
||||
import net.mamoe.mirai.message.data.MessageSource
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
|
||||
|
||||
/**
|
||||
* 消息撤回事件. 可是任意消息被任意人撤回.
|
||||
*
|
||||
* @see Contact.recallMessage 撤回消息. 为广播这个事件的唯一途径
|
||||
*/
|
||||
public sealed class MessageRecallEvent : BotEvent, AbstractEvent() {
|
||||
/**
|
||||
* 消息原发送人
|
||||
*/
|
||||
public abstract val authorId: Long
|
||||
|
||||
/**
|
||||
* 消息原发送人.
|
||||
*/
|
||||
public abstract val author: UserOrBot
|
||||
|
||||
/**
|
||||
* 消息 ids.
|
||||
* @see MessageSource.ids
|
||||
*/
|
||||
public abstract val messageIds: IntArray
|
||||
|
||||
/**
|
||||
* 消息内部 ids.
|
||||
* @see MessageSource.ids
|
||||
*/
|
||||
public abstract val messageInternalIds: IntArray
|
||||
|
||||
/**
|
||||
* 原发送时间戳, 单位为秒.
|
||||
*/
|
||||
public abstract val messageTime: Int // seconds
|
||||
|
||||
/**
|
||||
* 好友消息撤回事件
|
||||
*/
|
||||
public data class FriendRecall @MiraiInternalApi public constructor(
|
||||
public override val bot: Bot,
|
||||
public override val messageIds: IntArray,
|
||||
public override val messageInternalIds: IntArray,
|
||||
public override val messageTime: Int,
|
||||
/**
|
||||
* 撤回操作人, 好友的 [User.id]
|
||||
*/
|
||||
public val operatorId: Long,
|
||||
public val operator: Friend,
|
||||
) : MessageRecallEvent(), Packet {
|
||||
/**
|
||||
* 消息原发送人, 等于 [operator]
|
||||
*/
|
||||
override val author: Friend get() = operator
|
||||
|
||||
public override val authorId: Long
|
||||
get() = operatorId
|
||||
|
||||
@Suppress("DuplicatedCode")
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
|
||||
other as FriendRecall
|
||||
|
||||
if (bot != other.bot) return false
|
||||
if (!messageIds.contentEquals(other.messageIds)) return false
|
||||
if (!messageInternalIds.contentEquals(other.messageInternalIds)) return false
|
||||
if (messageTime != other.messageTime) return false
|
||||
if (operatorId != other.operatorId) return false
|
||||
if (operator != other.operator) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
var result = bot.hashCode()
|
||||
result = 31 * result + messageIds.contentHashCode()
|
||||
result = 31 * result + messageInternalIds.contentHashCode()
|
||||
result = 31 * result + messageTime
|
||||
result = 31 * result + operatorId.hashCode()
|
||||
result = 31 * result + operator.hashCode()
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 群消息撤回事件.
|
||||
*/
|
||||
public data class GroupRecall @MiraiInternalApi constructor(
|
||||
public override val bot: Bot,
|
||||
public override val authorId: Long,
|
||||
public override val messageIds: IntArray,
|
||||
public override val messageInternalIds: IntArray,
|
||||
public override val messageTime: Int,
|
||||
/**
|
||||
* 操作人. 为 null 时则为 [Bot] 操作.
|
||||
*/
|
||||
public override val operator: Member?,
|
||||
public override val group: Group,
|
||||
public override val author: NormalMember,
|
||||
) : MessageRecallEvent(), GroupOperableEvent, Packet {
|
||||
|
||||
@Suppress("DuplicatedCode")
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
|
||||
other as GroupRecall
|
||||
|
||||
if (bot != other.bot) return false
|
||||
if (authorId != other.authorId) return false
|
||||
if (!messageIds.contentEquals(other.messageIds)) return false
|
||||
if (!messageInternalIds.contentEquals(other.messageInternalIds)) return false
|
||||
if (messageTime != other.messageTime) return false
|
||||
if (operator != other.operator) return false
|
||||
if (group != other.group) return false
|
||||
if (author != other.author) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
var result = bot.hashCode()
|
||||
result = 31 * result + authorId.hashCode()
|
||||
result = 31 * result + messageIds.contentHashCode()
|
||||
result = 31 * result + messageInternalIds.contentHashCode()
|
||||
result = 31 * result + messageTime
|
||||
result = 31 * result + (operator?.hashCode() ?: 0)
|
||||
result = 31 * result + group.hashCode()
|
||||
result = 31 * result + author.hashCode()
|
||||
return result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public val MessageRecallEvent.FriendRecall.isByBot: Boolean get() = this.operatorId == bot.id
|
||||
// val MessageRecallEvent.GroupRecall.isByBot: Boolean get() = (this as GroupOperableEvent).isByBot
|
||||
// no need
|
||||
|
||||
public val MessageRecallEvent.isByBot: Boolean
|
||||
get() = when (this) {
|
||||
is MessageRecallEvent.FriendRecall -> this.isByBot
|
||||
is MessageRecallEvent.GroupRecall -> (this as GroupOperableEvent).isByBot
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* 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.Group
|
||||
import net.mamoe.mirai.contact.Member
|
||||
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
|
||||
|
||||
|
||||
/**
|
||||
* 机器人在其他客户端发送消息同步到这个客户端的事件.
|
||||
*
|
||||
* 本事件发生于**机器人账号**在另一个客户端向一个群或一个好友主动发送消息, 这条消息同步到机器人这个客户端上.
|
||||
*
|
||||
* @see MessageEvent
|
||||
*/
|
||||
public interface MessageSyncEvent : MessageEvent
|
||||
|
||||
|
||||
/**
|
||||
* 机器人在其他客户端发送群消息同步到这个客户端的事件
|
||||
*
|
||||
* @see MessageSyncEvent
|
||||
*/
|
||||
public class GroupMessageSyncEvent(
|
||||
override val group: Group,
|
||||
override val message: MessageChain,
|
||||
override val sender: Member,
|
||||
override val senderName: String,
|
||||
override val time: Int
|
||||
) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageSyncEvent {
|
||||
init {
|
||||
val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
|
||||
check(source is OnlineMessageSource.Incoming.FromGroup) { "source provided to a GroupMessageSyncEvent must be an instance of OnlineMessageSource.Incoming.FromGroup" }
|
||||
}
|
||||
|
||||
override val bot: Bot get() = group.bot
|
||||
override val subject: Group get() = group
|
||||
override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup
|
||||
|
||||
public override fun toString(): String =
|
||||
"GroupMessageSyncEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, message=$message)"
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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.internal.network.Packet
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
|
||||
|
||||
/**
|
||||
* 戳一戳事件
|
||||
*/
|
||||
public data class NudgeEvent @MiraiInternalApi constructor(
|
||||
/**
|
||||
* 戳一戳发起人
|
||||
*/
|
||||
public val from: UserOrBot,
|
||||
/**
|
||||
* 戳一戳目标, 可能与 [from] 相同.
|
||||
*/
|
||||
public val target: UserOrBot,
|
||||
/**
|
||||
* 消息语境, 同 [MessageEvent.subject]. 可能为 [Group], [Stranger], [Friend], [Member].
|
||||
*/
|
||||
public val subject: Contact,
|
||||
public val action: String,
|
||||
public val suffix: String,
|
||||
) : AbstractEvent(), BotEvent, Packet {
|
||||
override val bot: Bot get() = from.bot
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
- 在 IntelliJ 平台, 按 alt + 7 可打开文件的结构, [效果图](/.github/EZSLAB`K@YFFOW47{090W8B.png)
|
||||
|
||||
注释:
|
||||
- 此列表自 mirai `1.0.0` 起开始维护, 故在 `1.0.0` 前的变更将不做记录.
|
||||
- 此列表自 mirai `2.0.0` 起开始维护, 故在 `2.0.0` 前的变更将不做记录.
|
||||
- 支持某事件的 mirai 版本号将会显式标注, 通过数学区间形式表示, 如 `[1.1.0, 1.3.0)`, 但有简便表示方法:
|
||||
- (`1.1.0+`) 等注释表示在 `1.1.0` 及更新版本才支持, 区间表示为 `[1.1.0, +∞)`
|
||||
- (`1.1.0-`) 等注释表示在早于 `1.1.0` 的版本才支持, 区间表示为 `[1.0.0, 1.1.0)`
|
||||
@ -21,33 +21,31 @@
|
||||
- 服务器主动要求更换另一个服务器: RequireReconnect
|
||||
- Bot 重新登录: BotReloginEvent
|
||||
- Bot 头像改变: BotAvatarChangedEvent
|
||||
- (`1.2.0+`) Bot 昵称改变: BotNickChangedEvent
|
||||
- (`1.3.0+`) Bot 被戳: BotNudgedEvent
|
||||
- Bot 昵称改变: BotNickChangedEvent
|
||||
- Bot 被戳: BotNudgedEvent
|
||||
|
||||
### [消息](message.kt)
|
||||
- 被动收到消息:MessageEvent
|
||||
### 消息
|
||||
- 被动收到消息:[MessageEvent](MessageEvent.kt)
|
||||
- 群消息:GroupMessageEvent
|
||||
- 好友消息:FriendMessageEvent
|
||||
- 群临时会话消息:TempMessageEvent
|
||||
- (`1.1.0+`) 主动发送消息前: MessagePreSendEvent
|
||||
- 主动发送消息前: [MessagePreSendEvent](MessagePreSendEvent.kt)
|
||||
- 群消息: GroupMessagePreSendEvent
|
||||
- 好友消息: FriendMessagePreSendEvent
|
||||
- 群临时会话消息: TempMessagePreSendEvent
|
||||
- (`1.1.0+`) 主动发送消息后: MessagePostSendEvent
|
||||
- 主动发送消息后: [MessagePostSendEvent](MessagePostSendEvent.kt)
|
||||
- 群消息: GroupMessagePostSendEvent
|
||||
- 好友消息: FriendMessagePostSendEvent
|
||||
- 群临时会话消息: TempMessagePostSendEvent
|
||||
- 消息撤回: MessageRecallEvent
|
||||
- 消息撤回: [MessageRecallEvent](MessageRecallEvent.kt)
|
||||
- 好友撤回: FriendRecall
|
||||
- 群撤回: GroupRecall
|
||||
- 群临时会话撤回: TempRecall
|
||||
- 图片上传前: BeforeImageUploadEvent
|
||||
- 图片上传完成: ImageUploadEvent
|
||||
- 图片上传前: [BeforeImageUploadEvent](ImageUploadEvent.kt)
|
||||
- 图片上传完成: [ImageUploadEvent](ImageUploadEvent.kt)
|
||||
- 图片上传成功: Succeed
|
||||
- 图片上传失败: Failed
|
||||
- (`1.1.0-`) ~~主动发送消息: MessageSendEvent~~
|
||||
- ~~群消息: GroupMessageSendEvent~~
|
||||
- ~~好友消息: FriendMessageSendEvent~~
|
||||
- 戳一戳: [NudgeEvent](NudgeEvent.kt)
|
||||
|
||||
### [群](group.kt)
|
||||
- 机器人被踢出群或在其他客户端主动退出一个群: BotLeaveEvent
|
||||
@ -64,7 +62,6 @@
|
||||
- 入群公告改变: GroupEntranceAnnouncementChangeEvent
|
||||
- 全员禁言状态改变: GroupMuteAllEvent
|
||||
- 匿名聊天状态改变: GroupAllowAnonymousChatEvent
|
||||
- (`1.3.0-`) ~~坦白说状态改变: GroupAllowConfessTalkEvent~~
|
||||
- 允许群员邀请好友加群状态改变: GroupAllowMemberInviteEvent
|
||||
|
||||
#### 群成员
|
||||
@ -90,7 +87,6 @@
|
||||
##### 动作
|
||||
- 群成员被禁言: MemberMuteEvent
|
||||
- 群成员被取消禁言: MemberUnmuteEvent
|
||||
- (`1.3.0+`) 群员被戳: MemberNudgedEvent
|
||||
|
||||
### [好友](friend.kt)
|
||||
- 好友昵称改变: FriendRemarkChangeEvent
|
||||
@ -98,6 +94,5 @@
|
||||
- 好友已被删除: FriendDeleteEvent
|
||||
- 一个账号请求添加机器人为好友: NewFriendRequestEvent
|
||||
- 好友头像改变: FriendAvatarChangedEvent
|
||||
- (`1.2.0+`) 好友昵称改变: FriendNickChangedEvent
|
||||
- (`1.2.0+`) 好友输入状态改变: FriendInputStatusChangedEvent
|
||||
- (`1.3.0+`) 好友被戳: FriendNudgedEvent
|
||||
- 好友昵称改变: FriendNickChangedEvent
|
||||
- 好友输入状态改变: FriendInputStatusChangedEvent
|
@ -14,7 +14,6 @@
|
||||
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.internal.network.Packet
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalApi
|
||||
@ -133,27 +132,4 @@ public data class BotNickChangedEvent(
|
||||
public override val bot: Bot,
|
||||
public val from: String,
|
||||
public val to: String
|
||||
) : BotEvent, Packet, AbstractEvent()
|
||||
|
||||
|
||||
/**
|
||||
* 戳一戳事件
|
||||
*/
|
||||
public data class NudgeEvent @MiraiInternalApi constructor(
|
||||
/**
|
||||
* 戳一戳发起人
|
||||
*/
|
||||
public val from: UserOrBot,
|
||||
/**
|
||||
* 戳一戳目标, 可能与 [from] 相同.
|
||||
*/
|
||||
public val target: UserOrBot,
|
||||
/**
|
||||
* 消息语境, 同 [MessageEvent.subject]. 可能为 [Group], [Stranger], [Friend], [Member].
|
||||
*/
|
||||
public val subject: Contact,
|
||||
public val action: String,
|
||||
public val suffix: String,
|
||||
) : AbstractEvent(), BotEvent, Packet {
|
||||
override val bot: Bot get() = from.bot
|
||||
}
|
||||
) : BotEvent, Packet, AbstractEvent()
|
@ -1,730 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
@file:JvmMultifileClass
|
||||
@file:JvmName("BotEventsKt")
|
||||
@file:Suppress("unused", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||
|
||||
package net.mamoe.mirai.event.events
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.contact.*
|
||||
import net.mamoe.mirai.contact.Contact.Companion.uploadImage
|
||||
import net.mamoe.mirai.event.*
|
||||
import net.mamoe.mirai.event.events.ImageUploadEvent.Failed
|
||||
import net.mamoe.mirai.event.events.ImageUploadEvent.Succeed
|
||||
import net.mamoe.mirai.internal.network.Packet
|
||||
import net.mamoe.mirai.message.MessageReceipt
|
||||
import net.mamoe.mirai.message.data.*
|
||||
import net.mamoe.mirai.message.isContextIdenticalWith
|
||||
import net.mamoe.mirai.utils.ExternalResource
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
import kotlin.internal.InlineOnly
|
||||
|
||||
|
||||
// region MessagePreSendEvent
|
||||
|
||||
/**
|
||||
* 在发送消息前广播的事件. 可被 [取消][CancellableEvent.cancel].
|
||||
*
|
||||
* 此事件总是在 [MessagePostSendEvent] 之前广播.
|
||||
*
|
||||
* 当 [MessagePreSendEvent] 被 [取消][CancellableEvent.cancel] 后:
|
||||
* - [MessagePostSendEvent] 不会广播
|
||||
* - 消息不会发送.
|
||||
* - [Contact.sendMessage] 会抛出异常 [EventCancelledException]
|
||||
*
|
||||
* @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径
|
||||
*/
|
||||
public sealed class MessagePreSendEvent : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent {
|
||||
/** 发信目标. */
|
||||
public abstract val target: Contact
|
||||
public final override val bot: Bot get() = target.bot
|
||||
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public abstract var message: Message
|
||||
}
|
||||
|
||||
/**
|
||||
* 在发送群消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class GroupMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Group,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : MessagePreSendEvent()
|
||||
|
||||
/**
|
||||
* 在发送好友或群临时会话消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public sealed class UserMessagePreSendEvent : MessagePreSendEvent() {
|
||||
/** 发信目标. */
|
||||
public abstract override val target: User
|
||||
}
|
||||
|
||||
/**
|
||||
* 在发送好友消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class FriendMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Friend,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : UserMessagePreSendEvent()
|
||||
|
||||
/**
|
||||
* 在发送群临时会话消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class TempMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Member,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : UserMessagePreSendEvent() {
|
||||
public val group: Group get() = target.group
|
||||
}
|
||||
|
||||
/**
|
||||
* 在发送陌生人消息前广播的事件.
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public data class StrangerMessagePreSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Stranger,
|
||||
/** 待发送的消息. 修改后将会同时应用于发送. */
|
||||
public override var message: Message
|
||||
) : UserMessagePreSendEvent()
|
||||
|
||||
// endregion
|
||||
|
||||
// region MessagePostSendEvent
|
||||
|
||||
/**
|
||||
* 在发送消息后广播的事件, 总是在 [MessagePreSendEvent] 之后广播.
|
||||
*
|
||||
* 只要 [MessagePreSendEvent] 未被 [取消][CancellableEvent.cancel], [MessagePostSendEvent] 就一定会被广播, 并携带 [发送时产生的异常][MessagePostSendEvent.exception] (如果有).
|
||||
*
|
||||
* 在此事件广播前, 消息一定已经发送成功, 或产生一个异常.
|
||||
*
|
||||
* @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径
|
||||
* @see MessagePreSendEvent
|
||||
*/
|
||||
public sealed class MessagePostSendEvent<C : Contact> : BotEvent, BotActiveEvent, AbstractEvent() {
|
||||
/** 发信目标. */
|
||||
public abstract val target: C
|
||||
public final override val bot: Bot get() = target.bot
|
||||
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public abstract val message: MessageChain
|
||||
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public abstract val exception: Throwable?
|
||||
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public abstract val receipt: MessageReceipt<C>?
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指代这条已经发送的消息的 [MessageSource]. 若消息发送失败, 返回 `null`
|
||||
* @see MessagePostSendEvent.sourceResult
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.source: MessageSource?
|
||||
get() = receipt?.source
|
||||
|
||||
/**
|
||||
* 获取指代这条已经发送的消息的 [MessageSource], 并包装为 [kotlin.Result]
|
||||
* @see MessagePostSendEvent.result
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.sourceResult: Result<MessageSource>
|
||||
get() = result.map { it.source }
|
||||
|
||||
/**
|
||||
* 在此消息发送成功时返回 `true`.
|
||||
* @see MessagePostSendEvent.exception
|
||||
* @see MessagePostSendEvent.result
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.isSuccess: Boolean
|
||||
get() = exception == null
|
||||
|
||||
/**
|
||||
* 在此消息发送失败时返回 `true`.
|
||||
* @see MessagePostSendEvent.exception
|
||||
* @see MessagePostSendEvent.result
|
||||
*/
|
||||
@get:JvmSynthetic
|
||||
public inline val MessagePostSendEvent<*>.isFailure: Boolean
|
||||
get() = exception != null
|
||||
|
||||
/**
|
||||
* 将 [MessagePostSendEvent.exception] 与 [MessagePostSendEvent.receipt] 表示为 [Result]
|
||||
*/
|
||||
@InlineOnly
|
||||
public inline val <C : Contact> MessagePostSendEvent<C>.result: Result<MessageReceipt<C>>
|
||||
get() = exception.let { exception -> if (exception != null) Result.failure(exception) else Result.success(receipt!!) }
|
||||
|
||||
/**
|
||||
* 在群消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class GroupMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Group,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Group>?
|
||||
) : MessagePostSendEvent<Group>()
|
||||
|
||||
/**
|
||||
* 在好友或群临时会话消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public sealed class UserMessagePostSendEvent<C : User> : MessagePostSendEvent<C>()
|
||||
|
||||
/**
|
||||
* 在好友消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class FriendMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Friend,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Friend>?
|
||||
) : UserMessagePostSendEvent<Friend>()
|
||||
|
||||
/**
|
||||
* 在群临时会话消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class TempMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Member,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Member>?
|
||||
) : UserMessagePostSendEvent<Member>() {
|
||||
public val group: Group get() = target.group
|
||||
}
|
||||
|
||||
/**
|
||||
* 在陌生人消息发送后广播的事件.
|
||||
* @see MessagePostSendEvent
|
||||
*/
|
||||
public data class StrangerMessagePostSendEvent @MiraiInternalApi constructor(
|
||||
/** 发信目标. */
|
||||
public override val target: Stranger,
|
||||
/** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */
|
||||
public override val message: MessageChain,
|
||||
/**
|
||||
* 发送消息时抛出的异常. `null` 表示消息成功发送.
|
||||
* @see result
|
||||
*/
|
||||
public override val exception: Throwable?,
|
||||
/**
|
||||
* 发送消息成功时的回执. `null` 表示消息发送失败.
|
||||
* @see result
|
||||
*/
|
||||
public override val receipt: MessageReceipt<Stranger>?
|
||||
) : UserMessagePostSendEvent<Stranger>()
|
||||
|
||||
// endregion
|
||||
|
||||
// region MessageRecallEvent
|
||||
|
||||
/**
|
||||
* 消息撤回事件. 可是任意消息被任意人撤回.
|
||||
*
|
||||
* @see Contact.recallMessage 撤回消息. 为广播这个事件的唯一途径
|
||||
*/
|
||||
public sealed class MessageRecallEvent : BotEvent, AbstractEvent() {
|
||||
/**
|
||||
* 消息原发送人
|
||||
*/
|
||||
public abstract val authorId: Long
|
||||
|
||||
/**
|
||||
* 消息原发送人.
|
||||
*/
|
||||
public abstract val author: UserOrBot
|
||||
|
||||
/**
|
||||
* 消息 ids.
|
||||
* @see MessageSource.ids
|
||||
*/
|
||||
public abstract val messageIds: IntArray
|
||||
|
||||
/**
|
||||
* 消息内部 ids.
|
||||
* @see MessageSource.ids
|
||||
*/
|
||||
public abstract val messageInternalIds: IntArray
|
||||
|
||||
/**
|
||||
* 原发送时间戳, 单位为秒.
|
||||
*/
|
||||
public abstract val messageTime: Int // seconds
|
||||
|
||||
/**
|
||||
* 好友消息撤回事件
|
||||
*/
|
||||
public data class FriendRecall @MiraiInternalApi public constructor(
|
||||
public override val bot: Bot,
|
||||
public override val messageIds: IntArray,
|
||||
public override val messageInternalIds: IntArray,
|
||||
public override val messageTime: Int,
|
||||
/**
|
||||
* 撤回操作人, 好友的 [User.id]
|
||||
*/
|
||||
public val operatorId: Long,
|
||||
public val operator: Friend,
|
||||
) : MessageRecallEvent(), Packet {
|
||||
/**
|
||||
* 消息原发送人, 等于 [operator]
|
||||
*/
|
||||
override val author: Friend get() = operator
|
||||
|
||||
public override val authorId: Long
|
||||
get() = operatorId
|
||||
|
||||
@Suppress("DuplicatedCode")
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
|
||||
other as FriendRecall
|
||||
|
||||
if (bot != other.bot) return false
|
||||
if (!messageIds.contentEquals(other.messageIds)) return false
|
||||
if (!messageInternalIds.contentEquals(other.messageInternalIds)) return false
|
||||
if (messageTime != other.messageTime) return false
|
||||
if (operatorId != other.operatorId) return false
|
||||
if (operator != other.operator) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
var result = bot.hashCode()
|
||||
result = 31 * result + messageIds.contentHashCode()
|
||||
result = 31 * result + messageInternalIds.contentHashCode()
|
||||
result = 31 * result + messageTime
|
||||
result = 31 * result + operatorId.hashCode()
|
||||
result = 31 * result + operator.hashCode()
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 群消息撤回事件.
|
||||
*/
|
||||
public data class GroupRecall @MiraiInternalApi constructor(
|
||||
public override val bot: Bot,
|
||||
public override val authorId: Long,
|
||||
public override val messageIds: IntArray,
|
||||
public override val messageInternalIds: IntArray,
|
||||
public override val messageTime: Int,
|
||||
/**
|
||||
* 操作人. 为 null 时则为 [Bot] 操作.
|
||||
*/
|
||||
public override val operator: Member?,
|
||||
public override val group: Group,
|
||||
public override val author: NormalMember,
|
||||
) : MessageRecallEvent(), GroupOperableEvent, Packet {
|
||||
|
||||
@Suppress("DuplicatedCode")
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
|
||||
other as GroupRecall
|
||||
|
||||
if (bot != other.bot) return false
|
||||
if (authorId != other.authorId) return false
|
||||
if (!messageIds.contentEquals(other.messageIds)) return false
|
||||
if (!messageInternalIds.contentEquals(other.messageInternalIds)) return false
|
||||
if (messageTime != other.messageTime) return false
|
||||
if (operator != other.operator) return false
|
||||
if (group != other.group) return false
|
||||
if (author != other.author) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
var result = bot.hashCode()
|
||||
result = 31 * result + authorId.hashCode()
|
||||
result = 31 * result + messageIds.contentHashCode()
|
||||
result = 31 * result + messageInternalIds.contentHashCode()
|
||||
result = 31 * result + messageTime
|
||||
result = 31 * result + (operator?.hashCode() ?: 0)
|
||||
result = 31 * result + group.hashCode()
|
||||
result = 31 * result + author.hashCode()
|
||||
return result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
|
||||
@Deprecated("Binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
public val MessageRecallEvent.GroupRecall.author: Member
|
||||
get() = if (authorId == bot.id) group.botAsMember else group.getOrFail(authorId)
|
||||
|
||||
public val MessageRecallEvent.FriendRecall.isByBot: Boolean get() = this.operatorId == bot.id
|
||||
// val MessageRecallEvent.GroupRecall.isByBot: Boolean get() = (this as GroupOperableEvent).isByBot
|
||||
// no need
|
||||
|
||||
public val MessageRecallEvent.isByBot: Boolean
|
||||
get() = when (this) {
|
||||
is MessageRecallEvent.FriendRecall -> this.isByBot
|
||||
is MessageRecallEvent.GroupRecall -> (this as GroupOperableEvent).isByBot
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region ImageUploadEvent
|
||||
|
||||
/**
|
||||
* 图片上传前. 可以阻止上传.
|
||||
*
|
||||
* 此事件总是在 [ImageUploadEvent] 之前广播.
|
||||
* 若此事件被取消, [ImageUploadEvent] 不会广播.
|
||||
*
|
||||
* @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径
|
||||
*/
|
||||
public data class BeforeImageUploadEvent @MiraiInternalApi constructor(
|
||||
public val target: Contact,
|
||||
public val source: ExternalResource
|
||||
) : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent {
|
||||
public override val bot: Bot
|
||||
get() = target.bot
|
||||
}
|
||||
|
||||
/**
|
||||
* 图片上传完成.
|
||||
*
|
||||
* 此事件总是在 [BeforeImageUploadEvent] 之后广播.
|
||||
* 若 [BeforeImageUploadEvent] 被取消, 此事件不会广播.
|
||||
*
|
||||
* @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径
|
||||
*
|
||||
* @see Succeed
|
||||
* @see Failed
|
||||
*/
|
||||
public sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent() {
|
||||
public abstract val target: Contact
|
||||
public abstract val source: ExternalResource
|
||||
public override val bot: Bot
|
||||
get() = target.bot
|
||||
|
||||
public data class Succeed @MiraiInternalApi constructor(
|
||||
override val target: Contact,
|
||||
override val source: ExternalResource,
|
||||
val image: Image
|
||||
) : ImageUploadEvent()
|
||||
|
||||
public data class Failed @MiraiInternalApi constructor(
|
||||
override val target: Contact,
|
||||
override val source: ExternalResource,
|
||||
val errno: Int,
|
||||
val message: String
|
||||
) : ImageUploadEvent()
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region MessageEvent
|
||||
|
||||
/**
|
||||
* 一个 (收到的) 消息事件.
|
||||
*
|
||||
* 它是一个 [BotEvent], 因此可以被 [监听][EventChannel.subscribe]
|
||||
*
|
||||
* @see isContextIdenticalWith 判断语境相同
|
||||
*/
|
||||
public interface MessageEvent : Event, Packet, BotPassiveEvent {
|
||||
/**
|
||||
* 与这个消息事件相关的 [Bot]
|
||||
*/
|
||||
public override val bot: Bot
|
||||
|
||||
/**
|
||||
* 消息事件主体.
|
||||
*
|
||||
* - 对于好友消息, 这个属性为 [Friend] 的实例, 与 [sender] 引用相同;
|
||||
* - 对于临时会话消息, 这个属性为 [Member] 的实例, 与 [sender] 引用相同;
|
||||
* - 对于陌生人消息, 这个属性为 [Stranger] 的实例, 与 [sender] 引用相同
|
||||
* - 对于群消息, 这个属性为 [Group] 的实例, 与 [GroupMessageEvent.group] 引用相同
|
||||
* - 对于其他客户端消息, 这个属性为 [OtherClient] 的实例, 与 [OtherClientMessageEvent.client] 引用相同
|
||||
*
|
||||
* 在回复消息时, 可通过 [subject] 作为回复对象
|
||||
*/
|
||||
public val subject: Contact
|
||||
|
||||
/**
|
||||
* 发送人.
|
||||
*
|
||||
* 在私聊消息时为相关 [User] 的实例, 在群消息时为 [Member] 的实例, 在其他客户端消息时为 [Bot.asFriend]
|
||||
*/
|
||||
public val sender: User
|
||||
|
||||
/**
|
||||
* 发送人名称
|
||||
*/
|
||||
public val senderName: String
|
||||
|
||||
/**
|
||||
* 消息内容.
|
||||
*
|
||||
* 第一个元素一定为 [MessageSource], 存储此消息的发送人, 发送时间, 收信人, 消息 ids 等数据.
|
||||
* 随后的元素为拥有顺序的真实消息内容.
|
||||
*/
|
||||
public val message: MessageChain
|
||||
|
||||
/** 消息发送时间 (由服务器提供, 可能与本地有时差) */
|
||||
public val time: Int
|
||||
|
||||
/**
|
||||
* 消息源. 来自 [message] 的第一个元素,
|
||||
*/
|
||||
public val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming
|
||||
}
|
||||
|
||||
/**
|
||||
* 来自 [User] 的消息
|
||||
*
|
||||
* @see FriendMessageEvent
|
||||
* @see TempMessageEvent
|
||||
*/
|
||||
public 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
|
||||
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 TempMessageEvent
|
||||
*/
|
||||
public interface GroupAwareMessageEvent : MessageEvent {
|
||||
public val group: Group
|
||||
}
|
||||
|
||||
/**
|
||||
* 机器人收到的群消息的事件
|
||||
*
|
||||
* @see MessageEvent
|
||||
*/
|
||||
public class GroupMessageEvent(
|
||||
public override val senderName: String,
|
||||
/**
|
||||
* 发送方权限.
|
||||
*/
|
||||
public val permission: MemberPermission,
|
||||
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
|
||||
*/
|
||||
public class TempMessageEvent(
|
||||
public override val sender: Member,
|
||||
public override val message: MessageChain,
|
||||
public override val time: Int
|
||||
) : AbstractMessageEvent(), GroupAwareMessageEvent, UserMessageEvent {
|
||||
init {
|
||||
val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
|
||||
check(source is OnlineMessageSource.Incoming.FromTemp) { "source provided to a TempMessageEvent must be an instance of OnlineMessageSource.Incoming.FromTemp" }
|
||||
}
|
||||
|
||||
public override val bot: Bot get() = sender.bot
|
||||
public override val subject: Member 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 =
|
||||
"TempMessageEvent(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)"
|
||||
}
|
||||
|
||||
@MiraiInternalApi
|
||||
public abstract class AbstractMessageEvent : MessageEvent, AbstractEvent()
|
||||
|
||||
// endregion
|
||||
|
||||
// region MessageSyncEvent
|
||||
|
||||
/**
|
||||
* 机器人在其他客户端发送消息同步到这个客户端的事件.
|
||||
*
|
||||
* 本事件发生于**机器人账号**在另一个客户端向一个群或一个好友主动发送消息, 这条消息同步到机器人这个客户端上.
|
||||
*
|
||||
* @see MessageEvent
|
||||
*/
|
||||
public interface MessageSyncEvent : MessageEvent
|
||||
|
||||
|
||||
/**
|
||||
* 机器人在其他客户端发送群消息同步到这个客户端的事件
|
||||
*
|
||||
* @see MessageSyncEvent
|
||||
*/
|
||||
public class GroupMessageSyncEvent(
|
||||
override val group: Group,
|
||||
override val message: MessageChain,
|
||||
override val sender: Member,
|
||||
override val senderName: String,
|
||||
override val time: Int
|
||||
) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageSyncEvent {
|
||||
init {
|
||||
val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
|
||||
check(source is OnlineMessageSource.Incoming.FromGroup) { "source provided to a GroupMessageSyncEvent must be an instance of OnlineMessageSource.Incoming.FromGroup" }
|
||||
}
|
||||
|
||||
override val bot: Bot get() = group.bot
|
||||
override val subject: Group get() = group
|
||||
override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup
|
||||
|
||||
public override fun toString(): String =
|
||||
"GroupMessageSyncEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, message=$message)"
|
||||
}
|
||||
|
||||
// endregion
|
@ -9,18 +9,11 @@
|
||||
|
||||
package net.mamoe.mirai.event.events
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.contact.ClientKind
|
||||
import net.mamoe.mirai.contact.OtherClient
|
||||
import net.mamoe.mirai.event.AbstractEvent
|
||||
import net.mamoe.mirai.internal.network.Packet
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
|
||||
public interface OtherClientEvent : BotEvent, Packet {
|
||||
public val client: OtherClient
|
||||
override val bot: Bot get() = client.bot
|
||||
}
|
||||
|
||||
/**
|
||||
* 其他设备上线
|
||||
*/
|
||||
|
@ -7,7 +7,6 @@
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
|
||||
@file:JvmMultifileClass
|
||||
@file:JvmName("BotEventsKt")
|
||||
|
||||
@ -16,7 +15,7 @@ package net.mamoe.mirai.event.events
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.contact.*
|
||||
import net.mamoe.mirai.event.Event
|
||||
import kotlin.internal.HidesMembers
|
||||
import net.mamoe.mirai.internal.network.Packet
|
||||
|
||||
/**
|
||||
* 有关一个 [Bot] 的事件
|
||||
@ -61,8 +60,9 @@ public interface GroupOperableEvent : GroupEvent {
|
||||
/**
|
||||
* 是否由 [Bot] 操作
|
||||
*/
|
||||
@HidesMembers
|
||||
@get:JvmSynthetic
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
|
||||
@kotlin.internal.HidesMembers
|
||||
public inline val GroupOperableEvent.isByBot: Boolean
|
||||
get() = operator == null
|
||||
|
||||
@ -106,4 +106,9 @@ public interface GroupMemberEvent : GroupEvent, UserEvent {
|
||||
public val member: Member
|
||||
override val group: Group get() = member.group
|
||||
override val user: Member get() = member
|
||||
}
|
||||
}
|
||||
|
||||
public interface OtherClientEvent : BotEvent, Packet {
|
||||
public val client: OtherClient
|
||||
override val bot: Bot get() = client.bot
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user