Deprecate TempMessageEvent and add GroupTempMessageEvent for #429

This commit is contained in:
Him188 2021-01-11 17:08:22 +08:00
parent 3c0e7e7834
commit c074bef9c6
7 changed files with 107 additions and 10 deletions

View File

@ -0,0 +1,20 @@
/*
* Copyright 2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
package net.mamoe.mirai.contact
import net.mamoe.mirai.utils.MiraiInternalApi
/**
* 临时会话用户, 非群成员.
*
* [#429](https://github.com/mamoe/mirai/issues/429)
*/
@MiraiInternalApi("其他渠道的临时会话暂未支持. ")
public interface TempUser : User

View File

@ -270,7 +270,12 @@ public open class MessageSubscribersBuilder<M : MessageEvent, out Ret, R : RR, R
/** 如果是群临时会话消息 */
@MessageDsl
public fun sentByTemp(): ListeningFilter = newListeningFilter { this is TempMessageEvent }
@Deprecated("use sentByGroupTemp()", ReplaceWith("sentByGroupTemp()"), DeprecationLevel.ERROR)
public fun sentByTemp(): ListeningFilter = sentByGroupTemp()
/** 如果是群临时会话消息 */
@MessageDsl
public fun sentByGroupTemp(): ListeningFilter = newListeningFilter { this is GroupTempMessageEvent }
/** 如果是管理员或群主发的消息 */
@MessageDsl

View File

@ -34,7 +34,7 @@ import net.mamoe.mirai.utils.MiraiInternalApi
*
* @see isContextIdenticalWith 判断语境相同
*/
public interface MessageEvent : Event, Packet, BotPassiveEvent {
public interface MessageEvent : Event, Packet, BotPassiveEvent { // TODO: 2021/1/11 Make sealed interface in Kotlin 1.5
/**
* 与这个消息事件相关的 [Bot]
*/
@ -163,6 +163,9 @@ public class GroupMessageEvent(
* 发送方权限.
*/
public val permission: MemberPermission,
/**
* 发送人. 可能是 [NormalMember] [AnonymousMember]
*/
public override val sender: Member,
public override val message: MessageChain,
public override val time: Int
@ -186,7 +189,12 @@ public class GroupMessageEvent(
*
* @see MessageEvent
*/
public class TempMessageEvent(
@Deprecated(
"mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempMessageEvent 已更改为 GroupTempMessageEvent",
replaceWith = ReplaceWith("GroupTempMessageEvent", "net.mamoe.mirai.event.events.GroupTempMessageEvent"),
DeprecationLevel.ERROR
)
public sealed class TempMessageEvent constructor(
public override val sender: NormalMember,
public override val message: MessageChain,
public override val time: Int
@ -206,6 +214,38 @@ public class TempMessageEvent(
"TempMessageEvent(sender=${sender.id} from group(${sender.group.id}), message=$message)"
}
// 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 TempMessageEvent 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)"
}
/**
* 机器人收到的陌生人消息的事件
*

View File

@ -119,7 +119,15 @@ public fun <R> EventChannel<*>.subscribeFriendMessages(
return createBuilder(::FriendMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority).run(listeners)
}
public typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder<TempMessageEvent, Listener<TempMessageEvent>, Unit, Unit>
@Deprecated(
"mirai 正计划支持其他渠道发起的临时会话, 届时此定义会变动. 请使用 GroupTempMessageSubscribersBuilder",
ReplaceWith(
"GroupTempMessageSubscribersBuilder",
"net.mamoe.mirai.event.GroupTempMessageSubscribersBuilder"
),
DeprecationLevel.ERROR
)
public typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder<GroupTempMessageEvent, Listener<GroupTempMessageEvent>, Unit, Unit>
/**
* 通过 DSL 订阅来自所有 [Bot] 的所有临时会话消息事件. DSL 语法查看 [subscribeMessages].
@ -127,14 +135,38 @@ public typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder<TempM
* @see EventChannel.subscribe 事件监听基础
* @see EventChannel 事件通道
*/
@Deprecated(
"mirai 正计划支持其他渠道发起的临时会话, 届时此方法会变动. 请使用 subscribeGroupTempMessages",
ReplaceWith(
"subscribeGroupTempMessages(coroutineContext, concurrencyKind, priority, listeners)",
"net.mamoe.mirai.event.subscribeGroupTempMessages"
),
DeprecationLevel.ERROR
)
public fun <R> EventChannel<*>.subscribeTempMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.MONITOR,
listeners: TempMessageSubscribersBuilder.() -> R
listeners: GroupTempMessageSubscribersBuilder.() -> R
): R = subscribeGroupTempMessages(coroutineContext, concurrencyKind, priority, listeners)
public typealias GroupTempMessageSubscribersBuilder = MessageSubscribersBuilder<GroupTempMessageEvent, Listener<GroupTempMessageEvent>, Unit, Unit>
/**
* 通过 DSL 订阅来自所有 [Bot] 的所有 [GroupTempMessageEvent]. DSL 语法查看 [subscribeMessages].
*
* @see EventChannel.subscribe 事件监听基础
* @see EventChannel 事件通道
*/
public fun <R> EventChannel<*>.subscribeGroupTempMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.MONITOR,
listeners: GroupTempMessageSubscribersBuilder.() -> R
): R {
contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }
return createBuilder(::TempMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority).run(listeners)
return createBuilder(::GroupTempMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority)
.run(listeners)
}

View File

@ -207,7 +207,7 @@ public open class MessageSourceBuilder internal constructor() {
* 设置发信人
*/
public fun sender(sender: ContactOrBot): MessageSourceBuilder = apply {
this.fromId = Mirai.getUin(sender)
this.fromId = sender.id
}
/**
@ -221,7 +221,7 @@ public open class MessageSourceBuilder internal constructor() {
* 设置发信目标
*/
public fun target(target: ContactOrBot): MessageSourceBuilder = apply {
this.targetId = Mirai.getUin(target)
this.targetId = target.id
}
/**

View File

@ -177,7 +177,7 @@ internal fun net.mamoe.mirai.event.events.MessageEvent.logMessageReceived() {
is net.mamoe.mirai.event.events.GroupMessageEvent -> bot.logger.verbose {
renderGroupMessage(group, senderName, sender, message)
}
is net.mamoe.mirai.event.events.TempMessageEvent -> bot.logger.verbose {
is net.mamoe.mirai.event.events.GroupTempMessageEvent -> bot.logger.verbose {
"[${group.name}(${group.id})] $senderName(Temp ${sender.id}) -> $message".replaceMagicCodes()
}
is net.mamoe.mirai.event.events.StrangerMessageEvent -> bot.logger.verbose {

View File

@ -466,7 +466,7 @@ internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot): Packet? {
member.lastMessageSequence.loop { instant ->
if (msgHead.msgSeq > instant) {
if (member.lastMessageSequence.compareAndSet(instant, msgHead.msgSeq)) {
return TempMessageEvent(
return GroupTempMessageEvent(
member,
toMessageChain(
bot,