Commit be7c5376 authored by jiahua.liu's avatar jiahua.liu

Merge remote-tracking branch 'origin/master'

parents 221a4fe9 357e7d77
package net.mamoe.mirai.qqandroid
import net.mamoe.mirai.Bot
import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.BotFactory
import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.MiraiInternalAPI
/**
* QQ for Android
*/
actual object QQAndroid : BotFactory {
@UseExperimental(MiraiInternalAPI::class)
override fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration): Bot {
return QQAndroidBot(context, BotAccount(qq, password), configuration)
}
}
\ No newline at end of file
package net.mamoe.mirai.qqandroid package net.mamoe.mirai.qqandroid
import net.mamoe.mirai.BotAccount import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.qqandroid.utils.Context
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
internal actual class QQAndroidBot actual constructor( internal actual class QQAndroidBot actual constructor(
context: Context, context: Context,
......
package net.mamoe.mirai.qqandroid.utils
actual typealias Context = android.content.Context
\ No newline at end of file
package net.mamoe.mirai.qqandroid
import net.mamoe.mirai.BotFactory
/**
* QQ for Android
*/
expect object QQAndroid : BotFactory
\ No newline at end of file
...@@ -8,9 +8,9 @@ import net.mamoe.mirai.data.ImageLink ...@@ -8,9 +8,9 @@ import net.mamoe.mirai.data.ImageLink
import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler
import net.mamoe.mirai.qqandroid.network.QQAndroidClient import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.utils.Context
import net.mamoe.mirai.qqandroid.utils.ImageIdQQA import net.mamoe.mirai.qqandroid.utils.ImageIdQQA
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.LockFreeLinkedList import net.mamoe.mirai.utils.LockFreeLinkedList
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
......
...@@ -404,7 +404,9 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler ...@@ -404,7 +404,9 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
} }
override fun dispose(cause: Throwable?) { override fun dispose(cause: Throwable?) {
channel.close() if (::channel.isInitialized) {
channel.close()
}
super.dispose(cause) super.dispose(cause)
} }
......
...@@ -11,7 +11,6 @@ import net.mamoe.mirai.qqandroid.QQAndroidBot ...@@ -11,7 +11,6 @@ import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketLogger import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketLogger
import net.mamoe.mirai.qqandroid.network.protocol.packet.Tlv import net.mamoe.mirai.qqandroid.network.protocol.packet.Tlv
import net.mamoe.mirai.qqandroid.utils.Context
import net.mamoe.mirai.qqandroid.utils.DeviceInfo import net.mamoe.mirai.qqandroid.utils.DeviceInfo
import net.mamoe.mirai.qqandroid.utils.NetworkType import net.mamoe.mirai.qqandroid.utils.NetworkType
import net.mamoe.mirai.qqandroid.utils.SystemDeviceInfo import net.mamoe.mirai.qqandroid.utils.SystemDeviceInfo
......
...@@ -3,6 +3,7 @@ package net.mamoe.mirai.qqandroid.utils ...@@ -3,6 +3,7 @@ package net.mamoe.mirai.qqandroid.utils
import kotlinx.serialization.SerialId import kotlinx.serialization.SerialId
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import net.mamoe.mirai.qqandroid.io.serialization.ProtoBufWithNullableSupport import net.mamoe.mirai.qqandroid.io.serialization.ProtoBufWithNullableSupport
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.cryptor.contentToString import net.mamoe.mirai.utils.cryptor.contentToString
import net.mamoe.mirai.utils.getValue import net.mamoe.mirai.utils.getValue
import net.mamoe.mirai.utils.unsafeWeakRef import net.mamoe.mirai.utils.unsafeWeakRef
......
package net.mamoe.mirai.qqandroid.utils package net.mamoe.mirai.qqandroid.utils
import net.mamoe.mirai.utils.Context
/** /**
* System default values * System default values
*/ */
......
@file:Suppress("FunctionName")
package net.mamoe.mirai.qqandroid
import net.mamoe.mirai.Bot
import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.BotFactory
import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.MiraiInternalAPI
/**
* QQ for Android
*/
@UseExperimental(MiraiInternalAPI::class)
actual object QQAndroid : BotFactory {
override fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration): Bot {
return QQAndroidBot(context, BotAccount(qq, password), configuration)
}
fun Bot(qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot =
QQAndroidBot(BotAccount(qq, password), configuration)
}
/**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/
inline fun QQAndroid.Bot(qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot =
this.Bot(qq, password, BotConfiguration().apply(configuration))
\ No newline at end of file
package net.mamoe.mirai.qqandroid package net.mamoe.mirai.qqandroid
import net.mamoe.mirai.BotAccount import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.qqandroid.utils.Context
import net.mamoe.mirai.qqandroid.utils.ContextImpl
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.ContextImpl
import net.mamoe.mirai.utils.MiraiInternalAPI
@UseExperimental(MiraiInternalAPI::class)
@Suppress("FunctionName") @Suppress("FunctionName")
internal fun QQAndroidBot(account: BotAccount, configuration: BotConfiguration): QQAndroidBot = QQAndroidBot(ContextImpl(), account, configuration) internal fun QQAndroidBot(account: BotAccount, configuration: BotConfiguration): QQAndroidBot = QQAndroidBot(ContextImpl(), account, configuration)
@UseExperimental(MiraiInternalAPI::class)
internal actual class QQAndroidBot actual constructor( internal actual class QQAndroidBot actual constructor(
context: Context, context: Context,
account: BotAccount, account: BotAccount,
......
package net.mamoe.mirai.qqandroid.utils package net.mamoe.mirai.qqandroid.utils
import kotlinx.io.core.toByteArray import kotlinx.io.core.toByteArray
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.localIpAddress import net.mamoe.mirai.utils.localIpAddress
actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(context) { actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(context) {
...@@ -39,8 +40,4 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo( ...@@ -39,8 +40,4 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(
override val codename: ByteArray get() = "REL".toByteArray() override val codename: ByteArray get() = "REL".toByteArray()
override val sdk: Int get() = 29 override val sdk: Int get() = 29
} }
} }
\ No newline at end of file
actual abstract class Context
open class ContextImpl : Context()
\ No newline at end of file
...@@ -7,13 +7,21 @@ import net.mamoe.mirai.BotAccount ...@@ -7,13 +7,21 @@ import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.BotFactory import net.mamoe.mirai.BotFactory
import net.mamoe.mirai.timpc.TIMPC.Bot import net.mamoe.mirai.timpc.TIMPC.Bot
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
import net.mamoe.mirai.utils.MiraiInternalAPI
/** /**
* TIM PC 协议的 [Bot] 构造器. * TIM PC 协议的 [Bot] 构造器.
*/ */
@UseExperimental(MiraiInternalAPI::class)
object TIMPC : BotFactory { object TIMPC : BotFactory {
/** /**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例 * 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/ */
override fun Bot(account: BotAccount, configuration: BotConfiguration): Bot = TIMPCBot(account, configuration) override fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration): Bot = TIMPCBot(BotAccount(qq, password), configuration)
/**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/
fun Bot(qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot = TIMPCBot(BotAccount(qq, password), configuration)
} }
\ No newline at end of file
package net.mamoe.mirai.utils
actual typealias Context = android.content.Context
\ No newline at end of file
...@@ -3,9 +3,11 @@ ...@@ -3,9 +3,11 @@
package net.mamoe.mirai package net.mamoe.mirai
import kotlinx.io.core.toByteArray import kotlinx.io.core.toByteArray
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.md5 import net.mamoe.mirai.utils.md5
import kotlin.annotation.AnnotationTarget.* import kotlin.annotation.AnnotationTarget.*
@MiraiInternalAPI
data class BotAccount( data class BotAccount(
/** /**
* **注意**: 在 Android 协议, 总是使用 `QQAndroidClient.uin` 或 [Bot.uin], 而不要使用 [BotAccount.id]. 将来 [BotAccount.id] 可能会变为 [String] * **注意**: 在 Android 协议, 总是使用 `QQAndroidClient.uin` 或 [Bot.uin], 而不要使用 [BotAccount.id]. 将来 [BotAccount.id] 可能会变为 [String]
...@@ -23,4 +25,4 @@ data class BotAccount( ...@@ -23,4 +25,4 @@ data class BotAccount(
@Retention(AnnotationRetention.SOURCE) @Retention(AnnotationRetention.SOURCE)
@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR) @Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)
@Experimental(level = Experimental.Level.WARNING) @Experimental(level = Experimental.Level.WARNING)
annotation class RawAccountIdUse internal annotation class RawAccountIdUse
\ No newline at end of file \ No newline at end of file
...@@ -3,6 +3,9 @@ ...@@ -3,6 +3,9 @@
package net.mamoe.mirai package net.mamoe.mirai
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
import kotlin.jvm.JvmName
import kotlin.jvm.JvmOverloads
/** /**
* 构造 [Bot] 的工厂. * 构造 [Bot] 的工厂.
...@@ -15,23 +18,11 @@ interface BotFactory { ...@@ -15,23 +18,11 @@ interface BotFactory {
/** /**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例 * 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/ */
fun Bot(account: BotAccount, configuration: BotConfiguration = BotConfiguration.Default): Bot fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot
/**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/
fun Bot(qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot =
this.Bot(BotAccount(qq, password), configuration)
} }
/** /**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例 * 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/ */
inline fun BotFactory.Bot(account: BotAccount, configuration: (BotConfiguration.() -> Unit)): Bot= inline fun BotFactory.Bot(context: Context, qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot =
this.Bot(account, BotConfiguration().apply(configuration)) this.Bot(context, qq, password, BotConfiguration().apply(configuration))
\ No newline at end of file
/**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/
inline fun BotFactory.Bot(qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot =
this.Bot(qq, password, BotConfiguration().apply(configuration))
\ No newline at end of file
...@@ -518,7 +518,7 @@ class MessageSubscribersBuilder<T : MessagePacket<*, *>>( ...@@ -518,7 +518,7 @@ class MessageSubscribersBuilder<T : MessagePacket<*, *>>(
* [replier] 的 `it` 将会是去掉用来判断的后缀并删除前后空格后的字符串. * [replier] 的 `it` 将会是去掉用来判断的后缀并删除前后空格后的字符串.
* 如当消息为 " 123456 test" 时 * 如当消息为 " 123456 test" 时
* ```kotlin * ```kotlin
* "test" endswithReply { * "test" endsWithReply {
* println(it) // it 为 "123456" * println(it) // it 为 "123456"
* } * }
* ``` * ```
...@@ -526,7 +526,7 @@ class MessageSubscribersBuilder<T : MessagePacket<*, *>>( ...@@ -526,7 +526,7 @@ class MessageSubscribersBuilder<T : MessagePacket<*, *>>(
* @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复 * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复
*/ */
@MessageDsl @MessageDsl
inline infix fun String.endswithReply(crossinline replier: @MessageDsl suspend T.(String) -> Any?): Listener<T> { inline infix fun String.endsWithReply(crossinline replier: @MessageDsl suspend T.(String) -> Any?): Listener<T> {
val toCheck = this.trimEnd() val toCheck = this.trimEnd()
return content({ it.trim().endsWith(toCheck) }, { return content({ it.trim().endsWith(toCheck) }, {
@Suppress("DSL_SCOPE_VIOLATION_WARNING") @Suppress("DSL_SCOPE_VIOLATION_WARNING")
......
package net.mamoe.mirai.qqandroid.utils package net.mamoe.mirai.utils
/** /**
* On Android, typealias to `android.content.Context` * On Android, typealias to `android.content.Context`
......
...@@ -3,14 +3,17 @@ ...@@ -3,14 +3,17 @@
package net.mamoe.mirai package net.mamoe.mirai
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.Context
// Do not use ServiceLoader. Probably not working on MPP // Do not use ServiceLoader. Probably not working on MPP
@PublishedApi @PublishedApi
internal val factory: BotFactory = run { internal val factory: BotFactory = run {
try { runCatching {
Class.forName("net.mamoe.mirai.timpc.TIMPC").kotlin.objectInstance as BotFactory Class.forName("net.mamoe.mirai.timpc.TIMPC").kotlin.objectInstance as BotFactory
} catch (ignored: Exception) { }.getOrElse {
null runCatching {
Class.forName("net.mamoe.mirai.qqandroid.QQAndroid").kotlin.objectInstance as BotFactory
}.getOrNull()
} }
} ?: error( } ?: error(
""" """
...@@ -24,23 +27,11 @@ internal val factory: BotFactory = run { ...@@ -24,23 +27,11 @@ internal val factory: BotFactory = run {
/** /**
* 加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 * 加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例
*/ */
fun Bot(account: BotAccount, configuration: BotConfiguration = BotConfiguration.Default): Bot = fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot =
factory.Bot(account, configuration) factory.Bot(context, qq, password, configuration)
/** /**
* 加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 * 加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例
*/ */
fun Bot(qq: Long, password: String, configuration: BotConfiguration = BotConfiguration.Default): Bot = inline fun Bot(context: Context, qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot =
factory.Bot(qq, password, configuration) factory.Bot(context, qq, password, configuration)
\ No newline at end of file
/**
* 加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例
*/
inline fun Bot(account: BotAccount, configuration: (BotConfiguration.() -> Unit)): Bot =
factory.Bot(account, configuration)
/**
* 加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例
*/
inline fun Bot(qq: Long, password: String, configuration: (BotConfiguration.() -> Unit)): Bot =
factory.Bot(qq, password, configuration)
\ No newline at end of file
package net.mamoe.mirai.utils
actual abstract class Context
open class ContextImpl : Context()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment