mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-13 14:50:43 +08:00
Adjust subject declaration
This commit is contained in:
parent
82707d5ec6
commit
fa0f4e49df
@ -3,6 +3,7 @@
|
|||||||
package net.mamoe.mirai.event
|
package net.mamoe.mirai.event
|
||||||
|
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.Bot
|
||||||
|
import net.mamoe.mirai.contact.Contact
|
||||||
import net.mamoe.mirai.contact.Group
|
import net.mamoe.mirai.contact.Group
|
||||||
import net.mamoe.mirai.contact.QQ
|
import net.mamoe.mirai.contact.QQ
|
||||||
import net.mamoe.mirai.event.events.BotEvent
|
import net.mamoe.mirai.event.events.BotEvent
|
||||||
@ -13,45 +14,52 @@ import kotlin.jvm.JvmName
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 消息事件时创建的临时容器.
|
* 消息事件时创建的临时容器.
|
||||||
* @see
|
|
||||||
*/
|
*/
|
||||||
abstract class SenderAndMessage(
|
abstract class SenderAndMessage<S : Contact>(
|
||||||
|
/**
|
||||||
|
* 发送这条消息的用户.
|
||||||
|
*/
|
||||||
val sender: QQ,
|
val sender: QQ,
|
||||||
|
/**
|
||||||
|
* 消息事件主体. 对于好友消息, 这个属性为 [QQ] 的实例; 对于群消息, 这个属性为 [Group] 的实例
|
||||||
|
*/
|
||||||
|
val subject: S,
|
||||||
val message: MessageChain
|
val message: MessageChain
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* 给这个消息事件的主体发送消息
|
* 给这个消息事件的主体发送消息
|
||||||
* 对于好友消息事件, 这个方法将会给好友 ([sender]) 发送消息
|
* 对于好友消息事件, 这个方法将会给好友 ([subject]) 发送消息
|
||||||
* 对于群消息事件, 这个方法将会给群 ([sender]) 发送消息
|
* 对于群消息事件, 这个方法将会给群 ([subject]) 发送消息
|
||||||
*/
|
*/
|
||||||
abstract suspend fun reply(message: MessageChain)
|
suspend fun reply(message: MessageChain) = subject.sendMessage(message)
|
||||||
|
|
||||||
suspend fun reply(plain: String) = reply(PlainText(plain))
|
suspend fun reply(plain: String) = reply(PlainText(plain))
|
||||||
suspend fun reply(message: Message) = reply(message.toChain())
|
suspend fun reply(message: Message) = reply(message.toChain())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [subject] = [sender] = [QQ]
|
||||||
|
*/
|
||||||
class FriendSenderAndMessage(
|
class FriendSenderAndMessage(
|
||||||
sender: QQ,
|
sender: QQ,
|
||||||
message: MessageChain
|
message: MessageChain
|
||||||
) : SenderAndMessage(sender, message) {
|
) : SenderAndMessage<QQ>(sender, sender, message)
|
||||||
override suspend fun reply(message: MessageChain) = sender.sendMessage(message)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [subject] = [group] = [Group]
|
||||||
|
*/
|
||||||
class GroupSenderAndMessage(
|
class GroupSenderAndMessage(
|
||||||
val group: Group,
|
val group: Group,
|
||||||
sender: QQ,
|
sender: QQ,
|
||||||
message: MessageChain
|
message: MessageChain
|
||||||
) : SenderAndMessage(sender, message) {
|
) : SenderAndMessage<Group>(sender, group, message)
|
||||||
override suspend fun reply(message: MessageChain) = group.sendMessage(message)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订阅来自所有 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话.
|
* 订阅来自所有 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话.
|
||||||
*/
|
*/
|
||||||
@MessageListenerDsl
|
@MessageListenerDsl
|
||||||
suspend inline fun subscribeMessages(noinline listeners: suspend MessageSubscribersBuilder<SenderAndMessage>.() -> Unit) {
|
suspend inline fun subscribeMessages(noinline listeners: suspend MessageSubscribersBuilder<SenderAndMessage<*>>.() -> Unit) {
|
||||||
MessageSubscribersBuilder<SenderAndMessage> { listener ->
|
MessageSubscribersBuilder<SenderAndMessage<*>> { listener ->
|
||||||
subscribeAlways<BotEvent> {
|
subscribeAlways<BotEvent> {
|
||||||
when (it) {
|
when (it) {
|
||||||
is FriendMessageEvent -> listener(FriendSenderAndMessage(it.sender, it.message))
|
is FriendMessageEvent -> listener(FriendSenderAndMessage(it.sender, it.message))
|
||||||
@ -89,8 +97,8 @@ suspend inline fun subscribeFriendMessages(noinline listeners: suspend MessageSu
|
|||||||
* 订阅来自这个 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话.
|
* 订阅来自这个 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话.
|
||||||
*/
|
*/
|
||||||
@MessageListenerDsl
|
@MessageListenerDsl
|
||||||
suspend inline fun Bot.subscribeMessages(noinline listeners: suspend MessageSubscribersBuilder<SenderAndMessage>.() -> Unit) {
|
suspend inline fun Bot.subscribeMessages(noinline listeners: suspend MessageSubscribersBuilder<SenderAndMessage<*>>.() -> Unit) {
|
||||||
MessageSubscribersBuilder<SenderAndMessage> { listener ->
|
MessageSubscribersBuilder<SenderAndMessage<*>> { listener ->
|
||||||
this.subscribeAlways<BotEvent> {
|
this.subscribeAlways<BotEvent> {
|
||||||
when (it) {
|
when (it) {
|
||||||
is FriendMessageEvent -> listener(FriendSenderAndMessage(it.sender, it.message))
|
is FriendMessageEvent -> listener(FriendSenderAndMessage(it.sender, it.message))
|
||||||
@ -128,9 +136,9 @@ internal typealias MessageListener<T> = @MessageListenerDsl suspend T.(String) -
|
|||||||
|
|
||||||
internal typealias MessageReplier<T> = @MessageListenerDsl suspend T.(String) -> String
|
internal typealias MessageReplier<T> = @MessageListenerDsl suspend T.(String) -> String
|
||||||
|
|
||||||
internal suspend inline operator fun <T : SenderAndMessage> MessageListener<T>.invoke(t: T) = this.invoke(t, t.message.toString())
|
internal suspend inline operator fun <T : SenderAndMessage<*>> MessageListener<T>.invoke(t: T) = this.invoke(t, t.message.toString())
|
||||||
@JvmName("invoke1") //Avoid Platform declaration clash
|
@JvmName("invoke1") //Avoid Platform declaration clash
|
||||||
internal suspend inline operator fun <T : SenderAndMessage> MessageReplier<T>.invoke(t: T) = this.invoke(t, t.message.toString())
|
internal suspend inline operator fun <T : SenderAndMessage<*>> MessageReplier<T>.invoke(t: T) = this.invoke(t, t.message.toString())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 消息订阅构造器
|
* 消息订阅构造器
|
||||||
@ -140,7 +148,7 @@ internal suspend inline operator fun <T : SenderAndMessage> MessageReplier<T>.in
|
|||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@MessageListenerDsl
|
@MessageListenerDsl
|
||||||
inline class MessageSubscribersBuilder<T : SenderAndMessage>(
|
inline class MessageSubscribersBuilder<T : SenderAndMessage<*>>(
|
||||||
val handlerConsumer: suspend (MessageListener<T>) -> Unit
|
val handlerConsumer: suspend (MessageListener<T>) -> Unit
|
||||||
) {
|
) {
|
||||||
suspend inline fun case(equals: String, trim: Boolean = true, noinline listener: MessageListener<T>) = content({ equals == if (trim) it.trim() else it }, listener)
|
suspend inline fun case(equals: String, trim: Boolean = true, noinline listener: MessageListener<T>) = content({ equals == if (trim) it.trim() else it }, listener)
|
||||||
|
Loading…
Reference in New Issue
Block a user