Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
This commit is contained in:
jiahua.liu 2020-01-31 21:18:51 +08:00
commit bd0442c692
10 changed files with 49 additions and 20 deletions

View File

@ -14,8 +14,8 @@
加入 Gitter, 或加入 QQ 群: 655057127
## CHANGELOG
在 [Project](https://github.com/mamoe/mirai/projects/1) 查看已支持功能和计划(更新不及时)
在 [CHANGELOG](https://github.com/mamoe/mirai/blob/master/CHANGELOG.md) 查看版本更新记录(准确更新发布的版本)
在 [Project](https://github.com/mamoe/mirai/projects/3) 查看已支持功能和计划
在 [CHANGELOG](https://github.com/mamoe/mirai/blob/master/CHANGELOG.md) 查看版本更新记录 (仅发布的版本)
## Modules
### mirai-core

View File

@ -231,6 +231,10 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
if (cache == null) {
// 没有缓存
var length: Int = rawInput.readInt() - 4
if (length < 0) {
// 丢包了. 后半部分包提前到达
return
}
if (rawInput.remaining == length.toLong()) {
// 捷径: 当包长度正好, 直接传递剩余数据.
cachedPacketTimeoutJob?.cancel()

View File

@ -71,12 +71,13 @@ internal class FriendList {
GetTroopListReqV2Simplify.serializer(),
GetTroopListReqV2Simplify(
uin = client.uin,
getMSFMsgFlag = 0,
groupFlagExt = 1,
shVersion = 7,
getMSFMsgFlag = 0, // const
groupFlagExt = 1,// const
shVersion = 7, // const
dwCompanyId = 0,
versionNum = 1,
getLongGroupName = 1
versionNum = 1, // const
vecGroupInfo = listOf(),
getLongGroupName = 1// const
)
)
)

View File

@ -294,13 +294,15 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
data class UnsafeLogin(val url: String) : LoginPacketResponse()
class SMSVerifyCodeNeeded(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse(){
class SMSVerifyCodeNeeded(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse() {
override fun toString(): String {
return "LoginPacketResponse.SMSVerifyCodeNeeded"
}
}
class DeviceLockLogin(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse()
class DeviceLockLogin(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse() {
override fun toString(): String = "LoginPacket.LoginPacketResponse.DeviceLockLogin"
}
}
@InternalAPI

View File

@ -12,6 +12,7 @@ import net.mamoe.mirai.utils.cryptor.ECDH
import net.mamoe.mirai.utils.cryptor.adjustToPublicKey
import net.mamoe.mirai.utils.cryptor.decryptBy
import net.mamoe.mirai.utils.io.*
import net.mamoe.mirai.utils.unzip
/*
*/
@ -67,7 +68,6 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) {
PacketLogger.verbose("包类型(flag2) = $flag2. (可能是 ${if (flag2 == 2) "sso" else "uni"})")
val flag3 = readByte().toInt()
check(flag3 == 0) { "Illegal flag3. Expected 0, got $flag3" }
val uinAccount = readString(readInt() - 4)//uin
@ -88,9 +88,9 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) {
this.readBytes().tryDecryptOrNull()?.toReadPacket()
}?.debugPrint("sso/uni body=")?.let {
if (flag1 == 0x0A) {
parseSsoFrame(it)
parseSsoFrame(flag3, it)
} else {
parseSsoFrame(it)
parseSsoFrame(flag3, it)
}
}?.let {
val bytes = it.data.readBytes()
@ -205,7 +205,7 @@ private fun ByteReadPacket.parseOicqResponse(body: ByteReadPacket.() -> Unit) {
* 解析 SSO 层包装
*/
@UseExperimental(ExperimentalUnsignedTypes::class)
private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
private fun parseSsoFrame(flag3: Int, input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
val commandName: String
val ssoSequenceId: Int
@ -235,7 +235,14 @@ private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingP
println("找不到包 PacketFactory")
PacketLogger.verbose("传递给 PacketFactory 的数据 = ${input.readBytes().toUHexString()}")
}
return KnownPacketFactories.IncomingPacket(packetFactory, ssoSequenceId, input)
var data = input.readBytes()
if (flag3 == 1) {
data = data.unzip(offset = 4)
} else {
}
return KnownPacketFactories.IncomingPacket(packetFactory, ssoSequenceId, data.toReadPacket())
}

View File

@ -1,6 +1,6 @@
@file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS")
package net.mamoe.mirai.message.internal
package net.mamoe.mirai.timpc.message.internal
import kotlinx.io.core.*
import net.mamoe.mirai.message.MessageType

View File

@ -8,7 +8,7 @@ import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.contact.groupInternalId
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.internal.toPacket
import net.mamoe.mirai.timpc.message.internal.toPacket
import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.timpc.internal.RawGroupInfo
import net.mamoe.mirai.timpc.network.TIMProtocol

View File

@ -4,7 +4,7 @@ package net.mamoe.mirai.timpc.network.packet.action
import kotlinx.io.core.*
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.internal.toPacket
import net.mamoe.mirai.timpc.message.internal.toPacket
import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.utils.NoLog

View File

@ -5,7 +5,7 @@ import kotlinx.io.core.discardExact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.message.GroupMessage
import net.mamoe.mirai.message.internal.readMessageChain
import net.mamoe.mirai.timpc.message.internal.readMessageChain
import net.mamoe.mirai.message.FriendMessage
import net.mamoe.mirai.utils.PacketVersion
import net.mamoe.mirai.utils.MiraiLogger

View File

@ -21,12 +21,17 @@ import kotlin.contracts.contract
@UseExperimental(ExperimentalContracts::class)
@MessageDsl
inline fun CoroutineScope.subscribeMessages(crossinline listeners: MessageSubscribersBuilder<MessagePacket<*, *>>.() -> Unit) {
// contract 可帮助 IDE 进行类型推断. 无实际代码作用.
contract {
callsInPlace(listeners, InvocationKind.EXACTLY_ONCE)
}
MessageSubscribersBuilder<MessagePacket<*, *>> { listener ->
MessageSubscribersBuilder { messageListener: MessageListener<MessagePacket<*, *>> ->
// subscribeAlways 即注册一个监听器. 这个监听器收到消息后就传递给 [listener]
// listener 即为 DSL 里 `contains(...) { }`, `startsWith(...) { }` 的代码块.
subscribeAlways {
listener(it, this.message.toString())
messageListener.invoke(this, this.message.toString())
// this.message.toString() 即为 messageListener 中 it 接收到的值
}
}.apply { listeners() }
}
@ -112,6 +117,13 @@ inline fun Bot.subscribeFriendMessages(crossinline listeners: MessageSubscribers
}
/**
* 消息事件的处理器.
*
* :
* 接受者 T [MessagePacket]
* 参数 String 转为字符串了的消息 ([Message.toString])
*/
typealias MessageListener<T> = @MessageDsl suspend T.(String) -> Unit
/**
@ -124,6 +136,9 @@ typealias MessageListener<T> = @MessageDsl suspend T.(String) -> Unit
@Suppress("unused")
@MessageDsl
class MessageSubscribersBuilder<T : MessagePacket<*, *>>(
/**
* invoke 这个 lambda , 它将会把 [消息事件的处理器][MessageListener] 注册给事件, 并返回注册完成返回的监听器.
*/
val subscriber: (MessageListener<T>) -> Listener<T>
) {
/**