From 719b5ac7b531f2482a998fd3fc8abc0508948983 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 20 Jul 2020 15:06:30 +0800 Subject: [PATCH 1/2] Explicit api mode --- build.gradle.kts | 4 +- buildSrc/src/main/kotlin/Versions.kt | 1 + compatibility-validator/build.gradle.kts | 4 +- gradle.properties | 3 +- java-compatibility-validator/build.gradle.kts | 4 +- mirai-core-qqandroid/build.gradle.kts | 14 +- mirai-core/build.gradle.kts | 10 +- .../commonMain/kotlin/net.mamoe.mirai/Bot.kt | 100 +++-- .../kotlin/net.mamoe.mirai/BotFactory.kt | 10 +- .../kotlin/net.mamoe.mirai/contact/Contact.kt | 26 +- .../net.mamoe.mirai/contact/ContactList.kt | 22 +- .../net.mamoe.mirai/contact/ContactOrBot.kt | 4 +- .../net.mamoe.mirai/contact/Exceptions.kt | 14 +- .../kotlin/net.mamoe.mirai/contact/Friend.kt | 8 +- .../kotlin/net.mamoe.mirai/contact/Group.kt | 60 +-- .../kotlin/net.mamoe.mirai/contact/Member.kt | 45 +- .../contact/MemberPermission.kt | 28 +- .../kotlin/net.mamoe.mirai/contact/User.kt | 16 +- .../kotlin/net.mamoe.mirai/data/FriendInfo.kt | 6 +- .../net.mamoe.mirai/data/GroupActiveData.kt | 18 +- .../net.mamoe.mirai/data/GroupAnnouncement.kt | 10 +- .../kotlin/net.mamoe.mirai/data/GroupInfo.kt | 24 +- .../kotlin/net.mamoe.mirai/data/MemberInfo.kt | 10 +- .../net.mamoe.mirai/data/OnlineStatus.kt | 12 +- .../kotlin/net.mamoe.mirai/event/Event.kt | 33 +- .../event/MessageSubscribersBuilder.kt | 138 +++--- .../net.mamoe.mirai/event/deprecated.kt | 26 +- .../event/events/EventCancelledException.kt | 10 +- .../net.mamoe.mirai/event/events/bot.kt | 46 +- .../net.mamoe.mirai/event/events/friend.kt | 42 +- .../net.mamoe.mirai/event/events/group.kt | 248 ++++++----- .../net.mamoe.mirai/event/events/message.kt | 166 +++---- .../net.mamoe.mirai/event/events/types.kt | 28 +- .../kotlin/net.mamoe.mirai/event/linear.kt | 8 +- .../kotlin/net.mamoe.mirai/event/nextEvent.kt | 6 +- .../kotlin/net.mamoe.mirai/event/select.kt | 90 ++-- .../event/subscribeMessages.kt | 18 +- .../net.mamoe.mirai/event/subscriber.kt | 46 +- .../event/subscriberDeprecated.kt | 36 +- .../kotlin/net.mamoe.mirai/lowLevelApi.kt | 42 +- .../message/FriendMessageEvent.kt | 18 +- .../message/GroupMessageEvent.kt | 26 +- .../net.mamoe.mirai/message/MessageEvent.kt | 72 +-- .../net.mamoe.mirai/message/MessageReceipt.kt | 36 +- .../message/TempMessageEvent.kt | 20 +- .../message/code/CodableMessage.kt | 4 +- .../kotlin/net.mamoe.mirai/message/data/At.kt | 26 +- .../net.mamoe.mirai/message/data/AtAll.kt | 17 +- .../message/data/CustomMessage.kt | 46 +- .../net.mamoe.mirai/message/data/Face.kt | 412 +++++++++--------- .../message/data/ForwardMessage.kt | 139 +++--- .../message/data/HummerMessage.kt | 126 +++--- .../net.mamoe.mirai/message/data/Image.kt | 35 +- .../net.mamoe.mirai/message/data/Message.kt | 69 +-- .../message/data/MessageChain.kt | 98 ++--- .../message/data/MessageChainBuilder.kt | 60 +-- .../message/data/MessageSource.kt | 170 ++++---- .../message/data/MessageSourceBuilder.kt | 59 +-- .../net.mamoe.mirai/message/data/PlainText.kt | 18 +- .../message/data/QuoteReply.kt | 36 +- .../message/data/RichMessage.kt | 79 ++-- .../net.mamoe.mirai/message/data/Voice.kt | 33 +- .../message/data/imageDeprecated.kt | 38 +- .../kotlin/net.mamoe.mirai/message/utils.kt | 12 +- .../network/ForceOfflineException.kt | 2 +- .../network/LoginFailedException.kt | 33 +- .../qqandroid.network/Packet.kt | 8 +- .../net.mamoe.mirai/utils/Annotations.kt | 12 +- .../utils/BotConfiguration.common.kt | 48 +- .../kotlin/net.mamoe.mirai/utils/Channels.kt | 14 +- .../net.mamoe.mirai/utils/Context.common.kt | 2 +- .../net.mamoe.mirai/utils/DeviceInfo.kt | 116 ++--- .../net.mamoe.mirai/utils/ExternalImage.kt | 20 +- .../utils/FileCacheStrategy.common.kt | 14 +- .../net.mamoe.mirai/utils/LoginSolver.kt | 14 +- .../net.mamoe.mirai/utils/MiraiLogger.kt | 206 ++++----- .../utils/OverFileSizeMaxException.kt | 2 +- .../net.mamoe.mirai/utils/SystemDeviceInfo.kt | 8 +- .../kotlin/net.mamoe.mirai/utils/TimeUtils.kt | 30 +- .../kotlin/net.mamoe.mirai/utils/WeakRef.kt | 26 +- .../kotlin/net/mamoe/mirai/BotFactory.kt | 22 +- .../mamoe/mirai/event/JvmMethodListeners.kt | 24 +- .../mamoe/mirai/message/SendImageUtilsJvm.kt | 40 +- .../net/mamoe/mirai/message/data/Image.kt | 6 +- .../net/mamoe/mirai/utils/BotConfiguration.kt | 26 +- .../kotlin/net/mamoe/mirai/utils/Context.kt | 4 +- .../net/mamoe/mirai/utils/ExternalImageJvm.kt | 20 +- .../mirai/utils/FileCacheStrategy.jvm.kt | 20 +- .../net/mamoe/mirai/utils/FileLogger.kt | 4 +- .../net/mamoe/mirai/utils/LoginSolver.jvm.kt | 23 +- .../mirai/utils/LoginSolver.swing.jvm.kt | 8 +- .../mirai/utils/OverFileSizeMaxException.kt | 2 +- .../mamoe/mirai/utils/PlatformLogger.jvm.kt | 33 +- .../net/mamoe/mirai/utils/PlatformUtilsJvm.kt | 2 +- .../net/mamoe/mirai/utils/SystemDeviceInfo.kt | 66 +-- .../net/mamoe/mirai/utils/WeakRef.jvm.kt | 2 +- mirai-serialization/build.gradle.kts | 10 +- settings.gradle | 5 +- 98 files changed, 2022 insertions(+), 1935 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index bb20375bc..e62ecba83 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,8 +16,8 @@ buildscript { dependencies { classpath("com.github.jengelman.gradle.plugins:shadow:5.2.0") classpath("com.android.tools.build:gradle:${Versions.Android.androidGradlePlugin}") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.Kotlin.stdlib}") - classpath("org.jetbrains.kotlin:kotlin-serialization:${Versions.Kotlin.stdlib}") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.Kotlin.compiler}") + classpath("org.jetbrains.kotlin:kotlin-serialization:${Versions.Kotlin.compiler}") classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:${Versions.Kotlin.atomicFU}") classpath("org.jetbrains.kotlinx:binary-compatibility-validator:${Versions.Kotlin.binaryValidator}") } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 9df5292fe..69ca8f197 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -13,6 +13,7 @@ object Versions { } object Kotlin { + const val compiler = "1.4-M3" const val stdlib = "1.3.72" const val coroutines = "1.3.7" const val atomicFU = "0.14.2" diff --git a/compatibility-validator/build.gradle.kts b/compatibility-validator/build.gradle.kts index f3d6eeb88..971365998 100644 --- a/compatibility-validator/build.gradle.kts +++ b/compatibility-validator/build.gradle.kts @@ -21,7 +21,7 @@ kotlin { main { dependencies { - api(kotlin("stdlib")) + api(kotlin("stdlib", Versions.Kotlin.stdlib)) runtimeOnly(project(":mirai-core-qqandroid")) compileOnly("net.mamoe:mirai-core-qqandroid:0.38.0") } @@ -29,7 +29,7 @@ kotlin { test { dependencies { - api(kotlin("stdlib")) + api(kotlin("stdlib", Versions.Kotlin.stdlib)) api(kotlin("test")) api(kotlin("test-junit")) runtimeOnly(project(":mirai-core-qqandroid")) diff --git a/gradle.properties b/gradle.properties index 330f03d63..071733167 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,5 @@ kotlin.code.style=official # config kotlin.incremental.multiplatform=true kotlin.parallel.tasks.in.project=true -org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8 \ No newline at end of file +org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8 +#kotlin.mpp.enableGranularSourceSetsMetadata=true \ No newline at end of file diff --git a/java-compatibility-validator/build.gradle.kts b/java-compatibility-validator/build.gradle.kts index f45117e3f..46f1024f8 100644 --- a/java-compatibility-validator/build.gradle.kts +++ b/java-compatibility-validator/build.gradle.kts @@ -21,14 +21,14 @@ kotlin { main { dependencies { - api(kotlin("stdlib")) + api(kotlin("stdlib", Versions.Kotlin.stdlib)) api(project(":mirai-core-qqandroid")) } } test { dependencies { - api(kotlin("stdlib")) + api(kotlin("stdlib", Versions.Kotlin.stdlib)) api(kotlin("test")) api(kotlin("test-junit")) api(project(":mirai-core-qqandroid")) diff --git a/mirai-core-qqandroid/build.gradle.kts b/mirai-core-qqandroid/build.gradle.kts index 87315a7ff..8f3d20b24 100644 --- a/mirai-core-qqandroid/build.gradle.kts +++ b/mirai-core-qqandroid/build.gradle.kts @@ -36,7 +36,7 @@ kotlin { jvm("jvm") { } - sourceSets { + sourceSets.apply { all { languageSettings.enableLanguageFeature("InlineClasses") languageSettings.useExperimentalAnnotation("kotlin.Experimental") @@ -47,6 +47,10 @@ kotlin { languageSettings.useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference") languageSettings.useExperimentalAnnotation("kotlin.time.ExperimentalTime") languageSettings.useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") + + languageSettings.languageVersion = "1.3" + languageSettings.apiVersion = "1.3" + languageSettings.progressiveMode = true dependencies { @@ -83,8 +87,8 @@ kotlin { val androidTest by getting { dependencies { - implementation(kotlin("test", Versions.Kotlin.stdlib)) - implementation(kotlin("test-junit", Versions.Kotlin.stdlib)) + implementation(kotlin("test", Versions.Kotlin.compiler)) + implementation(kotlin("test-junit", Versions.Kotlin.compiler)) implementation(kotlin("test-annotations-common")) implementation(kotlin("test-common")) } @@ -105,8 +109,8 @@ kotlin { val jvmTest by getting { dependencies { dependsOn(commonTest) - implementation(kotlin("test", Versions.Kotlin.stdlib)) - implementation(kotlin("test-junit", Versions.Kotlin.stdlib)) + implementation(kotlin("test", Versions.Kotlin.compiler)) + implementation(kotlin("test-junit", Versions.Kotlin.compiler)) implementation("org.pcap4j:pcap4j-distribution:1.8.2") runtimeOnly(files("build/classes/kotlin/jvm/main")) // classpath is not properly set by IDE diff --git a/mirai-core/build.gradle.kts b/mirai-core/build.gradle.kts index 7ab5d504c..c3a7f81ce 100644 --- a/mirai-core/build.gradle.kts +++ b/mirai-core/build.gradle.kts @@ -14,6 +14,8 @@ description = "Mirai API module" val isAndroidSDKAvailable: Boolean by project kotlin { + explicitApi() + if (isAndroidSDKAvailable) { apply(from = rootProject.file("gradle/android.gradle")) android("android") { @@ -38,7 +40,7 @@ kotlin { // withJava() // https://youtrack.jetbrains.com/issue/KT-39991 } - sourceSets { + sourceSets.apply { all { languageSettings.enableLanguageFeature("InlineClasses") languageSettings.useExperimentalAnnotation("kotlin.Experimental") @@ -49,12 +51,16 @@ kotlin { languageSettings.useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference") languageSettings.useExperimentalAnnotation("kotlin.time.ExperimentalTime") languageSettings.useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") + + languageSettings.languageVersion = "1.3" + languageSettings.apiVersion = "1.3" + languageSettings.progressiveMode = true } commonMain { dependencies { - api(kotlin("stdlib")) + api(kotlin("stdlib", Versions.Kotlin.stdlib)) api(kotlin("serialization")) api(kotlin("reflect")) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt index 0c2c5fd99..b120b2fb0 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt @@ -9,7 +9,7 @@ @file:Suppress( "EXPERIMENTAL_API_USAGE", "unused", "FunctionName", "NOTHING_TO_INLINE", "UnusedImport", - "EXPERIMENTAL_OVERRIDE" + "EXPERIMENTAL_OVERRIDE", "CanBeParameter", "MemberVisibilityCanBePrivate" ) package net.mamoe.mirai @@ -33,7 +33,7 @@ import kotlin.jvm.JvmSynthetic * 登录, 返回 [this] */ @JvmSynthetic -suspend inline fun B.alsoLogin(): B = also { login() } +public suspend inline fun B.alsoLogin(): B = also { login() } /** * 机器人对象. 一个机器人实例登录一个 QQ 账号. @@ -47,10 +47,10 @@ suspend inline fun B.alsoLogin(): B = also { login() } * @see BotFactory 构造 [Bot] 的工厂, [Bot] 唯一的构造方式. */ @Suppress("INAPPLICABLE_JVM_NAME", "EXPOSED_SUPER_CLASS") -abstract class Bot internal constructor( - val configuration: BotConfiguration +public abstract class Bot internal constructor( + public val configuration: BotConfiguration ) : CoroutineScope, LowLevelBotAPIAccessor, BotJavaFriendlyAPI, ContactOrBot { - final override val coroutineContext: CoroutineContext = // for id + public final override val coroutineContext: CoroutineContext = // for id configuration.parentCoroutineContext .plus(SupervisorJob(configuration.parentCoroutineContext[Job])) .plus(configuration.parentCoroutineContext[CoroutineExceptionHandler] @@ -61,22 +61,22 @@ abstract class Bot internal constructor( .plus(CoroutineName("Mirai Bot")) - companion object { + public companion object { @JvmField @Suppress("ObjectPropertyName") internal val _instances: LockFreeLinkedList> = LockFreeLinkedList() - @PlannedRemoval("1.2.0") + @PlannedRemoval("2.0.0") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @JvmStatic - val instances: List> + public val instances: List> get() = _instances.toList() /** * 复制一份此时的 [Bot] 实例列表. */ @JvmStatic - val botInstances: List + public val botInstances: List get() = _instances.asSequence().mapNotNull { it.get() }.toList() /** @@ -84,28 +84,28 @@ abstract class Bot internal constructor( */ @SinceMirai("1.1.0") @JvmStatic - val botInstancesSequence: Sequence + public val botInstancesSequence: Sequence get() = _instances.asSequence().mapNotNull { it.get() } /** * 遍历每一个 [Bot] 实例 */ @JvmSynthetic - fun forEachInstance(block: (Bot) -> Unit) = _instances.forEach { it.get()?.let(block) } + public fun forEachInstance(block: (Bot) -> Unit): Unit = _instances.forEach { it.get()?.let(block) } /** * 获取一个 [Bot] 实例, 无对应实例时抛出 [NoSuchElementException] */ @JvmStatic @Throws(NoSuchElementException::class) - fun getInstance(qq: Long): Bot = + public fun getInstance(qq: Long): Bot = getInstanceOrNull(qq) ?: throw NoSuchElementException(qq.toString()) /** * 获取一个 [Bot] 实例, 无对应实例时返回 `null` */ @JvmStatic - fun getInstanceOrNull(qq: Long): Bot? = + public fun getInstanceOrNull(qq: Long): Bot? = _instances.asSequence().mapNotNull { it.get() }.firstOrNull { it.id == qq } } @@ -123,28 +123,28 @@ abstract class Bot internal constructor( * 在 Android 实现为 `android.content.Context` */ @MiraiExperimentalAPI - abstract val context: Context + public abstract val context: Context /** * QQ 号码. 实际类型为 uint */ - abstract override val id: Long + public abstract override val id: Long /** * 昵称 */ - abstract val nick: String + public abstract val nick: String /** * 日志记录器 */ - abstract val logger: MiraiLogger + public abstract val logger: MiraiLogger /** * 判断 Bot 是否在线 (可正常收发消息) */ @SinceMirai("1.0.1") - abstract val isOnline: Boolean + public abstract val isOnline: Boolean // region contacts @@ -152,30 +152,32 @@ abstract class Bot internal constructor( * [User.id] 与 [Bot.id] 相同的 [_lowLevelNewFriend] 实例 */ @MiraiExperimentalAPI - abstract val selfQQ: Friend + public abstract val selfQQ: Friend /** * 机器人的好友列表. 与服务器同步更新 */ - abstract val friends: ContactList + public abstract val friends: ContactList /** * 获取一个好友对象. * @throws [NoSuchElementException] 当不存在这个好友时抛出 */ - fun getFriend(id: Long): Friend = friends.firstOrNull { it.id == id } ?: throw NoSuchElementException("friend $id") + public fun getFriend(id: Long): Friend = + friends.firstOrNull { it.id == id } ?: throw NoSuchElementException("friend $id") /** * 机器人加入的群列表. 与服务器同步更新 */ - abstract val groups: ContactList + public abstract val groups: ContactList /** * 获取一个机器人加入的群. * @throws NoSuchElementException 当不存在这个群时抛出 */ - fun getGroup(id: Long): Group = groups.firstOrNull { it.id == id } ?: throw NoSuchElementException("group $id") + public fun getGroup(id: Long): Group = + groups.firstOrNull { it.id == id } ?: throw NoSuchElementException("group $id") // endregion @@ -191,7 +193,7 @@ abstract class Bot internal constructor( * @see alsoLogin `.apply { login() }` 捷径 */ @JvmSynthetic - abstract suspend fun login() + public abstract suspend fun login() // endregion @@ -212,7 +214,7 @@ abstract class Bot internal constructor( * @see MessageSource.recall 撤回消息扩展 */ @JvmSynthetic - abstract suspend fun recall(source: MessageSource) + public abstract suspend fun recall(source: MessageSource) /** * 获取图片下载链接 @@ -226,7 +228,7 @@ abstract class Bot internal constructor( level = DeprecationLevel.ERROR ) @JvmSynthetic - abstract suspend fun queryImageUrl(image: Image): String + public abstract suspend fun queryImageUrl(image: Image): String /** * 构造一个 [OfflineMessageSource] @@ -238,7 +240,7 @@ abstract class Bot internal constructor( * @param targetUin 为用户时为 [Friend.id], 为群时需使用 [Group.calculateGroupUinByGroupCode] 计算 */ @MiraiExperimentalAPI("This is very experimental and is subject to change.") - abstract fun constructMessageSource( + public abstract fun constructMessageSource( kind: OfflineMessageSource.Kind, fromUin: Long, targetUin: Long, id: Int, time: Int, internalId: Int, @@ -254,7 +256,7 @@ abstract class Bot internal constructor( @PlannedRemoval("1.2.0") @Deprecated("use member function.", replaceWith = ReplaceWith("event.accept()"), level = DeprecationLevel.ERROR) @JvmSynthetic - abstract suspend fun acceptNewFriendRequest(event: NewFriendRequestEvent) + public abstract suspend fun acceptNewFriendRequest(event: NewFriendRequestEvent) /** * 拒绝好友验证 @@ -269,7 +271,7 @@ abstract class Bot internal constructor( level = DeprecationLevel.ERROR ) @JvmSynthetic - abstract suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean = false) + public abstract suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean = false) /** * 通过加群验证(需管理员权限) @@ -279,7 +281,7 @@ abstract class Bot internal constructor( @PlannedRemoval("1.2.0") @Deprecated("use member function.", replaceWith = ReplaceWith("event.accept()"), level = DeprecationLevel.ERROR) @JvmSynthetic - abstract suspend fun acceptMemberJoinRequest(event: MemberJoinRequestEvent) + public abstract suspend fun acceptMemberJoinRequest(event: MemberJoinRequestEvent) /** * 拒绝加群验证(需管理员权限) @@ -293,10 +295,14 @@ abstract class Bot internal constructor( replaceWith = ReplaceWith("event.reject(blackList)"), level = DeprecationLevel.HIDDEN ) - abstract suspend fun rejectMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false) + public abstract suspend fun rejectMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false) @JvmSynthetic - abstract suspend fun rejectMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false, message: String = "") + public abstract suspend fun rejectMemberJoinRequest( + event: MemberJoinRequestEvent, + blackList: Boolean = false, + message: String = "" + ) /** * 忽略加群验证(需管理员权限) @@ -311,7 +317,7 @@ abstract class Bot internal constructor( level = DeprecationLevel.ERROR ) @JvmSynthetic - abstract suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false) + public abstract suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false) /** * 接收邀请入群(需管理员权限) @@ -321,7 +327,7 @@ abstract class Bot internal constructor( @PlannedRemoval("1.2.0") @Deprecated("use member function.", replaceWith = ReplaceWith("event.accept()"), level = DeprecationLevel.ERROR) @JvmSynthetic - abstract suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) + public abstract suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) /** * 忽略邀请入群(需管理员权限) @@ -331,7 +337,7 @@ abstract class Bot internal constructor( @PlannedRemoval("1.2.0") @Deprecated("use member function.", replaceWith = ReplaceWith("event.ignore()"), level = DeprecationLevel.ERROR) @JvmSynthetic - abstract suspend fun ignoreInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) + public abstract suspend fun ignoreInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) // endregion @@ -345,16 +351,16 @@ abstract class Bot internal constructor( * * @see closeAndJoin 取消并 [Bot.join], 以确保 [Bot] 相关的活动被完全关闭 */ - abstract fun close(cause: Throwable? = null) + public abstract fun close(cause: Throwable? = null) - final override fun toString(): String = "Bot($id)" + public final override fun toString(): String = "Bot($id)" } /** * 获取 [Job] 的协程 [Job]. 此 [Job] 为一个 [SupervisorJob] */ @get:JvmSynthetic -val Bot.supervisorJob: CompletableJob +public val Bot.supervisorJob: CompletableJob get() = this.coroutineContext[Job] as CompletableJob /** @@ -362,7 +368,7 @@ val Bot.supervisorJob: CompletableJob * 即使 [Bot] 离线, 也会等待直到协程关闭. */ @JvmSynthetic -suspend inline fun Bot.join() = this.coroutineContext[Job]!!.join() +public suspend inline fun Bot.join(): Unit = this.coroutineContext[Job]!!.join() /** * 撤回这条消息. @@ -374,7 +380,7 @@ suspend inline fun Bot.join() = this.coroutineContext[Job]!!.join() * @see Bot.recall */ @JvmSynthetic -suspend inline fun Bot.recall(message: MessageChain) = +public suspend inline fun Bot.recall(message: MessageChain): Unit = this.recall(message.source) /** @@ -385,7 +391,7 @@ suspend inline fun Bot.recall(message: MessageChain) = * @see recall */ @JvmSynthetic -inline fun CoroutineScope.recallIn( +public inline fun CoroutineScope.recallIn( source: MessageSource, millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext @@ -402,7 +408,7 @@ inline fun CoroutineScope.recallIn( * @see recall */ @JvmSynthetic -inline fun CoroutineScope.recallIn( +public inline fun CoroutineScope.recallIn( message: MessageChain, millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext @@ -419,19 +425,19 @@ inline fun CoroutineScope.recallIn( * @param cause 原因. 为 null 时视为正常关闭, 非 null 时视为异常关闭 */ @JvmSynthetic -suspend inline fun Bot.closeAndJoin(cause: Throwable? = null) { +public suspend inline fun Bot.closeAndJoin(cause: Throwable? = null) { close(cause) coroutineContext[Job]?.join() } @JvmSynthetic -inline fun Bot.containsFriend(id: Long): Boolean = this.friends.contains(id) +public inline fun Bot.containsFriend(id: Long): Boolean = this.friends.contains(id) @JvmSynthetic -inline fun Bot.containsGroup(id: Long): Boolean = this.groups.contains(id) +public inline fun Bot.containsGroup(id: Long): Boolean = this.groups.contains(id) @JvmSynthetic -inline fun Bot.getFriendOrNull(id: Long): Friend? = this.friends.getOrNull(id) +public inline fun Bot.getFriendOrNull(id: Long): Friend? = this.friends.getOrNull(id) @JvmSynthetic -inline fun Bot.getGroupOrNull(id: Long): Group? = this.groups.getOrNull(id) +public inline fun Bot.getGroupOrNull(id: Long): Group? = this.groups.getOrNull(id) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt index 057c24650..e65d509aa 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt @@ -23,12 +23,12 @@ import kotlin.jvm.JvmSynthetic * * 在 JVM, 请查看 `BotFactoryJvm` */ -expect interface BotFactory { +public expect interface BotFactory { /** * 使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmName("newBot") - fun Bot( + public fun Bot( context: Context, qq: Long, password: String, @@ -39,7 +39,7 @@ expect interface BotFactory { * 使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmName("newBot") - fun Bot( + public fun Bot( context: Context, qq: Long, passwordMd5: ByteArray, @@ -51,7 +51,7 @@ expect interface BotFactory { * 使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmSynthetic -inline fun BotFactory.Bot( +public inline fun BotFactory.Bot( context: Context, qq: Long, password: String, @@ -62,7 +62,7 @@ inline fun BotFactory.Bot( * 使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmSynthetic -inline fun BotFactory.Bot( +public inline fun BotFactory.Bot( context: Context, qq: Long, password: ByteArray, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt index 590e41104..52dc12b94 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt @@ -35,12 +35,12 @@ import kotlin.jvm.JvmSynthetic * 联系对象, 即可以与 [Bot] 互动的对象. 包含 [用户][User], 和 [群][Group]. */ @Suppress("EXPOSED_SUPER_CLASS") -abstract class Contact : ContactOrBot, CoroutineScope, ContactJavaFriendlyAPI { +public abstract class Contact : ContactOrBot, CoroutineScope, ContactJavaFriendlyAPI { /** * 这个联系对象所属 [Bot]. */ @WeakRefProperty - abstract val bot: Bot + public abstract val bot: Bot /** * 可以是 QQ 号码或者群号码. @@ -48,7 +48,7 @@ abstract class Contact : ContactOrBot, CoroutineScope, ContactJavaFriendlyAPI { * @see User.id * @see Group.id */ - abstract override val id: Long + public abstract override val id: Long /** * 向这个对象发送消息. @@ -66,12 +66,12 @@ abstract class Contact : ContactOrBot, CoroutineScope, ContactJavaFriendlyAPI { * @return 消息回执. 可 [引用回复][MessageReceipt.quote](仅群聊)或 [撤回][MessageReceipt.recall] 这条消息. */ @JvmSynthetic - abstract suspend fun sendMessage(message: Message): MessageReceipt + public abstract suspend fun sendMessage(message: Message): MessageReceipt @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "VIRTUAL_MEMBER_HIDDEN", "OVERRIDE_BY_INLINE") @kotlin.internal.InlineOnly @JvmSynthetic - suspend inline fun sendMessage(message: String): MessageReceipt { + public suspend inline fun sendMessage(message: String): MessageReceipt { return sendMessage(message.toMessage()) } @@ -87,34 +87,34 @@ abstract class Contact : ContactOrBot, CoroutineScope, ContactJavaFriendlyAPI { * @throws OverFileSizeMaxException 当图片文件过大而被服务器拒绝上传时抛出. (最大大小约为 20 MB, 但 mirai 限制的大小为 30 MB) */ @JvmSynthetic - abstract suspend fun uploadImage(image: ExternalImage): Image + public abstract suspend fun uploadImage(image: ExternalImage): Image - final override fun equals(other: Any?): Boolean = super.equals(other) - final override fun hashCode(): Int = super.hashCode() + public final override fun equals(other: Any?): Boolean = super.equals(other) + public final override fun hashCode(): Int = super.hashCode() /** * @return "Friend($id)" or "Group($id)" or "Member($id)" */ - abstract override fun toString(): String + public abstract override fun toString(): String } /** * @see Bot.recall */ @JvmSynthetic -suspend inline fun Contact.recall(source: MessageChain) = this.bot.recall(source) +public suspend inline fun Contact.recall(source: MessageChain): Unit = this.bot.recall(source) /** * @see Bot.recall */ @JvmSynthetic -suspend inline fun Contact.recall(source: MessageSource) = this.bot.recall(source) +public suspend inline fun Contact.recall(source: MessageSource): Unit = this.bot.recall(source) /** * @see Bot.recallIn */ @JvmSynthetic -inline fun Contact.recallIn( +public inline fun Contact.recallIn( message: MessageChain, millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext @@ -124,7 +124,7 @@ inline fun Contact.recallIn( * @see Bot.recallIn */ @JvmSynthetic -inline fun Contact.recallIn( +public inline fun Contact.recallIn( source: MessageSource, millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt index fa2cbf299..771486d4f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt @@ -22,24 +22,24 @@ import kotlin.jvm.JvmField * @see ContactList.asSequence */ @Suppress("unused") -class ContactList +public class ContactList internal constructor(@JvmField internal val delegate: LockFreeLinkedList) : Collection { - operator fun get(id: Long): C = + public operator fun get(id: Long): C = delegate.asSequence().firstOrNull { it.id == id } ?: throw NoSuchElementException("Contact id $id") - fun getOrNull(id: Long): C? = delegate.getOrNull(id) + public fun getOrNull(id: Long): C? = delegate.getOrNull(id) - override val size: Int get() = delegate.size - override operator fun contains(element: C): Boolean = delegate.contains(element) - operator fun contains(id: Long): Boolean = delegate.getOrNull(id) != null - override fun containsAll(elements: Collection): Boolean = elements.all { contains(it) } - override fun isEmpty(): Boolean = delegate.isEmpty() + public override val size: Int get() = delegate.size + public override operator fun contains(element: C): Boolean = delegate.contains(element) + public operator fun contains(id: Long): Boolean = delegate.getOrNull(id) != null + public override fun containsAll(elements: Collection): Boolean = elements.all { contains(it) } + public override fun isEmpty(): Boolean = delegate.isEmpty() - override fun toString(): String = + public override fun toString(): String = delegate.asSequence().joinToString(separator = ", ", prefix = "ContactList(", postfix = ")") - override fun iterator(): Iterator { + public override fun iterator(): Iterator { return this.delegate.asSequence().iterator() } } @@ -51,7 +51,7 @@ internal constructor(@JvmField internal val delegate: LockFreeLinkedList) : C * [123456, 321654, 123654] * ``` */ -val ContactList<*>.idContentString: String +public val ContactList<*>.idContentString: String get() = "[" + buildString { delegate.forEach { append(it.id).append(", ") } }.dropLast( 2 ) + "]" diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt index 766ce8d99..d07f78bc8 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt @@ -19,9 +19,9 @@ import net.mamoe.mirai.Bot * @see Contact * @see Bot */ -interface ContactOrBot : CoroutineScope { +public interface ContactOrBot : CoroutineScope { /** * QQ 号或群号. */ - val id: Long + public val id: Long } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Exceptions.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Exceptions.kt index b207ba375..28773da9f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Exceptions.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Exceptions.kt @@ -20,16 +20,16 @@ import kotlin.time.seconds * * @see Contact.sendMessage */ -class MessageTooLargeException( - val target: Contact, +public class MessageTooLargeException( + public val target: Contact, /** * 原发送消息 */ - val originalMessage: Message, + public val originalMessage: Message, /** * 经过事件拦截处理后的消息 */ - val messageAfterEvent: Message, + public val messageAfterEvent: Message, exceptionMessage: String ) : RuntimeException(exceptionMessage) @@ -38,8 +38,8 @@ class MessageTooLargeException( * * @see Group.sendMessage */ -class BotIsBeingMutedException( - val target: Group +public class BotIsBeingMutedException( + public val target: Group ) : RuntimeException("bot is being muted, remaining ${target.botMuteRemaining.seconds.asHumanReadable} seconds") -inline val BotIsBeingMutedException.botMuteRemaining: Int get() = target.botMuteRemaining \ No newline at end of file +public inline val BotIsBeingMutedException.botMuteRemaining: Int get() = target.botMuteRemaining \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Friend.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Friend.kt index 77c7e6b38..9d4c02f5e 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Friend.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Friend.kt @@ -34,22 +34,22 @@ import kotlin.jvm.JvmSynthetic * @see FriendMessageEvent */ @Suppress("DEPRECATION_ERROR") -abstract class Friend : User(), CoroutineScope { +public abstract class Friend : User(), CoroutineScope { /** * QQ 号码 */ - abstract override val id: Long + public abstract override val id: Long /** * 昵称 */ - abstract override val nick: String + public abstract override val nick: String /** * 头像下载链接 */ - override val avatarUrl: String + public override val avatarUrl: String get() = "http://q1.qlogo.cn/g?b=qq&nk=$id&s=640" /** diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt index aee6dc654..ed809e049 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt @@ -32,7 +32,7 @@ import kotlin.jvm.JvmSynthetic /** * 群. */ -abstract class Group : Contact(), CoroutineScope { +public abstract class Group : Contact(), CoroutineScope { /** * 群名称. * @@ -42,30 +42,30 @@ abstract class Group : Contact(), CoroutineScope { * @see GroupNameChangeEvent 群名片修改事件 * @throws PermissionDeniedException 无权限修改时将会抛出异常 */ - abstract var name: String + public abstract var name: String /** * 群设置 */ - abstract val settings: GroupSettings + public abstract val settings: GroupSettings /** * 同为 groupCode, 用户看到的群号码. */ - abstract override val id: Long + public abstract override val id: Long /** * 群主. * * @return 若机器人是群主, 返回 [botAsMember]. 否则返回相应的成员 */ - abstract val owner: Member + public abstract val owner: Member /** * [Bot] 在群内的 [Member] 实例 */ @MiraiExperimentalAPI - abstract val botAsMember: Member + public abstract val botAsMember: Member /** * 机器人被禁言还剩余多少秒 @@ -73,7 +73,7 @@ abstract class Group : Contact(), CoroutineScope { * @see BotMuteEvent 机器人被禁言事件 * @see isBotMuted 判断机器人是否正在被禁言 */ - abstract val botMuteRemaining: Int + public abstract val botMuteRemaining: Int /** * 机器人在这个群里的权限 @@ -82,38 +82,38 @@ abstract class Group : Contact(), CoroutineScope { * * @see BotGroupPermissionChangeEvent 机器人群员修改 */ - abstract val botPermission: MemberPermission + public abstract val botPermission: MemberPermission /** * 群头像下载链接. */ - val avatarUrl: String + public val avatarUrl: String get() = "https://p.qlogo.cn/gh/$id/${id}/640" /** * 群成员列表, 不含机器人自己, 含群主. * 在 [Group] 实例创建的时候查询一次. 并与事件同步事件更新 */ - abstract val members: ContactList + public abstract val members: ContactList /** * 获取群成员实例. 不存在时抛出 [kotlin.NoSuchElementException] * 当 [id] 为 [Bot.id] 时返回 [botAsMember] */ @Throws(NoSuchElementException::class) - abstract operator fun get(id: Long): Member + public abstract operator fun get(id: Long): Member /** * 获取群成员实例, 不存在则 null * 当 [id] 为 [Bot.id] 时返回 [botAsMember] */ - abstract fun getOrNull(id: Long): Member? + public abstract fun getOrNull(id: Long): Member? /** * 检查此 id 的群成员是否存在 * 当 [id] 为 [Bot.id] 时返回 `true` */ - abstract operator fun contains(id: Long): Boolean + public abstract operator fun contains(id: Long): Boolean /** @@ -122,7 +122,7 @@ abstract class Group : Contact(), CoroutineScope { * @return 退出成功时 true; 已经退出时 false */ @JvmSynthetic - abstract suspend fun quit(): Boolean + public abstract suspend fun quit(): Boolean /** * 构造一个 [Member]. @@ -130,7 +130,7 @@ abstract class Group : Contact(), CoroutineScope { */ @LowLevelAPI @MiraiExperimentalAPI("dangerous") - abstract fun newMember(memberInfo: MemberInfo): Member + public abstract fun newMember(memberInfo: MemberInfo): Member /** * 向这个对象发送消息. @@ -148,7 +148,7 @@ abstract class Group : Contact(), CoroutineScope { * @return 消息回执. 可进行撤回 ([MessageReceipt.recall]) */ @JvmSynthetic - abstract override suspend fun sendMessage(message: Message): MessageReceipt + public abstract override suspend fun sendMessage(message: Message): MessageReceipt /** * @see sendMessage @@ -156,7 +156,7 @@ abstract class Group : Contact(), CoroutineScope { @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "VIRTUAL_MEMBER_HIDDEN", "OVERRIDE_BY_INLINE") @kotlin.internal.InlineOnly @JvmSynthetic - suspend inline fun sendMessage(message: String): MessageReceipt { + public suspend inline fun sendMessage(message: String): MessageReceipt { return sendMessage(message.toMessage()) } @@ -172,16 +172,16 @@ abstract class Group : Contact(), CoroutineScope { * @throws OverFileSizeMaxException 当图片文件过大而被服务器拒绝上传时. (最大大小约为 20 MB) */ @JvmSynthetic - abstract override suspend fun uploadImage(image: ExternalImage): Image + public abstract override suspend fun uploadImage(image: ExternalImage): Image - companion object { + public companion object { /** * 使用 groupCode 计算 groupUin. 这两个值仅在 mirai 内部协议区分, 一般人使用时无需在意. * @suppress internal api */ @MiraiExperimentalAPI @JvmStatic - fun calculateGroupUinByGroupCode(groupCode: Long): Long = + public fun calculateGroupUinByGroupCode(groupCode: Long): Long = CommonGroupCalculations.calculateGroupUinByGroupCode(groupCode) /** @@ -190,7 +190,7 @@ abstract class Group : Contact(), CoroutineScope { */ @MiraiExperimentalAPI @JvmStatic - fun calculateGroupCodeByGroupUin(groupUin: Long): Long = + public fun calculateGroupCodeByGroupUin(groupUin: Long): Long = CommonGroupCalculations.calculateGroupCodeByGroupUin(groupUin) } @@ -200,7 +200,7 @@ abstract class Group : Contact(), CoroutineScope { @Suppress("FunctionName") @JvmName("quit") @JavaFriendlyAPI - fun __quitBlockingForJava__(): Boolean = runBlocking { quit() } + public fun __quitBlockingForJava__(): Boolean = runBlocking { quit() } } /** @@ -208,7 +208,7 @@ abstract class Group : Contact(), CoroutineScope { * * @see Group.settings 获取群设置 */ -interface GroupSettings { +public interface GroupSettings { /** * 入群公告, 没有时为空字符串. * @@ -217,7 +217,7 @@ interface GroupSettings { * @see GroupEntranceAnnouncementChangeEvent * @throws PermissionDeniedException 无权限修改时将会抛出异常 */ - var entranceAnnouncement: String + public var entranceAnnouncement: String /** * 全体禁言状态. `true` 为开启. @@ -227,7 +227,7 @@ interface GroupSettings { * @see GroupMuteAllEvent * @throws PermissionDeniedException 无权限修改时将会抛出异常 */ - var isMuteAll: Boolean + public var isMuteAll: Boolean /** * 坦白说状态. `true` 为允许. @@ -239,7 +239,7 @@ interface GroupSettings { */ @PlannedRemoval("1.3.0") @Deprecated("mirai 将不再支持此用例较少的设置", level = DeprecationLevel.WARNING) - var isConfessTalkEnabled: Boolean + public var isConfessTalkEnabled: Boolean /** * 允许群员邀请好友入群的状态. `true` 为允许 @@ -249,18 +249,18 @@ interface GroupSettings { * @see GroupAllowMemberInviteEvent * @throws PermissionDeniedException 无权限修改时将会抛出异常 */ - var isAllowMemberInvite: Boolean + public var isAllowMemberInvite: Boolean /** * 自动加群审批 */ @MiraiExperimentalAPI - val isAutoApproveEnabled: Boolean + public val isAutoApproveEnabled: Boolean /** * 匿名聊天 */ - val isAnonymousChatEnabled: Boolean + public val isAnonymousChatEnabled: Boolean } @@ -269,7 +269,7 @@ interface GroupSettings { * * @see Group.botMuteRemaining 剩余禁言时间 */ -inline val Group.isBotMuted: Boolean get() = this.botMuteRemaining != 0 +public inline val Group.isBotMuted: Boolean get() = this.botMuteRemaining != 0 internal object CommonGroupCalculations { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt index c5d4beb53..ee0908ca5 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt @@ -20,9 +20,6 @@ import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.isContentEmpty import net.mamoe.mirai.message.data.toMessage import net.mamoe.mirai.message.recall -import net.mamoe.mirai.utils.hoursToSeconds -import net.mamoe.mirai.utils.daysToSeconds -import net.mamoe.mirai.utils.minutesToSeconds import net.mamoe.mirai.utils.WeakRefProperty import kotlin.jvm.JvmSynthetic import kotlin.time.Duration @@ -39,19 +36,19 @@ import kotlin.time.ExperimentalTime */ @Suppress("INAPPLICABLE_JVM_NAME", "EXPOSED_SUPER_CLASS") @OptIn(JavaFriendlyAPI::class) -abstract class Member : MemberJavaFriendlyAPI, User() { +public abstract class Member : MemberJavaFriendlyAPI, User() { /** * 所在的群. */ @WeakRefProperty - abstract val group: Group + public abstract val group: Group /** * 成员的权限, 动态更新. * * @see MemberPermissionChangeEvent 权限变更事件. 由群主或机器人的操作触发. */ - abstract val permission: MemberPermission + public abstract val permission: MemberPermission /** * 群名片. 可能为空. @@ -65,7 +62,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @see MemberCardChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件. 修改时也会触发此事件. * @throws PermissionDeniedException 无权限修改时 */ - abstract var nameCard: String + public abstract var nameCard: String /** * 群头衔. @@ -77,7 +74,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @see MemberSpecialTitleChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件. 修改时也会触发此事件. * @throws PermissionDeniedException 无权限修改时 */ - abstract var specialTitle: String + public abstract var specialTitle: String /** * 被禁言剩余时长. 单位为秒. @@ -86,7 +83,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @see mute 设置禁言 * @see unmute 取消禁言 */ - abstract val muteTimeRemaining: Int + public abstract val muteTimeRemaining: Int /** * 禁言. @@ -111,7 +108,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @throws PermissionDeniedException 无权限修改时抛出 */ @JvmSynthetic - abstract suspend fun mute(durationSeconds: Int) + public abstract suspend fun mute(durationSeconds: Int) /** * 解除禁言. @@ -125,7 +122,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @throws PermissionDeniedException 无权限修改时抛出 */ @JvmSynthetic - abstract suspend fun unmute() + public abstract suspend fun unmute() /** * 踢出该成员. @@ -136,7 +133,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @throws PermissionDeniedException 无权限修改时 */ @JvmSynthetic - abstract suspend fun kick(message: String = "") + public abstract suspend fun kick(message: String = "") /** * 向群成员发送消息. @@ -158,7 +155,7 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * @return 消息回执. 可进行撤回 ([MessageReceipt.recall]) */ @JvmSynthetic - abstract override suspend fun sendMessage(message: Message): MessageReceipt + public abstract override suspend fun sendMessage(message: Message): MessageReceipt /** * @see sendMessage @@ -166,11 +163,11 @@ abstract class Member : MemberJavaFriendlyAPI, User() { @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "VIRTUAL_MEMBER_HIDDEN", "OVERRIDE_BY_INLINE") @kotlin.internal.InlineOnly @JvmSynthetic - suspend inline fun sendMessage(message: String): MessageReceipt { + public suspend inline fun sendMessage(message: String): MessageReceipt { return sendMessage(message.toMessage()) } - final override fun toString(): String = "Member($id)" + public final override fun toString(): String = "Member($id)" } /** @@ -178,23 +175,23 @@ abstract class Member : MemberJavaFriendlyAPI, User() { * * @throws IllegalStateException 当此成员不是好友时抛出 */ -fun Member.asFriend(): Friend = this.bot.getFriendOrNull(this.id) ?: error("$this is not a friend") +public fun Member.asFriend(): Friend = this.bot.getFriendOrNull(this.id) ?: error("$this is not a friend") /** * 得到此成员作为好友的对象, 当此成员不是好友时返回 `null` */ -fun Member.asFriendOrNull(): Friend? = this.bot.getFriendOrNull(this.id) +public fun Member.asFriendOrNull(): Friend? = this.bot.getFriendOrNull(this.id) /** * 判断此成员是否为好友 */ -inline val Member.isFriend: Boolean +public inline val Member.isFriend: Boolean get() = this.bot.friends.contains(this.id) /** * 如果此成员是好友, 则执行 [block] 并返回其返回值. 否则返回 `null` */ -inline fun Member.takeIfIsFriend(block: (Friend) -> R): R? { +public inline fun Member.takeIfIsFriend(block: (Friend) -> R): R? { return this.asFriendOrNull()?.let(block) } @@ -203,7 +200,7 @@ inline fun Member.takeIfIsFriend(block: (Friend) -> R): R? { * * 若 [群名片][Member.nameCard] 不为空则返回群名片, 为空则返回 [User.nick] */ -val Member.nameCardOrNick: String get() = this.nameCard.takeIf { it.isNotEmpty() } ?: this.nick +public val Member.nameCardOrNick: String get() = this.nameCard.takeIf { it.isNotEmpty() } ?: this.nick /** * 获取非空群名片或昵称. @@ -212,7 +209,7 @@ val Member.nameCardOrNick: String get() = this.nameCard.takeIf { it.isNotEmpty() * * 否则返回 [Member.nick] */ -val User.nameCardOrNick: String +public val User.nameCardOrNick: String get() = when (this) { is Member -> this.nameCardOrNick else -> this.nick @@ -221,14 +218,14 @@ val User.nameCardOrNick: String /** * 判断群成员是否处于禁言状态. */ -val Member.isMuted: Boolean +public val Member.isMuted: Boolean get() = muteTimeRemaining != 0 && muteTimeRemaining != 0xFFFFFFFF.toInt() /** * @see Member.mute */ @ExperimentalTime -suspend inline fun Member.mute(duration: Duration) { +public suspend inline fun Member.mute(duration: Duration) { require(duration.inDays <= 30) { "duration must be at most 1 month" } require(duration.inSeconds > 0) { "duration must be greater than 0 second" } this.mute(duration.inSeconds.toInt()) @@ -237,4 +234,4 @@ suspend inline fun Member.mute(duration: Duration) { /** * @see Member.mute */ -suspend inline fun Member.mute(durationSeconds: Long) = this.mute(durationSeconds.toInt()) \ No newline at end of file +public suspend inline fun Member.mute(durationSeconds: Long): Unit = this.mute(durationSeconds.toInt()) \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt index dcc9cfbdf..1fb6a4ab9 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt @@ -26,7 +26,7 @@ import kotlin.internal.InlineOnly * @see Member.isOperator 对 [Member] 的扩展函数, 判断此成员是否为管理员或群主 * @see Member.isAdministrator 对 [Member] 的扩展函数, 判断此成员是否为管理员 */ -enum class MemberPermission : Comparable { +public enum class MemberPermission : Comparable { /** * 一般群成员 */ @@ -45,7 +45,7 @@ enum class MemberPermission : Comparable { /** * 权限等级. [OWNER] 为 2, [ADMINISTRATOR] 为 1, [MEMBER] 为 0 */ - val level: Int + public val level: Int get() = ordinal } @@ -53,44 +53,44 @@ enum class MemberPermission : Comparable { * 判断权限是否为群主 */ @InlineOnly -inline fun MemberPermission.isOwner(): Boolean = this == MemberPermission.OWNER +public inline fun MemberPermission.isOwner(): Boolean = this == MemberPermission.OWNER /** * 判断权限是否为管理员 */ @InlineOnly -inline fun MemberPermission.isAdministrator(): Boolean = this == MemberPermission.ADMINISTRATOR +public inline fun MemberPermission.isAdministrator(): Boolean = this == MemberPermission.ADMINISTRATOR /** * 判断权限是否为管理员或群主 */ @InlineOnly -inline fun MemberPermission.isOperator(): Boolean = isAdministrator() || isOwner() +public inline fun MemberPermission.isOperator(): Boolean = isAdministrator() || isOwner() /** * 判断权限是否为群主 */ -inline fun Member.isOwner(): Boolean = this.permission.isOwner() +public inline fun Member.isOwner(): Boolean = this.permission.isOwner() /** * 判断权限是否为管理员 */ -inline fun Member.isAdministrator(): Boolean = this.permission.isAdministrator() +public inline fun Member.isAdministrator(): Boolean = this.permission.isAdministrator() /** * 判断权限是否为管理员或群主 */ -inline fun Member.isOperator(): Boolean = this.permission.isOperator() +public inline fun Member.isOperator(): Boolean = this.permission.isOperator() /** * 权限不足 */ @Suppress("unused") -class PermissionDeniedException : IllegalStateException { - constructor() : super("Permission denied") - constructor(message: String?) : super(message) +public class PermissionDeniedException : IllegalStateException { + public constructor() : super("Permission denied") + public constructor(message: String?) : super(message) } /** @@ -98,7 +98,7 @@ class PermissionDeniedException : IllegalStateException { * * @throws PermissionDeniedException */ -inline fun Group.checkBotPermission( +public inline fun Group.checkBotPermission( required: MemberPermission, crossinline lazyMessage: () -> String = { "Permission denied: required $required, got actual $botPermission for $bot in group $id" @@ -115,8 +115,8 @@ inline fun Group.checkBotPermission( * @throws PermissionDeniedException */ @Deprecated("use checkBotPermission", ReplaceWith("checkBotPermission(MemberPermission.ADMINISTRATOR)")) -inline fun Group.checkBotPermissionOperator( +public inline fun Group.checkBotPermissionOperator( crossinline lazyMessage: () -> String = { "Permission denied: required ${MemberPermission.ADMINISTRATOR} or ${MemberPermission.OWNER}, got actual $botPermission for $bot in group $id" } -) = checkBotPermission(MemberPermission.ADMINISTRATOR, lazyMessage) \ No newline at end of file +): Unit = checkBotPermission(MemberPermission.ADMINISTRATOR, lazyMessage) \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/User.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/User.kt index 662e795f1..b049b62e8 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/User.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/User.kt @@ -32,21 +32,21 @@ import kotlin.jvm.JvmSynthetic * * 对于同一个 [Bot] 任何一个人的 [User] 实例都是单一的. */ -abstract class User : Contact(), CoroutineScope { +public abstract class User : Contact(), CoroutineScope { /** * QQ 号码 */ - abstract override val id: Long + public abstract override val id: Long /** * 昵称 */ - abstract val nick: String + public abstract val nick: String /** * 头像下载链接 */ - open val avatarUrl: String + public open val avatarUrl: String get() = "http://q1.qlogo.cn/g?b=qq&nk=$id&s=640" /** @@ -65,7 +65,7 @@ abstract class User : Contact(), CoroutineScope { * @return 消息回执. 可进行撤回 ([MessageReceipt.recall]) */ @JvmSynthetic - abstract override suspend fun sendMessage(message: Message): MessageReceipt + public abstract override suspend fun sendMessage(message: Message): MessageReceipt /** * @see sendMessage @@ -73,7 +73,7 @@ abstract class User : Contact(), CoroutineScope { @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "VIRTUAL_MEMBER_HIDDEN", "OVERRIDE_BY_INLINE") @kotlin.internal.InlineOnly @JvmSynthetic - suspend inline fun sendMessage(message: String): MessageReceipt { + public suspend inline fun sendMessage(message: String): MessageReceipt { return sendMessage(message.toMessage()) } @@ -89,7 +89,7 @@ abstract class User : Contact(), CoroutineScope { * @throws OverFileSizeMaxException 当图片文件过大而被服务器拒绝上传时. (最大大小约为 20 MB) */ @JvmSynthetic - abstract override suspend fun uploadImage(image: ExternalImage): Image + public abstract override suspend fun uploadImage(image: ExternalImage): Image - abstract override fun toString(): String + public abstract override fun toString(): String } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/FriendInfo.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/FriendInfo.kt index 2f27874b4..b81f1dc66 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/FriendInfo.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/FriendInfo.kt @@ -12,8 +12,8 @@ package net.mamoe.mirai.data import net.mamoe.mirai.LowLevelAPI @LowLevelAPI -interface FriendInfo { - val uin: Long +public interface FriendInfo { + public val uin: Long - val nick: String + public val nick: String } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupActiveData.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupActiveData.kt index d54e2cf98..51c65bb24 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupActiveData.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupActiveData.kt @@ -11,7 +11,7 @@ import net.mamoe.mirai.utils.MiraiExperimentalAPI */ @MiraiExperimentalAPI @Serializable -data class GroupActiveData( +public data class GroupActiveData( @SerialName("ec") val ec: Int? = null, @@ -29,7 +29,7 @@ data class GroupActiveData( val role: Int? = 0 ) { @Serializable - data class GInfo( + public data class GInfo( @SerialName("g_act_num") @@ -39,7 +39,7 @@ data class GroupActiveData( val createTime: Int? = 0, @SerialName("g_exit_num") - val exitNum: List? = null, //退群人数列表 + val exitNum: List? = null, //退群人数列表 @SerialName("g_join_num") val joinNum: List? = null, @@ -66,7 +66,7 @@ data class GroupActiveData( val isEnd: Int? = null ) { @Serializable - data class GActNum( + public data class GActNum( @SerialName("date") val date: String? = null, @@ -76,7 +76,7 @@ data class GroupActiveData( ) @Serializable - data class GExitNum( + public data class GExitNum( @SerialName("date") val date: String? = null, @@ -86,7 +86,7 @@ data class GroupActiveData( ) @Serializable - data class GJoinNum( + public data class GJoinNum( @SerialName("date") val date: String? = null, @@ -96,7 +96,7 @@ data class GroupActiveData( ) @Serializable - data class GMemNum( + public data class GMemNum( @SerialName("date") val date: String? = null, @@ -106,7 +106,7 @@ data class GroupActiveData( ) @Serializable - data class GMostAct( + public data class GMostAct( @SerialName("name") val name: String? = null, // 名称 不完整 @@ -122,7 +122,7 @@ data class GroupActiveData( ) @Serializable - data class GSentence( + public data class GSentence( @SerialName("date") val date: String? = null, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupAnnouncement.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupAnnouncement.kt index f67341f28..5aa32977d 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupAnnouncement.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupAnnouncement.kt @@ -13,7 +13,7 @@ import net.mamoe.mirai.utils.MiraiExperimentalAPI */ @MiraiExperimentalAPI @Serializable -data class GroupAnnouncementList( +public data class GroupAnnouncementList( val ec: Int, //状态码 0 是正常的 @SerialName("em") val msg: String, //信息 val feeds: List? = null, //群公告列表 @@ -22,7 +22,7 @@ data class GroupAnnouncementList( @MiraiExperimentalAPI @Serializable -data class GroupAnnouncement( +public data class GroupAnnouncement( @SerialName("u") val sender: Long = 0, val msg: GroupAnnouncementMsg, val settings: GroupAnnouncementSettings? = null, @@ -30,12 +30,12 @@ data class GroupAnnouncement( @SerialName("read_num") val readNum: Int = 0, @SerialName("is_read") val isRead: Int = 0, val pinned: Int = 0, - val fid:String? = null //公告的id + val fid: String? = null //公告的id ) @MiraiExperimentalAPI @Serializable -data class GroupAnnouncementMsg( +public data class GroupAnnouncementMsg( val text: String, val text_face: String? = null, val title: String? = null @@ -43,7 +43,7 @@ data class GroupAnnouncementMsg( @MiraiExperimentalAPI @Serializable -data class GroupAnnouncementSettings( +public data class GroupAnnouncementSettings( @SerialName("is_show_edit_card") val isShowEditCard: Int = 0, @SerialName("remind_ts") val remindTs: Int = 0, @SerialName("tip_window_type") val tipWindowType: Int = 0, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt index d5c394c33..1b5ab56e6 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt @@ -9,61 +9,61 @@ import net.mamoe.mirai.LowLevelAPI * 通过 [Bot._lowLevelQueryGroupInfo] 得到 */ @LowLevelAPI -interface GroupInfo { +public interface GroupInfo { /** * Uin */ - val uin: Long + public val uin: Long /** * 群号码 */ // 由 uin 计算得到 - val groupCode: Long + public val groupCode: Long /** * 名称 */ - val name: String // 不一定能获取到 + public val name: String // 不一定能获取到 /** * 群主 */ - val owner: Long // 不一定能获取到 + public val owner: Long // 不一定能获取到 /** * 入群公告 */ - val memo: String // 不一定能获取到 + public val memo: String // 不一定能获取到 /** * 允许群员邀请其他人加入群 */ - val allowMemberInvite: Boolean + public val allowMemberInvite: Boolean /** * 允许匿名聊天 */ - val allowAnonymousChat: Boolean + public val allowAnonymousChat: Boolean /** * 自动审批加群请求 */ - val autoApprove: Boolean + public val autoApprove: Boolean /** * 坦白说开启状态 */ - val confessTalk: Boolean + public val confessTalk: Boolean /** * 全员禁言 */ - val muteAll: Boolean + public val muteAll: Boolean /** * 机器人被禁言还剩时间, 秒. */ - val botMuteTimestamp: Int + public val botMuteTimestamp: Int /* /** diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/MemberInfo.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/MemberInfo.kt index 17211ac19..b30606573 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/MemberInfo.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/MemberInfo.kt @@ -13,12 +13,12 @@ import net.mamoe.mirai.LowLevelAPI import net.mamoe.mirai.contact.MemberPermission @LowLevelAPI -interface MemberInfo : FriendInfo { - val nameCard: String +public interface MemberInfo : FriendInfo { + public val nameCard: String - val permission: MemberPermission + public val permission: MemberPermission - val specialTitle: String + public val specialTitle: String - val muteTimestamp: Int + public val muteTimestamp: Int } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt index 86e3f2a8d..6e59d518b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt @@ -14,11 +14,12 @@ package net.mamoe.mirai.data /** * 在线状态 */ -enum class OnlineStatus(val id: Int) { +public enum class OnlineStatus(public val id: Int) { /** * 我在线上 */ ONLINE(11), + /** * 离线 */ @@ -38,14 +39,17 @@ enum class OnlineStatus(val id: Int) { * 忙碌 */ BUSY(50), + /** * Q 我吧 */ Q_ME(60), + /** * 请勿打扰 */ DND(70), + /** * 离线但接收消息 */ @@ -56,8 +60,8 @@ enum class OnlineStatus(val id: Int) { */ UNKNOWN(-1); - companion object { - fun ofId(id: Int): OnlineStatus = values().first { it.id == id } - fun ofIdOrNull(id: Int): OnlineStatus? = values().firstOrNull { it.id == id } + public companion object { + public fun ofId(id: Int): OnlineStatus = values().first { it.id == id } + public fun ofIdOrNull(id: Int): OnlineStatus? = values().firstOrNull { it.id == id } } } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt index 86dc610bc..0a99b9f55 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt @@ -44,7 +44,7 @@ import kotlin.jvm.Volatile * * @see CancellableEvent 可被取消的事件 */ -interface Event { +public interface Event { /** * 事件是否已被拦截. * @@ -52,7 +52,7 @@ interface Event { * * @see intercept 拦截事件 */ - val isIntercepted: Boolean + public val isIntercepted: Boolean /** * 拦截这个事件 @@ -64,7 +64,7 @@ interface Event { * @see Listener.EventPriority 查看优先级相关信息 */ @SinceMirai("1.0.0") - fun intercept() + public fun intercept() } /** @@ -72,11 +72,12 @@ interface Event { * * 在使用事件时应使用类型 [Event]. 在实现自定义事件时应继承 [AbstractEvent]. */ -abstract class AbstractEvent : Event { +public abstract class AbstractEvent : Event { /** 限制一个事件实例不能并行广播. (适用于 object 广播的情况) */ @JvmField internal val broadCastLock = Mutex() + @Suppress("PropertyName") @JvmField @Volatile internal var _intercepted = false @@ -89,13 +90,13 @@ abstract class AbstractEvent : Event { * @see Event.isIntercepted */ @SinceMirai("1.0.0") - override val isIntercepted: Boolean + public override val isIntercepted: Boolean get() = _intercepted /** * @see Event.intercept */ - override fun intercept() { + public override fun intercept() { _intercepted = true } @@ -103,12 +104,12 @@ abstract class AbstractEvent : Event { /** * @see CancellableEvent.isCancelled */ - val isCancelled: Boolean get() = _cancelled + public val isCancelled: Boolean get() = _cancelled /** * @see CancellableEvent.cancel */ - fun cancel() { + public fun cancel() { check(this is CancellableEvent) { "Event $this is not cancellable" } @@ -119,14 +120,14 @@ abstract class AbstractEvent : Event { /** * 可被取消的事件 */ -interface CancellableEvent : Event { +public interface CancellableEvent : Event { /** * 事件是否已被取消. * * 事件需实现 [CancellableEvent] 接口才可以被取消, * 否则此属性固定返回 false. */ - val isCancelled: Boolean + public val isCancelled: Boolean /** * 取消这个事件. @@ -134,7 +135,7 @@ interface CancellableEvent : Event { * * @throws IllegalStateException 当事件未实现接口 [CancellableEvent] 时抛出 */ - fun cancel() + public fun cancel() } /** @@ -146,7 +147,7 @@ interface CancellableEvent : Event { * @see __broadcastJava Java 使用 */ @JvmSynthetic -suspend fun E.broadcast(): E = apply { +public suspend fun E.broadcast(): E = apply { check(this is AbstractEvent) { "Events must extend AbstractEvent" } @@ -168,7 +169,7 @@ suspend fun E.broadcast(): E = apply { @Suppress("FunctionName") @JvmName("broadcast") @JavaFriendlyAPI -fun E.__broadcastJava(): E = apply { +public fun E.__broadcastJava(): E = apply { if (this is BroadcastControllable && !this.shouldBroadcast) { return@apply } @@ -180,16 +181,16 @@ fun E.__broadcastJava(): E = apply { * 所有的 `subscribe` 都能正常添加到监听器列表, 但所有的广播都会直接返回. */ @MiraiExperimentalAPI -var EventDisabled = false +public var EventDisabled: Boolean = false /** * 可控制是否需要广播这个事件 */ -interface BroadcastControllable : Event { +public interface BroadcastControllable : Event { /** * 返回 `false` 时将不会广播这个事件. */ - val shouldBroadcast: Boolean + public val shouldBroadcast: Boolean get() = true } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribersBuilder.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribersBuilder.kt index 410988e9d..978528db8 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribersBuilder.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribersBuilder.kt @@ -35,7 +35,7 @@ import kotlin.jvm.JvmSynthetic * 接受者 T 为 [MessageEvent] * 参数 String 为 转为字符串了的消息 ([Message.toString]) */ -typealias MessageListener = @MessageDsl suspend T.(String) -> R +public typealias MessageListener = @MessageDsl suspend T.(String) -> R /** @@ -48,7 +48,7 @@ typealias MessageListener = @MessageDsl suspend T.(String) -> R * @see subscribeFriendMessages */ @MessageDsl -open class MessageSubscribersBuilder( +public open class MessageSubscribersBuilder( /** * 用于 [MessageListener] 无返回值的替代. */ @@ -57,54 +57,54 @@ open class MessageSubscribersBuilder( /** * invoke 这个 lambda 时, 它将会把 [消息事件的处理器][MessageListener] 注册给事件, 并返回注册完成返回的监听器. */ - val subscriber: (M.(String) -> Boolean, MessageListener) -> Ret + public val subscriber: (M.(String) -> Boolean, MessageListener) -> Ret ) { @Suppress("DEPRECATION_ERROR") - open fun newListeningFilter(filter: M.(String) -> Boolean): ListeningFilter = ListeningFilter(filter) + public open fun newListeningFilter(filter: M.(String) -> Boolean): ListeningFilter = ListeningFilter(filter) /** * 由 [contains], [startsWith] 等 DSL 创建出的监听条件, 使用 [invoke] 将其注册给事件 */ - open inner class ListeningFilter @Deprecated( // keep it for development warning + public open inner class ListeningFilter @Deprecated( // keep it for development warning "use newListeningFilter instead", ReplaceWith("newListeningFilter(filter)"), level = DeprecationLevel.ERROR ) constructor( - val filter: M.(String) -> Boolean + public val filter: M.(String) -> Boolean ) { /** 进行逻辑 `or`. */ - infix fun or(another: ListeningFilter): ListeningFilter = + public infix fun or(another: ListeningFilter): ListeningFilter = newListeningFilter { filter.invoke(this, it) || another.filter.invoke(this, it) } /** 进行逻辑 `and`. */ - infix fun and(another: ListeningFilter): ListeningFilter = + public infix fun and(another: ListeningFilter): ListeningFilter = newListeningFilter { filter.invoke(this, it) && another.filter.invoke(this, it) } /** 进行逻辑 `xor`. */ - infix fun xor(another: ListeningFilter): ListeningFilter = + public infix fun xor(another: ListeningFilter): ListeningFilter = newListeningFilter { filter.invoke(this, it) xor another.filter.invoke(this, it) } /** 进行逻辑 `nand`, 即 `not and`. */ - infix fun nand(another: ListeningFilter): ListeningFilter = + public infix fun nand(another: ListeningFilter): ListeningFilter = newListeningFilter { !filter.invoke(this, it) || !another.filter.invoke(this, it) } /** 进行逻辑 `not` */ - fun not(): ListeningFilter = newListeningFilter { !filter.invoke(this, it) } + public fun not(): ListeningFilter = newListeningFilter { !filter.invoke(this, it) } /** 启动事件监听. */ // do not inline due to kotlin (1.3.61) bug: java.lang.IllegalAccessError - operator fun invoke(onEvent: MessageListener): Ret = content(filter, onEvent) + public operator fun invoke(onEvent: MessageListener): Ret = content(filter, onEvent) } /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时回复原消息 */ @MessageDsl - open infix fun ListeningFilter.reply(toReply: String): Ret = + public open infix fun ListeningFilter.reply(toReply: String): Ret = content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) reply(toReply);this@MessageSubscribersBuilder.stub } /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时回复原消息 */ @MessageDsl - open infix fun ListeningFilter.reply(message: Message): Ret = + public open infix fun ListeningFilter.reply(message: Message): Ret = content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) reply(message);this@MessageSubscribersBuilder.stub } /** @@ -112,7 +112,7 @@ open class MessageSubscribersBuilder( * 返回值 [Unit] 将被忽略, [Message] 将被直接回复, 其他内容将会 [Any.toString] 后发送. */ @MessageDsl - open infix fun ListeningFilter.reply( + public open infix fun ListeningFilter.reply( replier: (@MessageDsl suspend M.(String) -> Any?) ): Ret = content(filter) { @@ -123,12 +123,12 @@ open class MessageSubscribersBuilder( /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时引用回复原消息 */ @MessageDsl - open infix fun ListeningFilter.quoteReply(toReply: String): Ret = + public open infix fun ListeningFilter.quoteReply(toReply: String): Ret = content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) quoteReply(toReply); this@MessageSubscribersBuilder.stub } /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时引用回复原消息 */ @MessageDsl - open infix fun ListeningFilter.quoteReply(toReply: Message): Ret = + public open infix fun ListeningFilter.quoteReply(toReply: Message): Ret = content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) quoteReply(toReply);this@MessageSubscribersBuilder.stub } /** @@ -136,7 +136,7 @@ open class MessageSubscribersBuilder( * 返回值 [Unit] 将被忽略, [Message] 将被直接回复, 其他内容将会 [Any.toString] 后发送 */ @MessageDsl - open infix fun ListeningFilter.quoteReply(replier: (@MessageDsl suspend M.(String) -> Any?)): Ret = + public open infix fun ListeningFilter.quoteReply(replier: (@MessageDsl suspend M.(String) -> Any?)): Ret = content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) this@MessageSubscribersBuilder.executeAndQuoteReply(this, replier) @@ -145,28 +145,28 @@ open class MessageSubscribersBuilder( /** 无触发条件, 每次收到消息都执行 [onEvent] */ @MessageDsl - open fun always(onEvent: MessageListener): Ret = subscriber({ true }, onEvent) + public open fun always(onEvent: MessageListener): Ret = subscriber({ true }, onEvent) /** [消息内容][Message.contentToString] `==` [equals] */ @MessageDsl - fun case(equals: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter = + public fun case(equals: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter = caseImpl(equals, ignoreCase, trim) /** 如果[消息内容][Message.contentToString] `==` [equals] */ @MessageDsl - operator fun String.invoke(block: MessageListener): Ret = case(this, onEvent = block) + public operator fun String.invoke(block: MessageListener): Ret = case(this, onEvent = block) /** 如果[消息内容][Message.contentToString] [matches] */ @MessageDsl @JvmSynthetic @JvmName("matchingExtension") - infix fun Regex.matching(block: MessageListener): Ret = content({ it matches this@matching }, block) + public infix fun Regex.matching(block: MessageListener): Ret = content({ it matches this@matching }, block) /** 如果[消息内容][Message.contentToString] [Regex.find] 不为空 */ @MessageDsl @JvmSynthetic @JvmName("findingExtension") - infix fun Regex.finding(block: @MessageDsl suspend M.(MatchResult) -> R): Ret = + public infix fun Regex.finding(block: @MessageDsl suspend M.(MatchResult) -> R): Ret = always { content -> this@finding.find(content)?.let { block(this, it) } ?: this@MessageSubscribersBuilder.stub } /** @@ -175,7 +175,7 @@ open class MessageSubscribersBuilder( * @param ignoreCase `true` 则不区分大小写 */ @MessageDsl - fun case( + public fun case( equals: String, ignoreCase: Boolean = false, trim: Boolean = true, onEvent: MessageListener ): Ret = (if (trim) equals.trim() else equals).let { toCheck -> @@ -187,13 +187,14 @@ open class MessageSubscribersBuilder( /** [消息内容][Message.contentToString]包含 [sub] */ @MessageDsl @JvmOverloads // bin comp - fun contains(sub: String, ignoreCase: Boolean = false): ListeningFilter = content { it.contains(sub, ignoreCase) } + public fun contains(sub: String, ignoreCase: Boolean = false): ListeningFilter = + content { it.contains(sub, ignoreCase) } /** * [消息内容][Message.contentToString]包含 [sub] 中的任意一个元素 */ @MessageDsl - fun contains( + public fun contains( sub: String, ignoreCase: Boolean = false, trim: Boolean = true, onEvent: MessageListener ): Ret = containsImpl(sub, ignoreCase, trim, onEvent) @@ -201,26 +202,26 @@ open class MessageSubscribersBuilder( /** [消息内容][Message.contentToString]包含 [sub] */ @JvmOverloads @MessageDsl - fun containsAny(vararg sub: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter = + public fun containsAny(vararg sub: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter = containsAnyImpl(*sub, ignoreCase = ignoreCase, trim = trim) /** [消息内容][Message.contentToString]包含 [sub] */ @JvmOverloads @MessageDsl - fun containsAll(vararg sub: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter = + public fun containsAll(vararg sub: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter = containsAllImpl(sub, ignoreCase = ignoreCase, trim = trim) /** 如果消息的前缀是 [prefix] */ @MessageDsl - fun startsWith(prefix: String, trim: Boolean = true): ListeningFilter { + public fun startsWith(prefix: String, trim: Boolean = true): ListeningFilter { val toCheck = if (trim) prefix.trim() else prefix return content { (if (trim) it.trim() else it).startsWith(toCheck) } } /** 如果消息的前缀是 [prefix] */ @MessageDsl - fun startsWith( + public fun startsWith( prefix: String, removePrefix: Boolean = true, trim: Boolean = true, onEvent: @MessageDsl suspend M.(String) -> R ): Ret = startsWithImpl(prefix, removePrefix, trim, onEvent) @@ -228,100 +229,101 @@ open class MessageSubscribersBuilder( /** 如果消息的结尾是 [suffix] */ @MessageDsl @JvmOverloads // for binary compatibility - fun endsWith(suffix: String, trim: Boolean = true): ListeningFilter = + public fun endsWith(suffix: String, trim: Boolean = true): ListeningFilter = content { if (trim) it.trimEnd().endsWith(suffix) else it.endsWith(suffix) } /** 如果消息的结尾是 [suffix] */ @MessageDsl - fun endsWith( + public fun endsWith( suffix: String, removeSuffix: Boolean = true, trim: Boolean = true, onEvent: @MessageDsl suspend M.(String) -> R ): Ret = endsWithImpl(suffix, removeSuffix, trim, onEvent) /** 如果是这个人发的消息. 消息目前只会是群消息 */ @MessageDsl - fun sentBy(name: String): ListeningFilter = content { this is GroupMessageEvent && this.senderName == name } + public fun sentBy(name: String): ListeningFilter = content { this is GroupMessageEvent && this.senderName == name } /** 如果是这个人发的消息. 消息可以是好友消息也可以是群消息 */ @MessageDsl - fun sentBy(qq: Long): ListeningFilter = content { sender.id == qq } + public fun sentBy(qq: Long): ListeningFilter = content { sender.id == qq } /** 如果是这个人发的消息. 消息可以是好友消息也可以是群消息 */ @MessageDsl - fun sentBy(friend: User): ListeningFilter = content { sender.id == friend.id } + public fun sentBy(friend: User): ListeningFilter = content { sender.id == friend.id } /** 如果是这个人发的消息. 消息可以是好友消息也可以是群消息 */ @MessageDsl - fun sentBy(qq: Long, onEvent: MessageListener): Ret = content { this.sender.id == qq }.invoke(onEvent) + public fun sentBy(qq: Long, onEvent: MessageListener): Ret = content { this.sender.id == qq }.invoke(onEvent) /** 如果是好友发来的消息 */ @MessageDsl - fun sentByFriend(onEvent: MessageListener): Ret = + public fun sentByFriend(onEvent: MessageListener): Ret = content({ this is FriendMessageEvent }) { onEvent(this as FriendMessageEvent, it) } /** 如果是好友发来的消息 */ @MessageDsl - fun sentByFriend(): ListeningFilter = newListeningFilter { this is FriendMessageEvent } + public fun sentByFriend(): ListeningFilter = newListeningFilter { this is FriendMessageEvent } /** 如果是群临时会话消息 */ @MessageDsl - fun sentByTemp(): ListeningFilter = newListeningFilter { this is TempMessageEvent } + public fun sentByTemp(): ListeningFilter = newListeningFilter { this is TempMessageEvent } /** 如果是管理员或群主发的消息 */ @MessageDsl - fun sentByOperator(): ListeningFilter = content { this is GroupMessageEvent && sender.permission.isOperator() } + public fun sentByOperator(): ListeningFilter = + content { this is GroupMessageEvent && sender.permission.isOperator() } /** 如果是管理员发的消息 */ @MessageDsl - fun sentByAdministrator(): ListeningFilter = + public fun sentByAdministrator(): ListeningFilter = content { this is GroupMessageEvent && sender.permission.isAdministrator() } /** 如果是群主发的消息 */ @MessageDsl - fun sentByOwner(): ListeningFilter = content { this is GroupMessageEvent && sender.isOwner() } + public fun sentByOwner(): ListeningFilter = content { this is GroupMessageEvent && sender.isOwner() } /** 如果是来自这个群的消息 */ @MessageDsl - fun sentFrom(groupId: Long): ListeningFilter = content { this is GroupMessageEvent && group.id == groupId } + public fun sentFrom(groupId: Long): ListeningFilter = content { this is GroupMessageEvent && group.id == groupId } /** 如果是来自这个群的消息 */ @MessageDsl - fun sentFrom(group: Group): ListeningFilter = content { this is GroupMessageEvent && group.id == group.id } + public fun sentFrom(group: Group): ListeningFilter = content { this is GroupMessageEvent && group.id == group.id } /** [消息内容][Message.contentToString]包含目标为 [Bot] 的 [At] */ @MessageDsl - fun atBot(): ListeningFilter = content { message.firstIsInstanceOrNull()?.target == bot.id } + public fun atBot(): ListeningFilter = content { message.firstIsInstanceOrNull()?.target == bot.id } /** [消息内容][Message.contentToString]包含 [AtAll] */ @MessageDsl - fun atAll(): ListeningFilter = content { message.firstIsInstanceOrNull() != null } + public fun atAll(): ListeningFilter = content { message.firstIsInstanceOrNull() != null } /** [消息内容][Message.contentToString]包含目标为 [target] 的 [At] */ @MessageDsl - fun at(target: Long): ListeningFilter = content { message.firstIsInstanceOrNull()?.target == target } + public fun at(target: Long): ListeningFilter = content { message.firstIsInstanceOrNull()?.target == target } /** [消息内容][Message.contentToString]包含目标为 [target] 的 [At] */ @MessageDsl - fun at(target: User): ListeningFilter = content { message.firstIsInstanceOrNull()?.target == target.id } + public fun at(target: User): ListeningFilter = content { message.firstIsInstanceOrNull()?.target == target.id } /** [消息内容][Message.contentToString]包含目标为 [Bot] 的 [At], 就执行 [onEvent] */ @MessageDsl - fun atBot(onEvent: @MessageDsl suspend M.(String) -> R): Ret = + public fun atBot(onEvent: @MessageDsl suspend M.(String) -> R): Ret = content { message.firstIsInstanceOrNull()?.target == bot.id }.invoke { onEvent.invoke(this, message.contentToString()) } @MessageDsl - inline fun has(noinline onEvent: @MessageDsl suspend M.(N) -> R): Ret = + public inline fun has(noinline onEvent: @MessageDsl suspend M.(N) -> R): Ret = content { message.any { it is N } }.invoke { onEvent.invoke(this, message.firstIsInstance()) } /** [消息内容][Message.contentToString]包含 [N] 类型的 [Message] */ @MessageDsl - inline fun has(): ListeningFilter = content { message.any { it is N } } + public inline fun has(): ListeningFilter = content { message.any { it is N } } /** 如果 [mapper] 返回值非空, 就执行 [onEvent] */ @MessageDsl - open fun mapping(mapper: M.(String) -> N?, onEvent: @MessageDsl suspend M.(N) -> R): Ret = + public open fun mapping(mapper: M.(String) -> N?, onEvent: @MessageDsl suspend M.(N) -> R): Ret = always { onEvent.invoke( this, @@ -331,16 +333,16 @@ open class MessageSubscribersBuilder( /** 如果 [filter] 返回 `true` */ @MessageDsl - fun content(filter: M.(String) -> Boolean): ListeningFilter = newListeningFilter(filter) + public fun content(filter: M.(String) -> Boolean): ListeningFilter = newListeningFilter(filter) /** [消息内容][Message.contentToString]可由正则表达式匹配([Regex.matchEntire]) */ @MessageDsl - fun matching(regex: Regex): ListeningFilter = content { regex.matchEntire(it) != null } + public fun matching(regex: Regex): ListeningFilter = content { regex.matchEntire(it) != null } /** [消息内容][Message.contentToString]可由正则表达式匹配([Regex.matchEntire]), 就执行 `onEvent` */ @MessageDsl - fun matching(regex: Regex, onEvent: @MessageDsl suspend M.(MatchResult) -> Unit): Ret = + public fun matching(regex: Regex, onEvent: @MessageDsl suspend M.(MatchResult) -> Unit): Ret = always { this@MessageSubscribersBuilder.executeAndReply(this) { onEvent.invoke( @@ -352,11 +354,11 @@ open class MessageSubscribersBuilder( /** [消息内容][Message.contentToString]可由正则表达式查找([Regex.find]) */ @MessageDsl - fun finding(regex: Regex): ListeningFilter = content { regex.find(it) != null } + public fun finding(regex: Regex): ListeningFilter = content { regex.find(it) != null } /** [消息内容][Message.contentToString]可由正则表达式查找([Regex.find]), 就执行 `onEvent` */ @MessageDsl - fun finding(regex: Regex, onEvent: @MessageDsl suspend M.(MatchResult) -> Unit): Ret = + public fun finding(regex: Regex, onEvent: @MessageDsl suspend M.(MatchResult) -> Unit): Ret = always { this@MessageSubscribersBuilder.executeAndReply(this) { onEvent.invoke( @@ -369,7 +371,7 @@ open class MessageSubscribersBuilder( /** [消息内容][Message.contentToString]包含 [this] 则回复 [reply] */ @MessageDsl - open infix fun String.containsReply(reply: String): Ret = + public open infix fun String.containsReply(reply: String): Ret = content({ this@containsReply in it }, { reply(reply); this@MessageSubscribersBuilder.stub }) /** @@ -380,7 +382,7 @@ open class MessageSubscribersBuilder( * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复 */ @MessageDsl - open infix fun String.containsReply(replier: @MessageDsl suspend M.(String) -> Any?): Ret = + public open infix fun String.containsReply(replier: @MessageDsl suspend M.(String) -> Any?): Ret = content({ this@containsReply in it }, { this@MessageSubscribersBuilder.executeAndReply(this, replier) }) /** @@ -391,7 +393,7 @@ open class MessageSubscribersBuilder( * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复 */ @MessageDsl - open infix fun Regex.matchingReply(replier: @MessageDsl suspend M.(MatchResult) -> Any?): Ret = + public open infix fun Regex.matchingReply(replier: @MessageDsl suspend M.(MatchResult) -> Any?): Ret = always { this@MessageSubscribersBuilder.executeAndReply(this) { replier.invoke( @@ -409,7 +411,7 @@ open class MessageSubscribersBuilder( * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复 */ @MessageDsl - open infix fun Regex.findingReply(replier: @MessageDsl suspend M.(MatchResult) -> Any?): Ret = + public open infix fun Regex.findingReply(replier: @MessageDsl suspend M.(MatchResult) -> Any?): Ret = always { this@MessageSubscribersBuilder.executeAndReply(this) { replier.invoke( @@ -425,7 +427,7 @@ open class MessageSubscribersBuilder( * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复 */ @MessageDsl - open infix fun String.endsWithReply(replier: @MessageDsl suspend M.(String) -> Any?): Ret { + public open infix fun String.endsWithReply(replier: @MessageDsl suspend M.(String) -> Any?): Ret { val toCheck = this.trimEnd() return content({ it.trim().endsWith(toCheck) }, { this@MessageSubscribersBuilder.executeAndReply(this) { replier(this, it.trim().removeSuffix(toCheck)) } @@ -434,21 +436,21 @@ open class MessageSubscribersBuilder( /** 当发送的消息内容为 [this] 就回复 [reply] */ @MessageDsl - open infix fun String.reply(reply: String): Ret { + public open infix fun String.reply(reply: String): Ret { val toCheck = this.trim() return content({ it.trim() == toCheck }, { reply(reply);this@MessageSubscribersBuilder.stub }) } /** 当发送的消息内容为 [this] 就回复 [reply] */ @MessageDsl - open infix fun String.reply(reply: Message): Ret { + public open infix fun String.reply(reply: Message): Ret { val toCheck = this.trim() return content({ it.trim() == toCheck }, { reply(reply);this@MessageSubscribersBuilder.stub }) } /** 当发送的消息内容为 [this] 就执行并回复 [replier] 的返回值 */ @MessageDsl - open infix fun String.reply(replier: @MessageDsl suspend M.(String) -> Any?): Ret { + public open infix fun String.reply(replier: @MessageDsl suspend M.(String) -> Any?): Ret { val toCheck = this.trim() return content({ it.trim() == toCheck }, { @Suppress("DSL_SCOPE_VIOLATION_WARNING") @@ -465,14 +467,14 @@ open class MessageSubscribersBuilder( @Deprecated("use reply instead", ReplaceWith("this.reply(message)"), level = DeprecationLevel.ERROR) @JvmName("reply3") @MessageDsl - open infix fun ListeningFilter.`->`(toReply: String): Ret = this.reply(toReply) + public open infix fun ListeningFilter.`->`(toReply: String): Ret = this.reply(toReply) /** 启动这个监听器, 在满足条件时回复原消息 */ @PlannedRemoval("1.2.0") @Deprecated("use reply instead", ReplaceWith("this.reply(message)"), level = DeprecationLevel.ERROR) @JvmName("reply3") @MessageDsl - open infix fun ListeningFilter.`->`(message: Message): Ret = this.reply(message) + public open infix fun ListeningFilter.`->`(message: Message): Ret = this.reply(message) @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE", "UNCHECKED_CAST") // false positive internal suspend inline fun executeAndReply(m: M, replier: suspend M.(String) -> Any?): RR { @@ -501,4 +503,4 @@ open class MessageSubscribersBuilder( @Retention(AnnotationRetention.SOURCE) @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS, AnnotationTarget.TYPE) @DslMarker -annotation class MessageDsl +public annotation class MessageDsl diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/deprecated.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/deprecated.kt index b8aa8010f..5d42df472 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/deprecated.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/deprecated.kt @@ -55,7 +55,7 @@ import kotlin.jvm.JvmName level = DeprecationLevel.HIDDEN ) @kotlin.internal.LowPriorityInOverloadResolution -fun Bot.subscribeMessages( +public fun Bot.subscribeMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -80,7 +80,7 @@ fun Bot.subscribeMessages( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -fun Bot.subscribeGroupMessages( +public fun Bot.subscribeGroupMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -105,7 +105,7 @@ fun Bot.subscribeGroupMessages( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -fun Bot.subscribeFriendMessages( +public fun Bot.subscribeFriendMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -131,7 +131,7 @@ fun Bot.subscribeFriendMessages( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -fun Bot.subscribeTempMessages( +public fun Bot.subscribeTempMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -156,7 +156,7 @@ fun Bot.subscribeTempMessages( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -inline fun Bot.incoming( +public inline fun Bot.incoming( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -175,7 +175,7 @@ inline fun Bot.incoming( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun CoroutineScope.subscribeMessages( +public fun CoroutineScope.subscribeMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: MessagePacketSubscribersBuilder.() -> R @@ -184,7 +184,7 @@ fun CoroutineScope.subscribeMessages( @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @kotlin.internal.LowPriorityInOverloadResolution @PlannedRemoval("1.2.0") -fun CoroutineScope.subscribeGroupMessages( +public fun CoroutineScope.subscribeGroupMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: GroupMessageSubscribersBuilder.() -> R @@ -193,7 +193,7 @@ fun CoroutineScope.subscribeGroupMessages( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun CoroutineScope.subscribeFriendMessages( +public fun CoroutineScope.subscribeFriendMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: FriendMessageSubscribersBuilder.() -> R @@ -202,7 +202,7 @@ fun CoroutineScope.subscribeFriendMessages( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun CoroutineScope.subscribeTempMessages( +public fun CoroutineScope.subscribeTempMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: TempMessageSubscribersBuilder.() -> R @@ -211,7 +211,7 @@ fun CoroutineScope.subscribeTempMessages( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun Bot.subscribeMessages( +public fun Bot.subscribeMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: MessagePacketSubscribersBuilder.() -> R @@ -220,7 +220,7 @@ fun Bot.subscribeMessages( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun Bot.subscribeGroupMessages( +public fun Bot.subscribeGroupMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: GroupMessageSubscribersBuilder.() -> R @@ -229,7 +229,7 @@ fun Bot.subscribeGroupMessages( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun Bot.subscribeFriendMessages( +public fun Bot.subscribeFriendMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: FriendMessageSubscribersBuilder.() -> R @@ -238,7 +238,7 @@ fun Bot.subscribeFriendMessages( @kotlin.internal.LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @PlannedRemoval("1.2.0") -fun Bot.subscribeTempMessages( +public fun Bot.subscribeTempMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, listeners: TempMessageSubscribersBuilder.() -> R diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/EventCancelledException.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/EventCancelledException.kt index 5da43c39b..d307e8f99 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/EventCancelledException.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/EventCancelledException.kt @@ -1,9 +1,9 @@ package net.mamoe.mirai.event.events @Suppress("unused") -class EventCancelledException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?) : super(message, cause) - constructor(cause: Throwable?) : super(cause) +public class EventCancelledException : RuntimeException { + public constructor() : super() + public constructor(message: String?) : super(message) + public constructor(message: String?, cause: Throwable?) : super(message, cause) + public constructor(cause: Throwable?) : super(cause) } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/bot.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/bot.kt index ef61904d8..6e6093129 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/bot.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/bot.kt @@ -28,23 +28,32 @@ import kotlin.jvm.JvmName /** * [Bot] 登录完成, 好友列表, 群组列表初始化完成 */ -data class BotOnlineEvent internal constructor(override val bot: Bot) : BotActiveEvent, AbstractEvent() +public data class BotOnlineEvent internal constructor( + public override val bot: Bot +) : BotActiveEvent, AbstractEvent() /** * [Bot] 离线. */ -sealed class BotOfflineEvent : BotEvent, AbstractEvent() { +public sealed class BotOfflineEvent : BotEvent, AbstractEvent() { /** * 主动离线. 主动广播这个事件也可以让 [Bot] 关闭. */ - data class Active(override val bot: Bot, override val cause: Throwable?) : BotOfflineEvent(), BotActiveEvent, + public data class Active( + public override val bot: Bot, + public override val cause: Throwable? + ) : BotOfflineEvent(), BotActiveEvent, CauseAware /** * 被挤下线 */ - data class Force internal constructor(override val bot: Bot, val title: String, val message: String) : + public data class Force internal constructor( + public override val bot: Bot, + public val title: String, + public val message: String + ) : BotOfflineEvent(), Packet, BotPassiveEvent @@ -53,14 +62,20 @@ sealed class BotOfflineEvent : BotEvent, AbstractEvent() { */ @SinceMirai("1.1.0") @MiraiInternalAPI("This is very experimental and might be changed") - data class MsfOffline internal constructor(override val bot: Bot, override val cause: Throwable?) : + public data class MsfOffline internal constructor( + public override val bot: Bot, + public override val cause: Throwable? + ) : BotOfflineEvent(), Packet, BotPassiveEvent, CauseAware /** * 因网络问题而掉线 */ - data class Dropped internal constructor(override val bot: Bot, override val cause: Throwable?) : BotOfflineEvent(), + public data class Dropped internal constructor( + public override val bot: Bot, + public override val cause: Throwable? + ) : BotOfflineEvent(), Packet, BotPassiveEvent, CauseAware @@ -68,28 +83,31 @@ sealed class BotOfflineEvent : BotEvent, AbstractEvent() { * 服务器主动要求更换另一个服务器 */ @MiraiInternalAPI - data class RequireReconnect internal constructor(override val bot: Bot) : BotOfflineEvent(), Packet, BotPassiveEvent + public data class RequireReconnect internal constructor( + public override val bot: Bot + ) : BotOfflineEvent(), Packet, + BotPassiveEvent @MiraiExperimentalAPI - interface CauseAware { - val cause: Throwable? + public interface CauseAware { + public val cause: Throwable? } } /** * [Bot] 主动或被动重新登录. 在此事件广播前就已经登录完毕. */ -data class BotReloginEvent internal constructor( - override val bot: Bot, - val cause: Throwable? +public data class BotReloginEvent internal constructor( + public override val bot: Bot, + public val cause: Throwable? ) : BotEvent, BotActiveEvent, AbstractEvent() /** * [Bot] 头像被修改(通过其他客户端修改了头像). 在此事件广播前就已经修改完毕. * @see FriendAvatarChangedEvent */ -data class BotAvatarChangedEvent( - override val bot: Bot +public data class BotAvatarChangedEvent( + public override val bot: Bot ) : BotEvent, Packet, AbstractEvent() // region 图片 diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/friend.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/friend.kt index 312fdfb47..ba401a4f2 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/friend.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/friend.kt @@ -28,54 +28,54 @@ import kotlin.jvm.* /** * 好友昵称改变事件. 目前仅支持解析 (来自 PC 端的修改). */ -data class FriendRemarkChangeEvent internal constructor( - override val friend: Friend, - val newName: String +public data class FriendRemarkChangeEvent internal constructor( + public override val friend: Friend, + public val newName: String ) : FriendEvent, Packet, AbstractEvent() /** * 成功添加了一个新好友的事件 */ -data class FriendAddEvent internal constructor( +public data class FriendAddEvent internal constructor( /** * 新好友. 已经添加到 [Bot.friends] */ - override val friend: Friend + public override val friend: Friend ) : FriendEvent, Packet, AbstractEvent() /** * 好友已被删除的事件. */ -data class FriendDeleteEvent internal constructor( - override val friend: Friend +public data class FriendDeleteEvent internal constructor( + public override val friend: Friend ) : FriendEvent, Packet, AbstractEvent() /** * 一个账号请求添加机器人为好友的事件 */ @Suppress("DEPRECATION") -data class NewFriendRequestEvent internal constructor( - override val bot: Bot, +public data class NewFriendRequestEvent internal constructor( + public override val bot: Bot, /** * 事件唯一识别号 */ - val eventId: Long, + public val eventId: Long, /** * 申请好友消息 */ - val message: String, + public val message: String, /** * 请求人 [User.id] */ - val fromId: Long, + public val fromId: Long, /** * 来自群 [Group.id], 其他途径时为 0 */ - val fromGroupId: Long, + public val fromGroupId: Long, /** * 群名片或好友昵称 */ - val fromNick: String + public val fromNick: String ) : BotEvent, Packet, AbstractEvent() { @JvmField internal val responded: MiraiAtomicBoolean = MiraiAtomicBoolean(false) @@ -83,23 +83,23 @@ data class NewFriendRequestEvent internal constructor( /** * @return 申请人来自的群. 当申请人来自其他途径申请时为 `null` */ - val fromGroup: Group? = if (fromGroupId == 0L) null else bot.getGroup(fromGroupId) + public val fromGroup: Group? = if (fromGroupId == 0L) null else bot.getGroup(fromGroupId) @JvmSynthetic - suspend fun accept() = bot.acceptNewFriendRequest(this) + public suspend fun accept(): Unit = bot.acceptNewFriendRequest(this) @JvmSynthetic - suspend fun reject(blackList: Boolean = false) = bot.rejectNewFriendRequest(this, blackList) + public suspend fun reject(blackList: Boolean = false): Unit = bot.rejectNewFriendRequest(this, blackList) @JavaFriendlyAPI @JvmName("accept") - fun __acceptBlockingForJava__() = runBlocking { accept() } + public fun __acceptBlockingForJava__(): Unit = runBlocking { accept() } @JavaFriendlyAPI @JvmOverloads @JvmName("reject") - fun __rejectBlockingForJava__(blackList: Boolean = false) = + public fun __rejectBlockingForJava__(blackList: Boolean = false): Unit = runBlocking { reject(blackList) } } @@ -107,7 +107,7 @@ data class NewFriendRequestEvent internal constructor( /** * [Friend] 头像被修改. 在此事件广播前就已经修改完毕. */ -data class FriendAvatarChangedEvent internal constructor( - override val friend: Friend +public data class FriendAvatarChangedEvent internal constructor( + public override val friend: Friend ) : FriendEvent, Packet, AbstractEvent() diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/group.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/group.kt index bf648780e..0fdaaa3db 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/group.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/group.kt @@ -31,82 +31,85 @@ import kotlin.jvm.* /** * 机器人被踢出群或在其他客户端主动退出一个群. 在事件广播前 [Bot.groups] 就已删除这个群. */ -sealed class BotLeaveEvent : BotEvent, Packet, AbstractEvent() { - abstract val group: Group +public sealed class BotLeaveEvent : BotEvent, Packet, AbstractEvent() { + public abstract val group: Group /** * 机器人主动退出一个群. */ @MiraiExperimentalAPI("目前此事件类型不一定正确. 部分被踢出情况也会广播此事件.") - data class Active internal constructor(override val group: Group) : BotLeaveEvent() { - override fun toString(): String = "BotLeaveEvent.Active(group=${group.id})" + public data class Active internal constructor( + public override val group: Group + ) : BotLeaveEvent() { + public override fun toString(): String = "BotLeaveEvent.Active(group=${group.id})" } /** * 机器人被管理员或群主踢出群. */ @MiraiExperimentalAPI("BotLeaveEvent 的子类可能在将来改动. 使用 BotLeaveEvent 以保证兼容性.") - data class Kick internal constructor(override val operator: Member) : BotLeaveEvent(), GroupOperableEvent { - override val group: Group get() = operator.group - override val bot: Bot get() = super.bot - override fun toString(): String = "BotLeaveEvent.Kick(group=${group.id},operator=${operator.id})" + public data class Kick internal constructor( + public override val operator: Member + ) : BotLeaveEvent(), + GroupOperableEvent { + public override val group: Group get() = operator.group + public override val bot: Bot get() = super.bot + public override fun toString(): String = "BotLeaveEvent.Kick(group=${group.id},operator=${operator.id})" } - override val bot: Bot get() = group.bot + public override val bot: Bot get() = group.bot } /** * Bot 在群里的权限被改变. 操作人一定是群主 */ -data class BotGroupPermissionChangeEvent internal constructor( - override val group: Group, - val origin: MemberPermission, - val new: MemberPermission +public data class BotGroupPermissionChangeEvent internal constructor( + public override val group: Group, + public val origin: MemberPermission, + public val new: MemberPermission ) : BotPassiveEvent, GroupEvent, Packet, AbstractEvent() /** * Bot 被禁言 */ -data class BotMuteEvent internal constructor( - val durationSeconds: Int, +public data class BotMuteEvent internal constructor( + public val durationSeconds: Int, /** * 操作人. */ - val operator: Member + public val operator: Member ) : GroupEvent, Packet, BotPassiveEvent, AbstractEvent() { - override val group: Group + public override val group: Group get() = operator.group } /** * Bot 被取消禁言 */ -data class BotUnmuteEvent internal constructor( +public data class BotUnmuteEvent internal constructor( /** * 操作人. */ - val operator: Member + public val operator: Member ) : GroupEvent, Packet, BotPassiveEvent, AbstractEvent() { - override val group: Group + public override val group: Group get() = operator.group } /** * Bot 成功加入了一个新群 */ -sealed class BotJoinGroupEvent : GroupEvent, Packet, AbstractEvent() { - abstract override val group: Group +public sealed class BotJoinGroupEvent : GroupEvent, Packet, AbstractEvent() { + public abstract override val group: Group /** * 不确定. 可能是主动加入 */ @MiraiExperimentalAPI - data class Active internal constructor( - override val group: Group + public data class Active internal constructor( + public override val group: Group ) : BotPassiveEvent, GroupEvent, Packet, AbstractEvent() { - override fun toString(): String { - return "BotJoinGroupEvent.Active(group=$group)" - } + public override fun toString(): String = "BotJoinGroupEvent.Active(group=$group)" } /** @@ -115,15 +118,15 @@ sealed class BotJoinGroupEvent : GroupEvent, Packet, AbstractEvent() { * 此时服务器基于 Bot 的 QQ 设置自动同意了请求. */ @MiraiExperimentalAPI - data class Invite internal constructor( + public data class Invite internal constructor( /** * 邀请人 */ - val invitor: Member + public val invitor: Member ) : BotPassiveEvent, GroupEvent, Packet, AbstractEvent() { - override val group: Group get() = invitor.group + public override val group: Group get() = invitor.group - override fun toString(): String { + public override fun toString(): String { return "BotJoinGroupEvent.Invite(invitor=$invitor)" } } @@ -134,95 +137,95 @@ sealed class BotJoinGroupEvent : GroupEvent, Packet, AbstractEvent() { /** * 群设置改变. 此事件广播前修改就已经完成. */ -interface GroupSettingChangeEvent : GroupEvent, BotPassiveEvent, BroadcastControllable { - val origin: T - val new: T +public interface GroupSettingChangeEvent : GroupEvent, BotPassiveEvent, BroadcastControllable { + public val origin: T + public val new: T - override val shouldBroadcast: Boolean + public override val shouldBroadcast: Boolean get() = origin != new } /** * 群名改变. 此事件广播前修改就已经完成. */ -data class GroupNameChangeEvent internal constructor( - override val origin: String, - override val new: String, - override val group: Group, +public data class GroupNameChangeEvent internal constructor( + public override val origin: String, + public override val new: String, + public override val group: Group, /** * 操作人. 为 null 时则是机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupSettingChangeEvent, Packet, GroupOperableEvent, AbstractEvent() { @LowPriorityInOverloadResolution @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) - val isByBot: Boolean + internal val isByBot: Boolean get() = operator == null } /** * 入群公告改变. 此事件广播前修改就已经完成. */ -data class GroupEntranceAnnouncementChangeEvent internal constructor( - override val origin: String, - override val new: String, - override val group: Group, +public data class GroupEntranceAnnouncementChangeEvent internal constructor( + public override val origin: String, + public override val new: String, + public override val group: Group, /** * 操作人. 为 null 时则是机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupSettingChangeEvent, Packet, GroupOperableEvent, AbstractEvent() /** * 群 "全员禁言" 功能状态改变. 此事件广播前修改就已经完成. */ -data class GroupMuteAllEvent internal constructor( - override val origin: Boolean, - override val new: Boolean, - override val group: Group, +public data class GroupMuteAllEvent internal constructor( + public override val origin: Boolean, + public override val new: Boolean, + public override val group: Group, /** * 操作人. 为 null 时则是机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupSettingChangeEvent, Packet, GroupOperableEvent, AbstractEvent() /** * 群 "匿名聊天" 功能状态改变. 此事件广播前修改就已经完成. */ -data class GroupAllowAnonymousChatEvent internal constructor( - override val origin: Boolean, - override val new: Boolean, - override val group: Group, +public data class GroupAllowAnonymousChatEvent internal constructor( + public override val origin: Boolean, + public override val new: Boolean, + public override val group: Group, /** * 操作人. 为 null 时则是机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupSettingChangeEvent, Packet, GroupOperableEvent, AbstractEvent() /** * 群 "坦白说" 功能状态改变. 此事件广播前修改就已经完成. */ -data class GroupAllowConfessTalkEvent internal constructor( - override val origin: Boolean, - override val new: Boolean, - override val group: Group, - val isByBot: Boolean // 无法获取操作人 +public data class GroupAllowConfessTalkEvent internal constructor( + public override val origin: Boolean, + public override val new: Boolean, + public override val group: Group, + public val isByBot: Boolean // 无法获取操作人 ) : GroupSettingChangeEvent, Packet, AbstractEvent() /** * 群 "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成. */ -data class GroupAllowMemberInviteEvent internal constructor( - override val origin: Boolean, - override val new: Boolean, - override val group: Group, +public data class GroupAllowMemberInviteEvent internal constructor( + public override val origin: Boolean, + public override val new: Boolean, + public override val group: Group, /** * 操作人. 为 null 时则是机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupSettingChangeEvent, Packet, GroupOperableEvent, AbstractEvent() @@ -236,45 +239,53 @@ data class GroupAllowMemberInviteEvent internal constructor( /** * 成员已经加入群的事件 */ -sealed class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent, Packet, +public sealed class MemberJoinEvent( + public override val member: Member +) : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent() { /** * 被邀请加入群 */ - data class Invite internal constructor(override val member: Member) : MemberJoinEvent(member) { - override fun toString(): String = "MemberJoinEvent.Invite(member=${member.id})" + public data class Invite internal constructor( + public override val member: Member + ) : MemberJoinEvent(member) { + public override fun toString(): String = "MemberJoinEvent.Invite(member=${member.id})" } /** * 成员主动加入群 */ - data class Active internal constructor(override val member: Member) : MemberJoinEvent(member) { - override fun toString(): String = "MemberJoinEvent.Active(member=${member.id})" + public data class Active internal constructor( + public override val member: Member + ) : MemberJoinEvent(member) { + public override fun toString(): String = "MemberJoinEvent.Active(member=${member.id})" } } /** * 成员已经离开群的事件. 在事件广播前成员就已经从 [Group.members] 中删除 */ -sealed class MemberLeaveEvent : GroupMemberEvent, AbstractEvent() { +public sealed class MemberLeaveEvent : GroupMemberEvent, AbstractEvent() { /** * 成员被踢出群. 成员不可能是机器人自己. */ - data class Kick( - override val member: Member, + public data class Kick( + public override val member: Member, /** * 操作人. 为 null 则是机器人操作. */ - override val operator: Member? + public override val operator: Member? ) : MemberLeaveEvent(), Packet, GroupOperableEvent { - override fun toString(): String = "MemberLeaveEvent.Kick(member=${member.id}, operator=${operator?.id})" + public override fun toString(): String = "MemberLeaveEvent.Kick(member=${member.id}, operator=${operator?.id})" } /** * 成员主动离开 */ - data class Quit(override val member: Member) : MemberLeaveEvent(), Packet { - override fun toString(): String = "MemberLeaveEvent.Quit(member=${member.id})" + public data class Quit( + public override val member: Member + ) : MemberLeaveEvent(), Packet { + public override fun toString(): String = "MemberLeaveEvent.Quit(member=${member.id})" } } @@ -282,42 +293,42 @@ sealed class MemberLeaveEvent : GroupMemberEvent, AbstractEvent() { * [Bot] 被邀请加入一个群. */ @Suppress("DEPRECATION") -data class BotInvitedJoinGroupRequestEvent internal constructor( - override val bot: Bot, +public data class BotInvitedJoinGroupRequestEvent internal constructor( + public override val bot: Bot, /** * 事件唯一识别号 */ - val eventId: Long, + public val eventId: Long, /** * 邀请入群的账号的 id */ - val invitorId: Long, - val groupId: Long, - val groupName: String, + public val invitorId: Long, + public val groupId: Long, + public val groupName: String, /** * 邀请人昵称 */ - val invitorNick: String + public val invitorNick: String ) : BotEvent, Packet, AbstractEvent() { - val invitor: Friend get() = this.bot.getFriend(invitorId) + public val invitor: Friend get() = this.bot.getFriend(invitorId) @JvmField internal val responded: MiraiAtomicBoolean = MiraiAtomicBoolean(false) @JvmSynthetic - suspend fun accept() = bot.acceptInvitedJoinGroupRequest(this) + public suspend fun accept(): Unit = bot.acceptInvitedJoinGroupRequest(this) @JvmSynthetic - suspend fun ignore() = bot.ignoreInvitedJoinGroupRequest(this) + public suspend fun ignore(): Unit = bot.ignoreInvitedJoinGroupRequest(this) @JavaFriendlyAPI @JvmName("accept") - fun __acceptBlockingForJava__() = + public fun __acceptBlockingForJava__(): Unit = runBlocking { bot.acceptInvitedJoinGroupRequest(this@BotInvitedJoinGroupRequestEvent) } @JavaFriendlyAPI @JvmName("ignore") - fun __ignoreBlockingForJava__() = + public fun __ignoreBlockingForJava__(): Unit = runBlocking { bot.ignoreInvitedJoinGroupRequest(this@BotInvitedJoinGroupRequestEvent) } } @@ -325,7 +336,7 @@ data class BotInvitedJoinGroupRequestEvent internal constructor( * 一个账号请求加入群事件, [Bot] 在此群中是管理员或群主. */ @Suppress("DEPRECATION") -data class MemberJoinRequestEvent internal constructor( +public data class MemberJoinRequestEvent internal constructor( override val bot: Bot, /** * 事件唯一识别号 @@ -346,37 +357,38 @@ data class MemberJoinRequestEvent internal constructor( */ val fromNick: String ) : BotEvent, Packet, AbstractEvent() { - val group: Group get() = this.bot.getGroup(groupId) + public val group: Group get() = this.bot.getGroup(groupId) @JvmField internal val responded: MiraiAtomicBoolean = MiraiAtomicBoolean(false) @JvmSynthetic - suspend fun accept() = bot.acceptMemberJoinRequest(this) + public suspend fun accept(): Unit = bot.acceptMemberJoinRequest(this) @JvmSynthetic @JvmOverloads - suspend fun reject(blackList: Boolean = false, message: String = "") = + public suspend fun reject(blackList: Boolean = false, message: String = ""): Unit = bot.rejectMemberJoinRequest(this, blackList, message) @JvmSynthetic - suspend fun ignore(blackList: Boolean = false) = bot.ignoreMemberJoinRequest(this, blackList) + public suspend fun ignore(blackList: Boolean = false): Unit = bot.ignoreMemberJoinRequest(this, blackList) @JavaFriendlyAPI @JvmName("accept") - fun __acceptBlockingForJava__() = runBlocking { bot.acceptMemberJoinRequest(this@MemberJoinRequestEvent) } + public fun __acceptBlockingForJava__(): Unit = + runBlocking { bot.acceptMemberJoinRequest(this@MemberJoinRequestEvent) } @JavaFriendlyAPI @JvmOverloads @JvmName("reject") - fun __rejectBlockingForJava__(blackList: Boolean = false, message: String = "") = + public fun __rejectBlockingForJava__(blackList: Boolean = false, message: String = ""): Unit = runBlocking { bot.rejectMemberJoinRequest(this@MemberJoinRequestEvent, blackList, message) } @JavaFriendlyAPI @JvmOverloads @JvmName("ignore") - fun __ignoreBlockingForJava__(blackList: Boolean = false) = + public fun __ignoreBlockingForJava__(blackList: Boolean = false): Unit = runBlocking { bot.ignoreMemberJoinRequest(this@MemberJoinRequestEvent, blackList) } } @@ -389,42 +401,42 @@ data class MemberJoinRequestEvent internal constructor( * * 由于服务器并不会告知名片变动, 此事件只能由 mirai 在发现变动时才广播. 不要依赖于这个事件. */ -data class MemberCardChangeEvent internal constructor( +public data class MemberCardChangeEvent internal constructor( /** * 修改前 */ - val origin: String, + public val origin: String, /** * 修改后 */ - val new: String, + public val new: String, - override val member: Member + public override val member: Member ) : GroupMemberEvent, Packet, AbstractEvent() /** * 成员群头衔改动. 一定为群主操作 */ -data class MemberSpecialTitleChangeEvent internal constructor( +public data class MemberSpecialTitleChangeEvent internal constructor( /** * 修改前 */ - val origin: String, + public val origin: String, /** * 修改后 */ - val new: String, + public val new: String, - override val member: Member, + public override val member: Member, /** * 操作人. * 不为 null 时一定为群主. 可能与 [member] 引用相同, 此时为群员自己修改. * 为 null 时则是机器人操作. */ - override val operator: Member? + public override val operator: Member? ) : GroupMemberEvent, GroupOperableEvent, AbstractEvent() // endregion @@ -435,10 +447,10 @@ data class MemberSpecialTitleChangeEvent internal constructor( /** * 成员权限改变的事件. 成员不可能是机器人自己. */ -data class MemberPermissionChangeEvent internal constructor( - override val member: Member, - val origin: MemberPermission, - val new: MemberPermission +public data class MemberPermissionChangeEvent internal constructor( + public override val member: Member, + public val origin: MemberPermission, + public val new: MemberPermission ) : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent() // endregion @@ -451,13 +463,13 @@ data class MemberPermissionChangeEvent internal constructor( * * @see BotMuteEvent 机器人被禁言的事件 */ -data class MemberMuteEvent internal constructor( - override val member: Member, - val durationSeconds: Int, +public data class MemberMuteEvent internal constructor( + public override val member: Member, + public val durationSeconds: Int, /** * 操作人. 为 null 则为机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupMemberEvent, Packet, GroupOperableEvent, AbstractEvent() /** @@ -465,12 +477,12 @@ data class MemberMuteEvent internal constructor( * * @see BotUnmuteEvent 机器人被取消禁言的事件 */ -data class MemberUnmuteEvent internal constructor( - override val member: Member, +public data class MemberUnmuteEvent internal constructor( + public override val member: Member, /** * 操作人. 为 null 则为机器人操作 */ - override val operator: Member? + public override val operator: Member? ) : GroupMemberEvent, Packet, GroupOperableEvent, AbstractEvent() // endregion diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/message.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/message.kt index f6abeece4..517d13031 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/message.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/message.kt @@ -49,13 +49,13 @@ import kotlin.jvm.JvmSynthetic * @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径 */ @SinceMirai("1.1.0") -sealed class MessagePreSendEvent : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent { +public sealed class MessagePreSendEvent : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent { /** 发信目标. */ - abstract val target: Contact - final override val bot: Bot get() = target.bot + public abstract val target: Contact + public final override val bot: Bot get() = target.bot /** 待发送的消息. 修改后将会同时应用于发送. */ - abstract var message: Message + public abstract var message: Message } /** @@ -63,11 +63,11 @@ sealed class MessagePreSendEvent : BotEvent, BotActiveEvent, AbstractEvent(), Ca * @see MessagePreSendEvent */ @SinceMirai("1.1.0") -data class GroupMessagePreSendEvent internal constructor( +public data class GroupMessagePreSendEvent internal constructor( /** 发信目标. */ - override val target: Group, + public override val target: Group, /** 待发送的消息. 修改后将会同时应用于发送. */ - override var message: Message + public override var message: Message ) : MessagePreSendEvent() /** @@ -75,9 +75,9 @@ data class GroupMessagePreSendEvent internal constructor( * @see MessagePreSendEvent */ @SinceMirai("1.1.0") -sealed class UserMessagePreSendEvent : MessagePreSendEvent() { +public sealed class UserMessagePreSendEvent : MessagePreSendEvent() { /** 发信目标. */ - abstract override val target: User + public abstract override val target: User } /** @@ -85,11 +85,11 @@ sealed class UserMessagePreSendEvent : MessagePreSendEvent() { * @see MessagePreSendEvent */ @SinceMirai("1.1.0") -data class FriendMessagePreSendEvent internal constructor( +public data class FriendMessagePreSendEvent internal constructor( /** 发信目标. */ - override val target: Friend, + public override val target: Friend, /** 待发送的消息. 修改后将会同时应用于发送. */ - override var message: Message + public override var message: Message ) : UserMessagePreSendEvent() /** @@ -97,13 +97,13 @@ data class FriendMessagePreSendEvent internal constructor( * @see MessagePreSendEvent */ @SinceMirai("1.1.0") -data class TempMessagePreSendEvent internal constructor( +public data class TempMessagePreSendEvent internal constructor( /** 发信目标. */ - override val target: Member, + public override val target: Member, /** 待发送的消息. 修改后将会同时应用于发送. */ - override var message: Message + public override var message: Message ) : UserMessagePreSendEvent() { - val group get() = target.group + public val group: Group get() = target.group } @@ -122,25 +122,25 @@ data class TempMessagePreSendEvent internal constructor( * @see MessagePreSendEvent */ @SinceMirai("1.1.0") -sealed class MessagePostSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { +public sealed class MessagePostSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { /** 发信目标. */ - abstract val target: C - final override val bot: Bot get() = target.bot + public abstract val target: C + public final override val bot: Bot get() = target.bot /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */ - abstract val message: MessageChain + public abstract val message: MessageChain /** * 发送消息时抛出的异常. `null` 表示消息成功发送. * @see result */ - abstract val exception: Throwable? + public abstract val exception: Throwable? /** * 发送消息成功时的回执. `null` 表示消息发送失败. * @see result */ - abstract val receipt: MessageReceipt? + public abstract val receipt: MessageReceipt? } /** @@ -149,7 +149,7 @@ sealed class MessagePostSendEvent : BotEvent, BotActiveEvent, Abstr */ @get:JvmSynthetic @SinceMirai("1.1.0") -inline val MessagePostSendEvent<*>.source: MessageSource? +public inline val MessagePostSendEvent<*>.source: MessageSource? get() = receipt?.source /** @@ -158,7 +158,7 @@ inline val MessagePostSendEvent<*>.source: MessageSource? */ @get:JvmSynthetic @SinceMirai("1.1.0") -inline val MessagePostSendEvent<*>.sourceResult: Result +public inline val MessagePostSendEvent<*>.sourceResult: Result get() = result.map { it.source } /** @@ -168,7 +168,7 @@ inline val MessagePostSendEvent<*>.sourceResult: Result */ @get:JvmSynthetic @SinceMirai("1.1.0") -inline val MessagePostSendEvent<*>.isSuccess: Boolean +public inline val MessagePostSendEvent<*>.isSuccess: Boolean get() = exception == null /** @@ -178,7 +178,7 @@ inline val MessagePostSendEvent<*>.isSuccess: Boolean */ @get:JvmSynthetic @SinceMirai("1.1.0") -inline val MessagePostSendEvent<*>.isFailure: Boolean +public inline val MessagePostSendEvent<*>.isFailure: Boolean get() = exception != null /** @@ -186,7 +186,7 @@ inline val MessagePostSendEvent<*>.isFailure: Boolean */ @InlineOnly @SinceMirai("1.1.0") -inline val MessagePostSendEvent.result: Result> +public inline val MessagePostSendEvent.result: Result> get() = exception.let { exception -> if (exception != null) Result.failure(exception) else Result.success(receipt!!) } /** @@ -194,21 +194,21 @@ inline val MessagePostSendEvent.result: Result? + public override val receipt: MessageReceipt? ) : MessagePostSendEvent() /** @@ -216,28 +216,28 @@ data class GroupMessagePostSendEvent internal constructor( * @see MessagePostSendEvent */ @SinceMirai("1.1.0") -sealed class UserMessagePostSendEvent : MessagePostSendEvent() +public sealed class UserMessagePostSendEvent : MessagePostSendEvent() /** * 在好友消息发送后广播的事件. * @see MessagePostSendEvent */ @SinceMirai("1.1.0") -data class FriendMessagePostSendEvent internal constructor( +public data class FriendMessagePostSendEvent internal constructor( /** 发信目标. */ - override val target: Friend, + public override val target: Friend, /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */ - override val message: MessageChain, + public override val message: MessageChain, /** * 发送消息时抛出的异常. `null` 表示消息成功发送. * @see result */ - override val exception: Throwable?, + public override val exception: Throwable?, /** * 发送消息成功时的回执. `null` 表示消息发送失败. * @see result */ - override val receipt: MessageReceipt? + public override val receipt: MessageReceipt? ) : UserMessagePostSendEvent() /** @@ -245,23 +245,23 @@ data class FriendMessagePostSendEvent internal constructor( * @see MessagePostSendEvent */ @SinceMirai("1.1.0") -data class TempMessagePostSendEvent internal constructor( +public data class TempMessagePostSendEvent internal constructor( /** 发信目标. */ - override val target: Member, + public override val target: Member, /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */ - override val message: MessageChain, + public override val message: MessageChain, /** * 发送消息时抛出的异常. `null` 表示消息成功发送. * @see result */ - override val exception: Throwable?, + public override val exception: Throwable?, /** * 发送消息成功时的回执. `null` 表示消息发送失败. * @see result */ - override val receipt: MessageReceipt? + public override val receipt: MessageReceipt? ) : UserMessagePostSendEvent() { - val group get() = target.group + public val group: Group get() = target.group } // endregion @@ -271,71 +271,71 @@ data class TempMessagePostSendEvent internal constructor( * * @see Contact.recall 撤回消息. 为广播这个事件的唯一途径 */ -sealed class MessageRecallEvent : BotEvent, AbstractEvent() { +public sealed class MessageRecallEvent : BotEvent, AbstractEvent() { /** * 消息原发送人 */ - abstract val authorId: Long + public abstract val authorId: Long /** * 消息 id. * @see MessageSource.id */ - abstract val messageId: Int + public abstract val messageId: Int /** * 消息内部 id. * @see MessageSource.id */ - abstract val messageInternalId: Int + public abstract val messageInternalId: Int /** * 原发送时间 */ - abstract val messageTime: Int // seconds + public abstract val messageTime: Int // seconds /** * 好友消息撤回事件, 暂不支持. */ - data class FriendRecall internal constructor( - override val bot: Bot, - override val messageId: Int, - override val messageInternalId: Int, - override val messageTime: Int, + public data class FriendRecall internal constructor( + public override val bot: Bot, + public override val messageId: Int, + public override val messageInternalId: Int, + public override val messageTime: Int, /** * 撤回操作人, 好友的 [User.id] */ - val operator: Long + public val operator: Long ) : MessageRecallEvent(), Packet { - override val authorId: Long + public override val authorId: Long get() = bot.id } /** * 群消息撤回事件. */ - data class GroupRecall internal constructor( - override val bot: Bot, - override val authorId: Long, - override val messageId: Int, - override val messageInternalId: Int, - override val messageTime: Int, + public data class GroupRecall internal constructor( + public override val bot: Bot, + public override val authorId: Long, + public override val messageId: Int, + public override val messageInternalId: Int, + public override val messageTime: Int, /** * 操作人. 为 null 时则为 [Bot] 操作. */ - override val operator: Member?, - override val group: Group + public override val operator: Member?, + public override val group: Group ) : MessageRecallEvent(), GroupOperableEvent, Packet } -val MessageRecallEvent.GroupRecall.author: Member +public val MessageRecallEvent.GroupRecall.author: Member get() = if (authorId == bot.id) group.botAsMember else group[authorId] -val MessageRecallEvent.FriendRecall.isByBot: Boolean get() = this.operator == bot.id +public val MessageRecallEvent.FriendRecall.isByBot: Boolean get() = this.operator == bot.id // val MessageRecallEvent.GroupRecall.isByBot: Boolean get() = (this as GroupOperableEvent).isByBot // no need -val MessageRecallEvent.isByBot: Boolean +public val MessageRecallEvent.isByBot: Boolean get() = when (this) { is MessageRecallEvent.FriendRecall -> this.isByBot is MessageRecallEvent.GroupRecall -> (this as GroupOperableEvent).isByBot @@ -350,11 +350,11 @@ val MessageRecallEvent.isByBot: Boolean * * @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径 */ -data class BeforeImageUploadEvent internal constructor( - val target: Contact, - val source: ExternalImage +public data class BeforeImageUploadEvent internal constructor( + public val target: Contact, + public val source: ExternalImage ) : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent { - override val bot: Bot + public override val bot: Bot get() = target.bot } @@ -369,19 +369,19 @@ data class BeforeImageUploadEvent internal constructor( * @see Succeed * @see Failed */ -sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent() { - abstract val target: Contact - abstract val source: ExternalImage - override val bot: Bot +public sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent() { + public abstract val target: Contact + public abstract val source: ExternalImage + public override val bot: Bot get() = target.bot - data class Succeed internal constructor( + public data class Succeed internal constructor( override val target: Contact, override val source: ExternalImage, val image: Image ) : ImageUploadEvent() - data class Failed internal constructor( + public data class Failed internal constructor( override val target: Contact, override val source: ExternalImage, val errno: Int, @@ -406,9 +406,9 @@ sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent() { replaceWith = ReplaceWith("MessagePreSendEvent", "net.mamoe.mirai.event.events.MessagePreSendEvent"), level = DeprecationLevel.WARNING ) -sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { - abstract val target: Contact - final override val bot: Bot +public sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { + public abstract val target: Contact + public final override val bot: Bot get() = target.bot @Deprecated( @@ -418,7 +418,7 @@ sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { replaceWith = ReplaceWith("GroupMessagePreSendEvent", "net.mamoe.mirai.event.events.GroupMessagePreSendEvent"), level = DeprecationLevel.WARNING ) - data class GroupMessageSendEvent internal constructor( + public data class GroupMessageSendEvent internal constructor( override val target: Group, var message: MessageChain ) : MessageSendEvent(), CancellableEvent @@ -433,7 +433,7 @@ sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { ), level = DeprecationLevel.WARNING ) - data class FriendMessageSendEvent internal constructor( + public data class FriendMessageSendEvent internal constructor( override val target: Friend, var message: MessageChain ) : MessageSendEvent(), CancellableEvent @@ -445,7 +445,7 @@ sealed class MessageSendEvent : BotEvent, BotActiveEvent, AbstractEvent() { replaceWith = ReplaceWith("TempMessagePreSendEvent", "net.mamoe.mirai.event.events.TempMessagePreSendEvent"), level = DeprecationLevel.WARNING ) - data class TempMessageSendEvent internal constructor( + public data class TempMessageSendEvent internal constructor( override val target: Member, var message: MessageChain ) : MessageSendEvent(), CancellableEvent diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/types.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/types.kt index 552a12252..411410f92 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/types.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/types.kt @@ -22,26 +22,26 @@ import kotlin.jvm.JvmSynthetic /** * 有关一个 [Bot] 的事件 */ -interface BotEvent : Event { - val bot: Bot +public interface BotEvent : Event { + public val bot: Bot } /** * [Bot] 被动接收的事件. 这些事件可能与机器人有关 */ -interface BotPassiveEvent : BotEvent +public interface BotPassiveEvent : BotEvent /** * 由 [Bot] 主动发起的动作的事件 */ -interface BotActiveEvent : BotEvent +public interface BotActiveEvent : BotEvent /** * 有关群的事件 */ -interface GroupEvent : BotEvent { - val group: Group +public interface GroupEvent : BotEvent { + public val group: Group override val bot: Bot get() = group.bot } @@ -49,8 +49,8 @@ interface GroupEvent : BotEvent { /** * 有关群成员的事件 */ -interface GroupMemberEvent : GroupEvent { - val member: Member +public interface GroupMemberEvent : GroupEvent { + public val member: Member override val group: Group get() = member.group } @@ -60,11 +60,11 @@ interface GroupMemberEvent : GroupEvent { * @see isByBot * @see operatorOrBot */ -interface GroupOperableEvent : GroupEvent { +public interface GroupOperableEvent : GroupEvent { /** * 操作人, 为 `null` 时为 [Bot] 操作 */ - val operator: Member? + public val operator: Member? } /** @@ -72,7 +72,7 @@ interface GroupOperableEvent : GroupEvent { */ @HidesMembers @get:JvmSynthetic // inline: planning to change to another file (1.2.0) -inline val GroupOperableEvent.isByBot: Boolean +public inline val GroupOperableEvent.isByBot: Boolean get() = operator == null /** @@ -80,14 +80,14 @@ inline val GroupOperableEvent.isByBot: Boolean * 当操作人为 [Bot] 时获取 [Group.botAsMember] */ @get:JvmSynthetic // inline: planning to change to another file (1.2.0) -inline val GroupOperableEvent.operatorOrBot: Member +public inline val GroupOperableEvent.operatorOrBot: Member get() = this.operator ?: this.group.botAsMember /** * 有关好友的事件 */ -interface FriendEvent : BotEvent { - val friend: Friend +public interface FriendEvent : BotEvent { + public val friend: Friend final override val bot: Bot get() = friend.bot } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/linear.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/linear.kt index 738fbf0bb..70fc69863 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/linear.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/linear.kt @@ -33,7 +33,7 @@ import kotlin.reflect.KClass * @throws Throwable 当 [mapper] 抛出任何异常时, 本函数会抛出该异常 */ @JvmSynthetic -suspend inline fun syncFromEvent( +public suspend inline fun syncFromEvent( timeoutMillis: Long = -1, priority: Listener.EventPriority = EventPriority.MONITOR, crossinline mapper: suspend E.(E) -> R? @@ -66,7 +66,7 @@ suspend inline fun syncFromEvent( * @throws Throwable 当 [mapper] 抛出任何异常时, 本函数会抛出该异常 */ @JvmSynthetic -suspend inline fun syncFromEventOrNull( +public suspend inline fun syncFromEventOrNull( timeoutMillis: Long, priority: Listener.EventPriority = EventPriority.MONITOR, crossinline mapper: suspend E.(E) -> R? @@ -94,7 +94,7 @@ suspend inline fun syncFromEventOrNull( */ @JvmSynthetic @Suppress("DeferredIsResult") -inline fun CoroutineScope.asyncFromEventOrNull( +public inline fun CoroutineScope.asyncFromEventOrNull( timeoutMillis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -123,7 +123,7 @@ inline fun CoroutineScope.asyncFromEventOrNull( */ @JvmSynthetic @Suppress("DeferredIsResult") -inline fun CoroutineScope.asyncFromEvent( +public inline fun CoroutineScope.asyncFromEvent( timeoutMillis: Long = -1, coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = EventPriority.MONITOR, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/nextEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/nextEvent.kt index 70f230577..9246d14b7 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/nextEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/nextEvent.kt @@ -31,7 +31,7 @@ import kotlin.reflect.KClass * @throws TimeoutCancellationException 在超时后抛出. */ @JvmSynthetic -suspend inline fun nextEvent( +public suspend inline fun nextEvent( timeoutMillis: Long = -1, priority: Listener.EventPriority = EventPriority.MONITOR ): E { @@ -53,7 +53,7 @@ suspend inline fun nextEvent( * @return 事件实例, 在超时后返回 `null` */ @JvmSynthetic -suspend inline fun nextEventOrNull( +public suspend inline fun nextEventOrNull( timeoutMillis: Long, priority: Listener.EventPriority = EventPriority.MONITOR ): E? { @@ -77,7 +77,7 @@ suspend inline fun nextEventOrNull( level = DeprecationLevel.HIDDEN ) @JvmSynthetic -suspend inline fun Bot.nextEvent( +public suspend inline fun Bot.nextEvent( timeoutMillis: Long = -1, priority: Listener.EventPriority = EventPriority.MONITOR ): E { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/select.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/select.kt index dce4720f7..83bcceaab 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/select.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/select.kt @@ -58,24 +58,24 @@ import kotlin.jvm.JvmSynthetic * @see nextMessage 挂起协程并等待下一条消息 */ @Suppress("unused") -suspend inline fun T.whileSelectMessages( +public suspend inline fun T.whileSelectMessages( timeoutMillis: Long = -1, filterContext: Boolean = true, priority: Listener.EventPriority = EventPriority.MONITOR, crossinline selectBuilder: @MessageDsl MessageSelectBuilder.() -> Unit -) = whileSelectMessagesImpl(timeoutMillis, filterContext, priority, selectBuilder) +): Unit = whileSelectMessagesImpl(timeoutMillis, filterContext, priority, selectBuilder) /** * [selectMessages] 的 [Unit] 返回值捷径 (由于 Kotlin 无法推断 [Unit] 类型) */ @MiraiExperimentalAPI @JvmName("selectMessages1") -suspend inline fun T.selectMessagesUnit( +public suspend inline fun T.selectMessagesUnit( timeoutMillis: Long = -1, filterContext: Boolean = true, priority: Listener.EventPriority = EventPriority.MONITOR, crossinline selectBuilder: @MessageDsl MessageSelectBuilderUnit.() -> Unit -) = selectMessagesImpl(timeoutMillis, true, filterContext, priority, selectBuilder) +): Unit = selectMessagesImpl(timeoutMillis, true, filterContext, priority, selectBuilder) /** @@ -100,17 +100,19 @@ suspend inline fun T.selectMessagesUnit( */ @Suppress("unused") // false positive // @BuilderInference // https://youtrack.jetbrains.com/issue/KT-37716 -suspend inline fun T.selectMessages( +public suspend inline fun T.selectMessages( timeoutMillis: Long = -1, filterContext: Boolean = true, priority: Listener.EventPriority = EventPriority.MONITOR, // @BuilderInference crossinline selectBuilder: @MessageDsl MessageSelectBuilder.() -> Unit ): R = - selectMessagesImpl(timeoutMillis, + selectMessagesImpl( + timeoutMillis, false, filterContext, - priority) { selectBuilder.invoke(this as MessageSelectBuilder) } + priority + ) { selectBuilder.invoke(this as MessageSelectBuilder) } /** * [selectMessages] 时的 DSL 构建器. @@ -120,7 +122,7 @@ suspend inline fun T.selectMessages( * @see MessageSelectBuilderUnit 查看上层 API */ @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") -abstract class MessageSelectBuilder @PublishedApi internal constructor( +public abstract class MessageSelectBuilder @PublishedApi internal constructor( ownerMessagePacket: M, stub: Any?, subscriber: (M.(String) -> Boolean, MessageListener) -> Unit @@ -132,10 +134,10 @@ abstract class MessageSelectBuilder @PublishedApi internal override fun mapping( mapper: M.(String) -> N?, onEvent: @MessageDsl suspend M.(N) -> R - ) = error("prohibited") + ): Nothing = error("prohibited") @Deprecated("Use `default` instead", level = DeprecationLevel.HIDDEN) - override fun always(onEvent: MessageListener) = error("prohibited") + override fun always(onEvent: MessageListener): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) override infix fun MessageSelectionTimeoutChecker.reply(block: suspend () -> Any?): Nothing = error("prohibited") @@ -176,55 +178,55 @@ abstract class MessageSelectBuilder @PublishedApi internal override fun String.containsReply(reply: String): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun String.containsReply(replier: suspend M.(String) -> Any?) = error("prohibited") + override fun String.containsReply(replier: suspend M.(String) -> Any?): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun Regex.matchingReply(replier: suspend M.(MatchResult) -> Any?) = error("prohibited") + override fun Regex.matchingReply(replier: suspend M.(MatchResult) -> Any?): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun Regex.findingReply(replier: suspend M.(MatchResult) -> Any?) = error("prohibited") + override fun Regex.findingReply(replier: suspend M.(MatchResult) -> Any?): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun String.endsWithReply(replier: suspend M.(String) -> Any?) = error("prohibited") + override fun String.endsWithReply(replier: suspend M.(String) -> Any?): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun String.reply(reply: String) = error("prohibited") + override fun String.reply(reply: String): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun String.reply(reply: Message) = error("prohibited") + override fun String.reply(reply: Message): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun String.reply(replier: suspend M.(String) -> Any?) = error("prohibited") + override fun String.reply(replier: suspend M.(String) -> Any?): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.reply(toReply: String) = error("prohibited") + override fun ListeningFilter.reply(toReply: String): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.reply(message: Message) = error("prohibited") + override fun ListeningFilter.reply(message: Message): Nothing = error("prohibited") @JvmName("reply3") @Suppress("INAPPLICABLE_JVM_NAME", "INVALID_CHARACTERS", "NAME_CONTAINS_ILLEGAL_CHARS", "FunctionName") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.`->`(toReply: String) = error("prohibited") + override fun ListeningFilter.`->`(toReply: String): Nothing = error("prohibited") @JvmName("reply3") @Suppress("INAPPLICABLE_JVM_NAME", "INVALID_CHARACTERS", "NAME_CONTAINS_ILLEGAL_CHARS", "FunctionName") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.`->`(message: Message) = error("prohibited") + override fun ListeningFilter.`->`(message: Message): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.reply(replier: suspend M.(String) -> Any?) = + override fun ListeningFilter.reply(replier: suspend M.(String) -> Any?): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.quoteReply(toReply: String) = error("prohibited") + override fun ListeningFilter.quoteReply(toReply: String): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.quoteReply(toReply: Message) = error("prohibited") + override fun ListeningFilter.quoteReply(toReply: Message): Nothing = error("prohibited") @Deprecated("Using `reply` DSL in message selection is prohibited", level = DeprecationLevel.HIDDEN) - override fun ListeningFilter.quoteReply(replier: suspend M.(String) -> Any?) = error("prohibited") + override fun ListeningFilter.quoteReply(replier: suspend M.(String) -> Any?): Nothing = error("prohibited") } /** @@ -234,7 +236,7 @@ abstract class MessageSelectBuilder @PublishedApi internal * * @see MessageSubscribersBuilder 查看上层 API */ -abstract class MessageSelectBuilderUnit @PublishedApi internal constructor( +public abstract class MessageSelectBuilderUnit @PublishedApi internal constructor( private val ownerMessagePacket: M, stub: Any?, subscriber: (M.(String) -> Boolean, MessageListener) -> Unit @@ -243,17 +245,17 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * 当其他条件都不满足时的默认处理. */ @MessageDsl - abstract fun default(onEvent: MessageListener) // 需要后置默认监听器 + public abstract fun default(onEvent: MessageListener) // 需要后置默认监听器 @Deprecated("Use `default` instead", level = DeprecationLevel.HIDDEN) - override fun always(onEvent: MessageListener) = error("prohibited") + override fun always(onEvent: MessageListener): Nothing = error("prohibited") /** * 限制本次 select 的最长等待时间, 当超时后抛出 [TimeoutCancellationException] */ @Suppress("NOTHING_TO_INLINE") @MessageDsl - fun timeoutException( + public fun timeoutException( timeoutMillis: Long, exception: () -> Throwable = { throw MessageSelectionTimeoutException() } ) { @@ -271,7 +273,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * 限制本次 select 的最长等待时间, 当超时后执行 [block] 以完成 select */ @MessageDsl - fun timeout(timeoutMillis: Long, block: suspend () -> R) { + public fun timeout(timeoutMillis: Long, block: suspend () -> R) { require(timeoutMillis > 0) { "timeoutMillis must be positive" } obtainCurrentCoroutineScope().launch { delay(timeoutMillis) @@ -290,7 +292,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * @see reply */ @MessageDsl - fun timeout(timeoutMillis: Long): MessageSelectionTimeoutChecker { + public fun timeout(timeoutMillis: Long): MessageSelectionTimeoutChecker { require(timeoutMillis > 0) { "timeoutMillis must be positive" } return MessageSelectionTimeoutChecker(timeoutMillis) } @@ -301,7 +303,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * @see Deferred.invoke */ @Suppress("unused") - fun MessageSelectionTimeoutChecker.invoke(block: suspend () -> R) { + public fun MessageSelectionTimeoutChecker.invoke(block: suspend () -> R) { return timeout(this.timeoutMillis, block) } @@ -314,7 +316,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * @see quoteReply */ @Suppress("unused", "UNCHECKED_CAST") - open infix fun MessageSelectionTimeoutChecker.reply(block: suspend () -> Any?) { + public open infix fun MessageSelectionTimeoutChecker.reply(block: suspend () -> Any?) { return timeout(this.timeoutMillis) { executeAndReply(block) Unit as R @@ -322,7 +324,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter } @Suppress("unused", "UNCHECKED_CAST") - open infix fun MessageSelectionTimeoutChecker.reply(message: Message) { + public open infix fun MessageSelectionTimeoutChecker.reply(message: Message) { return timeout(this.timeoutMillis) { ownerMessagePacket.reply(message) Unit as R @@ -330,7 +332,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter } @Suppress("unused", "UNCHECKED_CAST") - open infix fun MessageSelectionTimeoutChecker.reply(message: String) { + public open infix fun MessageSelectionTimeoutChecker.reply(message: String) { return timeout(this.timeoutMillis) { ownerMessagePacket.reply(message) Unit as R @@ -342,7 +344,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter "INAPPLICABLE_JVM_NAME", "unused", "UNCHECKED_CAST", "INVALID_CHARACTERS", "NAME_CONTAINS_ILLEGAL_CHARS", "FunctionName" ) - open infix fun MessageSelectionTimeoutChecker.`->`(message: Message) { + public open infix fun MessageSelectionTimeoutChecker.`->`(message: Message) { return this.reply(message) } @@ -351,7 +353,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter "INAPPLICABLE_JVM_NAME", "unused", "UNCHECKED_CAST", "INVALID_CHARACTERS", "NAME_CONTAINS_ILLEGAL_CHARS", "FunctionName" ) - open infix fun MessageSelectionTimeoutChecker.`->`(message: String) { + public open infix fun MessageSelectionTimeoutChecker.`->`(message: String) { return this.reply(message) } @@ -364,7 +366,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * @see reply */ @Suppress("unused", "UNCHECKED_CAST") - open infix fun MessageSelectionTimeoutChecker.quoteReply(block: suspend () -> Any?) { + public open infix fun MessageSelectionTimeoutChecker.quoteReply(block: suspend () -> Any?) { return timeout(this.timeoutMillis) { executeAndQuoteReply(block) Unit as R @@ -372,7 +374,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter } @Suppress("unused", "UNCHECKED_CAST") - open infix fun MessageSelectionTimeoutChecker.quoteReply(message: Message) { + public open infix fun MessageSelectionTimeoutChecker.quoteReply(message: Message) { return timeout(this.timeoutMillis) { ownerMessagePacket.quoteReply(message) Unit as R @@ -380,7 +382,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter } @Suppress("unused", "UNCHECKED_CAST") - open infix fun MessageSelectionTimeoutChecker.quoteReply(message: String) { + public open infix fun MessageSelectionTimeoutChecker.quoteReply(message: String) { return timeout(this.timeoutMillis) { ownerMessagePacket.quoteReply(message) Unit as R @@ -393,7 +395,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * 当 [block] 返回值为 [Unit] 时不回复, 为 [Message] 时回复 [Message], 其他将 [toString] 后回复为 [PlainText] */ @MessageDsl - fun defaultReply(block: suspend () -> Any?): Unit = subscriber({ true }, { + public fun defaultReply(block: suspend () -> Any?): Unit = subscriber({ true }, { this@MessageSelectBuilderUnit.executeAndReply(block) }) @@ -404,7 +406,7 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter * 当 [block] 返回值为 [Unit] 时不回复, 为 [Message] 时回复 [Message], 其他将 [toString] 后回复为 [PlainText] */ @MessageDsl - fun defaultQuoteReply(block: suspend () -> Any?): Unit = subscriber({ true }, { + public fun defaultQuoteReply(block: suspend () -> Any?): Unit = subscriber({ true }, { this@MessageSelectBuilderUnit.executeAndQuoteReply(block) }) @@ -433,9 +435,9 @@ abstract class MessageSelectBuilderUnit @PublishedApi inter } @Suppress("NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS") -inline class MessageSelectionTimeoutChecker internal constructor(val timeoutMillis: Long) +public inline class MessageSelectionTimeoutChecker internal constructor(public val timeoutMillis: Long) -class MessageSelectionTimeoutException : RuntimeException() +public class MessageSelectionTimeoutException : RuntimeException() ///////////////////////// diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt index d72627e4d..c4fbc1ea1 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt @@ -29,7 +29,7 @@ import kotlin.coroutines.EmptyCoroutineContext import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName -typealias MessagePacketSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> +public typealias MessagePacketSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> /** * 订阅来自所有 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话. @@ -39,7 +39,7 @@ typealias MessagePacketSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeMessages( +public fun CoroutineScope.subscribeMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -63,7 +63,7 @@ fun CoroutineScope.subscribeMessages( }.run(listeners) } -typealias GroupMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> +public typealias GroupMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> /** * 订阅来自所有 [Bot] 的所有群消息事件 @@ -72,7 +72,7 @@ typealias GroupMessageSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeGroupMessages( +public fun CoroutineScope.subscribeGroupMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -90,7 +90,7 @@ fun CoroutineScope.subscribeGroupMessages( }.run(listeners) } -typealias FriendMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> +public typealias FriendMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> /** * 订阅来自所有 [Bot] 的所有好友消息事件 @@ -99,7 +99,7 @@ typealias FriendMessageSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeFriendMessages( +public fun CoroutineScope.subscribeFriendMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -117,7 +117,7 @@ fun CoroutineScope.subscribeFriendMessages( }.run(listeners) } -typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> +public typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> /** * 订阅来自所有 [Bot] 的所有临时会话消息事件 @@ -126,7 +126,7 @@ typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeTempMessages( +public fun CoroutineScope.subscribeTempMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -159,7 +159,7 @@ fun CoroutineScope.subscribeTempMessages( * @see subscribeMessages * @see subscribeGroupMessages */ -inline fun CoroutineScope.incoming( +public inline fun CoroutineScope.incoming( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, priority: Listener.EventPriority = EventPriority.MONITOR, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriber.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriber.kt index 0d26c0709..e16f96e0d 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriber.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriber.kt @@ -42,7 +42,7 @@ import kotlin.reflect.KClass /** * 订阅者的状态 */ -enum class ListeningStatus { +public enum class ListeningStatus { /** * 表示继续监听 */ @@ -65,9 +65,9 @@ enum class ListeningStatus { * * 取消监听: [complete] */ -interface Listener : CompletableJob { +public interface Listener : CompletableJob { - enum class ConcurrencyKind { + public enum class ConcurrencyKind { /** * 并发地同时处理多个事件, 但无法保证 [onEvent] 返回 [ListeningStatus.STOPPED] 后立即停止事件监听. */ @@ -82,7 +82,7 @@ interface Listener : CompletableJob { /** * 并发类型 */ - val concurrencyKind: ConcurrencyKind + public val concurrencyKind: ConcurrencyKind /** * 事件优先级. @@ -96,7 +96,7 @@ interface Listener : CompletableJob { * * 当事件被 [拦截][Event.intercept] 后, 优先级较低 (靠右) 的监听器将不会被调用. */ - enum class EventPriority { + public enum class EventPriority { HIGHEST, HIGH, NORMAL, LOW, LOWEST, @@ -108,7 +108,7 @@ interface Listener : CompletableJob { */ MONITOR; - companion object { + internal companion object { @JvmStatic internal val valuesExceptMonitor: Array = arrayOf(HIGHEST, HIGH, NORMAL, LOW, LOWEST) } @@ -118,17 +118,17 @@ interface Listener : CompletableJob { * 事件优先级 * @see [EventPriority] */ - val priority: EventPriority get() = NORMAL + public val priority: EventPriority get() = NORMAL /** * 这个方法将会调用 [CoroutineScope.subscribe] 时提供的参数 `noinline handler: suspend E.(E) -> ListeningStatus`. * * 这个函数不会抛出任何异常, 详见 [CoroutineScope.subscribe] */ - suspend fun onEvent(event: E): ListeningStatus + public suspend fun onEvent(event: E): ListeningStatus } -typealias EventPriority = Listener.EventPriority +public typealias EventPriority = Listener.EventPriority // region subscribe / subscribeAlways / subscribeOnce @@ -210,7 +210,7 @@ typealias EventPriority = Listener.EventPriority * @see subscribeFriendMessages 监听好友消息 DSL * @see subscribeTempMessages 监听临时会话消息 DSL */ -inline fun CoroutineScope.subscribe( +public inline fun CoroutineScope.subscribe( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, priority: Listener.EventPriority = NORMAL, @@ -224,7 +224,7 @@ inline fun CoroutineScope.subscribe( * * @return 监听器实例. 此监听器已经注册到指定事件上, 在事件广播时将会调用 [handler] */ -fun CoroutineScope.subscribe( +public fun CoroutineScope.subscribe( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, @@ -247,7 +247,7 @@ fun CoroutineScope.subscribe( * * @see CoroutineScope.subscribe 获取更多说明 */ -inline fun CoroutineScope.subscribeAlways( +public inline fun CoroutineScope.subscribeAlways( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = CONCURRENT, priority: Listener.EventPriority = NORMAL, @@ -259,7 +259,7 @@ inline fun CoroutineScope.subscribeAlways( * @see CoroutineScope.subscribe * @see CoroutineScope.subscribeAlways */ -fun CoroutineScope.subscribeAlways( +public fun CoroutineScope.subscribeAlways( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -282,7 +282,7 @@ fun CoroutineScope.subscribeAlways( * @see CoroutineScope.subscribe 获取更多说明 */ @JvmSynthetic -inline fun CoroutineScope.subscribeOnce( +public inline fun CoroutineScope.subscribeOnce( coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = NORMAL, noinline handler: suspend E.(E) -> Unit @@ -291,7 +291,7 @@ inline fun CoroutineScope.subscribeOnce( /** * @see CoroutineScope.subscribeOnce */ -fun CoroutineScope.subscribeOnce( +public fun CoroutineScope.subscribeOnce( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = NORMAL, @@ -321,7 +321,7 @@ fun CoroutineScope.subscribeOnce( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribe1") -inline fun CoroutineScope.subscribe( +public inline fun CoroutineScope.subscribe( crossinline handler: (E) -> ListeningStatus, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -342,7 +342,7 @@ inline fun CoroutineScope.subscribe( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribe2") -inline fun CoroutineScope.subscribe( +public inline fun CoroutineScope.subscribe( crossinline handler: E.(E) -> ListeningStatus, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -363,7 +363,7 @@ inline fun CoroutineScope.subscribe( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribe1") -inline fun CoroutineScope.subscribe( +public inline fun CoroutineScope.subscribe( crossinline handler: suspend (E) -> ListeningStatus, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -384,7 +384,7 @@ inline fun CoroutineScope.subscribe( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribe3") -inline fun CoroutineScope.subscribe( +public inline fun CoroutineScope.subscribe( crossinline handler: suspend E.(E) -> ListeningStatus, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -410,7 +410,7 @@ inline fun CoroutineScope.subscribe( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribeAlways1") -inline fun CoroutineScope.subscribeAlways( +public inline fun CoroutineScope.subscribeAlways( crossinline handler: (E) -> Unit, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -429,7 +429,7 @@ inline fun CoroutineScope.subscribeAlways( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribeAlways1") -inline fun CoroutineScope.subscribeAlways( +public inline fun CoroutineScope.subscribeAlways( crossinline handler: E.(E) -> Unit, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -448,7 +448,7 @@ inline fun CoroutineScope.subscribeAlways( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribe4") -inline fun CoroutineScope.subscribeAlways( +public inline fun CoroutineScope.subscribeAlways( crossinline handler: suspend (E) -> Unit, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -467,7 +467,7 @@ inline fun CoroutineScope.subscribeAlways( @JvmSynthetic @LowPriorityInOverloadResolution @JvmName("subscribe1") -inline fun CoroutineScope.subscribeAlways( +public inline fun CoroutineScope.subscribeAlways( crossinline handler: suspend E.(E) -> Unit, priority: Listener.EventPriority = NORMAL, concurrency: Listener.ConcurrencyKind = CONCURRENT, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriberDeprecated.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriberDeprecated.kt index ac35f69c8..c15293671 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriberDeprecated.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriberDeprecated.kt @@ -45,7 +45,7 @@ import kotlin.reflect.KClass "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -inline fun Bot.subscribe( +public inline fun Bot.subscribe( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, priority: Listener.EventPriority = NORMAL, @@ -59,7 +59,7 @@ inline fun Bot.subscribe( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -fun Bot.subscribe( +public fun Bot.subscribe( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, @@ -82,7 +82,7 @@ fun Bot.subscribe( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -inline fun Bot.subscribeAlways( +public inline fun Bot.subscribeAlways( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = CONCURRENT, priority: Listener.EventPriority = NORMAL, @@ -95,7 +95,7 @@ inline fun Bot.subscribeAlways( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -fun Bot.subscribeAlways( +public fun Bot.subscribeAlways( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -114,7 +114,7 @@ fun Bot.subscribeAlways( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -inline fun Bot.subscribeOnce( +public inline fun Bot.subscribeOnce( coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = NORMAL, noinline listener: suspend E.(E) -> Unit @@ -126,7 +126,7 @@ inline fun Bot.subscribeOnce( "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", level = DeprecationLevel.HIDDEN ) -fun Bot.subscribeOnce( +public fun Bot.subscribeOnce( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = NORMAL, @@ -149,7 +149,7 @@ fun Bot.subscribeOnce( @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -inline fun CoroutineScope.subscribeDeprecated( +public inline fun CoroutineScope.subscribeDeprecated( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, noinline handler: suspend E.(E) -> ListeningStatus @@ -165,7 +165,7 @@ inline fun CoroutineScope.subscribeDeprecated( @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -fun CoroutineScope.subscribeDeprecated( +public fun CoroutineScope.subscribeDeprecated( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, @@ -183,7 +183,7 @@ fun CoroutineScope.subscribeDeprecated( @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -inline fun CoroutineScope.subscribeAlwaysDeprecated( +public inline fun CoroutineScope.subscribeAlwaysDeprecated( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, noinline listener: suspend E.(E) -> Unit @@ -199,7 +199,7 @@ inline fun CoroutineScope.subscribeAlwaysDeprecated( @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -fun CoroutineScope.subscribeAlwaysDeprecated( +public fun CoroutineScope.subscribeAlwaysDeprecated( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, @@ -217,7 +217,7 @@ fun CoroutineScope.subscribeAlwaysDeprecated( @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -inline fun CoroutineScope.subscribeOnceDeprecated( +public inline fun CoroutineScope.subscribeOnceDeprecated( coroutineContext: CoroutineContext = EmptyCoroutineContext, noinline listener: suspend E.(E) -> Unit ): Listener = subscribeOnce( @@ -231,7 +231,7 @@ inline fun CoroutineScope.subscribeOnceDeprecated( @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -fun CoroutineScope.subscribeOnceDeprecated( +public fun CoroutineScope.subscribeOnceDeprecated( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, listener: suspend E.(E) -> Unit @@ -247,7 +247,7 @@ fun CoroutineScope.subscribeOnceDeprecated( @JvmName("subscribeAlwaysForBot") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -inline fun Bot.subscribeDeprecated( +public inline fun Bot.subscribeDeprecated( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, noinline handler: suspend E.(E) -> ListeningStatus @@ -263,7 +263,7 @@ inline fun Bot.subscribeDeprecated( @JvmName("subscribe") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -fun Bot.subscribeDeprecated( +public fun Bot.subscribeDeprecated( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = LOCKED, @@ -281,7 +281,7 @@ fun Bot.subscribeDeprecated( @JvmName("subscribeAlwaysForBot1") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -inline fun Bot.subscribeAlwaysDeprecated( +public inline fun Bot.subscribeAlwaysDeprecated( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = CONCURRENT, noinline listener: suspend E.(E) -> Unit @@ -297,7 +297,7 @@ inline fun Bot.subscribeAlwaysDeprecated( @JvmName("subscribeAlways") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -fun Bot.subscribeAlwaysDeprecated( +public fun Bot.subscribeAlwaysDeprecated( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: Listener.ConcurrencyKind = CONCURRENT, @@ -315,7 +315,7 @@ fun Bot.subscribeAlwaysDeprecated( @JvmName("subscribeOnceForBot2") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -inline fun Bot.subscribeOnceDeprecated( +public inline fun Bot.subscribeOnceDeprecated( coroutineContext: CoroutineContext = EmptyCoroutineContext, noinline listener: suspend E.(E) -> Unit ): Listener = subscribeOnce( @@ -329,7 +329,7 @@ inline fun Bot.subscribeOnceDeprecated( @JvmName("subscribeOnce") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused") -fun Bot.subscribeOnceDeprecated( +public fun Bot.subscribeOnceDeprecated( eventClass: KClass, coroutineContext: CoroutineContext = EmptyCoroutineContext, listener: suspend E.(E) -> Unit diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt index 3cc35053a..6bbab1241 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt @@ -13,10 +13,6 @@ import kotlinx.coroutines.Job import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Group import net.mamoe.mirai.data.* -import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent -import net.mamoe.mirai.event.events.MemberJoinRequestEvent -import net.mamoe.mirai.event.events.NewFriendRequestEvent -import net.mamoe.mirai.message.data.Voice import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.WeakRef @@ -30,7 +26,7 @@ import net.mamoe.mirai.utils.WeakRef @RequiresOptIn @Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) -annotation class LowLevelAPI +public annotation class LowLevelAPI /** * [Bot] 相关协议层低级 API. @@ -42,7 +38,7 @@ annotation class LowLevelAPI @MiraiExperimentalAPI @Suppress("FunctionName", "unused") @LowLevelAPI -interface LowLevelBotAPIAccessor { +public interface LowLevelBotAPIAccessor { /** * 构造一个 [Friend] 对象. 它持有对 [Bot] 的弱引用([WeakRef]). * @@ -50,20 +46,20 @@ interface LowLevelBotAPIAccessor { * 因此, 当 [Bot] 被关闭后, 这个对象也会被关闭. */ @LowLevelAPI - fun _lowLevelNewFriend(friendInfo: FriendInfo): Friend + public fun _lowLevelNewFriend(friendInfo: FriendInfo): Friend /** * 向服务器查询群列表. 返回值高 32 bits 为 uin, 低 32 bits 为 groupCode */ @LowLevelAPI - suspend fun _lowLevelQueryGroupList(): Sequence + public suspend fun _lowLevelQueryGroupList(): Sequence /** * 向服务器查询群资料. 获得的仅为当前时刻的资料. * 请优先使用 [Bot.getGroup] 然后查看群资料. */ @LowLevelAPI - suspend fun _lowLevelQueryGroupInfo(groupCode: Long): GroupInfo + public suspend fun _lowLevelQueryGroupInfo(groupCode: Long): GroupInfo /** * 向服务器查询群成员列表. @@ -74,7 +70,11 @@ interface LowLevelBotAPIAccessor { * @see Group.calculateGroupUinByGroupCode 使用 groupCode 计算 groupUin */ @LowLevelAPI - suspend fun _lowLevelQueryGroupMemberList(groupUin: Long, groupCode: Long, ownerId: Long): Sequence + public suspend fun _lowLevelQueryGroupMemberList( + groupUin: Long, + groupCode: Long, + ownerId: Long + ): Sequence /** * 获取群公告列表 @@ -82,7 +82,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelGetAnnouncements(groupId: Long, page: Int = 1, amount: Int = 10): GroupAnnouncementList + public suspend fun _lowLevelGetAnnouncements(groupId: Long, page: Int = 1, amount: Int = 10): GroupAnnouncementList /** * 发送群公告 @@ -91,7 +91,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelSendAnnouncement(groupId: Long, announcement: GroupAnnouncement): String + public suspend fun _lowLevelSendAnnouncement(groupId: Long, announcement: GroupAnnouncement): String /** @@ -100,7 +100,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelDeleteAnnouncement(groupId: Long, fid: String) + public suspend fun _lowLevelDeleteAnnouncement(groupId: Long, fid: String) /** * 获取一条群公告 @@ -108,7 +108,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelGetAnnouncement(groupId: Long, fid: String): GroupAnnouncement + public suspend fun _lowLevelGetAnnouncement(groupId: Long, fid: String): GroupAnnouncement /** @@ -118,7 +118,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelGetGroupActiveData(groupId: Long, page: Int = -1): GroupActiveData + public suspend fun _lowLevelGetGroupActiveData(groupId: Long, page: Int = -1): GroupActiveData /** @@ -126,7 +126,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelSolveNewFriendRequestEvent( + public suspend fun _lowLevelSolveNewFriendRequestEvent( eventId: Long, fromId: Long, fromNick: String, @@ -139,7 +139,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelSolveBotInvitedJoinGroupRequestEvent( + public suspend fun _lowLevelSolveBotInvitedJoinGroupRequestEvent( eventId: Long, invitorId: Long, groupId: Long, @@ -151,7 +151,7 @@ interface LowLevelBotAPIAccessor { */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelSolveMemberJoinRequestEvent( + public suspend fun _lowLevelSolveMemberJoinRequestEvent( eventId: Long, fromId: Long, fromNick: String, @@ -163,10 +163,8 @@ interface LowLevelBotAPIAccessor { /** * 查询语音的下载连接 - * - * */ - + */ @LowLevelAPI @MiraiExperimentalAPI - suspend fun _lowLevelQueryGroupVoiceDownloadUrl(md5: ByteArray, groupId: Long, dstUin: Long): String + public suspend fun _lowLevelQueryGroupVoiceDownloadUrl(md5: ByteArray, groupId: Long, dstUin: Long): String } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt index e73100916..a8baf62b1 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt @@ -25,10 +25,10 @@ import net.mamoe.mirai.utils.PlannedRemoval * * @see MessageEvent */ -class FriendMessageEvent constructor( - override val sender: Friend, - override val message: MessageChain, - override val time: Int +public class FriendMessageEvent constructor( + public override val sender: Friend, + public override val message: MessageChain, + public override val time: Int ) : @PlannedRemoval("1.2.0") FriendMessage(), BroadcastControllable { init { val source = @@ -36,10 +36,10 @@ class FriendMessageEvent constructor( check(source is OnlineMessageSource.Incoming.FromFriend) { "source provided to a FriendMessage must be an instance of OnlineMessageSource.Incoming.FromFriend" } } - override val bot: Bot get() = sender.bot - override val subject: Friend get() = sender - override val senderName: String get() = sender.nick - override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend + public override val bot: Bot get() = sender.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 - override fun toString(): String = "FriendMessageEvent(sender=${sender.id}, message=$message)" + public override fun toString(): String = "FriendMessageEvent(sender=${sender.id}, message=$message)" } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt index d73a0ed0c..c69bdc74c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt @@ -7,7 +7,7 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -@file:Suppress("DEPRECATION_ERROR", "unused", "NOTHING_TO_INLINE") +@file:Suppress("DEPRECATION_ERROR", "unused", "NOTHING_TO_INLINE", "MemberVisibilityCanBePrivate") package net.mamoe.mirai.message @@ -24,30 +24,30 @@ import net.mamoe.mirai.utils.PlannedRemoval * * @see MessageEvent */ -class GroupMessageEvent( - override val senderName: String, +public class GroupMessageEvent( + public override val senderName: String, /** * 发送方权限. */ - val permission: MemberPermission, - override val sender: Member, - override val message: MessageChain, - override val time: Int + public val permission: MemberPermission, + public override val sender: Member, + public override val message: MessageChain, + public override val time: Int ) : @PlannedRemoval("1.2.0") GroupMessage(), Event { init { val source = message[MessageSource] ?: error("Cannot find MessageSource from message") check(source is OnlineMessageSource.Incoming.FromGroup) { "source provided to a GroupMessage must be an instance of OnlineMessageSource.Incoming.FromGroup" } } - override val group: Group get() = sender.group - override val bot: Bot get() = sender.bot + public override val group: Group get() = sender.group + public override val bot: Bot get() = sender.bot - override val subject: Group get() = group + public override val subject: Group get() = group - override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup + public override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup - inline fun At.asMember(): Member = group[this.target] + public inline fun At.asMember(): Member = group[this.target] - override fun toString(): String = + public override fun toString(): String = "GroupMessageEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, permission=${permission.name}, message=$message)" } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt index 7936b1fb6..1f434f670 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt @@ -46,13 +46,13 @@ import kotlin.jvm.JvmSynthetic * @see isContextIdenticalWith 判断语境是否相同 */ @Suppress("DEPRECATION_ERROR") -abstract class MessageEvent : @PlannedRemoval("1.2.0") ContactMessage(), +public abstract class MessageEvent : @PlannedRemoval("1.2.0") ContactMessage(), BotEvent, MessageEventExtensions { /** * 与这个消息事件相关的 [Bot] */ - abstract override val bot: Bot + public abstract override val bot: Bot /** * 消息事件主体. @@ -63,19 +63,19 @@ abstract class MessageEvent : @PlannedRemoval("1.2.0") ContactMessage(), * * 在回复消息时, 可通过 [subject] 作为回复对象 */ - abstract override val subject: Contact + public abstract override val subject: Contact /** * 发送人. * * 在好友消息时为 [Friend] 的实例, 在群消息时为 [Member] 的实例 */ - abstract override val sender: User + public abstract override val sender: User /** * 发送人名称 */ - abstract override val senderName: String + public abstract override val senderName: String /** * 消息内容. @@ -83,20 +83,20 @@ abstract class MessageEvent : @PlannedRemoval("1.2.0") ContactMessage(), * 第一个元素一定为 [MessageSource], 存储此消息的发送人, 发送时间, 收信人, 消息 id 等数据. * 随后的元素为拥有顺序的真实消息内容. */ - abstract override val message: MessageChain + public abstract override val message: MessageChain /** 消息发送时间 (由服务器提供, 可能与本地有时差) */ - abstract override val time: Int + public abstract override val time: Int /** * 消息源. 来自 [message] 的第一个元素, */ - override val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming + public override val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming } /** 消息事件的扩展函数 */ @Suppress("EXPOSED_SUPER_INTERFACE") // Functions are visible -interface MessageEventExtensions : +public interface MessageEventExtensions : MessageEventPlatformExtensions { // region 发送 Message @@ -107,29 +107,29 @@ interface MessageEventExtensions : * 对于群消息事件, 这个方法将会给群 ([subject]) 发送消息 */ @JvmSynthetic - suspend inline fun reply(message: Message): MessageReceipt = + public suspend inline fun reply(message: Message): MessageReceipt = subject.sendMessage(message.asMessageChain()) as MessageReceipt @JvmSynthetic - suspend inline fun reply(plain: String): MessageReceipt = + public suspend inline fun reply(plain: String): MessageReceipt = subject.sendMessage(plain.toMessage().asMessageChain()) as MessageReceipt // endregion @JvmSynthetic - suspend inline fun ExternalImage.upload(): Image = this.upload(subject) + public suspend inline fun ExternalImage.upload(): Image = this.upload(subject) @JvmSynthetic - suspend inline fun ExternalImage.send(): MessageReceipt = this.sendTo(subject) + public suspend inline fun ExternalImage.send(): MessageReceipt = this.sendTo(subject) @JvmSynthetic - suspend inline fun Image.send(): MessageReceipt = this.sendTo(subject) + public suspend inline fun Image.send(): MessageReceipt = this.sendTo(subject) @JvmSynthetic - suspend inline fun Message.send(): MessageReceipt = this.sendTo(subject) + public suspend inline fun Message.send(): MessageReceipt = this.sendTo(subject) @JvmSynthetic - suspend inline fun String.send(): MessageReceipt = this.toMessage().sendTo(subject) + public suspend inline fun String.send(): MessageReceipt = this.toMessage().sendTo(subject) // region 引用回复 /** @@ -138,17 +138,18 @@ interface MessageEventExtensions : * 对于群消息事件, 这个方法将会给群 ([subject]) 发送消息 */ @JvmSynthetic - suspend inline fun quoteReply(message: MessageChain): MessageReceipt = + public suspend inline fun quoteReply(message: MessageChain): MessageReceipt = reply(this.message.quote() + message) @JvmSynthetic - suspend inline fun quoteReply(message: Message): MessageReceipt = reply(this.message.quote() + message) + public suspend inline fun quoteReply(message: Message): MessageReceipt = + reply(this.message.quote() + message) @JvmSynthetic - suspend inline fun quoteReply(plain: String): MessageReceipt = reply(this.message.quote() + plain) + public suspend inline fun quoteReply(plain: String): MessageReceipt = reply(this.message.quote() + plain) @JvmSynthetic - inline fun At.isBot(): Boolean = target == bot.id + public inline fun At.isBot(): Boolean = target == bot.id /** @@ -156,7 +157,7 @@ interface MessageEventExtensions : * @return "http://gchat.qpic.cn/gchatpic_new/..." */ @JvmSynthetic - suspend inline fun Image.url(): String = this@url.queryUrl() + public suspend inline fun Image.url(): String = this@url.queryUrl() } /** 一个消息事件在各平台的相关扩展. 请使用 [MessageEventExtensions] */ @@ -177,14 +178,15 @@ internal expect interface MessageEventPlatformExtensions : Packet, BotEvent, AbstractEvent() { +public abstract class MessagePacketBase : Packet, BotEvent, + AbstractEvent() { abstract override val bot: Bot - abstract val sender: User - abstract val subject: Contact - abstract val message: MessageChain - abstract val time: Int - abstract val source: OnlineMessageSource.Incoming - abstract val senderName: String + public abstract val sender: User + public abstract val subject: Contact + public abstract val message: MessageChain + public abstract val time: Int + public abstract val source: OnlineMessageSource.Incoming + public abstract val senderName: String } @PlannedRemoval("1.2.0") @@ -194,7 +196,7 @@ abstract class MessagePacketBase : P level = DeprecationLevel.HIDDEN ) @Suppress("DEPRECATION_ERROR") -abstract class MessagePacket : MessagePacketBase(), +public abstract class MessagePacket : MessagePacketBase(), BotEvent, MessageEventExtensions { abstract override val bot: Bot abstract override val sender: User @@ -212,7 +214,7 @@ abstract class MessagePacket : MessagePacketBase(), level = DeprecationLevel.HIDDEN ) @Suppress("DEPRECATION_ERROR") -abstract class ContactMessage : MessagePacket(), +public abstract class ContactMessage : MessagePacket(), BotEvent, MessageEventExtensions { abstract override val bot: Bot abstract override val sender: User @@ -230,7 +232,7 @@ abstract class ContactMessage : MessagePacket(), level = DeprecationLevel.HIDDEN ) @Suppress("DEPRECATION_ERROR") -abstract class FriendMessage : MessageEvent() { +public abstract class FriendMessage : MessageEvent() { abstract override val bot: Bot abstract override val sender: Friend abstract override val subject: Friend @@ -247,8 +249,8 @@ abstract class FriendMessage : MessageEvent() { level = DeprecationLevel.HIDDEN ) @Suppress("DEPRECATION_ERROR") -abstract class GroupMessage : MessageEvent() { - abstract val group: Group +public abstract class GroupMessage : MessageEvent() { + public abstract val group: Group abstract override val bot: Bot abstract override val sender: Member abstract override val subject: Group @@ -264,13 +266,13 @@ abstract class GroupMessage : MessageEvent() { replaceWith = ReplaceWith("TempMessageEvent", "net.mamoe.mirai.message.TempMessageEvent"), level = DeprecationLevel.HIDDEN ) -abstract class TempMessage : MessageEvent() { +public abstract class TempMessage : MessageEvent() { abstract override val bot: Bot abstract override val sender: Member abstract override val subject: Member abstract override val message: MessageChain abstract override val time: Int abstract override val source: OnlineMessageSource.Incoming.FromTemp - abstract val group: Group + public abstract val group: Group abstract override val senderName: String } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt index ca78c801f..7c455d7e2 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt @@ -41,26 +41,26 @@ import kotlin.jvm.JvmSynthetic * @see MessageReceipt.sourceId 源 id * @see MessageReceipt.sourceTime 源时间 */ -open class MessageReceipt @MiraiExperimentalAPI("The constructor is subject to change.") constructor( +public open class MessageReceipt @MiraiExperimentalAPI("The constructor is subject to change.") constructor( /** * 指代发送出去的消息. */ - val source: OnlineMessageSource.Outgoing, + public val source: OnlineMessageSource.Outgoing, /** * 发送目标, 为 [Group] 或 [Friend] 或 [Member] */ - val target: C, + public val target: C, /** * @see Group.botAsMember */ @MiraiExperimentalAPI("This is subject to change.") - val botAsMember: Member? + public val botAsMember: Member? ) { /** * 是否为发送给群的消息的回执 */ - val isToGroup: Boolean get() = target is Group + public val isToGroup: Boolean get() = target is Group /** * 引用这条消息并回复. @@ -71,7 +71,7 @@ open class MessageReceipt @MiraiExperimentalAPI("The constructo */ @JavaFriendlyAPI @JvmName("quoteReply") - fun __quoteReplyBlockingForJava__(message: Message): MessageReceipt { + public fun __quoteReplyBlockingForJava__(message: Message): MessageReceipt { return runBlocking { return@runBlocking quoteReply(message) } } @@ -82,7 +82,7 @@ open class MessageReceipt @MiraiExperimentalAPI("The constructo */ @JavaFriendlyAPI @JvmName("quoteReply") - fun __quoteReplyBlockingForJava__(message: String): MessageReceipt { + public fun __quoteReplyBlockingForJava__(message: String): MessageReceipt { return runBlocking { quoteReply(message) } } @@ -93,7 +93,7 @@ open class MessageReceipt @MiraiExperimentalAPI("The constructo */ @JavaFriendlyAPI @JvmName("recall") - fun __recallBlockingForJava__() { + public fun __recallBlockingForJava__() { return runBlocking { recall() } } @@ -104,7 +104,7 @@ open class MessageReceipt @MiraiExperimentalAPI("The constructo */ @JavaFriendlyAPI @JvmName("recallIn") - fun __recallInBlockingForJava__(timeMillis: Long): Job { + public fun __recallInBlockingForJava__(timeMillis: Long): Job { return recallIn(timeMillis = timeMillis) } @@ -115,7 +115,7 @@ open class MessageReceipt @MiraiExperimentalAPI("The constructo */ @JavaFriendlyAPI @JvmName("quote") - fun __quoteBlockingForJava__(): QuoteReply { + public fun __quoteBlockingForJava__(): QuoteReply { return this.quote() } } @@ -126,7 +126,7 @@ open class MessageReceipt @MiraiExperimentalAPI("The constructo * @see Bot.recall * @throws IllegalStateException 当此消息已经被撤回或正计划撤回时 */ -suspend inline fun MessageReceipt<*>.recall() { +public suspend inline fun MessageReceipt<*>.recall() { return target.bot.recall(source) } @@ -136,7 +136,7 @@ suspend inline fun MessageReceipt<*>.recall() { * @param timeMillis 延迟时间, 单位为毫秒 * @throws IllegalStateException 当此消息已经被撤回或正计划撤回时 */ -inline fun MessageReceipt<*>.recallIn( +public inline fun MessageReceipt<*>.recallIn( timeMillis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext ): Job = source.recallIn(timeMillis, coroutineContext) @@ -147,14 +147,14 @@ inline fun MessageReceipt<*>.recallIn( * @see MessageChain.quote 引用一条消息 */ @JvmSynthetic -inline fun MessageReceipt<*>.quote(): QuoteReply = this.source.quote() +public inline fun MessageReceipt<*>.quote(): QuoteReply = this.source.quote() /** * 引用这条消息并回复. * @see MessageChain.quote 引用一条消息 */ @JvmSynthetic -suspend inline fun MessageReceipt.quoteReply(message: Message): MessageReceipt { +public suspend inline fun MessageReceipt.quoteReply(message: Message): MessageReceipt { @Suppress("UNCHECKED_CAST") return target.sendMessage(this.quote() + message) as MessageReceipt } @@ -164,7 +164,7 @@ suspend inline fun MessageReceipt.quoteReply(message: Message): * @see MessageChain.quote 引用一条消息 */ @JvmSynthetic -suspend inline fun MessageReceipt.quoteReply(message: String): MessageReceipt { +public suspend inline fun MessageReceipt.quoteReply(message: String): MessageReceipt { return this.quoteReply(message.toMessage()) } @@ -175,7 +175,7 @@ suspend inline fun MessageReceipt.quoteReply(message: String): * @see MessageSource.id */ @get:JvmSynthetic -inline val MessageReceipt<*>.sourceId: Int +public inline val MessageReceipt<*>.sourceId: Int get() = this.source.id @@ -185,7 +185,7 @@ inline val MessageReceipt<*>.sourceId: Int * @see MessageSource.id */ @get:JvmSynthetic -inline val MessageReceipt<*>.sourceInternalId: Int +public inline val MessageReceipt<*>.sourceInternalId: Int get() = this.source.internalId /** @@ -194,6 +194,6 @@ inline val MessageReceipt<*>.sourceInternalId: Int * @see MessageSource.time */ @get:JvmSynthetic -inline val MessageReceipt<*>.sourceTime: Int +public inline val MessageReceipt<*>.sourceTime: Int get() = this.source.time diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt index 99fbdf65c..75ff0074d 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt @@ -17,22 +17,22 @@ import net.mamoe.mirai.message.data.source * * @see MessageEvent */ -class TempMessageEvent( - override val sender: Member, - override val message: MessageChain, - override val time: Int +public class TempMessageEvent( + public override val sender: Member, + public override val message: MessageChain, + public override val time: Int ) : TempMessage(), BroadcastControllable { init { val source = message[MessageSource] ?: error("Cannot find MessageSource from message") check(source is OnlineMessageSource.Incoming.FromTemp) { "source provided to a TempMessage must be an instance of OnlineMessageSource.Incoming.FromTemp" } } - override val bot: Bot get() = sender.bot - override val subject: Member get() = sender - override val group: Group get() = sender.group - override val senderName: String get() = sender.nameCardOrNick - override val source: OnlineMessageSource.Incoming.FromTemp get() = message.source as 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 - override fun toString(): String = + public override fun toString(): String = "TempMessageEvent(sender=${sender.id} from group(${sender.group.id}), message=$message)" } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/code/CodableMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/code/CodableMessage.kt index b967da9b7..42c18243c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/code/CodableMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/code/CodableMessage.kt @@ -33,12 +33,12 @@ import net.mamoe.mirai.utils.SinceMirai */ @MiraiExperimentalAPI @SinceMirai("1.1.0") -interface CodableMessage : Message { +public interface CodableMessage : Message { /** * 转换为 mirai 码. * * @suppress 警告: 此 API 可能在任何时刻被改变 */ @MiraiExperimentalAPI - fun toMiraiCode(): String = this.toString() + public fun toMiraiCode(): String = this.toString() } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt index 871663d8e..ec8190ef4 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt @@ -32,30 +32,30 @@ import kotlin.jvm.JvmSynthetic * * @see AtAll 全体成员 */ -data class At +public data class At @Suppress("DataClassPrivateConstructor") private constructor( - val target: Long, + public val target: Long, /** * "@群员名片" */ - val display: String + public val display: String ) : MessageContent, CodableMessage { /** * 构造一个 [At] 实例. 这是唯一的公开的构造方式. */ - constructor(member: Member) : this(member.id, "@${member.nameCardOrNick}") + public constructor(member: Member) : this(member.id, "@${member.nameCardOrNick}") - override fun equals(other: Any?): Boolean { + public override fun equals(other: Any?): Boolean { return other is At && other.target == this.target && other.display == this.display } - override fun toString(): String = "[mirai:at:$target,$display]" - override fun contentToString(): String = this.display + public override fun toString(): String = "[mirai:at:$target,$display]" + public override fun contentToString(): String = this.display - companion object Key : Message.Key { - override val typeName: String + public companion object Key : Message.Key { + public override val typeName: String get() = "At" /** @@ -64,18 +64,18 @@ private constructor( @Suppress("FunctionName") @JvmStatic @LowLevelAPI - fun _lowLevelConstructAtInstance(target: Long, display: String): At = At(target, display) + public fun _lowLevelConstructAtInstance(target: Long, display: String): At = At(target, display) } // 自动为消息补充 " " - override fun followedBy(tail: Message): MessageChain { + public override fun followedBy(tail: Message): MessageChain { if (tail is PlainText && tail.content.startsWith(' ')) { return super.followedBy(tail) } return super.followedBy(PlainText(" ")) + tail } - override fun hashCode(): Int { + public override fun hashCode(): Int { var result = target.hashCode() result = 31 * result + display.hashCode() return result @@ -88,4 +88,4 @@ private constructor( */ @JvmSynthetic @Suppress("NOTHING_TO_INLINE") -inline fun Member.at(): At = At(this) \ No newline at end of file +public inline fun Member.at(): At = At(this) \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt index bf3413637..8810d360a 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt @@ -9,6 +9,7 @@ @file:JvmMultifileClass @file:JvmName("MessageUtils") +@file:Suppress("MemberVisibilityCanBePrivate") package net.mamoe.mirai.message.data @@ -28,26 +29,26 @@ private const val displayA = "@全体成员" * * @see At at 单个群成员 */ -object AtAll : +public object AtAll : Message.Key, MessageContent, CodableMessage { - const val display = displayA - override val typeName: String + public const val display: String = displayA + public override val typeName: String get() = "AtAll" @Suppress("SpellCheckingInspection") - override fun toString(): String = "[mirai:atall]" - override fun contentToString(): String = display - override fun equals(other: Any?): Boolean { + public override fun toString(): String = "[mirai:atall]" + public override fun contentToString(): String = display + public override fun equals(other: Any?): Boolean { return other === this } - override fun hashCode(): Int { + public override fun hashCode(): Int { return display.hashCode() } // 自动为消息补充 " " - override fun followedBy(tail: Message): MessageChain { + public override fun followedBy(tail: Message): MessageChain { if (tail is PlainText && tail.content.startsWith(' ')) { return super.followedBy(tail) } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt index 06de331f7..b9b1cfe1b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt @@ -37,11 +37,11 @@ import kotlin.jvm.JvmOverloads * @see CustomMessageMetadata 自定义消息元数据 */ @MiraiExperimentalAPI -sealed class CustomMessage : SingleMessage { +public sealed class CustomMessage : SingleMessage { /** * 获取这个消息的工厂 */ - abstract fun getFactory(): Factory + public abstract fun getFactory(): Factory /** * 序列化和反序列化此消息的工厂, 将会自动注册. @@ -51,13 +51,13 @@ sealed class CustomMessage : SingleMessage { * @see ProtoBufSerializerFactory 使用 [ProtoBuf] 作为序列模式的 [Factory] */ @MiraiExperimentalAPI - abstract class Factory( + public abstract class Factory( /** * 此类型消息的名称. * 在发往服务器时使用此名称. * 应确保唯一且不变. */ - final override val typeName: String + public final override val typeName: String ) : Message.Key { init { @@ -69,51 +69,51 @@ sealed class CustomMessage : SingleMessage { * 序列化此消息. */ @Throws(Exception::class) - abstract fun dump(message: @UnsafeVariance M): ByteArray + public abstract fun dump(message: @UnsafeVariance M): ByteArray /** * 从 [input] 读取此消息. */ @Throws(Exception::class) - abstract fun load(input: ByteArray): @UnsafeVariance M + public abstract fun load(input: ByteArray): @UnsafeVariance M } /** * 使用 [ProtoBuf] 作为序列模式的 [Factory]. * 推荐使用此工厂 */ - abstract class ProtoBufSerializerFactory(typeName: String) : + public abstract class ProtoBufSerializerFactory(typeName: String) : Factory(typeName) { /** * 得到 [M] 的 [KSerializer]. */ - abstract fun serializer(): KSerializer + public abstract fun serializer(): KSerializer - override fun dump(message: M): ByteArray = ProtoBuf.dump(serializer(), message) - override fun load(input: ByteArray): M = ProtoBuf.load(serializer(), input) + public override fun dump(message: M): ByteArray = ProtoBuf.dump(serializer(), message) + public override fun load(input: ByteArray): M = ProtoBuf.load(serializer(), input) } /** * 使用 [Json] 作为序列模式的 [Factory] * 推荐在调试时使用此工厂 */ - abstract class JsonSerializerFactory(typeName: String) : + public abstract class JsonSerializerFactory(typeName: String) : Factory(typeName) { /** * 得到 [M] 的 [KSerializer]. */ - abstract fun serializer(): KSerializer + public abstract fun serializer(): KSerializer @OptIn(UnstableDefault::class) - open val json = Json(JsonConfiguration.Default) + public open val json: Json = Json(JsonConfiguration.Default) - override fun dump(message: M): ByteArray = json.stringify(serializer(), message).toByteArray() - override fun load(input: ByteArray): M = json.parse(serializer(), String(input)) + public override fun dump(message: M): ByteArray = json.stringify(serializer(), message).toByteArray() + public override fun load(input: ByteArray): M = json.parse(serializer(), String(input)) } - companion object Key : Message.Key { + public companion object Key : Message.Key { override val typeName: String get() = "CustomMessage" private val factories: LockFreeLinkedList> = LockFreeLinkedList() @@ -127,14 +127,14 @@ sealed class CustomMessage : SingleMessage { } @Serializable - class CustomMessageFullData( + private class CustomMessageFullData( @ProtoId(1) val miraiVersionFlag: Int, @ProtoId(2) val typeName: String, @ProtoId(3) val data: ByteArray ) - class CustomMessageFullDataDeserializeInternalException(cause: Throwable?) : RuntimeException(cause) - class CustomMessageFullDataDeserializeUserException(val body: ByteArray, cause: Throwable?) : + public class CustomMessageFullDataDeserializeInternalException(cause: Throwable?) : RuntimeException(cause) + public class CustomMessageFullDataDeserializeUserException(public val body: ByteArray, cause: Throwable?) : RuntimeException(cause) internal fun load(fullData: ByteReadPacket): CustomMessage? { @@ -177,7 +177,7 @@ sealed class CustomMessage : SingleMessage { */ @MiraiExperimentalAPI @SinceMirai("1.1.0") -fun T.toByteArray(): ByteArray { +public fun T.toByteArray(): ByteArray { @Suppress("UNCHECKED_CAST") return (this.getFactory() as CustomMessage.Factory).dump(this) } @@ -194,12 +194,12 @@ fun T.toByteArray(): ByteArray { * @see ConstrainSingle 可实现此接口以保证消息链中只存在一个元素 */ @MiraiExperimentalAPI -abstract class CustomMessageMetadata : CustomMessage(), MessageMetadata { - companion object Key : Message.Key { +public abstract class CustomMessageMetadata : CustomMessage(), MessageMetadata { + public companion object Key : Message.Key { override val typeName: String get() = "CustomMessageMetadata" } - open fun customToString(): ByteArray = customToStringImpl(this.getFactory()) + public open fun customToString(): ByteArray = customToStringImpl(this.getFactory()) final override fun toString(): String = "[mirai:custom:${getFactory().typeName}:${String(customToString())}]" diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt index 31b98743c..66aa5ec9f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt @@ -24,219 +24,219 @@ import kotlin.jvm.JvmSynthetic * ## mirai 码支持 * 格式: [mirai:face:*[id]*] */ -data class Face(val id: Int) : // used in delegation +public data class Face(public val id: Int) : // used in delegation MessageContent, CodableMessage { - override fun toString(): String = "[mirai:face:$id]" - override fun contentToString(): String = - if (id >= 0 && id <= 255) - FaceName.names[id] - else "[表情]" + public override fun toString(): String = "[mirai:face:$id]" + public override fun contentToString(): String = + if (id >= 0 && id <= 255) + FaceName.names[id] + else "[表情]" - override fun equals(other: Any?): Boolean = other is Face && other.id == this.id - override fun hashCode(): Int = id + public override fun equals(other: Any?): Boolean = other is Face && other.id == this.id + public override fun hashCode(): Int = id /** * @author LamGC */ @Suppress("SpellCheckingInspection", "unused") - companion object IdList : Message.Key { - override val typeName: String + public companion object IdList : Message.Key { + public override val typeName: String get() = "Face" - const val unknown: Int = 0xff - const val jingya: Int = 0 - const val piezui: Int = 1 - const val se: Int = 2 - const val fadai: Int = 3 - const val deyi: Int = 4 - const val liulei: Int = 5 - const val haixiu: Int = 6 - const val bizui: Int = 7 - const val shui: Int = 8 - const val daku: Int = 9 - const val ganga: Int = 10 - const val fanu: Int = 11 - const val tiaopi: Int = 12 - const val ciya: Int = 13 - const val weixiao: Int = 14 - const val nanguo: Int = 15 - const val ku: Int = 16 - const val zhuakuang: Int = 18 - const val tu: Int = 19 - const val touxiao: Int = 20 - const val keai: Int = 21 - const val baiyan: Int = 22 - const val aoman: Int = 23 - const val ji_e: Int = 24 - const val kun: Int = 25 - const val jingkong: Int = 26 - const val liuhan: Int = 27 - const val hanxiao: Int = 28 - const val dabing: Int = 29 - const val fendou: Int = 30 - const val zhouma: Int = 31 - const val yiwen: Int = 32 - const val yun: Int = 34 - const val zhemo: Int = 35 - const val shuai: Int = 36 - const val kulou: Int = 37 - const val qiaoda: Int = 38 - const val zaijian: Int = 39 - const val fadou: Int = 41 - const val aiqing: Int = 42 - const val tiaotiao: Int = 43 - const val zhutou: Int = 46 - const val yongbao: Int = 49 - const val dan_gao: Int = 53 - const val shandian: Int = 54 - const val zhadan: Int = 55 - const val dao: Int = 56 - const val zuqiu: Int = 57 - const val bianbian: Int = 59 - const val kafei: Int = 60 - const val fan: Int = 61 - const val meigui: Int = 63 - const val diaoxie: Int = 64 - const val aixin: Int = 66 - const val xinsui: Int = 67 - const val liwu: Int = 69 - const val taiyang: Int = 74 - const val yueliang: Int = 75 - const val qiang: Int = 76 - const val ruo: Int = 77 - const val woshou: Int = 78 - const val shengli: Int = 79 - const val feiwen: Int = 85 - const val naohuo: Int = 86 - const val xigua: Int = 89 - const val lenghan: Int = 96 - const val cahan: Int = 97 - const val koubi: Int = 98 - const val guzhang: Int = 99 - const val qiudale: Int = 100 - const val huaixiao: Int = 101 - const val zuohengheng: Int = 102 - const val youhengheng: Int = 103 - const val haqian: Int = 104 - const val bishi: Int = 105 - const val weiqu: Int = 106 - const val kuaikule: Int = 107 - const val yinxian: Int = 108 - const val qinqin: Int = 109 - const val xia: Int = 110 - const val kelian: Int = 111 - const val caidao: Int = 112 - const val pijiu: Int = 113 - const val lanqiu: Int = 114 - const val pingpang: Int = 115 - const val shiai: Int = 116 - const val piaochong: Int = 117 - const val baoquan: Int = 118 - const val gouyin: Int = 119 - const val quantou: Int = 120 - const val chajin: Int = 121 - const val aini: Int = 122 - const val bu: Int = 123 - const val hao: Int = 124 - const val zhuanquan: Int = 125 - const val ketou: Int = 126 - const val huitou: Int = 127 - const val tiaosheng: Int = 128 - const val huishou: Int = 129 - const val jidong: Int = 130 - const val jiewu: Int = 131 - const val xianwen: Int = 132 - const val zuotaiji: Int = 133 - const val youtaiji: Int = 134 - const val shuangxi: Int = 136 - const val bianpao: Int = 137 - const val denglong: Int = 138 - const val facai: Int = 139 - const val K_ge: Int = 140 - const val gouwu: Int = 141 - const val youjian: Int = 142 - const val shuai_qi: Int = 143 - const val hecai: Int = 144 - const val qidao: Int = 145 - const val baojin: Int = 146 - const val bangbangtang: Int = 147 - const val he_nai: Int = 148 - const val xiamian: Int = 149 - const val xiangjiao: Int = 150 - const val feiji: Int = 151 - const val kaiche: Int = 152 - const val gaotiezuochetou: Int = 153 - const val chexiang: Int = 154 - const val gaotieyouchetou: Int = 155 - const val duoyun: Int = 156 - const val xiayu: Int = 157 - const val chaopiao: Int = 158 - const val xiongmao: Int = 159 - const val dengpao: Int = 160 - const val fengche: Int = 161 - const val naozhong: Int = 162 - const val dasan: Int = 163 - const val caiqiu: Int = 164 - const val zuanjie: Int = 165 - const val shafa: Int = 166 - const val zhijin: Int = 167 - const val yao: Int = 168 - const val shouqiang: Int = 169 - const val qingwa: Int = 170 - const val hexie: Int = 184 - const val yangtuo: Int = 185 - const val youling: Int = 187 - const val dan: Int = 188 - const val juhua: Int = 190 - const val hongbao: Int = 192 - const val daxiao: Int = 193 - const val bukaixin: Int = 194 - const val lengmo: Int = 197 - const val e: Int = 198 - const val haobang: Int = 199 - const val baituo: Int = 200 - const val dianzan: Int = 201 - const val wuliao: Int = 202 - const val tuolian: Int = 203 - const val chi: Int = 204 - const val songhua: Int = 205 - const val haipa: Int = 206 - const val huachi: Int = 207 - const val xiaoyanger: Int = 208 - const val biaolei: Int = 210 - const val wobukan: Int = 211 - const val bobo: Int = 214 - const val hulian: Int = 215 - const val paitou: Int = 216 - const val cheyiche: Int = 217 - const val tianyitian: Int = 218 - const val cengyiceng: Int = 219 - const val zhuaizhatian: Int = 220 - const val dingguagua: Int = 221 - const val baobao: Int = 222 - const val baoji: Int = 223 - const val kaiqiang: Int = 224 - const val liaoyiliao: Int = 225 - const val paizhuo: Int = 226 - const val paishou: Int = 227 - const val gongxi: Int = 228 - const val ganbei: Int = 229 - const val chaofeng: Int = 230 - const val heng: Int = 231 - const val foxi: Int = 232 - const val qiaoyiqioa: Int = 233 - const val jingdai: Int = 234 - const val chandou: Int = 235 - const val kentou: Int = 236 - const val toukan: Int = 237 - const val shanlian: Int = 238 - const val yuanliang: Int = 239 - const val penlian: Int = 240 - const val shengrikuaile: Int = 241 - const val touzhuangji: Int = 242 - const val shuaitou: Int = 243 - const val rengou: Int = 244 + public const val unknown: Int = 0xff + public const val jingya: Int = 0 + public const val piezui: Int = 1 + public const val se: Int = 2 + public const val fadai: Int = 3 + public const val deyi: Int = 4 + public const val liulei: Int = 5 + public const val haixiu: Int = 6 + public const val bizui: Int = 7 + public const val shui: Int = 8 + public const val daku: Int = 9 + public const val ganga: Int = 10 + public const val fanu: Int = 11 + public const val tiaopi: Int = 12 + public const val ciya: Int = 13 + public const val weixiao: Int = 14 + public const val nanguo: Int = 15 + public const val ku: Int = 16 + public const val zhuakuang: Int = 18 + public const val tu: Int = 19 + public const val touxiao: Int = 20 + public const val keai: Int = 21 + public const val baiyan: Int = 22 + public const val aoman: Int = 23 + public const val ji_e: Int = 24 + public const val kun: Int = 25 + public const val jingkong: Int = 26 + public const val liuhan: Int = 27 + public const val hanxiao: Int = 28 + public const val dabing: Int = 29 + public const val fendou: Int = 30 + public const val zhouma: Int = 31 + public const val yiwen: Int = 32 + public const val yun: Int = 34 + public const val zhemo: Int = 35 + public const val shuai: Int = 36 + public const val kulou: Int = 37 + public const val qiaoda: Int = 38 + public const val zaijian: Int = 39 + public const val fadou: Int = 41 + public const val aiqing: Int = 42 + public const val tiaotiao: Int = 43 + public const val zhutou: Int = 46 + public const val yongbao: Int = 49 + public const val dan_gao: Int = 53 + public const val shandian: Int = 54 + public const val zhadan: Int = 55 + public const val dao: Int = 56 + public const val zuqiu: Int = 57 + public const val bianbian: Int = 59 + public const val kafei: Int = 60 + public const val fan: Int = 61 + public const val meigui: Int = 63 + public const val diaoxie: Int = 64 + public const val aixin: Int = 66 + public const val xinsui: Int = 67 + public const val liwu: Int = 69 + public const val taiyang: Int = 74 + public const val yueliang: Int = 75 + public const val qiang: Int = 76 + public const val ruo: Int = 77 + public const val woshou: Int = 78 + public const val shengli: Int = 79 + public const val feiwen: Int = 85 + public const val naohuo: Int = 86 + public const val xigua: Int = 89 + public const val lenghan: Int = 96 + public const val cahan: Int = 97 + public const val koubi: Int = 98 + public const val guzhang: Int = 99 + public const val qiudale: Int = 100 + public const val huaixiao: Int = 101 + public const val zuohengheng: Int = 102 + public const val youhengheng: Int = 103 + public const val haqian: Int = 104 + public const val bishi: Int = 105 + public const val weiqu: Int = 106 + public const val kuaikule: Int = 107 + public const val yinxian: Int = 108 + public const val qinqin: Int = 109 + public const val xia: Int = 110 + public const val kelian: Int = 111 + public const val caidao: Int = 112 + public const val pijiu: Int = 113 + public const val lanqiu: Int = 114 + public const val pingpang: Int = 115 + public const val shiai: Int = 116 + public const val piaochong: Int = 117 + public const val baoquan: Int = 118 + public const val gouyin: Int = 119 + public const val quantou: Int = 120 + public const val chajin: Int = 121 + public const val aini: Int = 122 + public const val bu: Int = 123 + public const val hao: Int = 124 + public const val zhuanquan: Int = 125 + public const val ketou: Int = 126 + public const val huitou: Int = 127 + public const val tiaosheng: Int = 128 + public const val huishou: Int = 129 + public const val jidong: Int = 130 + public const val jiewu: Int = 131 + public const val xianwen: Int = 132 + public const val zuotaiji: Int = 133 + public const val youtaiji: Int = 134 + public const val shuangxi: Int = 136 + public const val bianpao: Int = 137 + public const val denglong: Int = 138 + public const val facai: Int = 139 + public const val K_ge: Int = 140 + public const val gouwu: Int = 141 + public const val youjian: Int = 142 + public const val shuai_qi: Int = 143 + public const val hecai: Int = 144 + public const val qidao: Int = 145 + public const val baojin: Int = 146 + public const val bangbangtang: Int = 147 + public const val he_nai: Int = 148 + public const val xiamian: Int = 149 + public const val xiangjiao: Int = 150 + public const val feiji: Int = 151 + public const val kaiche: Int = 152 + public const val gaotiezuochetou: Int = 153 + public const val chexiang: Int = 154 + public const val gaotieyouchetou: Int = 155 + public const val duoyun: Int = 156 + public const val xiayu: Int = 157 + public const val chaopiao: Int = 158 + public const val xiongmao: Int = 159 + public const val dengpao: Int = 160 + public const val fengche: Int = 161 + public const val naozhong: Int = 162 + public const val dasan: Int = 163 + public const val caiqiu: Int = 164 + public const val zuanjie: Int = 165 + public const val shafa: Int = 166 + public const val zhijin: Int = 167 + public const val yao: Int = 168 + public const val shouqiang: Int = 169 + public const val qingwa: Int = 170 + public const val hexie: Int = 184 + public const val yangtuo: Int = 185 + public const val youling: Int = 187 + public const val dan: Int = 188 + public const val juhua: Int = 190 + public const val hongbao: Int = 192 + public const val daxiao: Int = 193 + public const val bukaixin: Int = 194 + public const val lengmo: Int = 197 + public const val e: Int = 198 + public const val haobang: Int = 199 + public const val baituo: Int = 200 + public const val dianzan: Int = 201 + public const val wuliao: Int = 202 + public const val tuolian: Int = 203 + public const val chi: Int = 204 + public const val songhua: Int = 205 + public const val haipa: Int = 206 + public const val huachi: Int = 207 + public const val xiaoyanger: Int = 208 + public const val biaolei: Int = 210 + public const val wobukan: Int = 211 + public const val bobo: Int = 214 + public const val hulian: Int = 215 + public const val paitou: Int = 216 + public const val cheyiche: Int = 217 + public const val tianyitian: Int = 218 + public const val cengyiceng: Int = 219 + public const val zhuaizhatian: Int = 220 + public const val dingguagua: Int = 221 + public const val baobao: Int = 222 + public const val baoji: Int = 223 + public const val kaiqiang: Int = 224 + public const val liaoyiliao: Int = 225 + public const val paizhuo: Int = 226 + public const val paishou: Int = 227 + public const val gongxi: Int = 228 + public const val ganbei: Int = 229 + public const val chaofeng: Int = 230 + public const val heng: Int = 231 + public const val foxi: Int = 232 + public const val qiaoyiqioa: Int = 233 + public const val jingdai: Int = 234 + public const val chandou: Int = 235 + public const val kentou: Int = 236 + public const val toukan: Int = 237 + public const val shanlian: Int = 238 + public const val yuanliang: Int = 239 + public const val penlian: Int = 240 + public const val shengrikuaile: Int = 241 + public const val touzhuangji: Int = 242 + public const val shuaitou: Int = 243 + public const val rengou: Int = 244 } @@ -249,13 +249,13 @@ data class Face(val id: Int) : // used in delegation @PlannedRemoval("1.2.0") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused", "UNUSED_PARAMETER") - fun copy(id: Int = this.id, stringValue: String = "") = this.copy(id = id) + public fun copy(id: Int = this.id, stringValue: String = ""): Face = this.copy(id = id) @JvmSynthetic @PlannedRemoval("1.2.0") @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("unused", "UNUSED_PARAMETER") - operator fun component2(): String = toString() + public operator fun component2(): String = toString() } @@ -264,7 +264,7 @@ data class Face(val id: Int) : // used in delegation */ @Suppress("SpellCheckingInspection") private object FaceName { - val names = Array(256, { "[表情]" }) + val names = Array(256) { "[表情]" } init { names[Face.jingya] = "[惊讶]" diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/ForwardMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/ForwardMessage.kt index df7b1c83d..684707197 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/ForwardMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/ForwardMessage.kt @@ -83,12 +83,12 @@ import kotlin.jvm.Transient * * @see buildForwardMessage */ -class ForwardMessage @JvmOverloads constructor( +public class ForwardMessage @JvmOverloads constructor( /** * 消息列表 */ - val nodeList: Collection, - @Transient val displayStrategy: DisplayStrategy = DisplayStrategy.Default + public val nodeList: Collection, + @Transient public val displayStrategy: DisplayStrategy = DisplayStrategy.Default ) : MessageContent { init { require(nodeList.isNotEmpty()) { @@ -99,37 +99,37 @@ class ForwardMessage @JvmOverloads constructor( /** * @see ForwardMessage */ - abstract class DisplayStrategy { + public abstract class DisplayStrategy { /** * 修改后卡片标题会变为 "转发的聊天记录", 而此函数的返回值会显示在 preview 前 */ - open fun generateTitle(forward: ForwardMessage): String = "群聊的聊天记录" + public open fun generateTitle(forward: ForwardMessage): String = "群聊的聊天记录" /** * 显示在消息列表中的预览. */ - open fun generateBrief(forward: ForwardMessage): String = "[聊天记录]" + public open fun generateBrief(forward: ForwardMessage): String = "[聊天记录]" /** * 目前未发现在哪能显示 */ - open fun generateSource(forward: ForwardMessage): String = "聊天记录" + public open fun generateSource(forward: ForwardMessage): String = "聊天记录" /** * 显示在卡片 body 中, 只会显示 sequence 前四个元素. * Java 用户: 使用 [sequenceOf] (`SequenceKt.sequenceOf`) 或 [asSequence] (`SequenceKt.asSequence`) */ - open fun generatePreview(forward: ForwardMessage): Sequence = + public open fun generatePreview(forward: ForwardMessage): Sequence = forward.nodeList.asSequence().map { it.senderName + ": " + it.message.contentToString() } /** * 显示在卡片底部 */ - open fun generateSummary(forward: ForwardMessage): String = "查看 ${forward.nodeList.size} 条转发消息" + public open fun generateSummary(forward: ForwardMessage): String = "查看 ${forward.nodeList.size} 条转发消息" - companion object Default : DisplayStrategy() { + public companion object Default : DisplayStrategy() { @JvmSynthetic - inline operator fun invoke( + public inline operator fun invoke( crossinline generateTitle: (forward: ForwardMessage) -> String = Default::generateTitle, crossinline generateBrief: (forward: ForwardMessage) -> String = Default::generateBrief, crossinline generateSource: (forward: ForwardMessage) -> String = Default::generateSource, @@ -146,44 +146,44 @@ class ForwardMessage @JvmOverloads constructor( } - data class Node( + public data class Node( override val senderId: Long, override val time: Int, override val senderName: String, override val message: Message ) : INode - interface INode { + public interface INode { /** * 发送人 [User.id] */ - val senderId: Long + public val senderId: Long /** * 时间戳秒 */ - val time: Int + public val time: Int /** * 发送人名称 */ - val senderName: String + public val senderName: String /** * 消息内容 */ - val message: Message + public val message: Message } - companion object Key : Message.Key { - override val typeName: String get() = "ForwardMessage" + public companion object Key : Message.Key { + public override val typeName: String get() = "ForwardMessage" } - override fun toString(): String = "[mirai:forward:$nodeList]" + public override fun toString(): String = "[mirai:forward:$nodeList]" private val contentToString: String by lazy { nodeList.joinToString("\n") } @MiraiExperimentalAPI - override fun contentToString(): String = contentToString + public override fun contentToString(): String = contentToString } @@ -191,7 +191,7 @@ class ForwardMessage @JvmOverloads constructor( * 转换为 [ForwardMessage] */ @JvmOverloads -fun Iterable.toForwardMessage(displayStrategy: DisplayStrategy = DisplayStrategy): ForwardMessage { +public fun Iterable.toForwardMessage(displayStrategy: DisplayStrategy = DisplayStrategy): ForwardMessage { val iterator = this.iterator() if (!iterator.hasNext()) return ForwardMessage(emptyList(), displayStrategy) return ForwardMessage( @@ -203,7 +203,7 @@ fun Iterable.toForwardMessage(displayStrategy: DisplayStrategy = D * 转换为 [ForwardMessage] */ @JvmOverloads -fun Message.toForwardMessage( +public fun Message.toForwardMessage( sender: User, time: Int = currentTimeSeconds.toInt(), displayStrategy: DisplayStrategy = DisplayStrategy @@ -213,7 +213,7 @@ fun Message.toForwardMessage( * 转换为 [ForwardMessage] */ @JvmOverloads -fun Message.toForwardMessage( +public fun Message.toForwardMessage( senderId: Long, senderName: String, time: Int = currentTimeSeconds.toInt(), @@ -227,7 +227,7 @@ fun Message.toForwardMessage( * @see ForwardMessage 查看转发消息说明 */ @JvmSynthetic -inline fun buildForwardMessage( +public inline fun buildForwardMessage( context: Contact, displayStrategy: DisplayStrategy = DisplayStrategy, block: ForwardMessageBuilder.() -> Unit @@ -240,7 +240,7 @@ inline fun buildForwardMessage( * @see ForwardMessage 查看转发消息说明 */ @JvmSynthetic -inline fun MessageEvent.buildForwardMessage( +public inline fun MessageEvent.buildForwardMessage( context: Contact = this.subject, displayStrategy: DisplayStrategy = DisplayStrategy, block: ForwardMessageBuilder.() -> Unit @@ -253,7 +253,7 @@ inline fun MessageEvent.buildForwardMessage( */ @Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE) @DslMarker -annotation class ForwardMessageDsl +public annotation class ForwardMessageDsl /** * 转发消息 DSL 构建器. @@ -315,114 +315,115 @@ annotation class ForwardMessageDsl * * `S named "name1" named "name2" says M` 最终的发送人名称为 `"name2"` */ -class ForwardMessageBuilder private constructor( +public class ForwardMessageBuilder private constructor( /** * 消息语境. 可为 [Group] 或 [User] */ - val context: Contact, + public val context: Contact, private val container: MutableList ) : MutableList by container { /** * @see ForwardMessage.displayStrategy */ - var displayStrategy: DisplayStrategy = DisplayStrategy + public var displayStrategy: DisplayStrategy = DisplayStrategy private var built: Boolean = false private fun checkBuilt() { check(!built) { "ForwardMessageBuilder is already built therefore can't be modified" } } - constructor(context: Contact) : this(context, mutableListOf()) - constructor(context: Contact, initialSize: Int) : this(context, ArrayList(initialSize)) + public constructor(context: Contact) : this(context, mutableListOf()) + public constructor(context: Contact, initialSize: Int) : this(context, ArrayList(initialSize)) /** * 当前时间. * 在使用 [says] 时若不指定时间, 则会使用 [currentTime] 自增 1 的时间. */ - var currentTime: Int = currentTimeSeconds.toInt() + public var currentTime: Int = currentTimeSeconds.toInt() - inner class BuilderNode : ForwardMessage.INode { + public inner class BuilderNode : ForwardMessage.INode { /** * 发送人 [User.id] */ - override var senderId: Long = 0 + public override var senderId: Long = 0 /** * 时间戳秒 */ - override var time: Int = currentTime++ + public override var time: Int = currentTime++ /** * 发送人名称 */ - override var senderName: String = "" + public override var senderName: String = "" /** * 消息内容 */ - override lateinit var message: Message + public override lateinit var message: Message /** * 指定发送人 id 和名称. */ @ForwardMessageDsl - infix fun sender(user: User): BuilderNode = apply { this.senderId(user.id); this.named(user.nameCardOrNick) } + public infix fun sender(user: User): BuilderNode = + apply { this.senderId(user.id); this.named(user.nameCardOrNick) } /** * 指定发送人 id. */ @ForwardMessageDsl - infix fun senderId(id: Int): BuilderNode = apply { this.senderId = id.toLongUnsigned() } + public infix fun senderId(id: Int): BuilderNode = apply { this.senderId = id.toLongUnsigned() } /** * 指定发送人 id. */ @ForwardMessageDsl - infix fun senderId(id: Long): BuilderNode = apply { this.senderId = id } + public infix fun senderId(id: Long): BuilderNode = apply { this.senderId = id } /** * 指定发送人名称. */ @ForwardMessageDsl - infix fun named(name: String): BuilderNode = apply { this.senderName = name } + public infix fun named(name: String): BuilderNode = apply { this.senderName = name } /** * 指定发送人名称. */ @ForwardMessageDsl - infix fun senderName(name: String): BuilderNode = apply { this.senderName = name } + public infix fun senderName(name: String): BuilderNode = apply { this.senderName = name } /** * 指定时间. * @time 时间戳, 单位为秒 */ @ForwardMessageDsl - infix fun at(time: Int): BuilderNode = this.apply { this.time = time } + public infix fun at(time: Int): BuilderNode = this.apply { this.time = time } /** * 指定时间. * @time 时间戳, 单位为秒 */ @ForwardMessageDsl - infix fun time(time: Int): BuilderNode = this.apply { this.time = time } + public infix fun time(time: Int): BuilderNode = this.apply { this.time = time } /** * 指定消息内容 */ @ForwardMessageDsl - infix fun message(message: Message): BuilderNode = this.apply { this.message = message } + public infix fun message(message: Message): BuilderNode = this.apply { this.message = message } /** * 指定消息内容 */ @ForwardMessageDsl - infix fun message(message: String): BuilderNode = this.apply { this.message = message.toMessage() } + public infix fun message(message: String): BuilderNode = this.apply { this.message = message.toMessage() } /** 添加一条消息 */ @ForwardMessageDsl - infix fun says(message: Message): ForwardMessageBuilder = this@ForwardMessageBuilder.apply { + public infix fun says(message: Message): ForwardMessageBuilder = this@ForwardMessageBuilder.apply { checkBuilt() this@BuilderNode.message = message add(this@BuilderNode) @@ -430,11 +431,11 @@ class ForwardMessageBuilder private constructor( /** 添加一条消息 */ @ForwardMessageDsl - infix fun says(message: String): ForwardMessageBuilder = this.says(message.toMessage()) + public infix fun says(message: String): ForwardMessageBuilder = this.says(message.toMessage()) /** 构造并添加一个 [MessageChain] */ @ForwardMessageDsl - inline infix fun says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = + public inline infix fun says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = says(MessageChainBuilder().apply(chain).asMessageChain()) } @@ -442,16 +443,16 @@ class ForwardMessageBuilder private constructor( /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun Long.says(message: String): ForwardMessageBuilder = says(message.toMessage()) + public infix fun Long.says(message: String): ForwardMessageBuilder = says(message.toMessage()) /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun Int.says(message: String): ForwardMessageBuilder = + public infix fun Int.says(message: String): ForwardMessageBuilder = this.toLong().and(0xFFFF_FFFF).says(message.toMessage()) /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun Long.says(message: Message): ForwardMessageBuilder = + public infix fun Long.says(message: Message): ForwardMessageBuilder = this@ForwardMessageBuilder.apply { checkBuilt() add(BuilderNode().apply { @@ -462,43 +463,43 @@ class ForwardMessageBuilder private constructor( /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun Int.says(message: Message): ForwardMessageBuilder = this.toLong().and(0xFFFF_FFFF).says(message) + public infix fun Int.says(message: Message): ForwardMessageBuilder = this.toLong().and(0xFFFF_FFFF).says(message) /** 构造并添加一个 [MessageChain], 自动按顺序调整时间 */ @ForwardMessageDsl - inline infix fun Long.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = + public inline infix fun Long.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = says(MessageChainBuilder().apply(chain).asMessageChain()) /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - inline infix fun Int.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = + public inline infix fun Int.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = this.toLong().and(0xFFFF_FFFF).says(chain) /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun Bot.says(message: String): ForwardMessageBuilder = this.id named this.smartName() says message + public infix fun Bot.says(message: String): ForwardMessageBuilder = this.id named this.smartName() says message /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun User.says(message: String): ForwardMessageBuilder = this.id named this.nameCardOrNick says message + public infix fun User.says(message: String): ForwardMessageBuilder = this.id named this.nameCardOrNick says message /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun User.says(message: Message): ForwardMessageBuilder = this.id named this.nameCardOrNick says message + public infix fun User.says(message: Message): ForwardMessageBuilder = this.id named this.nameCardOrNick says message /** 添加一条消息, 自动按顺序调整时间 */ @ForwardMessageDsl - infix fun Bot.says(message: Message): ForwardMessageBuilder = this.id named this.smartName() says message + public infix fun Bot.says(message: Message): ForwardMessageBuilder = this.id named this.smartName() says message /** 构造并添加一个 [MessageChain], 自动按顺序调整时间 */ @ForwardMessageDsl - inline infix fun User.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = + public inline infix fun User.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = this says (MessageChainBuilder().apply(chain).asMessageChain()) /** 构造并添加一个 [MessageChain], 自动按顺序调整时间 */ @ForwardMessageDsl - inline infix fun Bot.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = + public inline infix fun Bot.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder = this says (MessageChainBuilder().apply(chain).asMessageChain()) // endregion @@ -511,21 +512,21 @@ class ForwardMessageBuilder private constructor( * @time 时间戳, 单位为秒 */ @ForwardMessageDsl - infix fun Int.at(time: Int): BuilderNode = this.toLongUnsigned() at time + public infix fun Int.at(time: Int): BuilderNode = this.toLongUnsigned() at time /** * 为一条消息指定时间. * @time 时间戳, 单位为秒 */ @ForwardMessageDsl - infix fun Long.at(time: Int): BuilderNode = BuilderNode().apply { senderId = this@at;this.time = time } + public infix fun Long.at(time: Int): BuilderNode = BuilderNode().apply { senderId = this@at;this.time = time } /** * 为一条消息指定时间和发送人名称. * @time 时间戳, 单位为秒 */ @ForwardMessageDsl - infix fun User.at(time: Int): BuilderNode = this.id named this.nameCardOrNick at time + public infix fun User.at(time: Int): BuilderNode = this.id named this.nameCardOrNick at time // endregion @@ -534,21 +535,21 @@ class ForwardMessageBuilder private constructor( /** 为一条消息指定发送人名称. */ @ForwardMessageDsl - infix fun Int.named(name: String): BuilderNode = this.toLongUnsigned().named(name) + public infix fun Int.named(name: String): BuilderNode = this.toLongUnsigned().named(name) /** 为一条消息指定发送人名称. */ @ForwardMessageDsl - infix fun Long.named(name: String): BuilderNode = + public infix fun Long.named(name: String): BuilderNode = BuilderNode().apply { senderId = this@named;this.senderName = name } /** 为一条消息指定发送人名称. */ @ForwardMessageDsl - infix fun User.named(name: String): BuilderNode = this.id.named(name) + public infix fun User.named(name: String): BuilderNode = this.id.named(name) // endregion /** 构造 [ForwardMessage] */ - fun build(): ForwardMessage = ForwardMessage(container.toList(), this.displayStrategy) + public fun build(): ForwardMessage = ForwardMessage(container.toList(), this.displayStrategy) internal fun Bot.smartName(): String = when (val c = this@ForwardMessageBuilder.context) { is Group -> c.botAsMember.nameCardOrNick else -> nick diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/HummerMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/HummerMessage.kt index 9097ae5d3..a533dd582 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/HummerMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/HummerMessage.kt @@ -17,7 +17,6 @@ import net.mamoe.mirai.message.code.CodableMessage import net.mamoe.mirai.message.data.PokeMessage.Types import net.mamoe.mirai.message.data.VipFace.Companion import net.mamoe.mirai.message.data.VipFace.Kind -import net.mamoe.mirai.utils.PlannedRemoval import kotlin.jvm.* /** @@ -26,9 +25,9 @@ import kotlin.jvm.* * @see PokeMessage 戳一戳 * @see FlashImage 闪照 */ -sealed class HummerMessage : MessageContent { - companion object Key : Message.Key { - override val typeName: String +public sealed class HummerMessage : MessageContent { + public companion object Key : Message.Key { + public override val typeName: String get() = "HummerMessage" } // has service type etc. @@ -46,90 +45,90 @@ sealed class HummerMessage : MessageContent { * * @see Types 使用伴生对象中的常量 */ -data class PokeMessage internal constructor( +public data class PokeMessage internal constructor( /** * 仅 mirai, 显示的名称 */ - val name: String, + public val name: String, - val type: Int, - val id: Int + public val type: Int, + public val id: Int ) : HummerMessage(), CodableMessage { @Suppress("DEPRECATION_ERROR", "DEPRECATION", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") - companion object Types : Message.Key { - override val typeName: String + public companion object Types : Message.Key { + public override val typeName: String get() = "PokeMessage" /** 戳一戳 */ @JvmField - val Poke = PokeMessage("戳一戳", 1, -1) + public val Poke: PokeMessage = PokeMessage("戳一戳", 1, -1) /** 比心 */ @JvmField - val ShowLove = PokeMessage("比心", 2, -1) + public val ShowLove: PokeMessage = PokeMessage("比心", 2, -1) /** 点赞 */ @JvmField - val Like = PokeMessage("点赞", 3, -1) + public val Like: PokeMessage = PokeMessage("点赞", 3, -1) /** 心碎 */ @JvmField - val Heartbroken = PokeMessage("心碎", 4, -1) + public val Heartbroken: PokeMessage = PokeMessage("心碎", 4, -1) /** 666 */ @JvmField - val SixSixSix = PokeMessage("666", 5, -1) + public val SixSixSix: PokeMessage = PokeMessage("666", 5, -1) /** 放大招 */ @JvmField - val FangDaZhao = PokeMessage("放大招", 6, -1) + public val FangDaZhao: PokeMessage = PokeMessage("放大招", 6, -1) /** 宝贝球 (SVIP) */ @JvmField - val BaoBeiQiu = PokeMessage("宝贝球", 126, 2011) + public val BaoBeiQiu: PokeMessage = PokeMessage("宝贝球", 126, 2011) /** 玫瑰花 (SVIP) */ @JvmField - val Rose = PokeMessage("玫瑰花", 126, 2007) + public val Rose: PokeMessage = PokeMessage("玫瑰花", 126, 2007) /** 召唤术 (SVIP) */ @JvmField - val ZhaoHuanShu = PokeMessage("召唤术", 126, 2006) + public val ZhaoHuanShu: PokeMessage = PokeMessage("召唤术", 126, 2006) /** 让你皮 (SVIP) */ @JvmField - val RangNiPi = PokeMessage("让你皮", 126, 2009) + public val RangNiPi: PokeMessage = PokeMessage("让你皮", 126, 2009) /** 结印 (SVIP) */ @JvmField - val JieYin = PokeMessage("结印", 126, 2005) + public val JieYin: PokeMessage = PokeMessage("结印", 126, 2005) /** 手雷 (SVIP) */ @JvmField - val ShouLei = PokeMessage("手雷", 126, 2004) + public val ShouLei: PokeMessage = PokeMessage("手雷", 126, 2004) /** 勾引 */ @JvmField - val GouYin = PokeMessage("勾引", 126, 2003) + public val GouYin: PokeMessage = PokeMessage("勾引", 126, 2003) /** 抓一下 (SVIP) */ @JvmField - val ZhuaYiXia = PokeMessage("抓一下", 126, 2001) + public val ZhuaYiXia: PokeMessage = PokeMessage("抓一下", 126, 2001) /** 碎屏 (SVIP) */ @JvmField - val SuiPing = PokeMessage("碎屏", 126, 2002) + public val SuiPing: PokeMessage = PokeMessage("碎屏", 126, 2002) /** 敲门 (SVIP) */ @JvmField - val QiaoMen = PokeMessage("敲门", 126, 2002) + public val QiaoMen: PokeMessage = PokeMessage("敲门", 126, 2002) /** * 所有类型数组 */ @JvmStatic - val values: Array = arrayOf( + public val values: Array = arrayOf( Poke, ShowLove, Like, Heartbroken, SixSixSix, FangDaZhao, BaoBeiQiu, Rose, ZhaoHuanShu, RangNiPi, JieYin, ShouLei, GouYin, ZhuaYiXia, SuiPing @@ -161,64 +160,64 @@ data class PokeMessage internal constructor( * * @see Types 使用伴生对象中的常量 */ -data class VipFace internal constructor( +public data class VipFace internal constructor( /** * 使用 [Companion] 中常量. */ - val kind: Kind, - val count: Int + public val kind: Kind, + public val count: Int ) : HummerMessage(), CodableMessage { - data class Kind( + public data class Kind( val id: Int, val name: String ) { - override fun toString(): String { + public override fun toString(): String { return "$id,$name" } } @Suppress("DEPRECATION_ERROR", "DEPRECATION", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") - companion object : Message.Key { + public companion object : Message.Key { override val typeName: String get() = "VipFace" @JvmStatic - val LiuLian = 9 to "榴莲" + public val LiuLian: Kind = 9 to "榴莲" @JvmStatic - val PingDiGuo = 1 to "平底锅" + public val PingDiGuo: Kind = 1 to "平底锅" @JvmStatic - val ChaoPiao = 12 to "钞票" + public val ChaoPiao: Kind = 12 to "钞票" @JvmStatic - val LueLueLue = 10 to "略略略" + public val LueLueLue: Kind = 10 to "略略略" @JvmStatic - val ZhuTou = 4 to "猪头" + public val ZhuTou: Kind = 4 to "猪头" @JvmStatic - val BianBian = 6 to "便便" + public val BianBian: Kind = 6 to "便便" @JvmStatic - val ZhaDan = 5 to "炸弹" + public val ZhaDan: Kind = 5 to "炸弹" @JvmStatic - val AiXin = 2 to "爱心" + public val AiXin: Kind = 2 to "爱心" @JvmStatic - val HaHa = 3 to "哈哈" + public val HaHa: Kind = 3 to "哈哈" @JvmStatic - val DianZan = 1 to "点赞" + public val DianZan: Kind = 1 to "点赞" @JvmStatic - val QinQin = 7 to "亲亲" + public val QinQin: Kind = 7 to "亲亲" @JvmStatic - val YaoWan = 8 to "药丸" + public val YaoWan: Kind = 8 to "药丸" @JvmStatic - val values: Array = arrayOf( + public val values: Array = arrayOf( LiuLian, PingDiGuo, ChaoPiao, LueLueLue, ZhuTou, BianBian, ZhaDan, AiXin, HaHa, DianZan, QinQin, YaoWan ) @@ -249,14 +248,14 @@ data class VipFace internal constructor( * * @see Image 查看图片相关信息 */ -sealed class FlashImage : MessageContent, HummerMessage(), CodableMessage { - companion object Key : Message.Key { +public sealed class FlashImage : MessageContent, HummerMessage(), CodableMessage { + public companion object Key : Message.Key { /** * 将普通图片转换为闪照. */ @JvmStatic @JvmName("from") - operator fun invoke(image: Image): FlashImage { + public operator fun invoke(image: Image): FlashImage { return when (image) { is GroupImage -> GroupFlashImage(image) @@ -272,18 +271,18 @@ sealed class FlashImage : MessageContent, HummerMessage(), CodableMessage { */ @JvmStatic @JvmName("from") - operator fun invoke(imageId: String): FlashImage { + public operator fun invoke(imageId: String): FlashImage { return invoke(Image(imageId)) } - override val typeName: String + public override val typeName: String get() = "FlashImage" } /** * 闪照的内容图片, 即一个普通图片. */ - abstract val image: Image + public abstract val image: Image private var stringValue: String? = null get() { @@ -293,23 +292,24 @@ sealed class FlashImage : MessageContent, HummerMessage(), CodableMessage { } } - final override fun toString(): String = stringValue!! - override fun contentToString(): String = "[闪照]" + public final override fun toString(): String = stringValue!! + public override fun contentToString(): String = "[闪照]" } -inline fun Image.flash(): FlashImage = FlashImage(this) + +public inline fun Image.flash(): FlashImage = FlashImage(this) @JvmSynthetic -inline fun GroupImage.flash(): GroupFlashImage = FlashImage(this) as GroupFlashImage +public inline fun GroupImage.flash(): GroupFlashImage = FlashImage(this) as GroupFlashImage @JvmSynthetic -inline fun FriendImage.flash(): FriendFlashImage = FlashImage(this) as FriendFlashImage +public inline fun FriendImage.flash(): FriendFlashImage = FlashImage(this) as FriendFlashImage /** * @see FlashImage.invoke */ -data class GroupFlashImage(override val image: GroupImage) : FlashImage() { - companion object Key : Message.Key { - override val typeName: String +public data class GroupFlashImage(public override val image: GroupImage) : FlashImage() { + public companion object Key : Message.Key { + public override val typeName: String get() = "GroupFlashImage" } } @@ -317,9 +317,9 @@ data class GroupFlashImage(override val image: GroupImage) : FlashImage() { /** * @see FlashImage.invoke */ -data class FriendFlashImage(override val image: FriendImage) : FlashImage() { - companion object Key : Message.Key { - override val typeName: String +public data class FriendFlashImage(public override val image: FriendImage) : FlashImage() { + public companion object Key : Message.Key { + public override val typeName: String get() = "FriendFlashImage" } } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Image.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Image.kt index eeaf3fb86..566b797c1 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Image.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Image.kt @@ -61,9 +61,9 @@ import kotlin.jvm.JvmSynthetic * @see FlashImage 闪照 * @see Image.flash 转换普通图片为闪照 */ -expect interface Image : Message, MessageContent, CodableMessage { - companion object Key : Message.Key { - override val typeName: String +public expect interface Image : Message, MessageContent, CodableMessage { + public companion object Key : Message.Key { + public override val typeName: String } /** @@ -82,7 +82,7 @@ expect interface Image : Message, MessageContent, CodableMessage { * @see Image 使用 id 构造图片 * @see md5 得到图片文件 MD5 */ - val imageId: String + public val imageId: String /* 实现: final override fun toString(): String = _stringValue!! @@ -106,7 +106,7 @@ expect interface Image : Message, MessageContent, CodableMessage { * 在 Java 使用: `MessageUtils.calculateImageMd5(image)` */ @get:JvmName("calculateImageMd5") -val Image.md5: ByteArray +public val Image.md5: ByteArray get() = calculateImageMd5ByImageId(imageId) @@ -116,9 +116,9 @@ val Image.md5: ByteArray * [imageId] 形如 `/f8f1ab55-bf8e-4236-b55e-955848d7069f` (37 长度) 或 `/000000000-3814297509-BFB7027B9354B8F899A062061D74E206` (54 长度) */ // NotOnlineImage -abstract class FriendImage internal constructor() : AbstractImage() { // change to sealed in the future. - companion object Key : Message.Key { - override val typeName: String get() = "FriendImage" +public abstract class FriendImage internal constructor() : AbstractImage() { // change to sealed in the future. + public companion object Key : Message.Key { + public override val typeName: String get() = "FriendImage" } } @@ -129,9 +129,9 @@ abstract class FriendImage internal constructor() : AbstractImage() { // change * @see Image 查看更多说明 */ // CustomFace -abstract class GroupImage internal constructor() : AbstractImage() { // change to sealed in the future. - companion object Key : Message.Key { - override val typeName: String get() = "GroupImage" +public abstract class GroupImage internal constructor() : AbstractImage() { // change to sealed in the future. + public companion object Key : Message.Key { + public override val typeName: String get() = "GroupImage" } } @@ -142,7 +142,7 @@ abstract class GroupImage internal constructor() : AbstractImage() { // change t * @see FRIEND_IMAGE_ID_REGEX_2 */ // Java: MessageUtils.FRIEND_IMAGE_ID_REGEX_1 -val FRIEND_IMAGE_ID_REGEX_1 = Regex("""/[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}""") +public val FRIEND_IMAGE_ID_REGEX_1: Regex = Regex("""/[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}""") /** * 好友图片 ID 正则表达式 2 @@ -151,16 +151,17 @@ val FRIEND_IMAGE_ID_REGEX_1 = Regex("""/[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a * @see FRIEND_IMAGE_ID_REGEX_1 */ // Java: MessageUtils.FRIEND_IMAGE_ID_REGEX_2 -val FRIEND_IMAGE_ID_REGEX_2 = Regex("""/[0-9]*-[0-9]*-[0-9a-fA-F]{32}""") +public val FRIEND_IMAGE_ID_REGEX_2: Regex = Regex("""/[0-9]*-[0-9]*-[0-9a-fA-F]{32}""") /** * 群图片 ID 正则表达式 * * `{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.ext` */ -@Suppress("RegExpRedundantEscape") // This is required on Android +@Suppress("RegExpRedundantEscape") +// This is required on Android // Java: MessageUtils.GROUP_IMAGE_ID_REGEX -val GROUP_IMAGE_ID_REGEX = Regex("""\{[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\}\..{3,5}""") +public val GROUP_IMAGE_ID_REGEX: Regex = Regex("""\{[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\}\..{3,5}""") /** * 通过 [Image.imageId] 构造一个 [Image] 以便发送. @@ -175,7 +176,7 @@ val GROUP_IMAGE_ID_REGEX = Regex("""\{[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-f @Suppress("FunctionName", "DEPRECATION") @JsName("newImage") @JvmName("newImage") -fun Image(imageId: String): OfflineImage = when { +public fun Image(imageId: String): OfflineImage = when { imageId matches FRIEND_IMAGE_ID_REGEX_1 -> OfflineFriendImage(imageId) imageId matches FRIEND_IMAGE_ID_REGEX_2 -> OfflineFriendImage(imageId) imageId matches GROUP_IMAGE_ID_REGEX -> OfflineGroupImage(imageId) @@ -192,7 +193,7 @@ fun Image(imageId: String): OfflineImage = when { * @throws IllegalStateException 当无任何 [Bot] 在线时抛出 (因为无法获取相关协议) */ @JvmSynthetic -suspend fun Image.queryUrl(): String { +public suspend fun Image.queryUrl(): String { @Suppress("DEPRECATION") return when (this) { is ConstOriginUrlAware -> this.originUrl diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt index bc93e98f4..e0e14ea95 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt @@ -75,7 +75,7 @@ import kotlin.jvm.JvmSynthetic * * @see Contact.sendMessage 发送消息 */ -interface Message { // must be interface. Don't consider any changes. +public interface Message { // must be interface. Don't consider any changes. /** * 类型 Key. 由伴生对象实现, 表示一个 [Message] 对象的类型. * @@ -87,11 +87,11 @@ interface Message { // must be interface. Don't consider any changes. * * @param M 指代持有这个 Key 的消息类型 */ - interface Key { + public interface Key { /** * 此 [Key] 指代的 [Message] 类型名. 一般为 `class.simpleName`, 如 "QuoteReply", "PlainText" */ - val typeName: String + public val typeName: String } /** @@ -112,7 +112,7 @@ interface Message { // must be interface. Don't consider any changes. * @see plus `+` 操作符重载 */ @JvmSynthetic // in java they should use `plus` instead - fun followedBy(tail: Message): MessageChain = followedByImpl(tail) + public fun followedBy(tail: Message): MessageChain = followedByImpl(tail) /** * 得到包含 mirai 消息元素代码的, 易读的字符串. 如 `At(member) + "test"` 将转为 `"[mirai:at:qqId]test"` @@ -129,7 +129,7 @@ interface Message { // must be interface. Don't consider any changes. * * @see contentToString 转为最接近官方格式的字符串 */ - override fun toString(): String + public override fun toString(): String /** * 转为最接近官方格式的字符串. 如 `At(member) + "test"` 将转为 `"@群名片 test"`. @@ -145,7 +145,7 @@ interface Message { // must be interface. Don't consider any changes. * * @see toString 得到包含 mirai 消息元素代码的, 易读的字符串 */ - fun contentToString(): String + public fun contentToString(): String /** @@ -155,7 +155,7 @@ interface Message { // must be interface. Don't consider any changes. * - `this` 与 [another] 的 [contentToString] 相等 * - `this` 为 [another] 的所有 [MessageContent] 都 [相等][Message.equals] 且有同样的排列顺序. */ - /* final */ fun contentEquals(another: Message, ignoreCase: Boolean = false): Boolean = + public /* final */ fun contentEquals(another: Message, ignoreCase: Boolean = false): Boolean = contentEqualsImpl(another, ignoreCase) /** @@ -165,7 +165,7 @@ interface Message { // must be interface. Don't consider any changes. * - [contentToString] 与 [another] 相等 * - 若 `this` 为 [MessageChain], 则只包含 [MessageMetadata] 和 [PlainText] */ - /* final */ fun contentEquals(another: String, ignoreCase: Boolean = false): Boolean { + public /* final */ fun contentEquals(another: String, ignoreCase: Boolean = false): Boolean { if (!this.contentToString().equals(another, ignoreCase = ignoreCase)) return false return when (this) { is SingleMessage -> true @@ -175,44 +175,45 @@ interface Message { // must be interface. Don't consider any changes. } /** 将 [another] 按顺序连接到这个消息的尾部. */ - /* final */ operator fun plus(another: MessageChain): MessageChain = this + another as Message + public /* final */ operator fun plus(another: MessageChain): MessageChain = this + another as Message /** 将 [another] 按顺序连接到这个消息的尾部. */ - /* final */ operator fun plus(another: Message): MessageChain = this.followedBy(another) + public /* final */ operator fun plus(another: Message): MessageChain = this.followedBy(another) /** 将 [another] 连接到这个消息的尾部. */ - /* final */ operator fun plus(another: SingleMessage): MessageChain = this.followedBy(another) + public /* final */ operator fun plus(another: SingleMessage): MessageChain = this.followedBy(another) /** 将 [another] 作为 [PlainText] 连接到这个消息的尾部. */ - /* final */ operator fun plus(another: String): MessageChain = this.followedBy(another.toMessage()) + public /* final */ operator fun plus(another: String): MessageChain = this.followedBy(another.toMessage()) /** 将 [another] 作为 [PlainText] 连接到这个消息的尾部. */ - /* final */ operator fun plus(another: CharSequence): MessageChain = this.followedBy(another.toString().toMessage()) + public /* final */ operator fun plus(another: CharSequence): MessageChain = + this.followedBy(another.toString().toMessage()) /** 将 [another] 按顺序连接到这个消息的尾部. */ - /* final */ operator fun plus(another: Iterable): MessageChain = + public /* final */ operator fun plus(another: Iterable): MessageChain = another.fold(this, Message::plus).asMessageChain() /** 将 [another] 按顺序连接到这个消息的尾部. */ @JvmName("plusIterableString") - /* final */ operator fun plus(another: Iterable): MessageChain = + public /* final */ operator fun plus(another: Iterable): MessageChain = another.fold(this, Message::plus).asMessageChain() /** 将 [another] 按顺序连接到这个消息的尾部. */ - /* final */ operator fun plus(another: Sequence): MessageChain = + public /* final */ operator fun plus(another: Sequence): MessageChain = another.fold(this, Message::plus).asMessageChain() } @MiraiExperimentalAPI @JvmSynthetic -suspend inline operator fun Message.plus(another: Flow): MessageChain = +public suspend inline operator fun Message.plus(another: Flow): MessageChain = another.fold(this) { acc, it -> acc + it }.asMessageChain() /** * [Message.contentToString] 的捷径 */ @get:JvmSynthetic -inline val Message.content: String +public inline val Message.content: String get() = contentToString() @@ -225,7 +226,7 @@ inline val Message.content: String * - [PlainText] 长度为 0 * - [MessageChain] 所有元素都满足 [isContentEmpty] */ -fun Message.isContentEmpty(): Boolean { +public fun Message.isContentEmpty(): Boolean { return when (this) { is MessageMetadata -> true is PlainText -> this.content.isEmpty() @@ -234,9 +235,9 @@ fun Message.isContentEmpty(): Boolean { } } -inline fun Message.isContentNotEmpty(): Boolean = !this.isContentEmpty() +public inline fun Message.isContentNotEmpty(): Boolean = !this.isContentEmpty() -inline fun Message.isPlain(): Boolean { +public inline fun Message.isPlain(): Boolean { contract { returns(true) implies (this@isPlain is PlainText) returns(false) implies (this@isPlain !is PlainText) @@ -244,7 +245,7 @@ inline fun Message.isPlain(): Boolean { return this is PlainText } -inline fun Message.isNotPlain(): Boolean { +public inline fun Message.isNotPlain(): Boolean { contract { returns(false) implies (this@isNotPlain is PlainText) returns(true) implies (this@isNotPlain !is PlainText) @@ -256,7 +257,7 @@ inline fun Message.isNotPlain(): Boolean { * 将此消息元素按顺序重复 [count] 次. */ // inline: for future removal -inline fun Message.repeat(count: Int): MessageChain { +public inline fun Message.repeat(count: Int): MessageChain { if (this is ConstrainSingle<*>) { // fast-path return this.asMessageChain() @@ -272,26 +273,26 @@ inline fun Message.repeat(count: Int): MessageChain { * 将此消息元素按顺序重复 [count] 次. */ @JvmSynthetic -inline operator fun Message.times(count: Int): MessageChain = this.repeat(count) +public inline operator fun Message.times(count: Int): MessageChain = this.repeat(count) /** * 单个消息元素. 与之相对的是 [MessageChain], 是多个 [SingleMessage] 的集合. */ -interface SingleMessage : Message { +public interface SingleMessage : Message { @PlannedRemoval("1.2.0") @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) - fun length(): Int = this.toString().length + public fun length(): Int = this.toString().length @PlannedRemoval("1.2.0") @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) - fun charAt(index: Int): Char = this.toString()[index] + public fun charAt(index: Int): Char = this.toString()[index] @PlannedRemoval("1.2.0") @JvmSynthetic @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) - fun subSequence(start: Int, end: Int): CharSequence = this.toString().subSequence(start, end) + public fun subSequence(start: Int, end: Int): CharSequence = this.toString().subSequence(start, end) } /** @@ -307,7 +308,7 @@ interface SingleMessage : Message { * * @see ConstrainSingle 约束一个 [MessageChain] 中只存在这一种类型的元素 */ -interface MessageMetadata : SingleMessage { +public interface MessageMetadata : SingleMessage { /** * 返回空字符串 */ @@ -319,12 +320,12 @@ interface MessageMetadata : SingleMessage { * * 实现此接口的元素将会在连接时自动处理替换. */ -interface ConstrainSingle : MessageMetadata { +public interface ConstrainSingle : MessageMetadata { /** * 用于判断是否为同一种元素的 [Key] * @see Key 查看更多信息 */ - val key: Key + public val key: Key } /** @@ -341,17 +342,17 @@ interface ConstrainSingle : MessageMetadata { * @see ForwardMessage 合并转发 * @see Voice 语音 */ -interface MessageContent : SingleMessage +public interface MessageContent : SingleMessage /** * 将 [this] 发送给指定联系人 */ @JvmSynthetic @Suppress("UNCHECKED_CAST") -suspend inline fun MessageChain.sendTo(contact: C): MessageReceipt = +public suspend inline fun MessageChain.sendTo(contact: C): MessageReceipt = contact.sendMessage(this) as MessageReceipt @JvmSynthetic @Suppress("UNCHECKED_CAST") -suspend inline fun Message.sendTo(contact: C): MessageReceipt = +public suspend inline fun Message.sendTo(contact: C): MessageReceipt = contact.sendMessage(this) as MessageReceipt diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt index e460ad1d0..936e118b2 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt @@ -50,11 +50,11 @@ import kotlin.reflect.KProperty * @see flatten 扁平化 */ @Suppress("FunctionName", "DeprecatedCallableAddReplaceWith", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") -interface MessageChain : Message, List, RandomAccess { +public interface MessageChain : Message, List, RandomAccess { /** * 元素数量. [EmptyMessageChain] 不参加计数. */ - override val size: Int + public override val size: Int /** * 获取第一个类型为 [key] 的 [Message] 实例. 若不存在此实例, 返回 `null` @@ -77,7 +77,7 @@ interface MessageChain : Message, List, RandomAccess { * @see MessageChain.getOrFail 在找不到此类型的元素时抛出 [NoSuchElementException] */ @JvmName("first") - operator fun get(key: Message.Key): M? = firstOrNull(key) + public operator fun get(key: Message.Key): M? = firstOrNull(key) /** * 遍历每一个有内容的消息, 即 [At], [AtAll], [PlainText], [Image], [Face] 等 @@ -85,7 +85,7 @@ interface MessageChain : Message, List, RandomAccess { */ @JvmName("forEachContent") @JavaFriendlyAPI - fun __forEachContentForJava__(block: (Message) -> Unit) = this.forEachContent(block) + public fun __forEachContentForJava__(block: (Message) -> Unit): Unit = this.forEachContent(block) @PlannedRemoval("1.2.0") @JvmName("firstOrNull") @@ -94,7 +94,7 @@ interface MessageChain : Message, List, RandomAccess { ReplaceWith("get(key)"), level = DeprecationLevel.ERROR ) - fun getOrNull(key: Message.Key): M? = get(key) + public fun getOrNull(key: Message.Key): M? = get(key) } // region accessors @@ -105,7 +105,7 @@ interface MessageChain : Message, List, RandomAccess { * @param key 由各个类型消息的伴生对象持有. 如 [PlainText.Key] */ @JvmOverloads -inline fun MessageChain.getOrFail( +public inline fun MessageChain.getOrFail( key: Message.Key, crossinline lazyMessage: (key: Message.Key) -> String = { key.typeName } ): M = firstOrNull(key) ?: throw NoSuchElementException(lazyMessage(key)) @@ -115,7 +115,7 @@ inline fun MessageChain.getOrFail( * 遍历每一个 [消息内容][MessageContent] */ @JvmSynthetic -inline fun MessageChain.forEachContent(block: (MessageContent) -> Unit) { +public inline fun MessageChain.forEachContent(block: (MessageContent) -> Unit) { for (element in this) { if (element !is MessageMetadata) { check(element is MessageContent) { "internal error: Message must be either MessageMetaData or MessageContent" } @@ -128,7 +128,7 @@ inline fun MessageChain.forEachContent(block: (MessageContent) -> Unit) { * 如果每一个 [消息内容][MessageContent] 都满足 [block], 返回 `true` */ @JvmSynthetic -inline fun MessageChain.allContent(block: (MessageContent) -> Boolean): Boolean { +public inline fun MessageChain.allContent(block: (MessageContent) -> Boolean): Boolean { this.forEach { if (it !is MessageMetadata) { check(it is MessageContent) { "internal error: Message must be either MessageMetaData or MessageContent" } @@ -142,7 +142,7 @@ inline fun MessageChain.allContent(block: (MessageContent) -> Boolean): Boolean * 如果每一个 [消息内容][MessageContent] 都不满足 [block], 返回 `true` */ @JvmSynthetic -inline fun MessageChain.noneContent(block: (MessageContent) -> Boolean): Boolean { +public inline fun MessageChain.noneContent(block: (MessageContent) -> Boolean): Boolean { this.forEach { if (it !is MessageMetadata) { check(it is MessageContent) { "internal error: Message must be either MessageMetaData or MessageContent" } @@ -157,20 +157,20 @@ inline fun MessageChain.noneContent(block: (MessageContent) -> Boolean): Boolean * 获取第一个 [M] 类型的 [Message] 实例 */ @JvmSynthetic -inline fun MessageChain.firstIsInstanceOrNull(): M? = this.firstOrNull { it is M } as M? +public inline fun MessageChain.firstIsInstanceOrNull(): M? = this.firstOrNull { it is M } as M? /** * 获取第一个 [M] 类型的 [Message] 实例 * @throws [NoSuchElementException] 如果找不到该类型的实例 */ @JvmSynthetic -inline fun MessageChain.firstIsInstance(): M = this.first { it is M } as M +public inline fun MessageChain.firstIsInstance(): M = this.first { it is M } as M /** * 判断 [this] 中是否存在 [Message] 的实例 */ @JvmSynthetic -inline fun MessageChain.anyIsInstance(): Boolean = this.any { it is M } +public inline fun MessageChain.anyIsInstance(): Boolean = this.any { it is M } /** @@ -178,7 +178,7 @@ inline fun MessageChain.anyIsInstance(): Boolean = this.an */ @JvmSynthetic @Suppress("UNCHECKED_CAST") -fun MessageChain.firstOrNull(key: Message.Key): M? = firstOrNullImpl(key) +public fun MessageChain.firstOrNull(key: Message.Key): M? = firstOrNullImpl(key) /** * 获取第一个 [M] 类型的 [Message] 实例 @@ -186,7 +186,7 @@ fun MessageChain.firstOrNull(key: Message.Key): M? = firstOrNul */ @JvmSynthetic @Suppress("UNCHECKED_CAST") -inline fun MessageChain.first(key: Message.Key): M = +public inline fun MessageChain.first(key: Message.Key): M = firstOrNull(key) ?: throw NoSuchElementException("Message type ${key.typeName} not found in chain $this") /** @@ -194,7 +194,7 @@ inline fun MessageChain.first(key: Message.Key): M = */ @JvmSynthetic @Suppress("UNCHECKED_CAST") -inline fun MessageChain.any(key: Message.Key): Boolean = firstOrNull(key) != null +public inline fun MessageChain.any(key: Message.Key): Boolean = firstOrNull(key) != null // endregion accessors @@ -212,7 +212,7 @@ inline fun MessageChain.any(key: Message.Key): Boolean = firstO * val image: Image by message */ @JvmSynthetic -inline operator fun MessageChain.getValue(thisRef: Any?, property: KProperty<*>): T = +public inline operator fun MessageChain.getValue(thisRef: Any?, property: KProperty<*>): T = this.firstIsInstance() /** @@ -220,9 +220,9 @@ inline operator fun MessageChain.getValue(thisRef: Any?, p * @see orNull */ @Suppress("NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS") -inline class OrNullDelegate @PublishedApi internal constructor(@JvmField @PublishedApi internal val value: Any?) { +public inline class OrNullDelegate @PublishedApi internal constructor(@JvmField @PublishedApi internal val value: Any?) { @Suppress("UNCHECKED_CAST") - operator fun getValue(thisRef: Any?, property: KProperty<*>): R = value as R + public operator fun getValue(thisRef: Any?, property: KProperty<*>): R = value as R } /** @@ -238,7 +238,7 @@ inline class OrNullDelegate @PublishedApi internal constructor(@JvmField * @see orElse 提供一个不存在则使用默认值的委托 */ @JvmSynthetic -inline fun MessageChain.orNull(): OrNullDelegate = +public inline fun MessageChain.orNull(): OrNullDelegate = OrNullDelegate(this.firstIsInstanceOrNull()) /** @@ -255,7 +255,7 @@ inline fun MessageChain.orNull(): OrNullDelegate = */ @Suppress("RemoveExplicitTypeArguments") @JvmSynthetic -inline fun MessageChain.orElse( +public inline fun MessageChain.orElse( lazyDefault: () -> R ): OrNullDelegate = OrNullDelegate(this.firstIsInstanceOrNull() ?: lazyDefault()) @@ -268,7 +268,7 @@ inline fun MessageChain.orElse( * 返回一个包含 [messages] 所有元素的消息链, 保留顺序. */ @JvmName("newChain") -inline fun messageChainOf(vararg messages: Message): MessageChain = messages.asMessageChain() +public inline fun messageChainOf(vararg messages: Message): MessageChain = messages.asMessageChain() /** * 得到包含 [this] 的 [MessageChain]. @@ -280,7 +280,7 @@ inline fun messageChainOf(vararg messages: Message): MessageChain = messages.asM @JvmName("newChain") @JsName("newChain") @Suppress("UNCHECKED_CAST") -fun Message.asMessageChain(): MessageChain = when (this) { +public fun Message.asMessageChain(): MessageChain = when (this) { is MessageChain -> this is CombinedMessage -> (this as Iterable).asMessageChain() else -> SingleMessageChainImpl(this as SingleMessage) @@ -290,13 +290,13 @@ fun Message.asMessageChain(): MessageChain = when (this) { * 直接将 [this] 委托为一个 [MessageChain] */ @JvmSynthetic -fun SingleMessage.asMessageChain(): MessageChain = SingleMessageChainImpl(this) +public fun SingleMessage.asMessageChain(): MessageChain = SingleMessageChainImpl(this) /** * 直接将 [this] 委托为一个 [MessageChain] */ @JvmSynthetic -fun Collection.asMessageChain(): MessageChain = +public fun Collection.asMessageChain(): MessageChain = MessageChainImplByCollection(this.constrainSingleMessages()) /** @@ -305,48 +305,48 @@ fun Collection.asMessageChain(): MessageChain = @JvmSynthetic @JvmName("newChain1") // @JsName("newChain") -fun Array.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) +public fun Array.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) @JvmSynthetic @JvmName("newChain2") -fun Array.asMessageChain(): MessageChain = MessageChainImplBySequence(this.asSequence()) +public fun Array.asMessageChain(): MessageChain = MessageChainImplBySequence(this.asSequence()) /** * 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain] */ @JvmName("newChain") // @JsName("newChain") -fun Collection.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) +public fun Collection.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) /** * 直接将 [this] 委托为一个 [MessageChain] */ @JvmSynthetic -fun Iterable.asMessageChain(): MessageChain = +public fun Iterable.asMessageChain(): MessageChain = MessageChainImplByCollection(this.constrainSingleMessages()) @JvmSynthetic -inline fun MessageChain.asMessageChain(): MessageChain = this // 避免套娃 +public inline fun MessageChain.asMessageChain(): MessageChain = this // 避免套娃 /** * 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain] */ @JvmName("newChain") // @JsName("newChain") -fun Iterable.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) +public fun Iterable.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) /** * 直接将 [this] 委托为一个 [MessageChain] */ @JvmSynthetic -fun Sequence.asMessageChain(): MessageChain = MessageChainImplBySequence(this) +public fun Sequence.asMessageChain(): MessageChain = MessageChainImplBySequence(this) /** * 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain] */ @JvmName("newChain") // @JsName("newChain") -fun Sequence.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) +public fun Sequence.asMessageChain(): MessageChain = MessageChainImplBySequence(this.flatten()) /** @@ -355,7 +355,7 @@ fun Sequence.asMessageChain(): MessageChain = MessageChainImplBySequenc */ @Suppress("FunctionName") @JvmName("newChain") -fun _____newChain______(messages: String): MessageChain { +public fun _____newChain______(messages: String): MessageChain { return messages.toMessage().asMessageChain() } @@ -371,12 +371,12 @@ fun _____newChain______(messages: String): MessageChain { * A <- B <- C <- D <- E <- F <- G * ``` */ -inline fun Iterable.flatten(): Sequence = asSequence().flatten() +public inline fun Iterable.flatten(): Sequence = asSequence().flatten() // @JsName("flatten1") @JvmName("flatten1")// avoid platform declare clash @JvmSynthetic -inline fun Iterable.flatten(): Sequence = this.asSequence() // fast path +public inline fun Iterable.flatten(): Sequence = this.asSequence() // fast path /** * 扁平化消息序列. @@ -390,16 +390,16 @@ inline fun Iterable.flatten(): Sequence = this.asS * A <- B <- C <- D <- E <- F <- G * ``` */ -inline fun Sequence.flatten(): Sequence = flatMap { it.flatten() } +public inline fun Sequence.flatten(): Sequence = flatMap { it.flatten() } @JsName("flatten1") // avoid platform declare clash @JvmName("flatten1") @JvmSynthetic -inline fun Sequence.flatten(): Sequence = this // fast path +public inline fun Sequence.flatten(): Sequence = this // fast path -inline fun Array.flatten(): Sequence = this.asSequence().flatten() +public inline fun Array.flatten(): Sequence = this.asSequence().flatten() -inline fun Array.flatten(): Sequence = this.asSequence() // fast path +public inline fun Array.flatten(): Sequence = this.asSequence() // fast path /** * 扁平化 [Message] @@ -409,7 +409,7 @@ inline fun Array.flatten(): Sequence = this.as * - `[MessageChain](E, F, G)` 返回 `E <- F <- G` * - 其他: 返回 `sequenceOf(this)` */ -fun Message.flatten(): Sequence { +public fun Message.flatten(): Sequence { return when (this) { is MessageChain -> this.asSequence() is CombinedMessage -> this.asSequence() // already constrained single. @@ -418,7 +418,7 @@ fun Message.flatten(): Sequence { } @JvmSynthetic // make Java user happier with less methods -inline fun MessageChain.flatten(): Sequence = this.asSequence() // fast path +public inline fun MessageChain.flatten(): Sequence = this.asSequence() // fast path // endregion converters @@ -426,14 +426,14 @@ inline fun MessageChain.flatten(): Sequence = this.asSequence() / /** * 不含任何元素的 [MessageChain]. */ -object EmptyMessageChain : MessageChain, Iterator, List by emptyList() { +public object EmptyMessageChain : MessageChain, Iterator, List by emptyList() { - override val size: Int get() = 0 - override fun toString(): String = "" - override fun contentToString(): String = "" - override fun equals(other: Any?): Boolean = other === this + public override val size: Int get() = 0 + public override fun toString(): String = "" + public override fun contentToString(): String = "" + public override fun equals(other: Any?): Boolean = other === this - override fun iterator(): Iterator = this - override fun hasNext(): Boolean = false - override fun next(): SingleMessage = throw NoSuchElementException("EmptyMessageChain is empty.") + public override fun iterator(): Iterator = this + public override fun hasNext(): Boolean = false + public override fun next(): SingleMessage = throw NoSuchElementException("EmptyMessageChain is empty.") } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChainBuilder.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChainBuilder.kt index 1a49bfa06..0fca9f920 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChainBuilder.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChainBuilder.kt @@ -23,7 +23,7 @@ import kotlin.jvm.JvmSynthetic * @see MessageChainBuilder */ @JvmSynthetic -inline fun buildMessageChain(block: MessageChainBuilder.() -> Unit): MessageChain { +public inline fun buildMessageChain(block: MessageChainBuilder.() -> Unit): MessageChain { return MessageChainBuilder().apply(block).asMessageChain() } @@ -33,7 +33,7 @@ inline fun buildMessageChain(block: MessageChainBuilder.() -> Unit): MessageChai * @see MessageChainBuilder */ @JvmSynthetic -inline fun buildMessageChain(initialSize: Int, block: MessageChainBuilder.() -> Unit): MessageChain { +public inline fun buildMessageChain(initialSize: Int, block: MessageChainBuilder.() -> Unit): MessageChain { return MessageChainBuilder(initialSize).apply(block).asMessageChain() } @@ -47,19 +47,19 @@ inline fun buildMessageChain(initialSize: Int, block: MessageChainBuilder.() -> * @see buildMessageChain 推荐使用 * @see asMessageChain 完成构建 */ -open class MessageChainBuilder private constructor( +public open class MessageChainBuilder private constructor( private val container: MutableList ) : MutableList by container, Appendable { - constructor() : this(mutableListOf()) - constructor(initialSize: Int) : this(ArrayList(initialSize)) + public constructor() : this(mutableListOf()) + public constructor(initialSize: Int) : this(ArrayList(initialSize)) - final override fun add(element: SingleMessage): Boolean { + public final override fun add(element: SingleMessage): Boolean { checkBuilt() flushCache() return addAndCheckConstrainSingle(element) } - fun add(element: Message): Boolean { + public fun add(element: Message): Boolean { checkBuilt() flushCache() @Suppress("UNCHECKED_CAST") @@ -71,27 +71,27 @@ open class MessageChainBuilder private constructor( } } - final override fun addAll(elements: Collection): Boolean { + public final override fun addAll(elements: Collection): Boolean { checkBuilt() flushCache() return addAll(elements.flatten()) } - fun addAll(elements: Iterable): Boolean { + public fun addAll(elements: Iterable): Boolean { checkBuilt() flushCache() return addAll(elements.flatten()) } @JvmName("addAllFlatten") // erased generic type cause declaration clash - fun addAll(elements: Iterable): Boolean { + public fun addAll(elements: Iterable): Boolean { checkBuilt() flushCache() return addAll(elements.flatten()) } @JvmSynthetic - operator fun Message.unaryPlus() { + public operator fun Message.unaryPlus() { checkBuilt() flushCache() add(this) @@ -99,91 +99,91 @@ open class MessageChainBuilder private constructor( @JvmSynthetic - operator fun String.unaryPlus() { + public operator fun String.unaryPlus() { checkBuilt() add(this) } @JvmSynthetic // they should use add - operator fun plusAssign(plain: String) { + public operator fun plusAssign(plain: String) { checkBuilt() withCache { append(plain) } } @JvmSynthetic // they should use add - operator fun plusAssign(message: Message) { + public operator fun plusAssign(message: Message) { checkBuilt() flushCache() this.add(message) } @JvmSynthetic // they should use add - operator fun plusAssign(message: SingleMessage) { // avoid resolution ambiguity + public operator fun plusAssign(message: SingleMessage) { // avoid resolution ambiguity checkBuilt() flushCache() this.add(message) } - fun add(plain: String) { + public fun add(plain: String) { checkBuilt() withCache { append(plain) } } @JvmSynthetic // they should use add - operator fun plusAssign(charSequence: CharSequence) { + public operator fun plusAssign(charSequence: CharSequence) { checkBuilt() withCache { append(charSequence) } } - final override fun append(value: Char): MessageChainBuilder = withCache { append(value) } - final override fun append(value: CharSequence?): MessageChainBuilder = withCache { append(value) } - final override fun append(value: CharSequence?, startIndex: Int, endIndex: Int): MessageChainBuilder = + public final override fun append(value: Char): MessageChainBuilder = withCache { append(value) } + public final override fun append(value: CharSequence?): MessageChainBuilder = withCache { append(value) } + public final override fun append(value: CharSequence?, startIndex: Int, endIndex: Int): MessageChainBuilder = withCache { append(value, startIndex, endIndex) } - fun append(message: Message): MessageChainBuilder = apply { add(message) } - fun append(message: SingleMessage): MessageChainBuilder = apply { add(message) } + public fun append(message: Message): MessageChainBuilder = apply { add(message) } + public fun append(message: SingleMessage): MessageChainBuilder = apply { add(message) } // avoid resolution to extensions - fun asMessageChain(): MessageChain { + public fun asMessageChain(): MessageChain { built = true this.flushCache() return MessageChainImplByCollection(this) // fast-path, no need to constrain } /** 同 [asMessageChain] */ - fun build(): MessageChain = asMessageChain() + public fun build(): MessageChain = asMessageChain() /** * 将所有已有元素引用复制到一个新的 [MessageChainBuilder] */ - fun copy(): MessageChainBuilder { + public fun copy(): MessageChainBuilder { return MessageChainBuilder(container.toMutableList()) } /////// // FOR IMMUTABLE SAFETY - final override fun remove(element: SingleMessage): Boolean { + public final override fun remove(element: SingleMessage): Boolean { checkBuilt() return container.remove(element) } - final override fun removeAll(elements: Collection): Boolean { + public final override fun removeAll(elements: Collection): Boolean { checkBuilt() return container.removeAll(elements) } - final override fun removeAt(index: Int): SingleMessage { + public final override fun removeAt(index: Int): SingleMessage { checkBuilt() return container.removeAt(index) } - final override fun clear() { + public final override fun clear() { checkBuilt() return container.clear() } - final override fun set(index: Int, element: SingleMessage): SingleMessage { + public final override fun set(index: Int, element: SingleMessage): SingleMessage { checkBuilt() return container.set(index, element) } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt index a4ad9dad4..b83fbdf6b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt @@ -63,17 +63,17 @@ import kotlin.jvm.JvmSynthetic * * @see buildMessageSource 构造一个 [OfflineMessageSource] */ -sealed class MessageSource : Message, MessageMetadata, ConstrainSingle { - companion object Key : Message.Key { +public sealed class MessageSource : Message, MessageMetadata, ConstrainSingle { + public companion object Key : Message.Key { override val typeName: String get() = "MessageSource" } - final override val key: Message.Key get() = Key + public final override val key: Message.Key get() = Key /** * 所属 [Bot] */ - abstract val bot: Bot + public abstract val bot: Bot /** * 消息 id (序列号). 在获取失败时 (概率很低) 为 `-1`. @@ -88,7 +88,7 @@ sealed class MessageSource : Message, MessageMetadata, ConstrainSingle { - override val typeName: String get() = "OnlineMessageSource" +public sealed class OnlineMessageSource : MessageSource() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource" } /** * 消息发送人. 可能为 [机器人][Bot] 或 [好友][Friend] 或 [群员][Member]. * 即类型必定为 [Bot], [Friend] 或 [Member] */ - abstract val sender: ContactOrBot + public abstract val sender: ContactOrBot /** * 消息发送目标. 可能为 [机器人][Bot] 或 [好友][Friend] 或 [群][Group]. * 即类型必定为 [Bot], [Friend] 或 [Group] */ - abstract val target: ContactOrBot + public abstract val target: ContactOrBot /** * 消息主体. 群消息时为 [Group]. 好友消息时为 [Friend], 临时消息为 [Member] * 不论是机器人接收的消息还是发送的消息, 此属性都指向机器人能进行回复的目标. */ - abstract val subject: Contact + public abstract val subject: Contact /* * 以下子类型仅是覆盖了 [target], [subject], [sender] 等的类型 @@ -190,91 +190,91 @@ sealed class OnlineMessageSource : MessageSource() { /** * 由 [机器人主动发送消息][Contact.sendMessage] 产生的 [MessageSource], 可通过 [MessageReceipt] 获得. */ - sealed class Outgoing : OnlineMessageSource() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Outgoing" + public sealed class Outgoing : OnlineMessageSource() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Outgoing" } - abstract override val sender: Bot - abstract override val target: Contact + public abstract override val sender: Bot + public abstract override val target: Contact - final override val fromId: Long get() = sender.id - final override val targetId: Long get() = target.id + public final override val fromId: Long get() = sender.id + public final override val targetId: Long get() = target.id - abstract class ToFriend : Outgoing() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Outgoing.ToFriend" + public abstract class ToFriend : Outgoing() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Outgoing.ToFriend" } - abstract override val target: Friend - final override val subject: Friend get() = target + public abstract override val target: Friend + public final override val subject: Friend get() = target // final override fun toString(): String = "OnlineMessageSource.ToFriend(target=${target.id})" } - abstract class ToTemp : Outgoing() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Outgoing.ToTemp" + public abstract class ToTemp : Outgoing() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Outgoing.ToTemp" } - abstract override val target: Member - val group: Group get() = target.group - final override val subject: Member get() = target + public abstract override val target: Member + public val group: Group get() = target.group + public final override val subject: Member get() = target } - abstract class ToGroup : Outgoing() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Outgoing.ToGroup" + public abstract class ToGroup : Outgoing() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Outgoing.ToGroup" } - abstract override val target: Group - final override val subject: Group get() = target + public abstract override val target: Group + public final override val subject: Group get() = target } } /** * 接收到的一条消息的 [MessageSource] */ - sealed class Incoming : OnlineMessageSource() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Incoming" + public sealed class Incoming : OnlineMessageSource() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Incoming" } - abstract override val sender: User + public abstract override val sender: User - final override val fromId: Long get() = sender.id - final override val targetId: Long get() = target.id + public final override val fromId: Long get() = sender.id + public final override val targetId: Long get() = target.id - abstract class FromFriend : Incoming() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Incoming.FromFriend" + public abstract class FromFriend : Incoming() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Incoming.FromFriend" } - abstract override val sender: Friend - final override val subject: Friend get() = sender - final override val target: Bot get() = sender.bot + public abstract override val sender: Friend + public final override val subject: Friend get() = sender + public final override val target: Bot get() = sender.bot // final override fun toString(): String = "OnlineMessageSource.FromFriend(from=${sender.id})" } - abstract class FromTemp : Incoming() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Incoming.FromTemp" + public abstract class FromTemp : Incoming() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Incoming.FromTemp" } - abstract override val sender: Member - inline val group: Group get() = sender.group - final override val subject: Member get() = sender - final override val target: Bot get() = sender.bot + public abstract override val sender: Member + public inline val group: Group get() = sender.group + public final override val subject: Member get() = sender + public final override val target: Bot get() = sender.bot } - abstract class FromGroup : Incoming() { - companion object Key : Message.Key { - override val typeName: String get() = "OnlineMessageSource.Incoming.FromGroup" + public abstract class FromGroup : Incoming() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OnlineMessageSource.Incoming.FromGroup" } - abstract override val sender: Member - final override val subject: Group get() = sender.group - final override val target: Group get() = group - inline val group: Group get() = sender.group + public abstract override val sender: Member + public final override val subject: Group get() = sender.group + public final override val target: Group get() = group + public inline val group: Group get() = sender.group } } } @@ -285,12 +285,12 @@ sealed class OnlineMessageSource : MessageSource() { * * @see buildMessageSource 构建一个 [OfflineMessageSource] */ -abstract class OfflineMessageSource : MessageSource() { - companion object Key : Message.Key { - override val typeName: String get() = "OfflineMessageSource" +public abstract class OfflineMessageSource : MessageSource() { + public companion object Key : Message.Key { + public override val typeName: String get() = "OfflineMessageSource" } - enum class Kind { + public enum class Kind { GROUP, FRIEND, TEMP @@ -299,14 +299,14 @@ abstract class OfflineMessageSource : MessageSource() { /** * 消息种类 */ - abstract val kind: Kind + public abstract val kind: Kind } /** * 判断是否是发送给群, 或从群接收的消息的消息源 */ // inline for future removal -inline fun MessageSource.isAboutGroup(): Boolean { +public inline fun MessageSource.isAboutGroup(): Boolean { return when (this) { is OnlineMessageSource -> subject is Group is OfflineMessageSource -> kind == OfflineMessageSource.Kind.GROUP @@ -316,7 +316,7 @@ inline fun MessageSource.isAboutGroup(): Boolean { /** * 判断是否是发送给临时会话, 或从临时会话接收的消息的消息源 */ -inline fun MessageSource.isAboutTemp(): Boolean { +public inline fun MessageSource.isAboutTemp(): Boolean { return when (this) { is OnlineMessageSource -> subject is Member is OfflineMessageSource -> kind == OfflineMessageSource.Kind.TEMP @@ -327,7 +327,7 @@ inline fun MessageSource.isAboutTemp(): Boolean { * 判断是否是发送给好友, 或从好友接收的消息的消息源 */ // inline for future removal -inline fun MessageSource.isAboutFriend(): Boolean { +public inline fun MessageSource.isAboutFriend(): Boolean { return when (this) { is OnlineMessageSource -> subject !is Group && subject !is Member is OfflineMessageSource -> kind == OfflineMessageSource.Kind.FRIEND @@ -339,14 +339,14 @@ inline fun MessageSource.isAboutFriend(): Boolean { * @see QuoteReply */ @JvmSynthetic -inline fun MessageSource.quote(): QuoteReply = QuoteReply(this) +public inline fun MessageSource.quote(): QuoteReply = QuoteReply(this) /** * 引用这条消息. 仅从服务器接收的消息 (即来自 [MessageEvent]) 才可以通过这个方式被引用. * @see QuoteReply */ @JvmSynthetic -inline fun MessageChain.quote(): QuoteReply = QuoteReply(this.source) +public inline fun MessageChain.quote(): QuoteReply = QuoteReply(this.source) /** * 撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息. @@ -364,7 +364,7 @@ inline fun MessageChain.quote(): QuoteReply = QuoteReply(this.source) * @see Bot.recall */ @JvmSynthetic -suspend inline fun MessageSource.recall() = bot.recall(this) +public suspend inline fun MessageSource.recall(): Unit = bot.recall(this) /** * 在一段时间后撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息. @@ -378,7 +378,7 @@ suspend inline fun MessageSource.recall() = bot.recall(this) * @see Bot.recall */ @JvmSynthetic -inline fun MessageSource.recallIn( +public inline fun MessageSource.recallIn( timeMillis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext ): Job = bot.recallIn(this, timeMillis, coroutineContext) @@ -393,7 +393,7 @@ inline fun MessageSource.recallIn( * @see MessageSource.id */ @get:JvmSynthetic -val MessageChain.id: Int +public val MessageChain.id: Int get() = this.source.id /** @@ -404,7 +404,7 @@ val MessageChain.id: Int * @see MessageSource.id */ @get:JvmSynthetic -val MessageChain.internalId: Int +public val MessageChain.internalId: Int get() = this.source.internalId /** @@ -415,7 +415,7 @@ val MessageChain.internalId: Int * @see MessageSource.id */ @get:JvmSynthetic -val MessageChain.time: Int +public val MessageChain.time: Int get() = this.source.time /** @@ -426,7 +426,7 @@ val MessageChain.time: Int * @see MessageSource.id */ @get:JvmSynthetic -val MessageChain.bot: Bot +public val MessageChain.bot: Bot get() = this.source.bot /** @@ -435,7 +435,7 @@ val MessageChain.bot: Bot * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取消息源, 否则将抛出异常 [NoSuchElementException] */ @get:JvmSynthetic -val MessageChain.source: MessageSource +public val MessageChain.source: MessageSource get() = this.getOrFail(MessageSource) /** @@ -454,7 +454,7 @@ val MessageChain.source: MessageSource * @see Bot.recall */ @JvmSynthetic -suspend inline fun MessageChain.recall() = this.source.recall() +public suspend inline fun MessageChain.recall(): Unit = this.source.recall() /** * 在一段时间后撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息. @@ -472,7 +472,7 @@ suspend inline fun MessageChain.recall() = this.source.recall() * @see Bot.recall */ @JvmSynthetic -inline fun MessageChain.recallIn( +public inline fun MessageChain.recallIn( millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext ): Job = source.recallIn(millis, coroutineContext) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSourceBuilder.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSourceBuilder.kt index bad6d9210..16a257450 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSourceBuilder.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSourceBuilder.kt @@ -28,7 +28,7 @@ import kotlin.jvm.JvmSynthetic * 将在线消息源转换为离线消息源. */ @JvmName("toOfflineMessageSource") -fun OnlineMessageSource.toOffline(): OfflineMessageSource = +public fun OnlineMessageSource.toOffline(): OfflineMessageSource = OfflineMessageSourceByOnline(this) /////////////// @@ -43,25 +43,25 @@ fun OnlineMessageSource.toOffline(): OfflineMessageSource = */ @MiraiExperimentalAPI @JvmName("copySource") -fun MessageSource.copyAmend( +public fun MessageSource.copyAmend( block: MessageSourceAmender.() -> Unit ): OfflineMessageSource = toMutableOffline().apply(block) /** * 仅于 [copyAmend] 中修改 [MessageSource] */ -interface MessageSourceAmender { - var kind: OfflineMessageSource.Kind - var fromUin: Long - var targetUin: Long - var id: Int - var time: Int - var internalId: Int +public interface MessageSourceAmender { + public var kind: OfflineMessageSource.Kind + public var fromUin: Long + public var targetUin: Long + public var id: Int + public var time: Int + public var internalId: Int - var originalMessage: MessageChain + public var originalMessage: MessageChain /** 从另一个 [MessageSource] 中复制 [id], [internalId], [time]*/ - fun metadataFrom(another: MessageSource) { + public fun metadataFrom(another: MessageSource) { this.id = another.id this.internalId = another.internalId this.time = another.time @@ -104,7 +104,7 @@ interface MessageSourceAmender { */ @JvmSynthetic @MiraiExperimentalAPI -fun Bot.buildMessageSource(block: MessageSourceBuilder.() -> Unit): MessageSource { +public fun Bot.buildMessageSource(block: MessageSourceBuilder.() -> Unit): MessageSource { val builder = MessageSourceBuilderImpl().apply(block) return constructMessageSource( builder.kind ?: error("You must call `Contact.sendTo(Contact)` when `buildMessageSource`"), @@ -120,7 +120,7 @@ fun Bot.buildMessageSource(block: MessageSourceBuilder.() -> Unit): MessageSourc /** * @see buildMessageSource */ -abstract class MessageSourceBuilder { +public abstract class MessageSourceBuilder { internal abstract var kind: OfflineMessageSource.Kind? internal abstract var fromUin: Long internal abstract var targetUin: Long @@ -132,22 +132,22 @@ abstract class MessageSourceBuilder { @PublishedApi internal val originalMessages: MessageChainBuilder = MessageChainBuilder() - fun time(from: MessageSource): MessageSourceBuilder = apply { this.time = from.time } - val now: Int get() = currentTimeSeconds.toInt() - fun time(value: Int) = apply { this.time = value } + public fun time(from: MessageSource): MessageSourceBuilder = apply { this.time = from.time } + public val now: Int get() = currentTimeSeconds.toInt() + public fun time(value: Int): MessageSourceBuilder = apply { this.time = value } - fun internalId(from: MessageSource): MessageSourceBuilder = apply { this.internalId = from.internalId } - fun internalId(value: Int): MessageSourceBuilder = apply { this.internalId = value } + public fun internalId(from: MessageSource): MessageSourceBuilder = apply { this.internalId = from.internalId } + public fun internalId(value: Int): MessageSourceBuilder = apply { this.internalId = value } - fun id(from: MessageSource): MessageSourceBuilder = apply { this.id = from.id } - fun id(value: Int): MessageSourceBuilder = apply { this.id = value } + public fun id(from: MessageSource): MessageSourceBuilder = apply { this.id = from.id } + public fun id(value: Int): MessageSourceBuilder = apply { this.id = value } /** * 从另一个 [MessageSource] 复制 [id], [time], [internalId]. * 这三个数据决定官方客户端能 "定位" 到的原消息 */ - fun metadata(from: MessageSource): MessageSourceBuilder = apply { + public fun metadata(from: MessageSource): MessageSourceBuilder = apply { id(from) internalId(from) time(from) @@ -156,7 +156,7 @@ abstract class MessageSourceBuilder { /** * 从另一个 [MessageSource] 复制所有信息, 包括消息内容. 不会清空已有消息. */ - fun allFrom(source: MessageSource): MessageSourceBuilder { + public fun allFrom(source: MessageSource): MessageSourceBuilder { this.kind = determineKind(source) this.id = source.id this.time = source.time @@ -171,34 +171,35 @@ abstract class MessageSourceBuilder { /** * 从另一个 [MessageSource] 复制 [消息内容][MessageSource.originalMessage]. 不会清空已有消息. */ - fun messagesFrom(source: MessageSource): MessageSourceBuilder = apply { + public fun messagesFrom(source: MessageSource): MessageSourceBuilder = apply { this.originalMessages.addAll(source.originalMessage) } - fun messages(messages: Iterable): MessageSourceBuilder = apply { + public fun messages(messages: Iterable): MessageSourceBuilder = apply { this.originalMessages.addAll(messages) } - fun messages(vararg message: Message): MessageSourceBuilder = apply { + public fun messages(vararg message: Message): MessageSourceBuilder = apply { for (it in message) { this.originalMessages.add(it) } } @JvmSynthetic - inline fun messages(block: MessageChainBuilder.() -> Unit): MessageSourceBuilder = apply { + public inline fun messages(block: MessageChainBuilder.() -> Unit): MessageSourceBuilder = apply { this.originalMessages.apply(block) } - fun clearMessages(): MessageSourceBuilder = apply { this.originalMessages.clear() } + public fun clearMessages(): MessageSourceBuilder = apply { this.originalMessages.clear() } /** * 设置 [发送人][this] 和 [发送目标][target], 并自动判断 [kind] */ @JvmSynthetic - abstract infix fun ContactOrBot.sendTo(target: ContactOrBot): MessageSourceBuilder + public abstract infix fun ContactOrBot.sendTo(target: ContactOrBot): MessageSourceBuilder - fun setSenderAndTarget(sender: ContactOrBot, target: ContactOrBot) = sender sendTo target + public fun setSenderAndTarget(sender: ContactOrBot, target: ContactOrBot): MessageSourceBuilder = + sender sendTo target } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/PlainText.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/PlainText.kt index 2be2b5ca0..b6ab0d2fc 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/PlainText.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/PlainText.kt @@ -23,8 +23,8 @@ import kotlin.jvm.JvmSynthetic * * 一般不需要主动构造 [PlainText], [Message] 可直接与 [String] 相加. Java 用户请使用 [Message.plus] */ -data class PlainText( - val content: String +public data class PlainText( + public val content: String ) : MessageContent { @PlannedRemoval("1.2.0") @@ -33,17 +33,17 @@ data class PlainText( level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("content") ) - val stringValue: String + public val stringValue: String get() = content @Suppress("unused") - constructor(charSequence: CharSequence) : this(charSequence.toString()) + public constructor(charSequence: CharSequence) : this(charSequence.toString()) - override fun toString(): String = content - override fun contentToString(): String = content + public override fun toString(): String = content + public override fun contentToString(): String = content - companion object Key : Message.Key { - override val typeName: String get() = "PlainText" + public companion object Key : Message.Key<PlainText> { + public override val typeName: String get() = "PlainText" } } @@ -52,4 +52,4 @@ data class PlainText( */ @JvmSynthetic @Suppress("NOTHING_TO_INLINE") -inline fun String.toMessage(): PlainText = PlainText(this) \ No newline at end of file +public inline fun String.toMessage(): PlainText = PlainText(this) \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt index a3acc16bf..c5c9cf9ad 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/QuoteReply.kt @@ -44,37 +44,37 @@ import kotlin.jvm.JvmSynthetic * * @see MessageSource 获取有关消息源的更多信息 */ -class QuoteReply(val source: MessageSource) : Message, MessageMetadata, ConstrainSingle<QuoteReply> { - companion object Key : Message.Key<QuoteReply> { - override val typeName: String +public class QuoteReply(public val source: MessageSource) : Message, MessageMetadata, ConstrainSingle<QuoteReply> { + public companion object Key : Message.Key<QuoteReply> { + public override val typeName: String get() = "QuoteReply" } - override val key: Message.Key<QuoteReply> get() = Key + public override val key: Message.Key<QuoteReply> get() = Key - override fun toString(): String = "[mirai:quote:${source.id},${source.internalId}]" - override fun equals(other: Any?): Boolean = other is QuoteReply && other.source == this.source - override fun hashCode(): Int = source.hashCode() + public override fun toString(): String = "[mirai:quote:${source.id},${source.internalId}]" + public override fun equals(other: Any?): Boolean = other is QuoteReply && other.source == this.source + public override fun hashCode(): Int = source.hashCode() } /** * @see MessageSource.bot */ @get:JvmSynthetic -inline val QuoteReply.bot: Bot +public inline val QuoteReply.bot: Bot get() = source.bot /** * 撤回引用的源消息 */ @JvmSynthetic -suspend inline fun QuoteReply.recallSource() = this.source.recall() +public suspend inline fun QuoteReply.recallSource(): Unit = this.source.recall() /** * 在一段时间后撤回引用的源消息 */ @JvmOverloads -inline fun QuoteReply.recallSourceIn( +public inline fun QuoteReply.recallSourceIn( millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext ): Job = this.source.recallIn(millis, coroutineContext) @@ -85,43 +85,43 @@ inline fun QuoteReply.recallSourceIn( @PlannedRemoval("1.3.0") @get:JvmSynthetic @Deprecated("use source.id for clearer semantics", ReplaceWith("source.id")) -inline val QuoteReply.id: Int +public inline val QuoteReply.id: Int get() = source.id @PlannedRemoval("1.3.0") @get:JvmSynthetic @Deprecated("use source.internalId for clearer semantics", ReplaceWith("source.internalId")) -inline val QuoteReply.internalId: Int +public inline val QuoteReply.internalId: Int get() = source.internalId @PlannedRemoval("1.3.0") @get:JvmSynthetic @Deprecated("use source.fromId for clearer semantics", ReplaceWith("source.fromId")) -inline val QuoteReply.fromId: Long +public inline val QuoteReply.fromId: Long get() = source.fromId @PlannedRemoval("1.3.0") @get:JvmSynthetic @Deprecated("use source.targetId for clearer semantics", ReplaceWith("source.targetId")) -inline val QuoteReply.targetId: Long +public inline val QuoteReply.targetId: Long get() = source.targetId @PlannedRemoval("1.3.0") @get:JvmSynthetic @Deprecated("use source.originalMessage for clearer semantics", ReplaceWith("source.originalMessage")) -inline val QuoteReply.originalMessage: MessageChain +public inline val QuoteReply.originalMessage: MessageChain get() = source.originalMessage @PlannedRemoval("1.3.0") @get:JvmSynthetic @Deprecated("use source.time for clearer semantics", ReplaceWith("source.time")) -inline val QuoteReply.time: Int +public inline val QuoteReply.time: Int get() = source.time @PlannedRemoval("1.3.0") @Deprecated("use recallSourceIn for clearer semantics", ReplaceWith("recallSourceIn(millis, coroutineContext)")) @JvmOverloads -inline fun QuoteReply.recallIn( +public inline fun QuoteReply.recallIn( millis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext ): Job = recallSourceIn(millis, coroutineContext) @@ -129,4 +129,4 @@ inline fun QuoteReply.recallIn( @PlannedRemoval("1.3.0") @Deprecated("use recallSource for clearer semantics", ReplaceWith("this.recallSource()")) @JvmSynthetic -suspend inline fun QuoteReply.recall() = recallSource() +public suspend inline fun QuoteReply.recall(): Unit = recallSource() diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt index 0c7299414..d2ade6908 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt @@ -29,31 +29,31 @@ import kotlin.jvm.JvmSynthetic * @see LightApp 小程序 (JSON) */ // not using sealed class for customized implementations -interface RichMessage : MessageContent { +public interface RichMessage : MessageContent { /** * **注意**: 富文本消息的 [RichMessage.contentEquals] 和 [RichMessage.toString] 都不稳定. 将来可能在没有任何警告的情况下改变格式. */ @MiraiExperimentalAPI - override fun contentToString(): String = this.content + public override fun contentToString(): String = this.content /** * 消息内容. 可为 JSON 文本或 XML 文本 */ - val content: String + public val content: String /** * 一些模板 * @suppress 此 API 不稳定, 可能在任意时刻被删除 */ @MiraiExperimentalAPI - companion object Templates : Message.Key<RichMessage> { + public companion object Templates : Message.Key<RichMessage> { /** * @suppress 此 API 不稳定, 可能在任意时刻被删除 */ @MiraiExperimentalAPI - fun share( + public fun share( url: String, title: String? = null, content: String? = null, @@ -93,12 +93,12 @@ interface RichMessage : MessageContent { * * @see ServiceMessage 服务消息 */ -data class LightApp(override val content: String) : RichMessage { - companion object Key : Message.Key<LightApp> { - override val typeName: String get() = "LightApp" +public data class LightApp(override val content: String) : RichMessage { + public companion object Key : Message.Key<LightApp> { + public override val typeName: String get() = "LightApp" } - override fun toString(): String = "[mirai:app:$content]" + public override fun toString(): String = "[mirai:app:$content]" } /** @@ -111,21 +111,24 @@ data class LightApp(override val content: String) : RichMessage { * * @see LightApp 小程序类型消息 */ -open class ServiceMessage(val serviceId: Int, final override val content: String) : RichMessage { - companion object Key : Message.Key<ServiceMessage> { - override val typeName: String get() = "ServiceMessage" +public open class ServiceMessage( + public val serviceId: Int, + public final override val content: String +) : RichMessage { + public companion object Key : Message.Key<ServiceMessage> { + public override val typeName: String get() = "ServiceMessage" } - final override fun toString(): String = "[mirai:service:$serviceId,$content]" + public final override fun toString(): String = "[mirai:service:$serviceId,$content]" - final override fun equals(other: Any?): Boolean { + public final override fun equals(other: Any?): Boolean { if (other == null) return false if (other::class != this::class) return false other as ServiceMessage return other.serviceId == this.serviceId && other.content == this.content } - final override fun hashCode(): Int { + public final override fun hashCode(): Int { var result = serviceId result = 31 * result + content.hashCode() return result @@ -148,40 +151,40 @@ commonElem=CommonElem#750141174 { @Suppress("DEPRECATION_ERROR") @JvmSynthetic @MiraiExperimentalAPI -inline fun buildXmlMessage(serviceId: Int, block: @XmlMessageDsl XmlMessageBuilder.() -> Unit): ServiceMessage = +public inline fun buildXmlMessage(serviceId: Int, block: @XmlMessageDsl XmlMessageBuilder.() -> Unit): ServiceMessage = ServiceMessage(serviceId, XmlMessageBuilder().apply(block).text) @MiraiExperimentalAPI @Target(CLASS, FUNCTION, TYPE) @DslMarker -annotation class XmlMessageDsl +public annotation class XmlMessageDsl /** * @suppress 此 API 不稳定 */ @MiraiExperimentalAPI @XmlMessageDsl -class XmlMessageBuilder( - var templateId: Int = 1, - var serviceId: Int = 1, - var action: String = "plugin", +public class XmlMessageBuilder( + public var templateId: Int = 1, + public var serviceId: Int = 1, + public var action: String = "plugin", /** * 一般为点击这条消息后跳转的链接 */ - var actionData: String = "", + public var actionData: String = "", /** * 摘要, 在官方客户端内消息列表中显示 */ - var brief: String = "", - var flag: Int = 3, - var url: String = "", // TODO: 2019/12/3 unknown - var sourceName: String = "", - var sourceIconURL: String = "" + public var brief: String = "", + public var flag: Int = 3, + public var url: String = "", // TODO: 2019/12/3 unknown + public var sourceName: String = "", + public var sourceIconURL: String = "" ) { @PublishedApi internal val builder: StringBuilder = StringBuilder() - val text: String + public val text: String get() = "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>" + "<msg templateID='$templateId' serviceID='$serviceId' action='$action' actionData='$actionData' brief='$brief' flag='$flag' url='$url'>" + builder.toString() + @@ -190,36 +193,38 @@ class XmlMessageBuilder( @JvmOverloads @XmlMessageDsl - inline fun item(bg: Int = 0, layout: Int = 4, block: @XmlMessageDsl ItemBuilder.() -> Unit) { + public inline fun item(bg: Int = 0, layout: Int = 4, block: @XmlMessageDsl ItemBuilder.() -> Unit) { builder.append(ItemBuilder(bg, layout).apply(block).text) } - fun source(name: String, iconURL: String = "") { + public fun source(name: String, iconURL: String = "") { sourceName = name sourceIconURL = iconURL } + @XmlMessageDsl - class ItemBuilder @PublishedApi internal constructor( - var bg: Int = 0, - var layout: Int = 4 + public class ItemBuilder @PublishedApi internal constructor( + public var bg: Int = 0, + public var layout: Int = 4 ) { @PublishedApi internal val builder: StringBuilder = StringBuilder() - val text: String get() = "<item bg='$bg' layout='$layout'>$builder</item>" + public val text: String get() = "<item bg='$bg' layout='$layout'>$builder</item>" - fun summary(text: String, color: String = "#000000") { + public fun summary(text: String, color: String = "#000000") { this.builder.append("<summary color='$color'>$text</summary>") } - fun title(text: String, size: Int = 25, color: String = "#000000") { + public fun title(text: String, size: Int = 25, color: String = "#000000") { this.builder.append("<title size='$size' color='$color'>$text</title>") } - fun picture(coverUrl: String) { + public fun picture(coverUrl: String) { this.builder.append("<picture cover='$coverUrl'/>") } } } + @MiraiExperimentalAPI internal class LongMessage internal constructor(content: String, val resId: String) : ServiceMessage(35, content) { companion object Key : Message.Key<LongMessage> { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Voice.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Voice.kt index 949d7e18b..0479d4276 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Voice.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Voice.kt @@ -6,16 +6,16 @@ import net.mamoe.mirai.utils.MiraiExperimentalAPI * 需要通过上传到服务器的消息,如语音、文件 */ @MiraiExperimentalAPI -abstract class PttMessage : MessageContent { +public abstract class PttMessage : MessageContent { - companion object Key : Message.Key<PttMessage> { - override val typeName: String + public companion object Key : Message.Key<PttMessage> { + public override val typeName: String get() = "PttMessage" } - abstract val fileName: String - abstract val md5: ByteArray - abstract val fileSize: Long + public abstract val fileName: String + public abstract val md5: ByteArray + public abstract val fileSize: Long } @@ -23,21 +23,22 @@ abstract class PttMessage : MessageContent { * 语音消息, 目前只支持接收和转发 */ @MiraiExperimentalAPI -class Voice( - override val fileName: String, - override val md5: ByteArray, - override val fileSize: Long, +public class Voice( + public override val fileName: String, + public override val md5: ByteArray, + public override val fileSize: Long, private val _url: String ) : PttMessage() { - companion object Key : Message.Key<Voice> { + public companion object Key : Message.Key<Voice> { override val typeName: String get() = "Voice" } - val url: String? - get() = if (_url.startsWith("http")) _url - else null + public val url: String? + get() = + if (_url.startsWith("http")) _url + else null private var _stringValue: String? = null get() = field ?: kotlin.run { @@ -45,7 +46,7 @@ class Voice( field } - override fun toString(): String = _stringValue!! + public override fun toString(): String = _stringValue!! - override fun contentToString(): String = "[语音]" + public override fun contentToString(): String = "[语音]" } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/imageDeprecated.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/imageDeprecated.kt index 3d68557df..919b98999 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/imageDeprecated.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/imageDeprecated.kt @@ -52,12 +52,12 @@ internal const val ONLINE_OFFLINE_DEPRECATION_MESSAGE = """ replaceWith = ReplaceWith("Image", "net.mamoe.mirai.message.data.Image") ) @Suppress("EXPOSED_SUPER_INTERFACE") -interface OnlineImage : Image, ConstOriginUrlAware { - companion object Key : Message.Key<OnlineImage> { - override val typeName: String get() = "OnlineImage" +public interface OnlineImage : Image, ConstOriginUrlAware { + public companion object Key : Message.Key<OnlineImage> { + public override val typeName: String get() = "OnlineImage" } - override val originUrl: String + public override val originUrl: String } /** @@ -72,9 +72,9 @@ interface OnlineImage : Image, ConstOriginUrlAware { level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("Image", "net.mamoe.mirai.message.data.Image") ) -interface OfflineImage : Image { - companion object Key : Message.Key<OfflineImage> { - override val typeName: String get() = "OfflineImage" +public interface OfflineImage : Image { + public companion object Key : Message.Key<OfflineImage> { + public override val typeName: String get() = "OfflineImage" } } @@ -84,7 +84,7 @@ interface OfflineImage : Image { level = DeprecationLevel.HIDDEN ) @JvmSynthetic -suspend fun OfflineImage.queryUrl(): String { +public suspend fun OfflineImage.queryUrl(): String { return Bot._instances.peekFirst()?.get()?.queryImageUrl(this) ?: error("No Bot available to query image url") } @@ -100,12 +100,14 @@ suspend fun OfflineImage.queryUrl(): String { replaceWith = ReplaceWith("Image", "net.mamoe.mirai.message.data.Image") ) @Serializable -data class OfflineGroupImage( - override val imageId: String +public data class OfflineGroupImage( + public override val imageId: String ) : GroupImage(), OfflineImage, DeferredOriginUrlAware { - override fun getUrl(bot: Bot): String { - return "http://gchat.qpic.cn/gchatpic_new/${bot.id}/0-0-${imageId.substring(1..36) - .replace("-", "")}/0?term=2" + public override fun getUrl(bot: Bot): String { + return "http://gchat.qpic.cn/gchatpic_new/${bot.id}/0-0-${ + imageId.substring(1..36) + .replace("-", "") + }/0?term=2" } init { @@ -125,7 +127,7 @@ data class OfflineGroupImage( level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("Image", "net.mamoe.mirai.message.data.Image") ) -abstract class OnlineGroupImage : GroupImage(), OnlineImage +public abstract class OnlineGroupImage : GroupImage(), OnlineImage /** * 通过 [Group.uploadImage] 上传得到的 [GroupImage]. 它的链接需要查询 [Bot.queryImageUrl] @@ -139,10 +141,10 @@ abstract class OnlineGroupImage : GroupImage(), OnlineImage replaceWith = ReplaceWith("Image", "net.mamoe.mirai.message.data.Image") ) @Serializable -data class OfflineFriendImage( - override val imageId: String +public data class OfflineFriendImage( + public override val imageId: String ) : FriendImage(), OfflineImage, DeferredOriginUrlAware { - override fun getUrl(bot: Bot): String { + public override fun getUrl(bot: Bot): String { return "http://c2cpicdw.qpic.cn/offpic_new/${bot.id}/${this.imageId}/0?term=2" } @@ -162,6 +164,6 @@ data class OfflineFriendImage( level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("Image", "net.mamoe.mirai.message.data.Image") ) -abstract class OnlineFriendImage : FriendImage(), OnlineImage +public abstract class OnlineFriendImage : FriendImage(), OnlineImage // endregion diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/utils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/utils.kt index c62100c30..80b89531c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/utils.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/utils.kt @@ -31,7 +31,7 @@ import kotlin.jvm.JvmSynthetic /** * 判断两个 [MessageEvent] 的 [MessageEvent.sender] 和 [MessageEvent.subject] 是否相同 */ -fun MessageEvent.isContextIdenticalWith(another: MessageEvent): Boolean { +public fun MessageEvent.isContextIdenticalWith(another: MessageEvent): Boolean { return this.sender == another.sender && this.subject == another.subject } @@ -47,7 +47,7 @@ fun MessageEvent.isContextIdenticalWith(another: MessageEvent): Boolean { * @see syncFromEvent 实现原理 */ @JvmSynthetic -suspend inline fun <reified P : MessageEvent> P.nextMessage( +public suspend inline fun <reified P : MessageEvent> P.nextMessage( timeoutMillis: Long = -1, priority: Listener.EventPriority = EventPriority.MONITOR, noinline filter: suspend P.(P) -> Boolean = { true } @@ -69,7 +69,7 @@ suspend inline fun <reified P : MessageEvent> P.nextMessage( * @see syncFromEventOrNull 实现原理 */ @JvmSynthetic -suspend inline fun <reified P : MessageEvent> P.nextMessageOrNull( +public suspend inline fun <reified P : MessageEvent> P.nextMessageOrNull( timeoutMillis: Long, priority: Listener.EventPriority = EventPriority.MONITOR, noinline filter: suspend P.(P) -> Boolean = { true } @@ -84,7 +84,7 @@ suspend inline fun <reified P : MessageEvent> P.nextMessageOrNull( * @see nextMessage */ @JvmSynthetic -inline fun <reified P : MessageEvent> P.nextMessageAsync( +public inline fun <reified P : MessageEvent> P.nextMessageAsync( timeoutMillis: Long = -1, coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -101,7 +101,7 @@ inline fun <reified P : MessageEvent> P.nextMessageAsync( * @see nextMessageOrNull */ @JvmSynthetic -inline fun <reified P : MessageEvent> P.nextMessageOrNullAsync( +public inline fun <reified P : MessageEvent> P.nextMessageOrNullAsync( timeoutMillis: Long, coroutineContext: CoroutineContext = EmptyCoroutineContext, priority: Listener.EventPriority = EventPriority.MONITOR, @@ -118,6 +118,6 @@ inline fun <reified P : MessageEvent> P.nextMessageOrNullAsync( @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Suppress("DEPRECATION_ERROR") @JvmSynthetic -fun ContactMessage.isContextIdenticalWith(another: ContactMessage): Boolean { +public fun ContactMessage.isContextIdenticalWith(another: ContactMessage): Boolean { return this.sender == another.sender && this.subject == another.subject && this.bot == another.bot } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/ForceOfflineException.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/ForceOfflineException.kt index d20222867..930ba028b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/ForceOfflineException.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/ForceOfflineException.kt @@ -7,4 +7,4 @@ import net.mamoe.mirai.Bot /** * 当 [Bot] 被迫下线时抛出, 作为 [Job.cancel] 的 `cause` */ -class ForceOfflineException(override val message: String?) : CancellationException(message) \ No newline at end of file +public class ForceOfflineException(public override val message: String?) : CancellationException(message) \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/LoginFailedException.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/LoginFailedException.kt index cbb048ae2..d2c4cde5e 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/LoginFailedException.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/LoginFailedException.kt @@ -19,11 +19,11 @@ import net.mamoe.mirai.utils.SinceMirai /** * 在 [登录][Bot.login] 失败时抛出, 可正常地中断登录过程. */ -sealed class LoginFailedException constructor( +public sealed class LoginFailedException( /** * 是否可因此登录失败而关闭 [Bot]. 一般是密码错误, 被冻结等异常时. */ - val killBot: Boolean = false, + public val killBot: Boolean = false, message: String? = null, cause: Throwable? = null ) : RuntimeException(message, cause) @@ -31,38 +31,43 @@ sealed class LoginFailedException constructor( /** * 密码输入错误 (有时候也会是其他错误, 如 `"当前上网环境异常,请更换网络环境或在常用设备上登录或稍后再试。"`) */ -class WrongPasswordException @MiraiInternalAPI constructor(message: String?) : LoginFailedException(true, message) +public class WrongPasswordException @MiraiInternalAPI constructor( + message: String? +) : LoginFailedException(true, message) /** * 无可用服务器 */ -class NoServerAvailableException @MiraiInternalAPI constructor(override val cause: Throwable?) : - LoginFailedException(false, "no server available") +public class NoServerAvailableException @MiraiInternalAPI constructor( + public override val cause: Throwable? +) : LoginFailedException(false, "no server available") /** * 服务器要求稍后重试 */ @SinceMirai("1.2.0") -class RetryLaterException @MiraiInternalAPI constructor() : LoginFailedException(false, "server requests retrial later") +public class RetryLaterException @MiraiInternalAPI constructor() : + LoginFailedException(false, "server requests retrial later") /** * 无标准输入或 Kotlin 不支持此输入. */ -class NoStandardInputForCaptchaException @MiraiInternalAPI constructor(override val cause: Throwable?) : - LoginFailedException(true, "no standard input for captcha") +public class NoStandardInputForCaptchaException @MiraiInternalAPI constructor( + public override val cause: Throwable? +) : LoginFailedException(true, "no standard input for captcha") /** * 需要短信验证时抛出. mirai 目前还不支持短信验证. */ @MiraiExperimentalAPI -class UnsupportedSMSLoginException(message: String?) : LoginFailedException(true, message) +public class UnsupportedSMSLoginException(message: String?) : LoginFailedException(true, message) /** * 非 mirai 实现的异常 */ -abstract class CustomLoginFailedException : LoginFailedException { - constructor(killBot: Boolean) : super(killBot) - constructor(killBot: Boolean, message: String?) : super(killBot, message) - constructor(killBot: Boolean, message: String?, cause: Throwable?) : super(killBot, message, cause) - constructor(killBot: Boolean, cause: Throwable?) : super(killBot, cause = cause) +public abstract class CustomLoginFailedException : LoginFailedException { + public constructor(killBot: Boolean) : super(killBot) + public constructor(killBot: Boolean, message: String?) : super(killBot, message) + public constructor(killBot: Boolean, message: String?, cause: Throwable?) : super(killBot, message, cause) + public constructor(killBot: Boolean, cause: Throwable?) : super(killBot, cause = cause) } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/qqandroid.network/Packet.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/qqandroid.network/Packet.kt index a7b9201c0..00b050d25 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/qqandroid.network/Packet.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/qqandroid.network/Packet.kt @@ -10,14 +10,16 @@ import net.mamoe.mirai.utils.MiraiInternalAPI * **InternalAPI**: 这是内部 API, 它随时都有可能被修改 */ @MiraiInternalAPI -interface Packet { +public interface Packet { /** * 实现这个接口的包将不会被记录到日志中 */ - interface NoLog + @MiraiInternalAPI + public interface NoLog /** * 实现这个接口的 [Event] 不会被作为事件记录到日志中 */ - interface NoEventLog + @MiraiInternalAPI + public interface NoEventLog } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt index c693171f7..7b305e6b4 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt @@ -24,8 +24,8 @@ import kotlin.annotation.AnnotationTarget.* CLASS, FUNCTION, PROPERTY ) @MustBeDocumented -annotation class MiraiInternalAPI( - val message: String = "" +public annotation class MiraiInternalAPI( + public val message: String = "" ) /** @@ -38,8 +38,8 @@ annotation class MiraiInternalAPI( @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR) @MustBeDocumented -annotation class MiraiExperimentalAPI( - val message: String = "" +public annotation class MiraiExperimentalAPI( + public val message: String = "" ) /** @@ -48,7 +48,9 @@ annotation class MiraiExperimentalAPI( @Target(CLASS, PROPERTY, FIELD, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, TYPEALIAS) @Retention(AnnotationRetention.BINARY) @MustBeDocumented -annotation class SinceMirai(val version: String) +public annotation class SinceMirai( + public val version: String +) /** * 标记一个正计划在 [version] 版本时删除 (对外隐藏) 的 API. diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.common.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.common.kt index 5adf1b3db..00f97697c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.common.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.common.kt @@ -37,12 +37,12 @@ import kotlin.jvm.JvmSynthetic * } * ``` */ -expect open class BotConfiguration() : BotConfigurationBase { +public expect open class BotConfiguration() : BotConfigurationBase { /** * 设备信息覆盖. 在没有手动指定时将会通过日志警告, 并使用随机设备信息. * @see randomDeviceInfo 使用随机设备信息 */ - var deviceInfo: ((Context) -> DeviceInfo)? + public var deviceInfo: ((Context) -> DeviceInfo)? /** * 使用随机设备信息. @@ -50,12 +50,12 @@ expect open class BotConfiguration() : BotConfigurationBase { * @see deviceInfo */ @ConfigurationDsl - fun randomDeviceInfo() + public fun randomDeviceInfo() /** * 协议类型, 服务器仅允许使用不同协议同时登录. */ - enum class MiraiProtocol { + public enum class MiraiProtocol { /** * Android 手机. */ @@ -76,17 +76,17 @@ expect open class BotConfiguration() : BotConfigurationBase { internal val id: Long } - companion object { + public companion object { /** 默认的配置实例. 可以进行修改 */ @JvmStatic - val Default: BotConfiguration + public val Default: BotConfiguration } - fun copy(): BotConfiguration + public fun copy(): BotConfiguration } @SinceMirai("1.1.0") -open class BotConfigurationBase internal constructor() { +public open class BotConfigurationBase internal constructor() { /** * 日志记录器 * @@ -97,7 +97,7 @@ open class BotConfigurationBase internal constructor() { * * @see MiraiLogger */ - var botLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Bot ${it.id}") } + public var botLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Bot ${it.id}") } /** * 网络层日志构造器 @@ -109,46 +109,46 @@ open class BotConfigurationBase internal constructor() { * * @see MiraiLogger */ - var networkLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Net ${it.id}") } + public var networkLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Net ${it.id}") } /** 父 [CoroutineContext]. [Bot] 创建后会使用 [SupervisorJob] 覆盖其 [Job], 但会将这个 [Job] 作为父 [Job] */ - var parentCoroutineContext: CoroutineContext = EmptyCoroutineContext + public var parentCoroutineContext: CoroutineContext = EmptyCoroutineContext /** 心跳周期. 过长会导致被服务器断开连接. */ - var heartbeatPeriodMillis: Long = 60.secondsToMillis + public var heartbeatPeriodMillis: Long = 60.secondsToMillis /** * 每次心跳时等待结果的时间. * 一旦心跳超时, 整个网络服务将会重启 (将消耗约 1s). 除正在进行的任务 (如图片上传) 会被中断外, 事件和插件均不受影响. */ - var heartbeatTimeoutMillis: Long = 5.secondsToMillis + public var heartbeatTimeoutMillis: Long = 5.secondsToMillis /** 心跳失败后的第一次重连前的等待时间. */ - var firstReconnectDelayMillis: Long = 5.secondsToMillis + public var firstReconnectDelayMillis: Long = 5.secondsToMillis /** 重连失败后, 继续尝试的每次等待时间 */ - var reconnectPeriodMillis: Long = 5.secondsToMillis + public var reconnectPeriodMillis: Long = 5.secondsToMillis /** 最多尝试多少次重连 */ - var reconnectionRetryTimes: Int = Int.MAX_VALUE + public var reconnectionRetryTimes: Int = Int.MAX_VALUE /** 验证码处理器 */ - var loginSolver: LoginSolver = LoginSolver.Default + public var loginSolver: LoginSolver = LoginSolver.Default /** 使用协议类型 */ - var protocol: MiraiProtocol = MiraiProtocol.ANDROID_PAD + public var protocol: MiraiProtocol = MiraiProtocol.ANDROID_PAD /** 缓存策略 */ @SinceMirai("1.0.0") @MiraiExperimentalAPI - var fileCacheStrategy: FileCacheStrategy = FileCacheStrategy.PlatformDefault + public var fileCacheStrategy: FileCacheStrategy = FileCacheStrategy.PlatformDefault /** * Json 序列化器, 使用 'kotlinx.serialization' */ @SinceMirai("1.1.0") @MiraiExperimentalAPI - var json: Json = kotlin.runCatching { + public var json: Json = kotlin.runCatching { @OptIn(UnstableDefault::class) Json(JsonConfiguration(isLenient = true, ignoreUnknownKeys = true)) }.getOrElse { Json(JsonConfiguration.Stable) } @@ -158,7 +158,7 @@ open class BotConfigurationBase internal constructor() { * @see networkLoggerSupplier 更多日志处理方式 */ @ConfigurationDsl - fun noNetworkLog() { + public fun noNetworkLog() { networkLoggerSupplier = { _ -> SilentLogger } } @@ -167,7 +167,7 @@ open class BotConfigurationBase internal constructor() { * @see botLoggerSupplier 更多日志处理方式 */ @ConfigurationDsl - fun noBotLog() { + public fun noBotLog() { botLoggerSupplier = { _ -> SilentLogger } } @@ -225,14 +225,14 @@ open class BotConfigurationBase internal constructor() { */ @JvmSynthetic @ConfigurationDsl - suspend inline fun inheritCoroutineContext() { + public suspend inline fun inheritCoroutineContext() { parentCoroutineContext = coroutineContext } /** 标注一个配置 DSL 函数 */ @Target(AnnotationTarget.FUNCTION) @DslMarker - annotation class ConfigurationDsl + public annotation class ConfigurationDsl } internal val deviceInfoStub: (Context) -> DeviceInfo = { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Channels.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Channels.kt index ef2108821..a85590ade 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Channels.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Channels.kt @@ -30,7 +30,7 @@ import kotlin.jvm.JvmName */ @OptIn(InternalSerializationApi::class) @MiraiExperimentalAPI -suspend fun ByteReadChannel.copyTo(dst: OutputStream) { +public suspend fun ByteReadChannel.copyTo(dst: OutputStream) { val buffer = ByteArray(2048) var size: Int while (this.readAvailable(buffer).also { size = it } > 0) { @@ -42,7 +42,7 @@ suspend fun ByteReadChannel.copyTo(dst: OutputStream) { * 从接收者管道读取所有数据并写入 [dst]. 不会关闭 [dst] */ @MiraiExperimentalAPI -suspend fun ByteReadChannel.copyTo(dst: Output) { +public suspend fun ByteReadChannel.copyTo(dst: Output) { val buffer = ByteArray(2048) var size: Int while (this.readAvailable(buffer).also { size = it } > 0) { @@ -54,7 +54,7 @@ suspend fun ByteReadChannel.copyTo(dst: Output) { * 从接收者管道读取所有数据并写入 [dst]. 不会关闭 [dst] */ @MiraiExperimentalAPI -suspend fun ByteReadChannel.copyTo(dst: ByteWriteChannel) { +public suspend fun ByteReadChannel.copyTo(dst: ByteWriteChannel) { val buffer = ByteArray(2048) var size: Int while (this.readAvailable(buffer).also { size = it } > 0) { @@ -70,7 +70,7 @@ suspend fun ByteReadChannel.copyTo(dst: ByteWriteChannel) { */ @MiraiExperimentalAPI @OptIn(InternalSerializationApi::class) -suspend fun ByteReadChannel.copyAndClose(dst: OutputStream) { // 在 JVM 这个 API 不是 internal 的 +public suspend fun ByteReadChannel.copyAndClose(dst: OutputStream) { // 在 JVM 这个 API 不是 internal 的 try { val buffer = ByteArray(2048) var size: Int @@ -86,7 +86,7 @@ suspend fun ByteReadChannel.copyAndClose(dst: OutputStream) { // 在 JVM 这个 * 从接收者管道读取所有数据并写入 [dst], 最终关闭 [dst] */ @MiraiExperimentalAPI -suspend fun ByteReadChannel.copyAndClose(dst: Output) { +public suspend fun ByteReadChannel.copyAndClose(dst: Output) { try { val buffer = ByteArray(2048) var size: Int @@ -102,7 +102,7 @@ suspend fun ByteReadChannel.copyAndClose(dst: Output) { * 从接收者管道读取所有数据并写入 [dst], 最终关闭 [dst] */ @MiraiExperimentalAPI -suspend fun ByteReadChannel.copyAndClose(dst: ByteWriteChannel) { +public suspend fun ByteReadChannel.copyAndClose(dst: ByteWriteChannel) { @Suppress("DuplicatedCode") try { val buffer = ByteArray(2048) @@ -120,7 +120,7 @@ suspend fun ByteReadChannel.copyAndClose(dst: ByteWriteChannel) { * 从接收者管道读取所有数据并写入 [dst], 最终关闭 [dst] */ @MiraiExperimentalAPI -suspend fun ByteReadChannel.copyAndClose(dst: io.ktor.utils.io.ByteWriteChannel) { +public suspend fun ByteReadChannel.copyAndClose(dst: io.ktor.utils.io.ByteWriteChannel) { @Suppress("DuplicatedCode") try { val buffer = ByteArray(2048) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Context.common.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Context.common.kt index 9071c2cf7..695d80cf9 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Context.common.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Context.common.kt @@ -13,4 +13,4 @@ package net.mamoe.mirai.utils * On Android, typealias to `android.content.Context` * On JVM, empty class. */ -expect abstract class Context +public expect abstract class Context diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/DeviceInfo.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/DeviceInfo.kt index 690c05ab0..45ab5995b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/DeviceInfo.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/DeviceInfo.kt @@ -17,45 +17,45 @@ import kotlinx.serialization.protobuf.ProtoId /** * 设备信息. 可通过继承 [SystemDeviceInfo] 来在默认的基础上修改 */ -abstract class DeviceInfo { +public abstract class DeviceInfo { @Transient - abstract val context: Context + public abstract val context: Context - abstract val display: ByteArray - abstract val product: ByteArray - abstract val device: ByteArray - abstract val board: ByteArray + public abstract val display: ByteArray + public abstract val product: ByteArray + public abstract val device: ByteArray + public abstract val board: ByteArray - abstract val brand: ByteArray - abstract val model: ByteArray - abstract val bootloader: ByteArray - abstract val fingerprint: ByteArray - abstract val bootId: ByteArray + public abstract val brand: ByteArray + public abstract val model: ByteArray + public abstract val bootloader: ByteArray + public abstract val fingerprint: ByteArray + public abstract val bootId: ByteArray - abstract val procVersion: ByteArray - abstract val baseBand: ByteArray + public abstract val procVersion: ByteArray + public abstract val baseBand: ByteArray - abstract val version: Version + public abstract val version: Version - abstract val simInfo: ByteArray + public abstract val simInfo: ByteArray - abstract val osType: ByteArray + public abstract val osType: ByteArray - abstract val macAddress: ByteArray + public abstract val macAddress: ByteArray - abstract val wifiBSSID: ByteArray? - abstract val wifiSSID: ByteArray? + public abstract val wifiBSSID: ByteArray? + public abstract val wifiSSID: ByteArray? - abstract val imsiMd5: ByteArray - abstract val imei: String + public abstract val imsiMd5: ByteArray + public abstract val imei: String - val ipAddress: ByteArray get() = byteArrayOf(192.toByte(), 168.toByte(), 1, 123) + public val ipAddress: ByteArray get() = byteArrayOf(192.toByte(), 168.toByte(), 1, 123) - abstract val androidId: ByteArray + public abstract val androidId: ByteArray - abstract val apn: ByteArray + public abstract val apn: ByteArray - fun generateDeviceInfoData(): ByteArray { + public fun generateDeviceInfoData(): ByteArray { @Serializable class DevInfo( @ProtoId(1) val bootloader: ByteArray, @@ -84,48 +84,48 @@ abstract class DeviceInfo { ) } - interface Version { - val incremental: ByteArray - val release: ByteArray - val codename: ByteArray - val sdk: Int + public interface Version { + public val incremental: ByteArray + public val release: ByteArray + public val codename: ByteArray + public val sdk: Int } } @Serializable -class DeviceInfoData( - override val display: ByteArray, - override val product: ByteArray, - override val device: ByteArray, - override val board: ByteArray, - override val brand: ByteArray, - override val model: ByteArray, - override val bootloader: ByteArray, - override val fingerprint: ByteArray, - override val bootId: ByteArray, - override val procVersion: ByteArray, - override val baseBand: ByteArray, - override val version: VersionData, - override val simInfo: ByteArray, - override val osType: ByteArray, - override val macAddress: ByteArray, - override val wifiBSSID: ByteArray?, - override val wifiSSID: ByteArray?, - override val imsiMd5: ByteArray, - override val imei: String, - override val apn: ByteArray +public class DeviceInfoData( + public override val display: ByteArray, + public override val product: ByteArray, + public override val device: ByteArray, + public override val board: ByteArray, + public override val brand: ByteArray, + public override val model: ByteArray, + public override val bootloader: ByteArray, + public override val fingerprint: ByteArray, + public override val bootId: ByteArray, + public override val procVersion: ByteArray, + public override val baseBand: ByteArray, + public override val version: VersionData, + public override val simInfo: ByteArray, + public override val osType: ByteArray, + public override val macAddress: ByteArray, + public override val wifiBSSID: ByteArray?, + public override val wifiSSID: ByteArray?, + public override val imsiMd5: ByteArray, + public override val imei: String, + public override val apn: ByteArray ) : DeviceInfo() { @Transient - override lateinit var context: Context + public override lateinit var context: Context - override val androidId: ByteArray get() = display + public override val androidId: ByteArray get() = display @Serializable - class VersionData( - override val incremental: ByteArray = SystemDeviceInfo.Version.incremental, - override val release: ByteArray = SystemDeviceInfo.Version.release, - override val codename: ByteArray = SystemDeviceInfo.Version.codename, - override val sdk: Int = SystemDeviceInfo.Version.sdk + public class VersionData( + public override val incremental: ByteArray = SystemDeviceInfo.Version.incremental, + public override val release: ByteArray = SystemDeviceInfo.Version.release, + public override val codename: ByteArray = SystemDeviceInfo.Version.codename, + public override val sdk: Int = SystemDeviceInfo.Version.sdk ) : Version } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt index f4a21bae5..163837ae8 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt @@ -33,12 +33,12 @@ import kotlin.jvm.JvmSynthetic * @see ExternalImage.sendTo 上传图片并以纯图片消息发送给联系人 * @See ExternalImage.upload 上传图片并得到 [Image] 消息 */ -class ExternalImage internal constructor( +public class ExternalImage internal constructor( @JvmField internal val input: ReusableInput ) { internal val md5: ByteArray get() = this.input.md5 - val formatName: String by lazy { + public val formatName: String by lazy { val hex = input.asInput().use { it.readBytes(8).toUHexString("") } @@ -51,22 +51,22 @@ class ExternalImage internal constructor( } } - companion object { - const val defaultFormatName = "mirai" + public companion object { + public const val defaultFormatName: String = "mirai" @MiraiExperimentalAPI - fun generateUUID(md5: ByteArray): String { + public fun generateUUID(md5: ByteArray): String { return "${md5[0, 3]}-${md5[4, 5]}-${md5[6, 7]}-${md5[8, 9]}-${md5[10, 15]}" } @MiraiExperimentalAPI - fun generateImageId(md5: ByteArray): String { + public fun generateImageId(md5: ByteArray): String { return """{${generateUUID(md5)}}.$defaultFormatName""" } } - override fun toString(): String { + public override fun toString(): String { if (input is DeferredReusableInput) { if (!input.initialized) { return "ExternalImage(uninitialized)" @@ -104,7 +104,7 @@ class ExternalImage internal constructor( * @see Contact.sendMessage 最终调用, 发送消息. */ @JvmSynthetic -suspend fun <C : Contact> ExternalImage.sendTo(contact: C): MessageReceipt<C> = when (contact) { +public suspend fun <C : Contact> ExternalImage.sendTo(contact: C): MessageReceipt<C> = when (contact) { is Group -> contact.uploadImage(this).sendTo(contact) is User -> contact.uploadImage(this).sendTo(contact) else -> error("unreachable") @@ -119,7 +119,7 @@ suspend fun <C : Contact> ExternalImage.sendTo(contact: C): MessageReceipt<C> = * @see Contact.uploadImage 最终调用, 上传图片. */ @JvmSynthetic -suspend fun ExternalImage.upload(contact: Contact): Image = when (contact) { +public suspend fun ExternalImage.upload(contact: Contact): Image = when (contact) { is Group -> contact.uploadImage(this) is User -> contact.uploadImage(this) else -> error("unreachable") @@ -131,7 +131,7 @@ suspend fun ExternalImage.upload(contact: Contact): Image = when (contact) { * @see Contact.sendMessage 最终调用, 发送消息. */ @JvmSynthetic -suspend inline fun <C : Contact> C.sendImage(image: ExternalImage): MessageReceipt<C> = image.sendTo(this) +public suspend inline fun <C : Contact> C.sendImage(image: ExternalImage): MessageReceipt<C> = image.sendTo(this) @JvmSynthetic diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/FileCacheStrategy.common.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/FileCacheStrategy.common.kt index 95a7dba1e..05680a7d9 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/FileCacheStrategy.common.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/FileCacheStrategy.common.kt @@ -13,14 +13,14 @@ import kotlin.contracts.contract * 图片上传时默认使用文件缓存. */ @MiraiExperimentalAPI -expect interface FileCacheStrategy { +public expect interface FileCacheStrategy { /** * 将 [input] 缓存为 [ExternalImage]. * 此函数应 close 这个 [Input] */ @MiraiExperimentalAPI @Throws(IOException::class) - fun newImageCache(input: Input): ExternalImage + public fun newImageCache(input: Input): ExternalImage /** * 将 [input] 缓存为 [ExternalImage]. @@ -28,25 +28,25 @@ expect interface FileCacheStrategy { */ @MiraiExperimentalAPI @Throws(IOException::class) - fun newImageCache(input: ByteArray): ExternalImage + public fun newImageCache(input: ByteArray): ExternalImage /** * 默认的缓存方案. 在 JVM 平台使用系统临时文件. */ @MiraiExperimentalAPI - object PlatformDefault : FileCacheStrategy + public object PlatformDefault : FileCacheStrategy /** * 使用内存直接存储所有图片文件. */ - object MemoryCache : FileCacheStrategy { + public object MemoryCache : FileCacheStrategy { @MiraiExperimentalAPI @Throws(IOException::class) - override fun newImageCache(input: Input): ExternalImage + public override fun newImageCache(input: Input): ExternalImage @MiraiExperimentalAPI @Throws(IOException::class) - override fun newImageCache(input: ByteArray): ExternalImage + public override fun newImageCache(input: ByteArray): ExternalImage } } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LoginSolver.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LoginSolver.kt index 09cd3a9ae..d422c7b8c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LoginSolver.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LoginSolver.kt @@ -40,12 +40,12 @@ import kotlin.reflect.KClass @Retention(AnnotationRetention.SOURCE) @OptIn(ExperimentalMultiplatform::class) @OptionalExpectation -expect annotation class Throws(vararg val exceptionClasses: KClass<out Throwable>) +internal expect annotation class Throws(vararg val exceptionClasses: KClass<out Throwable>) /** * 验证码, 设备锁解决器 */ -expect abstract class LoginSolver { +public expect abstract class LoginSolver { /** * 处理图片验证码. * 返回 null 以表示无法处理验证码, 将会刷新验证码或重试登录. @@ -53,7 +53,7 @@ expect abstract class LoginSolver { * * @throws LoginFailedException */ - abstract suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? + public abstract suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? /** * 处理滑动验证码. @@ -63,7 +63,7 @@ expect abstract class LoginSolver { * @throws LoginFailedException * @return 验证码解决成功后获得的 ticket. */ - abstract suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? + public abstract suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? /** * 处理不安全设备验证. @@ -73,9 +73,9 @@ expect abstract class LoginSolver { * @return 任意内容. 返回值保留以供未来更新. * @throws LoginFailedException */ - abstract suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? + public abstract suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? - companion object { - val Default: LoginSolver + public companion object { + public val Default: LoginSolver } } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt index 44b0f777c..f5d34c1c0 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt @@ -32,13 +32,13 @@ import kotlin.jvm.JvmOverloads * * Java 调用: `Utils.getDefaultLogger().invoke(identity)` */ -var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger(it) } +public var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger(it) } /** * 给这个 logger 添加一个开关, 用于控制是否记录 log */ @JvmOverloads -fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitch = MiraiLoggerWithSwitch(this, default) +public fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitch = MiraiLoggerWithSwitch(this, default) /** * 日志记录器. 所有的输出均依赖于它. @@ -56,7 +56,7 @@ fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitch = Mir * * @see MiraiLoggerPlatformBase 平台通用基础实现. 若 Mirai 自带的日志系统无法满足需求, 请继承这个类并实现其抽象函数. */ -interface MiraiLogger { +public interface MiraiLogger { /** * 顶层日志记录器. * @@ -64,7 +64,7 @@ interface MiraiLogger { * 请参考使用 [DefaultLogger] */ @Deprecated(message = "顶层日志会导致混乱并难以定位问题. 请自行构造 logger 实例并使用.", level = DeprecationLevel.WARNING) - companion object : MiraiLogger by DefaultLogger("Mirai") + public companion object : MiraiLogger by DefaultLogger("Mirai") /** * 日志的标记. 在 Mirai 中, identity 可为 @@ -74,14 +74,14 @@ interface MiraiLogger { * * 它只用于帮助调试或统计. 十分建议清晰定义 identity */ - val identity: String? + public val identity: String? /** * 获取 [MiraiLogger] 是否已开启 * * 除 [MiraiLoggerWithSwitch] 可控制开关外, 其他的所有 [MiraiLogger] 均一直开启. */ - val isEnabled: Boolean + public val isEnabled: Boolean /** * 随从. 在 this 中调用所有方法后都应继续往 [follower] 传递调用. @@ -93,54 +93,54 @@ interface MiraiLogger { * * 当然, 多个 logger 也可以加在一起: `val logger = bot.logger + MynLogger() + MyLogger2()` */ - var follower: MiraiLogger? + public var follower: MiraiLogger? /** * 记录一个 `verbose` 级别的日志. * 无关紧要的, 经常大量输出的日志应使用它. */ - fun verbose(message: String?) + public fun verbose(message: String?) - fun verbose(e: Throwable?) = verbose(null, e) - fun verbose(message: String?, e: Throwable?) + public fun verbose(e: Throwable?): Unit = verbose(null, e) + public fun verbose(message: String?, e: Throwable?) /** * 记录一个 _调试_ 级别的日志. */ - fun debug(message: String?) + public fun debug(message: String?) - fun debug(e: Throwable?) = debug(null, e) - fun debug(message: String?, e: Throwable?) + public fun debug(e: Throwable?): Unit = debug(null, e) + public fun debug(message: String?, e: Throwable?) /** * 记录一个 _信息_ 级别的日志. */ - fun info(message: String?) + public fun info(message: String?) - fun info(e: Throwable?) = info(null, e) - fun info(message: String?, e: Throwable?) + public fun info(e: Throwable?): Unit = info(null, e) + public fun info(message: String?, e: Throwable?) /** * 记录一个 _警告_ 级别的日志. */ - fun warning(message: String?) + public fun warning(message: String?) - fun warning(e: Throwable?) = warning(null, e) - fun warning(message: String?, e: Throwable?) + public fun warning(e: Throwable?): Unit = warning(null, e) + public fun warning(message: String?, e: Throwable?) /** * 记录一个 _错误_ 级别的日志. */ - fun error(message: String?) + public fun error(message: String?) - fun error(e: Throwable?) = error(null, e) - fun error(message: String?, e: Throwable?) + public fun error(e: Throwable?): Unit = error(null, e) + public fun error(message: String?, e: Throwable?) /** 根据优先级调用对应函数 */ - fun call(priority: SimpleLogger.LogPriority, message: String? = null, e: Throwable? = null) = + public fun call(priority: SimpleLogger.LogPriority, message: String? = null, e: Throwable? = null): Unit = priority.correspondingFunction(this, message, e) /** @@ -154,7 +154,7 @@ interface MiraiLogger { * * @return [follower] */ - operator fun <T : MiraiLogger> plus(follower: T): T + public operator fun <T : MiraiLogger> plus(follower: T): T /** * 添加一个 [follower] @@ -162,47 +162,47 @@ interface MiraiLogger { * * @see follower */ - operator fun plusAssign(follower: MiraiLogger) + public operator fun plusAssign(follower: MiraiLogger) } -inline fun MiraiLogger.verbose(lazyMessage: () -> String) { +public inline fun MiraiLogger.verbose(lazyMessage: () -> String) { if (isEnabled) verbose(lazyMessage()) } -inline fun MiraiLogger.verbose(lazyMessage: () -> String, e: Throwable?) { +public inline fun MiraiLogger.verbose(lazyMessage: () -> String, e: Throwable?) { if (isEnabled) verbose(lazyMessage(), e) } -inline fun MiraiLogger.debug(lazyMessage: () -> String?) { +public inline fun MiraiLogger.debug(lazyMessage: () -> String?) { if (isEnabled) debug(lazyMessage()) } -inline fun MiraiLogger.debug(lazyMessage: () -> String?, e: Throwable?) { +public inline fun MiraiLogger.debug(lazyMessage: () -> String?, e: Throwable?) { if (isEnabled) debug(lazyMessage(), e) } -inline fun MiraiLogger.info(lazyMessage: () -> String?) { +public inline fun MiraiLogger.info(lazyMessage: () -> String?) { if (isEnabled) info(lazyMessage()) } -inline fun MiraiLogger.info(lazyMessage: () -> String?, e: Throwable?) { +public inline fun MiraiLogger.info(lazyMessage: () -> String?, e: Throwable?) { if (isEnabled) info(lazyMessage(), e) } -inline fun MiraiLogger.warning(lazyMessage: () -> String?) { +public inline fun MiraiLogger.warning(lazyMessage: () -> String?) { if (isEnabled) warning(lazyMessage()) } -inline fun MiraiLogger.warning(lazyMessage: () -> String?, e: Throwable?) { +public inline fun MiraiLogger.warning(lazyMessage: () -> String?, e: Throwable?) { if (isEnabled) warning(lazyMessage(), e) } -inline fun MiraiLogger.error(lazyMessage: () -> String?) { +public inline fun MiraiLogger.error(lazyMessage: () -> String?) { if (isEnabled) error(lazyMessage()) } -inline fun MiraiLogger.error(lazyMessage: () -> String?, e: Throwable?) { +public inline fun MiraiLogger.error(lazyMessage: () -> String?, e: Throwable?) { if (isEnabled) error(lazyMessage(), e) } @@ -229,41 +229,41 @@ inline fun MiraiLogger.error(lazyMessage: () -> String?, e: Throwable?) { * * @see DefaultLogger */ -expect open class PlatformLogger @JvmOverloads constructor(identity: String? = "Mirai") : MiraiLoggerPlatformBase +public expect open class PlatformLogger @JvmOverloads constructor(identity: String? = "Mirai") : MiraiLoggerPlatformBase /** * 不做任何事情的 logger, keep silent. */ @Suppress("unused") -object SilentLogger : PlatformLogger() { - override val identity: String? = null +public object SilentLogger : PlatformLogger() { + public override val identity: String? = null - override fun error0(message: String?) = Unit - override fun debug0(message: String?) = Unit - override fun warning0(message: String?) = Unit - override fun verbose0(message: String?) = Unit - override fun info0(message: String?) = Unit + public override fun error0(message: String?): Unit = Unit + public override fun debug0(message: String?): Unit = Unit + public override fun warning0(message: String?): Unit = Unit + public override fun verbose0(message: String?): Unit = Unit + public override fun info0(message: String?): Unit = Unit - override fun verbose0(message: String?, e: Throwable?) = Unit - override fun debug0(message: String?, e: Throwable?) = Unit - override fun info0(message: String?, e: Throwable?) = Unit - override fun warning0(message: String?, e: Throwable?) = Unit - override fun error0(message: String?, e: Throwable?) = Unit + public override fun verbose0(message: String?, e: Throwable?): Unit = Unit + public override fun debug0(message: String?, e: Throwable?): Unit = Unit + public override fun info0(message: String?, e: Throwable?): Unit = Unit + public override fun warning0(message: String?, e: Throwable?): Unit = Unit + public override fun error0(message: String?, e: Throwable?): Unit = Unit } /** * 简易日志记录, 所有类型日志都会被重定向 [logger] */ -open class SimpleLogger( - final override val identity: String?, +public open class SimpleLogger( + public final override val identity: String?, protected open val logger: (priority: LogPriority, message: String?, e: Throwable?) -> Unit ) : MiraiLoggerPlatformBase() { - enum class LogPriority( - @MiraiExperimentalAPI val nameAligned: String, - val simpleName: String, - @MiraiExperimentalAPI val correspondingFunction: MiraiLogger.(message: String?, e: Throwable?) -> Unit + public enum class LogPriority( + @MiraiExperimentalAPI public val nameAligned: String, + public val simpleName: String, + @MiraiExperimentalAPI public val correspondingFunction: MiraiLogger.(message: String?, e: Throwable?) -> Unit ) { VERBOSE("VERBOSE", "V", MiraiLogger::verbose), DEBUG(" DEBUG ", "D", MiraiLogger::debug), @@ -272,11 +272,11 @@ open class SimpleLogger( ERROR(" ERROR ", "E", MiraiLogger::error) } - companion object { - inline operator fun invoke(crossinline logger: (message: String?, e: Throwable?) -> Unit): SimpleLogger = + public companion object { + public inline operator fun invoke(crossinline logger: (message: String?, e: Throwable?) -> Unit): SimpleLogger = SimpleLogger(null, logger) - inline operator fun invoke( + public inline operator fun invoke( identity: String?, crossinline logger: (message: String?, e: Throwable?) -> Unit ): SimpleLogger = @@ -284,20 +284,20 @@ open class SimpleLogger( logger(message, e) } - operator fun invoke(logger: (priority: LogPriority, message: String?, e: Throwable?) -> Unit): SimpleLogger = + public operator fun invoke(logger: (priority: LogPriority, message: String?, e: Throwable?) -> Unit): SimpleLogger = SimpleLogger(null, logger) } - override fun verbose0(message: String?) = logger(LogPriority.VERBOSE, message, null) - override fun verbose0(message: String?, e: Throwable?) = logger(LogPriority.VERBOSE, message, e) - override fun debug0(message: String?) = logger(LogPriority.DEBUG, message, null) - override fun debug0(message: String?, e: Throwable?) = logger(LogPriority.DEBUG, message, e) - override fun info0(message: String?) = logger(LogPriority.INFO, message, null) - override fun info0(message: String?, e: Throwable?) = logger(LogPriority.INFO, message, e) - override fun warning0(message: String?) = logger(LogPriority.WARNING, message, null) - override fun warning0(message: String?, e: Throwable?) = logger(LogPriority.WARNING, message, e) - override fun error0(message: String?) = logger(LogPriority.ERROR, message, null) - override fun error0(message: String?, e: Throwable?) = logger(LogPriority.ERROR, message, e) + public override fun verbose0(message: String?): Unit = logger(LogPriority.VERBOSE, message, null) + public override fun verbose0(message: String?, e: Throwable?): Unit = logger(LogPriority.VERBOSE, message, e) + public override fun debug0(message: String?): Unit = logger(LogPriority.DEBUG, message, null) + public override fun debug0(message: String?, e: Throwable?): Unit = logger(LogPriority.DEBUG, message, e) + public override fun info0(message: String?): Unit = logger(LogPriority.INFO, message, null) + public override fun info0(message: String?, e: Throwable?): Unit = logger(LogPriority.INFO, message, e) + public override fun warning0(message: String?): Unit = logger(LogPriority.WARNING, message, null) + public override fun warning0(message: String?, e: Throwable?): Unit = logger(LogPriority.WARNING, message, e) + public override fun error0(message: String?): Unit = logger(LogPriority.ERROR, message, null) + public override fun error0(message: String?, e: Throwable?): Unit = logger(LogPriority.ERROR, message, e) } /** @@ -307,9 +307,9 @@ open class SimpleLogger( * @see disable 关闭 */ @Suppress("MemberVisibilityCanBePrivate") -class MiraiLoggerWithSwitch internal constructor(private val delegate: MiraiLogger, default: Boolean) : +public class MiraiLoggerWithSwitch internal constructor(private val delegate: MiraiLogger, default: Boolean) : MiraiLoggerPlatformBase() { - override val identity: String? get() = delegate.identity + public override val identity: String? get() = delegate.identity /** * true 为开启. @@ -317,26 +317,26 @@ class MiraiLoggerWithSwitch internal constructor(private val delegate: MiraiLogg @PublishedApi internal var switch: Boolean = default - override val isEnabled: Boolean get() = switch + public override val isEnabled: Boolean get() = switch - fun enable() { + public fun enable() { switch = true } - fun disable() { + public fun disable() { switch = false } - override fun verbose0(message: String?) = delegate.verbose(message) - override fun verbose0(message: String?, e: Throwable?) = delegate.verbose(message, e) - override fun debug0(message: String?) = delegate.debug(message) - override fun debug0(message: String?, e: Throwable?) = delegate.debug(message, e) - override fun info0(message: String?) = delegate.info(message) - override fun info0(message: String?, e: Throwable?) = delegate.info(message, e) - override fun warning0(message: String?) = delegate.warning(message) - override fun warning0(message: String?, e: Throwable?) = delegate.warning(message, e) - override fun error0(message: String?) = delegate.error(message) - override fun error0(message: String?, e: Throwable?) = delegate.error(message, e) + public override fun verbose0(message: String?): Unit = delegate.verbose(message) + public override fun verbose0(message: String?, e: Throwable?): Unit = delegate.verbose(message, e) + public override fun debug0(message: String?): Unit = delegate.debug(message) + public override fun debug0(message: String?, e: Throwable?): Unit = delegate.debug(message, e) + public override fun info0(message: String?): Unit = delegate.info(message) + public override fun info0(message: String?, e: Throwable?): Unit = delegate.info(message, e) + public override fun warning0(message: String?): Unit = delegate.warning(message) + public override fun warning0(message: String?, e: Throwable?): Unit = delegate.warning(message, e) + public override fun error0(message: String?): Unit = delegate.error(message) + public override fun error0(message: String?, e: Throwable?): Unit = delegate.error(message, e) } /** @@ -349,87 +349,87 @@ class MiraiLoggerWithSwitch internal constructor(private val delegate: MiraiLogg * @see PlatformLogger * @see SimpleLogger */ -abstract class MiraiLoggerPlatformBase : MiraiLogger { - override val isEnabled: Boolean get() = true - final override var follower: MiraiLogger? = null +public abstract class MiraiLoggerPlatformBase : MiraiLogger { + public override val isEnabled: Boolean get() = true + public final override var follower: MiraiLogger? = null - final override fun verbose(message: String?) { + public final override fun verbose(message: String?) { if (!isEnabled) return follower?.verbose(message) verbose0(message) } - final override fun verbose(message: String?, e: Throwable?) { + public final override fun verbose(message: String?, e: Throwable?) { if (!isEnabled) return follower?.verbose(message, e) verbose0(message, e) } - final override fun debug(message: String?) { + public final override fun debug(message: String?) { if (!isEnabled) return follower?.debug(message) debug0(message) } - final override fun debug(message: String?, e: Throwable?) { + public final override fun debug(message: String?, e: Throwable?) { if (!isEnabled) return follower?.debug(message, e) debug0(message, e) } - final override fun info(message: String?) { + public final override fun info(message: String?) { if (!isEnabled) return follower?.info(message) info0(message) } - final override fun info(message: String?, e: Throwable?) { + public final override fun info(message: String?, e: Throwable?) { if (!isEnabled) return follower?.info(message, e) info0(message, e) } - final override fun warning(message: String?) { + public final override fun warning(message: String?) { if (!isEnabled) return follower?.warning(message) warning0(message) } - final override fun warning(message: String?, e: Throwable?) { + public final override fun warning(message: String?, e: Throwable?) { if (!isEnabled) return follower?.warning(message, e) warning0(message, e) } - final override fun error(message: String?) { + public final override fun error(message: String?) { if (!isEnabled) return follower?.error(message) error0(message) } - final override fun error(message: String?, e: Throwable?) { + public final override fun error(message: String?, e: Throwable?) { if (!isEnabled) return follower?.error(message, e) error0(message, e) } - protected open fun verbose0(message: String?) = verbose0(message, null) + protected open fun verbose0(message: String?): Unit = verbose0(message, null) protected abstract fun verbose0(message: String?, e: Throwable?) - protected open fun debug0(message: String?) = debug0(message, null) + protected open fun debug0(message: String?): Unit = debug0(message, null) protected abstract fun debug0(message: String?, e: Throwable?) - protected open fun info0(message: String?) = info0(message, null) + protected open fun info0(message: String?): Unit = info0(message, null) protected abstract fun info0(message: String?, e: Throwable?) - protected open fun warning0(message: String?) = warning0(message, null) + protected open fun warning0(message: String?): Unit = warning0(message, null) protected abstract fun warning0(message: String?, e: Throwable?) - protected open fun error0(message: String?) = error0(message, null) + protected open fun error0(message: String?): Unit = error0(message, null) protected abstract fun error0(message: String?, e: Throwable?) - override operator fun <T : MiraiLogger> plus(follower: T): T { + public override operator fun <T : MiraiLogger> plus(follower: T): T { this.follower = follower return follower } - override fun plusAssign(follower: MiraiLogger) = + public override fun plusAssign(follower: MiraiLogger): Unit = if (this.follower == null) this.follower = follower else this.follower!! += follower } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OverFileSizeMaxException.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OverFileSizeMaxException.kt index bf6355ac9..8caeb1524 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OverFileSizeMaxException.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OverFileSizeMaxException.kt @@ -18,4 +18,4 @@ import kotlin.jvm.JvmName /** * 图片文件过大 */ // 不要删除多平台结构, 这是 kotlin 的 bug -expect class OverFileSizeMaxException() : IllegalStateException \ No newline at end of file +public expect class OverFileSizeMaxException() : IllegalStateException \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/SystemDeviceInfo.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/SystemDeviceInfo.kt index 761114287..4df51949b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/SystemDeviceInfo.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/SystemDeviceInfo.kt @@ -15,9 +15,9 @@ package net.mamoe.mirai.utils * Android: 获取手机信息, 与 QQ 官方相同. * JVM: 部分为常量, 部分为随机 */ -expect open class SystemDeviceInfo : DeviceInfo { - constructor() - constructor(context: Context) +public expect open class SystemDeviceInfo : DeviceInfo { + public constructor() + public constructor(context: Context) - object Version : DeviceInfo.Version + public object Version : DeviceInfo.Version } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt index b1c24d02b..048deed54 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt @@ -23,10 +23,10 @@ import kotlin.time.ExperimentalTime /** * 时间戳 */ -expect val currentTimeMillis: Long +public expect val currentTimeMillis: Long @get:JvmSynthetic -inline val currentTimeSeconds: Long +public inline val currentTimeSeconds: Long get() = currentTimeMillis / 1000 @@ -34,57 +34,57 @@ inline val currentTimeSeconds: Long // 内联属性, 则将来删除这些 API 将不会导致二进制不兼容. @get:JvmSynthetic -inline val Int.secondsToMillis: Long +public inline val Int.secondsToMillis: Long get() = this * 1000L @get:JvmSynthetic -inline val Int.minutesToMillis: Long +public inline val Int.minutesToMillis: Long get() = this * 60.secondsToMillis @get:JvmSynthetic -inline val Int.hoursToMillis: Long +public inline val Int.hoursToMillis: Long get() = this * 60.minutesToMillis @get:JvmSynthetic -inline val Int.daysToMillis: Long +public inline val Int.daysToMillis: Long get() = this * 24.hoursToMillis @get:JvmSynthetic -inline val Int.weeksToMillis: Long +public inline val Int.weeksToMillis: Long get() = this * 7.daysToMillis @get:JvmSynthetic -inline val Int.monthsToMillis: Long +public inline val Int.monthsToMillis: Long get() = this * 30.daysToMillis @get:JvmSynthetic -inline val Int.millisToSeconds: Long +public inline val Int.millisToSeconds: Long get() = (this / 1000).toLong() @get:JvmSynthetic -inline val Int.minutesToSeconds: Long +public inline val Int.minutesToSeconds: Long get() = (this * 60).toLong() @get:JvmSynthetic -inline val Int.hoursToSeconds: Long +public inline val Int.hoursToSeconds: Long get() = this * 60.minutesToSeconds @get:JvmSynthetic -inline val Int.daysToSeconds: Long +public inline val Int.daysToSeconds: Long get() = this * 24.hoursToSeconds @get:JvmSynthetic -inline val Int.weeksToSeconds: Long +public inline val Int.weeksToSeconds: Long get() = this * 7.daysToSeconds @get:JvmSynthetic -inline val Int.monthsToSeconds: Long +public inline val Int.monthsToSeconds: Long get() = this * 30.daysToSeconds @MiraiExperimentalAPI @ExperimentalTime -val Duration.asHumanReadable: String +public val Duration.asHumanReadable: String get() { val days = toInt(DurationUnit.DAYS) val hours = toInt(DurationUnit.HOURS) % 24 diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/WeakRef.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/WeakRef.kt index 6f24d467c..307a18040 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/WeakRef.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/WeakRef.kt @@ -19,9 +19,9 @@ import kotlin.reflect.KProperty /** * WeakRef that `getValue` for delegation throws an [IllegalStateException] if the referent is released by GC. Therefore it returns notnull value only */ -class UnsafeWeakRef<T>(private val weakRef: WeakRef<T>) { - fun get(): T = weakRef.get() ?: error("WeakRef is released") - fun clear() = weakRef.clear() +public class UnsafeWeakRef<T>(private val weakRef: WeakRef<T>) { + public fun get(): T = weakRef.get() ?: error("WeakRef is released") + public fun clear(): Unit = weakRef.clear() } /** @@ -32,7 +32,7 @@ class UnsafeWeakRef<T>(private val weakRef: WeakRef<T>) { * ``` */ @JvmSynthetic -inline operator fun <T> UnsafeWeakRef<T>.getValue(thisRef: Any?, property: KProperty<*>): T = get() +public inline operator fun <T> UnsafeWeakRef<T>.getValue(thisRef: Any?, property: KProperty<*>): T = get() /** * Weak Reference. @@ -46,9 +46,9 @@ inline operator fun <T> UnsafeWeakRef<T>.getValue(thisRef: Any?, property: KProp * @see weakRef provides a WeakRef * @see unsafeWeakRef provides a UnsafeWeakRef */ -expect class WeakRef<T>(referent: T) { - fun get(): T? - fun clear() +public expect class WeakRef<T>(referent: T) { + public fun get(): T? + public fun clear() } /** @@ -58,20 +58,20 @@ expect class WeakRef<T>(referent: T) { */ @Target(AnnotationTarget.PROPERTY) @Retention(AnnotationRetention.SOURCE) -annotation class WeakRefProperty +public annotation class WeakRefProperty /** * Provides a weak reference to [this] * The `getValue` for delegation returns [this] when [this] is not released by GC */ @JvmSynthetic -inline fun <T> T.weakRef(): WeakRef<T> = WeakRef(this) +public inline fun <T> T.weakRef(): WeakRef<T> = WeakRef(this) /** * Constructs an unsafe inline delegate for [this] */ @JvmSynthetic -inline fun <T> WeakRef<T>.unsafe(): UnsafeWeakRef<T> = UnsafeWeakRef(this) +public inline fun <T> WeakRef<T>.unsafe(): UnsafeWeakRef<T> = UnsafeWeakRef(this) /** * Provides a weak reference to [this]. @@ -80,7 +80,7 @@ inline fun <T> WeakRef<T>.unsafe(): UnsafeWeakRef<T> = UnsafeWeakRef(this) * **UNSTABLE API**: It is strongly suggested not to use this api */ @JvmSynthetic -inline fun <T> T.unsafeWeakRef(): UnsafeWeakRef<T> = UnsafeWeakRef(this.weakRef()) +public inline fun <T> T.unsafeWeakRef(): UnsafeWeakRef<T> = UnsafeWeakRef(this.weakRef()) /** * Provides delegate value. @@ -90,10 +90,10 @@ inline fun <T> T.unsafeWeakRef(): UnsafeWeakRef<T> = UnsafeWeakRef(this.weakRef( * ``` */ @JvmSynthetic -inline operator fun <T> WeakRef<T>.getValue(thisRef: Any?, property: KProperty<*>): T? = this.get() +public inline operator fun <T> WeakRef<T>.getValue(thisRef: Any?, property: KProperty<*>): T? = this.get() /** * Call the block if the referent is absent */ @JvmSynthetic -inline fun <T, R> WeakRef<T>.ifAbsent(block: (T) -> R): R? = this.get()?.let(block) \ No newline at end of file +public inline fun <T, R> WeakRef<T>.ifAbsent(block: (T) -> R): R? = this.get()?.let(block) \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt index cb9d4c579..48dd393d0 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt @@ -20,12 +20,12 @@ import net.mamoe.mirai.utils.ContextImpl * ### 手动选择协议模块并构造 [Bot] * 引用 `net.mamoe.mirai.qqandroid.QQAndroid` 并使用其成员函数 [Bot] */ -actual interface BotFactory { +public actual interface BotFactory { /** * 使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmName("newBot") - actual fun Bot( + public actual fun Bot( context: Context, qq: Long, password: String, @@ -36,7 +36,7 @@ actual interface BotFactory { * 使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmName("newBot") - actual fun Bot( + public actual fun Bot( context: Context, qq: Long, passwordMd5: ByteArray, @@ -52,14 +52,14 @@ actual interface BotFactory { */ @JvmName("newBot") @JvmOverloads -fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot = +public fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot = factory.Bot(context, qq, password, configuration) /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmSynthetic -inline fun Bot(context: Context, qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot = +public inline fun Bot(context: Context, qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot = factory.Bot(context, qq, password, configuration) @@ -70,14 +70,14 @@ inline fun Bot(context: Context, qq: Long, password: String, configuration: (Bot */ @JvmName("newBot") @JvmOverloads -fun Bot(qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot = +public fun Bot(qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot = factory.Bot(ContextImpl(), qq, password, configuration) /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmSynthetic -inline fun Bot(qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot = +public inline fun Bot(qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot = factory.Bot(ContextImpl(), qq, password, configuration) @@ -88,7 +88,7 @@ inline fun Bot(qq: Long, password: String, configuration: (BotConfiguration.() - */ @JvmName("newBot") @JvmOverloads -fun Bot( +public fun Bot( context: Context, qq: Long, passwordMd5: ByteArray, @@ -100,7 +100,7 @@ fun Bot( * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmSynthetic -inline fun Bot(context: Context, qq: Long, passwordMd5: ByteArray, configuration: (BotConfiguration.() -> Unit)): Bot = +public inline fun Bot(context: Context, qq: Long, passwordMd5: ByteArray, configuration: (BotConfiguration.() -> Unit)): Bot = factory.Bot(context, qq, passwordMd5, BotConfiguration().apply(configuration)) @@ -111,14 +111,14 @@ inline fun Bot(context: Context, qq: Long, passwordMd5: ByteArray, configuration */ @JvmName("newBot") @JvmOverloads -fun Bot(qq: Long, passwordMd5: ByteArray, configuration: BotConfiguration = BotConfiguration.Default): Bot = +public fun Bot(qq: Long, passwordMd5: ByteArray, configuration: BotConfiguration = BotConfiguration.Default): Bot = factory.Bot(ContextImpl(), qq, passwordMd5, configuration) /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 */ @JvmSynthetic -inline fun Bot(qq: Long, passwordMd5: ByteArray, configuration: (BotConfiguration.() -> Unit)): Bot = +public inline fun Bot(qq: Long, passwordMd5: ByteArray, configuration: (BotConfiguration.() -> Unit)): Bot = factory.Bot(ContextImpl(), qq, passwordMd5, BotConfiguration().apply(configuration)) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/JvmMethodListeners.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/JvmMethodListeners.kt index 50e66f2bd..e638ba361 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/JvmMethodListeners.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/JvmMethodListeners.kt @@ -144,27 +144,27 @@ import kotlin.reflect.jvm.kotlinFunction * Events.registerEvents(new MyEventHandlers()) * ``` * - * @sample net.mamoe.mirai.event.JvmMethodEventsTest + * //@sample net.mamoe.mirai.event.JvmMethodEventsTest */ @Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.RUNTIME) -annotation class EventHandler( +public annotation class EventHandler( /** * 监听器优先级 * @see Listener.EventPriority 查看优先级相关信息 * @see Event.intercept 拦截事件 */ - val priority: Listener.EventPriority = EventPriority.NORMAL, + public val priority: Listener.EventPriority = EventPriority.NORMAL, /** * 是否自动忽略被 [取消][CancellableEvent.isCancelled] * @see CancellableEvent */ - val ignoreCancelled: Boolean = true, + public val ignoreCancelled: Boolean = true, /** * 并发类型 * @see Listener.ConcurrencyKind */ - val concurrency: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT + public val concurrency: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT ) /** @@ -173,23 +173,23 @@ annotation class EventHandler( * @see SimpleListenerHost 简单的实现 * @see EventHandler 查看更多信息 */ -interface ListenerHost +public interface ListenerHost /** * 携带一个异常处理器的 [ListenerHost]. * @see ListenerHost 查看更多信息 * @see EventHandler 查看更多信息 */ -abstract class SimpleListenerHost +public abstract class SimpleListenerHost @JvmOverloads constructor(coroutineContext: CoroutineContext = EmptyCoroutineContext) : ListenerHost, CoroutineScope { - final override val coroutineContext: CoroutineContext = + public final override val coroutineContext: CoroutineContext = CoroutineExceptionHandler(::handleException) + coroutineContext + SupervisorJob(coroutineContext[Job]) /** * 处理事件处理中未捕获的异常. 在构造器中的 [coroutineContext] 未提供 [CoroutineExceptionHandler] 情况下必须继承此函数. */ - open fun handleException(context: CoroutineContext, exception: Throwable) { + public open fun handleException(context: CoroutineContext, exception: Throwable) { throw IllegalStateException( """ 未找到异常处理器. 请继承 SimpleListenerHost 中的 handleException 方法, 或在构造 SimpleListenerHost 时提供 CoroutineExceptionHandler @@ -203,7 +203,7 @@ abstract class SimpleListenerHost /** * 停止所有事件监听 */ - fun cancelAll() { + public fun cancelAll() { this.cancel() } } @@ -216,7 +216,7 @@ abstract class SimpleListenerHost * @see EventHandler 获取更多信息 */ @JvmOverloads -fun <T> T.registerEvents(coroutineContext: CoroutineContext = EmptyCoroutineContext) +public fun <T> T.registerEvents(coroutineContext: CoroutineContext = EmptyCoroutineContext): Unit where T : CoroutineScope, T : ListenerHost = this.registerEvents(this, coroutineContext) /** @@ -227,7 +227,7 @@ fun <T> T.registerEvents(coroutineContext: CoroutineContext = EmptyCoroutineCont * @see EventHandler 获取更多信息 */ @JvmOverloads -fun CoroutineScope.registerEvents(host: ListenerHost, coroutineContext: CoroutineContext = EmptyCoroutineContext) { +public fun CoroutineScope.registerEvents(host: ListenerHost, coroutineContext: CoroutineContext = EmptyCoroutineContext) { for (method in host.javaClass.declaredMethods) { method.getAnnotation(EventHandler::class.java)?.let { method.registerEvent(host, this, it, coroutineContext) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt index d540d2859..ce9f54482 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt @@ -36,7 +36,7 @@ import java.net.URL * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun <C : Contact> BufferedImage.sendTo(contact: C): MessageReceipt<C> = +public suspend fun <C : Contact> BufferedImage.sendTo(contact: C): MessageReceipt<C> = toExternalImage().sendTo(contact) /** @@ -44,7 +44,7 @@ suspend fun <C : Contact> BufferedImage.sendTo(contact: C): MessageReceipt<C> = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun <C : Contact> URL.sendAsImageTo(contact: C): MessageReceipt<C> = +public suspend fun <C : Contact> URL.sendAsImageTo(contact: C): MessageReceipt<C> = toExternalImage().sendTo(contact) /** @@ -52,7 +52,7 @@ suspend fun <C : Contact> URL.sendAsImageTo(contact: C): MessageReceipt<C> = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun <C : Contact> Input.sendAsImageTo(contact: C): MessageReceipt<C> = +public suspend fun <C : Contact> Input.sendAsImageTo(contact: C): MessageReceipt<C> = toExternalImage().sendTo(contact) /** @@ -60,7 +60,7 @@ suspend fun <C : Contact> Input.sendAsImageTo(contact: C): MessageReceipt<C> = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun <C : Contact> InputStream.sendAsImageTo(contact: C): MessageReceipt<C> = +public suspend fun <C : Contact> InputStream.sendAsImageTo(contact: C): MessageReceipt<C> = toExternalImage().sendTo(contact) /** @@ -68,7 +68,7 @@ suspend fun <C : Contact> InputStream.sendAsImageTo(contact: C): MessageReceipt< * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun <C : Contact> File.sendAsImageTo(contact: C): MessageReceipt<C> { +public suspend fun <C : Contact> File.sendAsImageTo(contact: C): MessageReceipt<C> { require(this.exists() && this.canRead()) return toExternalImage().sendTo(contact) } @@ -83,7 +83,7 @@ suspend fun <C : Contact> File.sendAsImageTo(contact: C): MessageReceipt<C> { */ @JvmSynthetic @Throws(OverFileSizeMaxException::class) -suspend fun BufferedImage.upload(contact: Contact): Image = +public suspend fun BufferedImage.upload(contact: Contact): Image = toExternalImage().upload(contact) /** @@ -91,7 +91,7 @@ suspend fun BufferedImage.upload(contact: Contact): Image = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun URL.uploadAsImage(contact: Contact): Image = +public suspend fun URL.uploadAsImage(contact: Contact): Image = toExternalImage().upload(contact) /** @@ -99,7 +99,7 @@ suspend fun URL.uploadAsImage(contact: Contact): Image = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun Input.uploadAsImage(contact: Contact): Image = +public suspend fun Input.uploadAsImage(contact: Contact): Image = toExternalImage().upload(contact) /** @@ -107,7 +107,7 @@ suspend fun Input.uploadAsImage(contact: Contact): Image = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun InputStream.uploadAsImage(contact: Contact): Image = +public suspend fun InputStream.uploadAsImage(contact: Contact): Image = toExternalImage().upload(contact) /** @@ -115,7 +115,7 @@ suspend fun InputStream.uploadAsImage(contact: Contact): Image = * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend fun File.uploadAsImage(contact: Contact): Image { +public suspend fun File.uploadAsImage(contact: Contact): Image { require(this.isFile && this.exists() && this.canRead()) { "file ${this.path} is not readable" } return toExternalImage().upload(contact) } @@ -129,7 +129,7 @@ suspend fun File.uploadAsImage(contact: Contact): Image { * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun <C : Contact> C.sendImage(bufferedImage: BufferedImage): MessageReceipt<C> = +public suspend inline fun <C : Contact> C.sendImage(bufferedImage: BufferedImage): MessageReceipt<C> = bufferedImage.sendTo(this) /** @@ -137,21 +137,21 @@ suspend inline fun <C : Contact> C.sendImage(bufferedImage: BufferedImage): Mess * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun <C : Contact> C.sendImage(imageUrl: URL): MessageReceipt<C> = imageUrl.sendAsImageTo(this) +public suspend inline fun <C : Contact> C.sendImage(imageUrl: URL): MessageReceipt<C> = imageUrl.sendAsImageTo(this) /** * 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片发送到指定联系人 * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun <C : Contact> C.sendImage(imageInput: Input): MessageReceipt<C> = imageInput.sendAsImageTo(this) +public suspend inline fun <C : Contact> C.sendImage(imageInput: Input): MessageReceipt<C> = imageInput.sendAsImageTo(this) /** * 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人 * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun <C : Contact> C.sendImage(imageStream: InputStream): MessageReceipt<C> = +public suspend inline fun <C : Contact> C.sendImage(imageStream: InputStream): MessageReceipt<C> = imageStream.sendAsImageTo(this) /** @@ -159,7 +159,7 @@ suspend inline fun <C : Contact> C.sendImage(imageStream: InputStream): MessageR * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun <C : Contact> C.sendImage(file: File): MessageReceipt<C> = file.sendAsImageTo(this) +public suspend inline fun <C : Contact> C.sendImage(file: File): MessageReceipt<C> = file.sendAsImageTo(this) // endregion @@ -170,34 +170,34 @@ suspend inline fun <C : Contact> C.sendImage(file: File): MessageReceipt<C> = fi * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun Contact.uploadImage(bufferedImage: BufferedImage): Image = bufferedImage.upload(this) +public suspend inline fun Contact.uploadImage(bufferedImage: BufferedImage): Image = bufferedImage.upload(this) /** * 在 [Dispatchers.IO] 中下载 [URL] 到临时文件并将其作为图片上传, 但不发送 * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun Contact.uploadImage(imageUrl: URL): Image = imageUrl.uploadAsImage(this) +public suspend inline fun Contact.uploadImage(imageUrl: URL): Image = imageUrl.uploadAsImage(this) /** * 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片上传, 但不发送 * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun Contact.uploadImage(imageInput: Input): Image = imageInput.uploadAsImage(this) +public suspend inline fun Contact.uploadImage(imageInput: Input): Image = imageInput.uploadAsImage(this) /** * 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片上传, 但不发送 * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun Contact.uploadImage(imageStream: InputStream): Image = imageStream.uploadAsImage(this) +public suspend inline fun Contact.uploadImage(imageStream: InputStream): Image = imageStream.uploadAsImage(this) /** * 在 [Dispatchers.IO] 中将文件作为图片上传, 但不发送 * @throws OverFileSizeMaxException */ @Throws(OverFileSizeMaxException::class) -suspend inline fun Contact.uploadImage(file: File): Image = file.uploadAsImage(this) +public suspend inline fun Contact.uploadImage(file: File): Image = file.uploadAsImage(this) // endregion \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/data/Image.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/data/Image.kt index 6918fc1cb..1329de1d6 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/data/Image.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/data/Image.kt @@ -61,8 +61,8 @@ import java.net.URL * @see FlashImage 闪照 * @see Image.flash 转换普通图片为闪照 */ -actual interface Image : Message, MessageContent, CodableMessage { - actual companion object Key : Message.Key<Image> { +public actual interface Image : Message, MessageContent, CodableMessage { + public actual companion object Key : Message.Key<Image> { actual override val typeName: String get() = "Image" } @@ -82,7 +82,7 @@ actual interface Image : Message, MessageContent, CodableMessage { * * @see Image 使用 id 构造图片 */ - actual val imageId: String + public actual val imageId: String @Deprecated( diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt index 71906be41..c2dbd54f6 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt @@ -37,13 +37,13 @@ import java.io.File * ``` */ @Suppress("PropertyName") -actual open class BotConfiguration : BotConfigurationBase() { // open for Java +public actual open class BotConfiguration : BotConfigurationBase() { // open for Java /** * 设备信息覆盖. 在没有手动指定时将会通过日志警告, 并使用随机设备信息. * @see fileBasedDeviceInfo 使用指定文件存储设备信息 * @see randomDeviceInfo 使用随机设备信息 */ - actual var deviceInfo: ((Context) -> DeviceInfo)? = deviceInfoStub + public actual var deviceInfo: ((Context) -> DeviceInfo)? = deviceInfoStub /** * 使用随机设备信息. @@ -51,7 +51,7 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java * @see deviceInfo */ @ConfigurationDsl - actual fun randomDeviceInfo() { + public actual fun randomDeviceInfo() { deviceInfo = null } @@ -63,7 +63,7 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java @JvmOverloads @ConfigurationDsl @SinceMirai("1.1.0") - fun redirectNetworkLogToDirectory( + public fun redirectNetworkLogToDirectory( dir: File = File("logs"), retain: Long = 1.weeksToMillis, identity: (bot: Bot) -> String = { "Net ${it.id}" } @@ -82,7 +82,7 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java @JvmOverloads @SinceMirai("1.1.0") @ConfigurationDsl - fun redirectNetworkLogToFile( + public fun redirectNetworkLogToFile( file: File = File("mirai.log"), identity: (bot: Bot) -> String = { "Net ${it.id}" } ) { @@ -99,7 +99,7 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java @JvmOverloads @ConfigurationDsl @SinceMirai("1.1.0") - fun redirectBotLogToDirectory( + public fun redirectBotLogToDirectory( dir: File = File("logs"), retain: Long = 1.weeksToMillis, identity: (bot: Bot) -> String = { "Net ${it.id}" } @@ -118,7 +118,7 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java @JvmOverloads @ConfigurationDsl @SinceMirai("1.1.0") - fun redirectBotLogToFile( + public fun redirectBotLogToFile( file: File = File("mirai.log"), identity: (bot: Bot) -> String = { "Net ${it.id}" } ) { @@ -128,9 +128,9 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java } @Suppress("ACTUAL_WITHOUT_EXPECT") - actual enum class MiraiProtocol actual constructor( + public actual enum class MiraiProtocol actual constructor( /** 协议模块使用的 ID */ - @JvmField actual internal val id: Long + @JvmField internal actual val id: Long ) { /** * Android 手机. @@ -149,10 +149,10 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java ANDROID_WATCH(537061176) } - actual companion object { + public actual companion object { /** 默认的配置实例. 可以进行修改 */ @JvmStatic - actual val Default = BotConfiguration() + public actual val Default: BotConfiguration = BotConfiguration() } /** @@ -164,11 +164,11 @@ actual open class BotConfiguration : BotConfigurationBase() { // open for Java */ @JvmOverloads @ConfigurationDsl - fun fileBasedDeviceInfo(filepath: String = "device.json") { + public fun fileBasedDeviceInfo(filepath: String = "device.json") { deviceInfo = getFileBasedDeviceInfoSupplier(filepath) } - actual fun copy(): BotConfiguration { + public actual fun copy(): BotConfiguration { return BotConfiguration().also { new -> new.botLoggerSupplier = botLoggerSupplier new.networkLoggerSupplier = networkLoggerSupplier diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/Context.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/Context.kt index 304c2af33..50798081a 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/Context.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/Context.kt @@ -11,6 +11,6 @@ package net.mamoe.mirai.utils import kotlinx.io.pool.DefaultPool -actual abstract class Context +public actual abstract class Context -open class ContextImpl : Context() +public open class ContextImpl : Context() diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt index 2141be63d..1a4856b24 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt @@ -29,7 +29,7 @@ import java.net.URL * 将 [BufferedImage] 保存为临时文件, 然后构造 [ExternalImage] */ @JvmOverloads -fun BufferedImage.toExternalImage(formatName: String = "png"): ExternalImage = +public fun BufferedImage.toExternalImage(formatName: String = "png"): ExternalImage = ExternalImage(DeferredReusableInput(this, formatName)) /** @@ -37,7 +37,7 @@ fun BufferedImage.toExternalImage(formatName: String = "png"): ExternalImage = * @param deleteOnClose 若为 `true`, 图片发送后将会删除这个文件 */ @JvmOverloads -fun File.toExternalImage(deleteOnClose: Boolean = false): ExternalImage { +public fun File.toExternalImage(deleteOnClose: Boolean = false): ExternalImage { require(this.isFile) { "File must be a file" } require(this.exists()) { "File must exist" } require(this.canRead()) { "File must can be read" } @@ -48,42 +48,42 @@ fun File.toExternalImage(deleteOnClose: Boolean = false): ExternalImage { * 将 [URL] 委托为 [ExternalImage]. * 只会在上传图片时才读取 [URL] 的内容. 具体行为取决于相关 [Bot] 的 [FileCacheStrategy] */ -fun URL.toExternalImage(): ExternalImage = ExternalImage(DeferredReusableInput(this, null)) +public fun URL.toExternalImage(): ExternalImage = ExternalImage(DeferredReusableInput(this, null)) /** * 将 [InputStream] 委托为 [ExternalImage]. * 只会在上传图片时才读取 [InputStream] 的内容. 具体行为取决于相关 [Bot] 的 [FileCacheStrategy] */ -fun InputStream.toExternalImage(): ExternalImage = ExternalImage(DeferredReusableInput(this, null)) +public fun InputStream.toExternalImage(): ExternalImage = ExternalImage(DeferredReusableInput(this, null)) /** * 将 [Input] 委托为 [ExternalImage]. * 只会在上传图片时才读取 [Input] 的内容. 具体行为取决于相关 [Bot] 的 [FileCacheStrategy] */ -fun Input.toExternalImage(): ExternalImage = ExternalImage(DeferredReusableInput(this, null)) +public fun Input.toExternalImage(): ExternalImage = ExternalImage(DeferredReusableInput(this, null)) @PlannedRemoval("1.2.0") @Suppress("RedundantSuspendModifier") @Deprecated("no need", ReplaceWith("toExternalImage()"), level = DeprecationLevel.ERROR) -suspend fun Input.suspendToExternalImage(): ExternalImage = toExternalImage() +public suspend fun Input.suspendToExternalImage(): ExternalImage = toExternalImage() @Suppress("RedundantSuspendModifier") @PlannedRemoval("1.2.0") @Deprecated("no need", ReplaceWith("toExternalImage()"), level = DeprecationLevel.ERROR) -suspend fun InputStream.suspendToExternalImage(): ExternalImage = toExternalImage() +public suspend fun InputStream.suspendToExternalImage(): ExternalImage = toExternalImage() @Suppress("RedundantSuspendModifier") @PlannedRemoval("1.2.0") @Deprecated("no need", ReplaceWith("toExternalImage()"), level = DeprecationLevel.ERROR) -suspend fun URL.suspendToExternalImage(): ExternalImage = toExternalImage() +public suspend fun URL.suspendToExternalImage(): ExternalImage = toExternalImage() @Suppress("RedundantSuspendModifier") @PlannedRemoval("1.2.0") @Deprecated("no need", ReplaceWith("toExternalImage()"), level = DeprecationLevel.ERROR) -suspend fun File.suspendToExternalImage(): ExternalImage = toExternalImage() +public suspend fun File.suspendToExternalImage(): ExternalImage = toExternalImage() @Suppress("RedundantSuspendModifier") @PlannedRemoval("1.2.0") @Deprecated("no need", ReplaceWith("toExternalImage()"), level = DeprecationLevel.ERROR) -suspend fun BufferedImage.suspendToExternalImage(): ExternalImage = toExternalImage() +public suspend fun BufferedImage.suspendToExternalImage(): ExternalImage = toExternalImage() diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt index 2ddcb56d3..56fc1d79c 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt @@ -29,14 +29,14 @@ import kotlin.io.use * @see BotConfiguration.fileCacheStrategy 为 [Bot] 指定缓存策略 */ @MiraiExperimentalAPI -actual interface FileCacheStrategy { +public actual interface FileCacheStrategy { /** * 将 [input] 缓存为 [ExternalImage]. * 此函数应 close 这个 [Input] */ @MiraiExperimentalAPI @Throws(IOException::class) - actual fun newImageCache(input: Input): ExternalImage + public actual fun newImageCache(input: Input): ExternalImage /** * 将 [input] 缓存为 [ExternalImage]. @@ -44,7 +44,7 @@ actual interface FileCacheStrategy { */ @MiraiExperimentalAPI @Throws(IOException::class) - fun newImageCache(input: InputStream): ExternalImage + public fun newImageCache(input: InputStream): ExternalImage /** * 将 [input] 缓存为 [ExternalImage]. @@ -52,7 +52,7 @@ actual interface FileCacheStrategy { */ @MiraiExperimentalAPI @Throws(IOException::class) - actual fun newImageCache(input: ByteArray): ExternalImage + public actual fun newImageCache(input: ByteArray): ExternalImage /** * 将 [input] 缓存为 [ExternalImage]. @@ -60,25 +60,25 @@ actual interface FileCacheStrategy { */ @MiraiExperimentalAPI @Throws(IOException::class) - fun newImageCache(input: BufferedImage, format: String = "png"): ExternalImage + public fun newImageCache(input: BufferedImage, format: String = "png"): ExternalImage /** * 将 [input] 缓存为 [ExternalImage]. */ @MiraiExperimentalAPI @Throws(IOException::class) - fun newImageCache(input: URL): ExternalImage + public fun newImageCache(input: URL): ExternalImage /** * 默认的缓存方案, 使用系统临时文件夹存储. */ @MiraiExperimentalAPI - actual object PlatformDefault : FileCacheStrategy by TempCache(null) + public actual object PlatformDefault : FileCacheStrategy by TempCache(null) /** * 使用内存直接存储所有图片文件. */ - actual object MemoryCache : FileCacheStrategy { + public actual object MemoryCache : FileCacheStrategy { @MiraiExperimentalAPI @Throws(IOException::class) actual override fun newImageCache(input: Input): ExternalImage { @@ -116,11 +116,11 @@ actual interface FileCacheStrategy { * 使用系统临时文件夹缓存图片文件. 在图片使用完毕后删除临时文件. */ @MiraiExperimentalAPI - class TempCache @JvmOverloads constructor( + public class TempCache @JvmOverloads constructor( /** * 缓存图片存放位置. 为 `null` 时使用主机系统的临时文件夹 */ - val directory: File? = null + public val directory: File? = null ) : FileCacheStrategy { @MiraiExperimentalAPI @Throws(IOException::class) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileLogger.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileLogger.kt index 710a47203..7dba24cf6 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileLogger.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileLogger.kt @@ -21,7 +21,7 @@ private val currentDate get() = SimpleDateFormat("yyyy-MM-dd").format(Date()) * * @see PlatformLogger 查看格式信息 */ -class SingleFileLogger @JvmOverloads constructor(identity: String, file: File = File("$identity-$currentDate.log")) : +public class SingleFileLogger @JvmOverloads constructor(identity: String, file: File = File("$identity-$currentDate.log")) : PlatformLogger(identity, { file.appendText(it + "\n") }, false) { init { @@ -39,7 +39,7 @@ private val STUB: (priority: SimpleLogger.LogPriority, message: String?, e: Thro * * @see PlatformLogger 查看格式信息 */ -class DirectoryLogger @JvmOverloads constructor( +public class DirectoryLogger @JvmOverloads constructor( identity: String, private val directory: File = File(identity), /** diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt index b268a90cb..9ad190eb3 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt @@ -30,15 +30,16 @@ import java.io.RandomAccessFile import javax.imageio.ImageIO import kotlin.coroutines.CoroutineContext -actual typealias Throws = kotlin.jvm.Throws +@Suppress("ACTUAL_WITHOUT_EXPECT") +internal actual typealias Throws = kotlin.jvm.Throws /** * 自动选择 [SwingSolver] 或 [StandardCharImageLoginSolver] */ @MiraiExperimentalAPI -class DefaultLoginSolver( - val input: suspend () -> String, - val overrideLogger: MiraiLogger? = null +public class DefaultLoginSolver( + public val input: suspend () -> String, + public val overrideLogger: MiraiLogger? = null ) : LoginSolver() { private val delegate: LoginSolver @@ -67,7 +68,7 @@ class DefaultLoginSolver( * 使用字符图片展示验证码, 使用 [input] 获取输入, 使用 [overrideLogger] 输出 */ @MiraiExperimentalAPI -class StandardCharImageLoginSolver( +public class StandardCharImageLoginSolver( input: suspend () -> String, /** * 为 `null` 时使用 [Bot.logger] @@ -138,13 +139,13 @@ class StandardCharImageLoginSolver( /** * 验证码, 设备锁解决器 */ -actual abstract class LoginSolver { - actual abstract suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? - actual abstract suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? - actual abstract suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? +public actual abstract class LoginSolver { + public actual abstract suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? + public actual abstract suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? + public actual abstract suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? - actual companion object { - actual val Default: LoginSolver = + public actual companion object { + public actual val Default: LoginSolver = DefaultLoginSolver({ readLine() ?: throw NoStandardInputForCaptchaException(null) }) } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.swing.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.swing.jvm.kt index 0855c4cc6..2b862eed0 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.swing.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.swing.jvm.kt @@ -21,22 +21,22 @@ import javax.swing.JTextField * @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp> */ @MiraiExperimentalAPI -object SwingSolver : LoginSolver() { - override suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? { +public object SwingSolver : LoginSolver() { + public override suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? { return openWindow("Mirai PicCaptcha(${bot.id})") { val image = ImageIO.read(data.inputStream()) JLabel(ImageIcon(image)).append() } } - override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? { + public override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? { return openWindow("Mirai SliderCaptcha(${bot.id})") { JLabel("需要滑动验证码, 完成后请关闭该窗口").append() Desktop.getDesktop().browse(URI(url)) } } - override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? { + public override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? { return openWindow("Mirai UnsafeDeviceLoginVerify(${bot.id})") { JLabel( """ diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/OverFileSizeMaxException.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/OverFileSizeMaxException.kt index 4a31ad010..c6cd2f77d 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/OverFileSizeMaxException.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/OverFileSizeMaxException.kt @@ -3,4 +3,4 @@ package net.mamoe.mirai.utils /** * 图片文件过大 */ -actual class OverFileSizeMaxException : IllegalStateException() \ No newline at end of file +public actual class OverFileSizeMaxException : IllegalStateException() \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformLogger.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformLogger.jvm.kt index 43ab4bc24..e27bae13a 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformLogger.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformLogger.jvm.kt @@ -15,6 +15,7 @@ package net.mamoe.mirai.utils import java.io.ByteArrayOutputStream import java.io.PrintStream +import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* @@ -43,15 +44,15 @@ import java.util.* * @see SingleFileLogger 使用单一文件记录日志 * @see DirectoryLogger 在一个目录中按日期存放文件记录日志, 自动清理过期日志 */ -actual open class PlatformLogger @JvmOverloads constructor( - override val identity: String? = "Mirai", +public actual open class PlatformLogger @JvmOverloads constructor( + public override val identity: String? = "Mirai", /** * 日志输出. 不会自动添加换行 */ - open val output: (String) -> Unit, - val isColored: Boolean = true + public open val output: (String) -> Unit, + public val isColored: Boolean = true ) : MiraiLoggerPlatformBase() { - actual constructor(identity: String?) : this(identity, ::println) + public actual constructor(identity: String?) : this(identity, ::println) /** * 输出一条日志. [message] 末尾可能不带换行符. @@ -75,39 +76,39 @@ actual open class PlatformLogger @JvmOverloads constructor( SimpleLogger.LogPriority.DEBUG -> Color.LIGHT_CYAN } - override fun verbose0(message: String?) = printLog(message, SimpleLogger.LogPriority.VERBOSE) + public override fun verbose0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.VERBOSE) - override fun verbose0(message: String?, e: Throwable?) { + public override fun verbose0(message: String?, e: Throwable?) { if (e != null) verbose((message ?: e.toString()) + "\n${e.stackTraceString}") else verbose(message.toString()) } - override fun info0(message: String?) = printLog(message, SimpleLogger.LogPriority.INFO) - override fun info0(message: String?, e: Throwable?) { + public override fun info0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.INFO) + public override fun info0(message: String?, e: Throwable?) { if (e != null) info((message ?: e.toString()) + "\n${e.stackTraceString}") else info(message.toString()) } - override fun warning0(message: String?) = printLog(message, SimpleLogger.LogPriority.WARNING) - override fun warning0(message: String?, e: Throwable?) { + public override fun warning0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.WARNING) + public override fun warning0(message: String?, e: Throwable?) { if (e != null) warning((message ?: e.toString()) + "\n${e.stackTraceString}") else warning(message.toString()) } - override fun error0(message: String?) = printLog(message, SimpleLogger.LogPriority.ERROR) - override fun error0(message: String?, e: Throwable?) { + public override fun error0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.ERROR) + public override fun error0(message: String?, e: Throwable?) { if (e != null) error((message ?: e.toString()) + "\n${e.stackTraceString}") else error(message.toString()) } - override fun debug0(message: String?) = printLog(message, SimpleLogger.LogPriority.DEBUG) - override fun debug0(message: String?, e: Throwable?) { + public override fun debug0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.DEBUG) + public override fun debug0(message: String?, e: Throwable?) { if (e != null) debug((message ?: e.toString()) + "\n${e.stackTraceString}") else debug(message.toString()) } @SinceMirai("1.1.0") - protected open val timeFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.SIMPLIFIED_CHINESE) + protected open val timeFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.SIMPLIFIED_CHINESE) private val currentTimeFormatted get() = timeFormat.format(Date()) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt index aa0222856..90fdafee0 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt @@ -30,5 +30,5 @@ import java.util.zip.Inflater /** * 时间戳 */ -actual val currentTimeMillis: Long +public actual val currentTimeMillis: Long get() = System.currentTimeMillis() diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt index 4a7892b86..342a601f1 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt @@ -12,9 +12,7 @@ package net.mamoe.mirai.utils import kotlinx.io.core.toByteArray import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import kotlinx.serialization.UnstableDefault import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import net.mamoe.mirai.utils.internal.md5 import java.io.File import kotlin.random.Random @@ -23,7 +21,7 @@ import kotlin.random.nextInt /** * 加载一个设备信息. 若文件不存在或为空则随机并创建一个设备信息保存. */ -fun File.loadAsDeviceInfo(json: Json, context: Context = ContextImpl()): DeviceInfo { +public fun File.loadAsDeviceInfo(json: Json, context: Context = ContextImpl()): DeviceInfo { if (!this.exists() || this.length() == 0L) { return SystemDeviceInfo(context).also { this.writeText(json.stringify(SystemDeviceInfo.serializer(), it)) @@ -35,55 +33,57 @@ fun File.loadAsDeviceInfo(json: Json, context: Context = ContextImpl()): DeviceI } @Serializable -actual open class SystemDeviceInfo actual constructor() : DeviceInfo() { - actual constructor(context: Context) : this() { +public actual open class SystemDeviceInfo actual constructor() : DeviceInfo() { + public actual constructor(context: Context) : this() { this.context = context } @Transient - final override lateinit var context: Context + public final override lateinit var context: Context - override val display: ByteArray = "MIRAI.${getRandomString(6, '0'..'9')}.001".toByteArray() - override val product: ByteArray = "mirai".toByteArray() - override val device: ByteArray = "mirai".toByteArray() - override val board: ByteArray = "mirai".toByteArray() - override val brand: ByteArray = "mamoe".toByteArray() - override val model: ByteArray = "mirai".toByteArray() - override val bootloader: ByteArray = "unknown".toByteArray() - override val fingerprint: ByteArray = + public override val display: ByteArray = "MIRAI.${getRandomString(6, '0'..'9')}.001".toByteArray() + public override val product: ByteArray = "mirai".toByteArray() + public override val device: ByteArray = "mirai".toByteArray() + public override val board: ByteArray = "mirai".toByteArray() + public override val brand: ByteArray = "mamoe".toByteArray() + public override val model: ByteArray = "mirai".toByteArray() + public override val bootloader: ByteArray = "unknown".toByteArray() + public override val fingerprint: ByteArray = "mamoe/mirai/mirai:10/MIRAI.200122.001/${getRandomString(7, '0'..'9')}:user/release-keys".toByteArray() - override val bootId: ByteArray = ExternalImage.generateUUID(getRandomByteArray(16).md5()).toByteArray() - override val procVersion: ByteArray = + public override val bootId: ByteArray = ExternalImage.generateUUID(getRandomByteArray(16).md5()).toByteArray() + public override val procVersion: ByteArray = "Linux version 3.0.31-${getRandomString(8)} (android-build@xxx.xxx.xxx.xxx.com)".toByteArray() - override val baseBand: ByteArray = byteArrayOf() - override val version: Version = Version - override val simInfo: ByteArray = "T-Mobile".toByteArray() - override val osType: ByteArray = "android".toByteArray() - override val macAddress: ByteArray = "02:00:00:00:00:00".toByteArray() - override val wifiBSSID: ByteArray? = "02:00:00:00:00:00".toByteArray() - override val wifiSSID: ByteArray? = "<unknown ssid>".toByteArray() - override val imsiMd5: ByteArray = getRandomByteArray(16).md5() - override val imei: String = getRandomString(15, '0'..'9') - override val androidId: ByteArray get() = display - override val apn: ByteArray = "wifi".toByteArray() + public override val baseBand: ByteArray = byteArrayOf() + public override val version: Version = Version + public override val simInfo: ByteArray = "T-Mobile".toByteArray() + public override val osType: ByteArray = "android".toByteArray() + public override val macAddress: ByteArray = "02:00:00:00:00:00".toByteArray() + public override val wifiBSSID: ByteArray? = "02:00:00:00:00:00".toByteArray() + public override val wifiSSID: ByteArray? = "<unknown ssid>".toByteArray() + public override val imsiMd5: ByteArray = getRandomByteArray(16).md5() + public override val imei: String = getRandomString(15, '0'..'9') + public override val androidId: ByteArray get() = display + public override val apn: ByteArray = "wifi".toByteArray() @Serializable - actual object Version : DeviceInfo.Version { - override val incremental: ByteArray = "5891938".toByteArray() - override val release: ByteArray = "10".toByteArray() - override val codename: ByteArray = "REL".toByteArray() - override val sdk: Int = 29 + public actual object Version : DeviceInfo.Version { + public override val incremental: ByteArray = "5891938".toByteArray() + public override val release: ByteArray = "10".toByteArray() + public override val codename: ByteArray = "REL".toByteArray() + public override val sdk: Int = 29 } } /** * 生成长度为 [length], 元素为随机 `0..255` 的 [ByteArray] */ +@JvmSynthetic internal fun getRandomByteArray(length: Int): ByteArray = ByteArray(length) { Random.nextInt(0..255).toByte() } /** * 随机生成长度为 [length] 的 [String]. */ +@JvmSynthetic internal fun getRandomString(length: Int): String = getRandomString(length, *defaultRanges) @@ -92,11 +92,13 @@ private val defaultRanges: Array<CharRange> = arrayOf('a'..'z', 'A'..'Z', '0'..' /** * 根据所给 [charRange] 随机生成长度为 [length] 的 [String]. */ +@JvmSynthetic internal fun getRandomString(length: Int, charRange: CharRange): String = String(CharArray(length) { charRange.random() }) /** * 根据所给 [charRanges] 随机生成长度为 [length] 的 [String]. */ +@JvmSynthetic internal fun getRandomString(length: Int, vararg charRanges: CharRange): String = String(CharArray(length) { charRanges[Random.Default.nextInt(0..charRanges.lastIndex)].random() }) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/WeakRef.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/WeakRef.jvm.kt index 862b3fc52..82ba458eb 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/WeakRef.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/WeakRef.jvm.kt @@ -11,4 +11,4 @@ package net.mamoe.mirai.utils import java.lang.ref.WeakReference -actual typealias WeakRef<T> = WeakReference<T> \ No newline at end of file +public actual typealias WeakRef<T> = WeakReference<T> \ No newline at end of file diff --git a/mirai-serialization/build.gradle.kts b/mirai-serialization/build.gradle.kts index 7e053974d..005ee5477 100644 --- a/mirai-serialization/build.gradle.kts +++ b/mirai-serialization/build.gradle.kts @@ -14,6 +14,8 @@ description = "Mirai serialization module" val isAndroidSDKAvailable: Boolean by project kotlin { + explicitApi() + if (isAndroidSDKAvailable) { apply(from = rootProject.file("gradle/android.gradle")) android("android") { @@ -36,7 +38,7 @@ kotlin { jvm() - sourceSets { + sourceSets.apply { all { languageSettings.enableLanguageFeature("InlineClasses") languageSettings.useExperimentalAnnotation("kotlin.Experimental") @@ -47,12 +49,16 @@ kotlin { languageSettings.useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference") languageSettings.useExperimentalAnnotation("kotlin.time.ExperimentalTime") languageSettings.useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") + + languageSettings.languageVersion = "1.3" + languageSettings.apiVersion = "1.3" + languageSettings.progressiveMode = true } val commonMain by getting { dependencies { - api(kotlin("stdlib")) + api(kotlin("stdlib", Versions.Kotlin.stdlib)) api(project(":mirai-core")) } } diff --git a/settings.gradle b/settings.gradle index ea22bf2c5..baba99f2b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,8 +22,9 @@ pluginManagement { rootProject.name = 'mirai' include(':mirai-core') -include(':mirai-core-qqandroid') -include(':mirai-serialization') +//include(':mirai-core-qqandroid') +//include(':mirai-serialization') + //include(':compatibility-validator') // THIS WILL CAUSE A DEPENDENCY RESOLUTION BUG //include(':java-compatibility-validator') From 4f86d15ef3a4aae845ab44cc9f887a4d67e06046 Mon Sep 17 00:00:00 2001 From: Him188 <Him188@mamoe.net> Date: Mon, 20 Jul 2020 17:21:00 +0800 Subject: [PATCH 2/2] Simplify buildscript --- buildSrc/src/main/kotlin/Versions.kt | 2 +- mirai-core/build.gradle.kts | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 69ca8f197..64984007e 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -42,4 +42,4 @@ object Versions { fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$version" @Suppress("unused") -fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version" +fun ktor(id: String, version: String = Versions.Kotlin.ktor) = "io.ktor:ktor-$id:$version" diff --git a/mirai-core/build.gradle.kts b/mirai-core/build.gradle.kts index c3a7f81ce..bd378e3f1 100644 --- a/mirai-core/build.gradle.kts +++ b/mirai-core/build.gradle.kts @@ -58,7 +58,7 @@ kotlin { languageSettings.progressiveMode = true } - commonMain { + val commonMain by getting { dependencies { api(kotlin("stdlib", Versions.Kotlin.stdlib)) api(kotlin("serialization")) @@ -72,11 +72,12 @@ kotlin { api("org.jetbrains.kotlinx:atomicfu-common:${Versions.Kotlin.atomicFU}") - api(ktor("client-cio", Versions.Kotlin.ktor)) - api(ktor("client-core", Versions.Kotlin.ktor)) - api(ktor("network", Versions.Kotlin.ktor)) + api(ktor("client-cio")) + api(ktor("client-core")) + api(ktor("network")) } } + commonTest { dependencies { implementation(kotlin("test-annotations-common"))