mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-02 22:02:25 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
92504fc313
40
.github/workflows/main2.yml
vendored
Normal file
40
.github/workflows/main2.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# This is a basic workflow to help you get started with Actions
|
||||||
|
|
||||||
|
name: Shadow
|
||||||
|
|
||||||
|
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||||
|
# events but only for the master branch
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Set up JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
- name: Grant execute permission for gradlew
|
||||||
|
run: chmod +x gradlew
|
||||||
|
- name: Build with Gradle and shadowJar
|
||||||
|
run: ./gradlew :mirai-core:shadowJar :mirai-core-qqandroid:shadowJar
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v1.0.0
|
||||||
|
with:
|
||||||
|
# Artifact name
|
||||||
|
name: mirai-core-all
|
||||||
|
# Directory containing files to upload
|
||||||
|
path: "mirai-core/build/libs/mirai-core-*-all.jar"
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v1.0.0
|
||||||
|
with:
|
||||||
|
# Artifact name
|
||||||
|
name: mirai-core-qqandroid-all
|
||||||
|
# Directory containing files to upload
|
||||||
|
path: "mirai-core-qqandroid/build/libs/mirai-core-qqandroid-*-all.jar"
|
@ -160,7 +160,7 @@ internal open class QQAndroidClient(
|
|||||||
|
|
||||||
@UseExperimental(RawAccountIdUse::class)
|
@UseExperimental(RawAccountIdUse::class)
|
||||||
@Suppress("PropertyName")
|
@Suppress("PropertyName")
|
||||||
internal var _uin: Long = bot.account.id
|
internal var _uin: Long = bot.uin
|
||||||
|
|
||||||
var t530: ByteArray? = null
|
var t530: ByteArray? = null
|
||||||
var t528: ByteArray? = null
|
var t528: ByteArray? = null
|
||||||
|
@ -54,12 +54,6 @@ actual abstract class Bot actual constructor() : CoroutineScope, LowLevelBotAPIA
|
|||||||
*/
|
*/
|
||||||
actual abstract val context: Context
|
actual abstract val context: Context
|
||||||
|
|
||||||
/**
|
|
||||||
* 账号信息
|
|
||||||
*/
|
|
||||||
@MiraiInternalAPI
|
|
||||||
actual abstract val account: BotAccount
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QQ 号码. 实际类型为 uint
|
* QQ 号码. 实际类型为 uint
|
||||||
*/
|
*/
|
||||||
|
@ -70,12 +70,6 @@ expect abstract class Bot() : CoroutineScope, LowLevelBotAPIAccessor {
|
|||||||
*/
|
*/
|
||||||
abstract val context: Context
|
abstract val context: Context
|
||||||
|
|
||||||
/**
|
|
||||||
* 账号信息
|
|
||||||
*/
|
|
||||||
@MiraiInternalAPI
|
|
||||||
abstract val account: BotAccount
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QQ 号码. 实际类型为 uint
|
* QQ 号码. 实际类型为 uint
|
||||||
*/
|
*/
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
package net.mamoe.mirai
|
package net.mamoe.mirai
|
||||||
|
|
||||||
import io.ktor.utils.io.core.toByteArray
|
import io.ktor.utils.io.core.toByteArray
|
||||||
|
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
||||||
import net.mamoe.mirai.utils.MiraiInternalAPI
|
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.*
|
||||||
@ -23,6 +24,8 @@ data class BotAccount(
|
|||||||
*/
|
*/
|
||||||
@RawAccountIdUse
|
@RawAccountIdUse
|
||||||
val id: Long,
|
val id: Long,
|
||||||
|
@MiraiExperimentalAPI
|
||||||
|
@MiraiInternalAPI
|
||||||
val passwordMd5: ByteArray // md5
|
val passwordMd5: ByteArray // md5
|
||||||
) {
|
) {
|
||||||
constructor(id: Long, passwordPlainText: String) : this(id, md5(passwordPlainText.toByteArray()))
|
constructor(id: Long, passwordPlainText: String) : this(id, md5(passwordPlainText.toByteArray()))
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@file:Suppress("EXPERIMENTAL_API_USAGE")
|
@file:Suppress("EXPERIMENTAL_API_USAGE", "DEPRECATION_ERROR")
|
||||||
|
|
||||||
package net.mamoe.mirai
|
package net.mamoe.mirai
|
||||||
|
|
||||||
@ -40,12 +40,13 @@ abstract class BotImpl<N : BotNetworkHandler> constructor(
|
|||||||
?: CoroutineExceptionHandler { _, e -> logger.error("An exception was thrown under a coroutine of Bot", e) })
|
?: CoroutineExceptionHandler { _, e -> logger.error("An exception was thrown under a coroutine of Bot", e) })
|
||||||
override val context: Context by context.unsafeWeakRef()
|
override val context: Context by context.unsafeWeakRef()
|
||||||
|
|
||||||
@Suppress("CanBePrimaryConstructorProperty") // for logger
|
@UseExperimental(LowLevelAPI::class)
|
||||||
|
@Suppress("CanBePrimaryConstructorProperty", "OverridingDeprecatedMember") // for logger
|
||||||
final override val account: BotAccount = account
|
final override val account: BotAccount = account
|
||||||
|
|
||||||
@UseExperimental(RawAccountIdUse::class)
|
@UseExperimental(RawAccountIdUse::class)
|
||||||
override val uin: Long
|
override val uin: Long
|
||||||
get() = account.id
|
get() = this.account.id
|
||||||
final override val logger: MiraiLogger by lazy { configuration.botLoggerSupplier(this) }
|
final override val logger: MiraiLogger by lazy { configuration.botLoggerSupplier(this) }
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -17,6 +17,7 @@ import net.mamoe.mirai.data.GroupInfo
|
|||||||
import net.mamoe.mirai.data.MemberInfo
|
import net.mamoe.mirai.data.MemberInfo
|
||||||
import net.mamoe.mirai.message.data.MessageSource
|
import net.mamoe.mirai.message.data.MessageSource
|
||||||
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
||||||
|
import net.mamoe.mirai.utils.MiraiInternalAPI
|
||||||
import net.mamoe.mirai.utils.WeakRef
|
import net.mamoe.mirai.utils.WeakRef
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,6 +38,14 @@ annotation class LowLevelAPI
|
|||||||
@Suppress("FunctionName", "unused")
|
@Suppress("FunctionName", "unused")
|
||||||
@LowLevelAPI
|
@LowLevelAPI
|
||||||
interface LowLevelBotAPIAccessor {
|
interface LowLevelBotAPIAccessor {
|
||||||
|
/**
|
||||||
|
* 账号信息
|
||||||
|
*/
|
||||||
|
@Deprecated("将来会做修改", level = DeprecationLevel.ERROR)
|
||||||
|
@MiraiExperimentalAPI
|
||||||
|
@LowLevelAPI
|
||||||
|
@MiraiInternalAPI
|
||||||
|
abstract val account: BotAccount
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造一个 [_lowLevelNewQQ] 对象. 它持有对 [Bot] 的弱引用([WeakRef]).
|
* 构造一个 [_lowLevelNewQQ] 对象. 它持有对 [Bot] 的弱引用([WeakRef]).
|
||||||
|
@ -58,4 +58,8 @@ class CombinedMessage(
|
|||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return element.toString() + left.toString()
|
return element.toString() + left.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isFlat(): Boolean {
|
||||||
|
return element is SingleMessage && left is SingleMessage
|
||||||
|
}
|
||||||
}
|
}
|
@ -61,7 +61,7 @@ interface MessageChain : Message, Iterable<SingleMessage> {
|
|||||||
fun <M : Message> getOrNull(key: Message.Key<M>): M? = firstOrNull(key)
|
fun <M : Message> getOrNull(key: Message.Key<M>): M? = firstOrNull(key)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 遍历每一个有内容的消息, 即 [At], [AtAll], [PlainText], [Image], [Face], [XMLMessage].
|
* 遍历每一个有内容的消息, 即 [At], [AtAll], [PlainText], [Image], [Face], [XMLMessage], [QuoteReply].
|
||||||
* 仅供 `Java` 使用
|
* 仅供 `Java` 使用
|
||||||
*/
|
*/
|
||||||
@Suppress("FunctionName", "INAPPLICABLE_JVM_NAME")
|
@Suppress("FunctionName", "INAPPLICABLE_JVM_NAME")
|
||||||
@ -71,13 +71,26 @@ interface MessageChain : Message, Iterable<SingleMessage> {
|
|||||||
fun `__forEachContent for Java__`(block: (Message) -> Unit) {
|
fun `__forEachContent for Java__`(block: (Message) -> Unit) {
|
||||||
this.foreachContent(block)
|
this.foreachContent(block)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 遍历每一个消息, 即 [MessageSource] [At], [AtAll], [PlainText], [Image], [Face], [XMLMessage], [QuoteReply].
|
||||||
|
* 仅供 `Java` 使用
|
||||||
|
*/
|
||||||
|
@Suppress("FunctionName", "INAPPLICABLE_JVM_NAME")
|
||||||
|
@JsName("forEach")
|
||||||
|
@JvmName("forEach")
|
||||||
|
@MiraiInternalAPI
|
||||||
|
fun `__forEach for Java__`(block: (Message) -> Unit) {
|
||||||
|
this.forEach(block)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// region accessors
|
// region accessors
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 遍历每一个有内容的消息, 即 [At], [AtAll], [PlainText], [Image], [Face], [XMLMessage]
|
* 遍历每一个有内容的消息, 即 [At], [AtAll], [PlainText], [Image], [Face], [XMLMessage], [QuoteReply]
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
inline fun MessageChain.foreachContent(block: (Message) -> Unit) {
|
inline fun MessageChain.foreachContent(block: (Message) -> Unit) {
|
||||||
this.forEach {
|
this.forEach {
|
||||||
if (it !is MessageMetadata) block(it)
|
if (it !is MessageMetadata) block(it)
|
||||||
@ -87,23 +100,27 @@ inline fun MessageChain.foreachContent(block: (Message) -> Unit) {
|
|||||||
/**
|
/**
|
||||||
* 获取第一个 [M] 类型的 [Message] 实例
|
* 获取第一个 [M] 类型的 [Message] 实例
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
inline fun <reified M : Message?> MessageChain.firstOrNull(): M? = this.firstOrNull { it is M } as M?
|
inline fun <reified M : Message?> MessageChain.firstOrNull(): M? = this.firstOrNull { it is M } as M?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取第一个 [M] 类型的 [Message] 实例
|
* 获取第一个 [M] 类型的 [Message] 实例
|
||||||
* @throws [NoSuchElementException] 如果找不到该类型的实例
|
* @throws [NoSuchElementException] 如果找不到该类型的实例
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
inline fun <reified M : Message> MessageChain.first(): M = this.first { it is M } as M
|
inline fun <reified M : Message> MessageChain.first(): M = this.first { it is M } as M
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取第一个 [M] 类型的 [Message] 实例
|
* 获取第一个 [M] 类型的 [Message] 实例
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
inline fun <reified M : Message> MessageChain.any(): Boolean = this.any { it is M }
|
inline fun <reified M : Message> MessageChain.any(): Boolean = this.any { it is M }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取第一个 [M] 类型的 [Message] 实例
|
* 获取第一个 [M] 类型的 [Message] 实例
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun <M : Message> MessageChain.firstOrNull(key: Message.Key<M>): M? = when (key) {
|
fun <M : Message> MessageChain.firstOrNull(key: Message.Key<M>): M? = when (key) {
|
||||||
At -> first<At>()
|
At -> first<At>()
|
||||||
@ -120,6 +137,7 @@ fun <M : Message> MessageChain.firstOrNull(key: Message.Key<M>): M? = when (key)
|
|||||||
* 获取第一个 [M] 类型的 [Message] 实例
|
* 获取第一个 [M] 类型的 [Message] 实例
|
||||||
* @throws [NoSuchElementException] 如果找不到该类型的实例
|
* @throws [NoSuchElementException] 如果找不到该类型的实例
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun <M : Message> MessageChain.first(key: Message.Key<M>): M =
|
fun <M : Message> MessageChain.first(key: Message.Key<M>): M =
|
||||||
firstOrNull(key) ?: throw NoSuchElementException("no such element: $key")
|
firstOrNull(key) ?: throw NoSuchElementException("no such element: $key")
|
||||||
@ -127,6 +145,7 @@ fun <M : Message> MessageChain.first(key: Message.Key<M>): M =
|
|||||||
/**
|
/**
|
||||||
* 获取第一个 [M] 类型的 [Message] 实例
|
* 获取第一个 [M] 类型的 [Message] 实例
|
||||||
*/
|
*/
|
||||||
|
@JvmSynthetic
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun <M : Message> MessageChain.any(key: Message.Key<M>): Boolean = firstOrNull(key) != null
|
fun <M : Message> MessageChain.any(key: Message.Key<M>): Boolean = firstOrNull(key) != null
|
||||||
|
|
||||||
@ -211,9 +230,6 @@ fun Message.asMessageChain(): MessageChain = when (this) {
|
|||||||
else -> SingleMessageChainImpl(this as SingleMessage)
|
else -> SingleMessageChainImpl(this as SingleMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("use asMessageChain instead", ReplaceWith("this.asMessageChain()"), DeprecationLevel.ERROR)
|
|
||||||
fun Message.toChain(): MessageChain = this.asMessageChain()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 直接将 [this] 委托为一个 [MessageChain]
|
* 直接将 [this] 委托为一个 [MessageChain]
|
||||||
*/
|
*/
|
||||||
@ -233,8 +249,18 @@ fun Collection<Message>.asMessageChain(): MessageChain = MessageChainImplBySeque
|
|||||||
@JvmSynthetic
|
@JvmSynthetic
|
||||||
fun Iterable<SingleMessage>.asMessageChain(): MessageChain = MessageChainImplByIterable(this)
|
fun Iterable<SingleMessage>.asMessageChain(): MessageChain = MessageChainImplByIterable(this)
|
||||||
|
|
||||||
|
@JvmSynthetic
|
||||||
inline fun MessageChain.asMessageChain(): MessageChain = this // 避免套娃
|
inline fun MessageChain.asMessageChain(): MessageChain = this // 避免套娃
|
||||||
|
|
||||||
|
@JvmSynthetic
|
||||||
|
fun CombinedMessage.asMessageChain(): MessageChain {
|
||||||
|
if (left is SingleMessage && this.element is SingleMessage) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return (this as Iterable<SingleMessage>).asMessageChain()
|
||||||
|
}
|
||||||
|
return (this as Iterable<Message>).asMessageChain()
|
||||||
|
} // 避免套娃
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain]
|
* 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain]
|
||||||
*/
|
*/
|
||||||
@ -324,11 +350,20 @@ fun Sequence<SingleMessage>.flatten(): Sequence<SingleMessage> = this // fast pa
|
|||||||
fun Message.flatten(): Sequence<SingleMessage> {
|
fun Message.flatten(): Sequence<SingleMessage> {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is MessageChain -> this.asSequence()
|
is MessageChain -> this.asSequence()
|
||||||
is CombinedMessage -> this.asSequence().flatten()
|
is CombinedMessage -> this.flatten()
|
||||||
else -> sequenceOf(this as SingleMessage)
|
else -> sequenceOf(this as SingleMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun CombinedMessage.flatten(): Sequence<SingleMessage> {
|
||||||
|
if (this.isFlat()){
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return (this as Iterable<SingleMessage>).asSequence()
|
||||||
|
} else return this.asSequence().flatten()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MessageChain.flatten(): Sequence<SingleMessage> = this.asSequence() // fast path
|
||||||
|
|
||||||
// endregion converters
|
// endregion converters
|
||||||
|
|
||||||
// region implementations
|
// region implementations
|
||||||
|
@ -64,12 +64,6 @@ actual abstract class Bot actual constructor() : CoroutineScope, LowLevelBotAPIA
|
|||||||
*/
|
*/
|
||||||
actual abstract val context: Context
|
actual abstract val context: Context
|
||||||
|
|
||||||
/**
|
|
||||||
* 账号信息
|
|
||||||
*/
|
|
||||||
@MiraiInternalAPI
|
|
||||||
actual abstract val account: BotAccount
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QQ 号码. 实际类型为 uint
|
* QQ 号码. 实际类型为 uint
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user