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 @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 @MessageDsl

View File

@ -34,7 +34,7 @@ import net.mamoe.mirai.utils.MiraiInternalApi
* *
* @see isContextIdenticalWith 判断语境相同 * @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] * 与这个消息事件相关的 [Bot]
*/ */
@ -163,6 +163,9 @@ public class GroupMessageEvent(
* 发送方权限. * 发送方权限.
*/ */
public val permission: MemberPermission, public val permission: MemberPermission,
/**
* 发送人. 可能是 [NormalMember] [AnonymousMember]
*/
public override val sender: Member, public override val sender: Member,
public override val message: MessageChain, public override val message: MessageChain,
public override val time: Int public override val time: Int
@ -186,7 +189,12 @@ public class GroupMessageEvent(
* *
* @see MessageEvent * @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 sender: NormalMember,
public override val message: MessageChain, public override val message: MessageChain,
public override val time: Int public override val time: Int
@ -206,6 +214,38 @@ public class TempMessageEvent(
"TempMessageEvent(sender=${sender.id} from group(${sender.group.id}), message=$message)" "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) 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]. * 通过 DSL 订阅来自所有 [Bot] 的所有临时会话消息事件. DSL 语法查看 [subscribeMessages].
@ -127,14 +135,38 @@ public typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder<TempM
* @see EventChannel.subscribe 事件监听基础 * @see EventChannel.subscribe 事件监听基础
* @see EventChannel 事件通道 * @see EventChannel 事件通道
*/ */
@Deprecated(
"mirai 正计划支持其他渠道发起的临时会话, 届时此方法会变动. 请使用 subscribeGroupTempMessages",
ReplaceWith(
"subscribeGroupTempMessages(coroutineContext, concurrencyKind, priority, listeners)",
"net.mamoe.mirai.event.subscribeGroupTempMessages"
),
DeprecationLevel.ERROR
)
public fun <R> EventChannel<*>.subscribeTempMessages( public fun <R> EventChannel<*>.subscribeTempMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: ConcurrencyKind = CONCURRENT, concurrencyKind: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.MONITOR, 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 { ): R {
contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } 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 { 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 { 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 { is net.mamoe.mirai.event.events.GroupMessageEvent -> bot.logger.verbose {
renderGroupMessage(group, senderName, sender, message) 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() "[${group.name}(${group.id})] $senderName(Temp ${sender.id}) -> $message".replaceMagicCodes()
} }
is net.mamoe.mirai.event.events.StrangerMessageEvent -> bot.logger.verbose { 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 -> member.lastMessageSequence.loop { instant ->
if (msgHead.msgSeq > instant) { if (msgHead.msgSeq > instant) {
if (member.lastMessageSequence.compareAndSet(instant, msgHead.msgSeq)) { if (member.lastMessageSequence.compareAndSet(instant, msgHead.msgSeq)) {
return TempMessageEvent( return GroupTempMessageEvent(
member, member,
toMessageChain( toMessageChain(
bot, bot,