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

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
parents 192a83de b939f703
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
加入 Gitter, 或加入 QQ 群: 655057127 加入 Gitter, 或加入 QQ 群: 655057127
## CHANGELOG ## CHANGELOG
[Project](https://github.com/mamoe/mirai/projects/1) 查看已支持功能和计划(更新不及时) [Project](https://github.com/mamoe/mirai/projects/3) 查看已支持功能和计划
[CHANGELOG](https://github.com/mamoe/mirai/blob/master/CHANGELOG.md) 查看版本更新记录(准确更新发布的版本) [CHANGELOG](https://github.com/mamoe/mirai/blob/master/CHANGELOG.md) 查看版本更新记录 (仅发布的版本)
## Modules ## Modules
### mirai-core ### mirai-core
......
...@@ -231,6 +231,10 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler ...@@ -231,6 +231,10 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
if (cache == null) { if (cache == null) {
// 没有缓存 // 没有缓存
var length: Int = rawInput.readInt() - 4 var length: Int = rawInput.readInt() - 4
if (length < 0) {
// 丢包了. 后半部分包提前到达
return
}
if (rawInput.remaining == length.toLong()) { if (rawInput.remaining == length.toLong()) {
// 捷径: 当包长度正好, 直接传递剩余数据. // 捷径: 当包长度正好, 直接传递剩余数据.
cachedPacketTimeoutJob?.cancel() cachedPacketTimeoutJob?.cancel()
......
...@@ -71,12 +71,13 @@ internal class FriendList { ...@@ -71,12 +71,13 @@ internal class FriendList {
GetTroopListReqV2Simplify.serializer(), GetTroopListReqV2Simplify.serializer(),
GetTroopListReqV2Simplify( GetTroopListReqV2Simplify(
uin = client.uin, uin = client.uin,
getMSFMsgFlag = 0, getMSFMsgFlag = 0, // const
groupFlagExt = 1, groupFlagExt = 1,// const
shVersion = 7, shVersion = 7, // const
dwCompanyId = 0, dwCompanyId = 0,
versionNum = 1, versionNum = 1, // const
getLongGroupName = 1 vecGroupInfo = listOf(),
getLongGroupName = 1// const
) )
) )
) )
......
...@@ -294,13 +294,15 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt ...@@ -294,13 +294,15 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
data class UnsafeLogin(val url: String) : LoginPacketResponse() 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 { override fun toString(): String {
return "LoginPacketResponse.SMSVerifyCodeNeeded" 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 @InternalAPI
......
...@@ -12,6 +12,7 @@ import net.mamoe.mirai.utils.cryptor.ECDH ...@@ -12,6 +12,7 @@ import net.mamoe.mirai.utils.cryptor.ECDH
import net.mamoe.mirai.utils.cryptor.adjustToPublicKey import net.mamoe.mirai.utils.cryptor.adjustToPublicKey
import net.mamoe.mirai.utils.cryptor.decryptBy import net.mamoe.mirai.utils.cryptor.decryptBy
import net.mamoe.mirai.utils.io.* import net.mamoe.mirai.utils.io.*
import net.mamoe.mirai.utils.unzip
/* /*
*/ */
...@@ -67,7 +68,6 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) { ...@@ -67,7 +68,6 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) {
PacketLogger.verbose("包类型(flag2) = $flag2. (可能是 ${if (flag2 == 2) "sso" else "uni"})") PacketLogger.verbose("包类型(flag2) = $flag2. (可能是 ${if (flag2 == 2) "sso" else "uni"})")
val flag3 = readByte().toInt() val flag3 = readByte().toInt()
check(flag3 == 0) { "Illegal flag3. Expected 0, got $flag3" }
val uinAccount = readString(readInt() - 4)//uin val uinAccount = readString(readInt() - 4)//uin
...@@ -88,9 +88,9 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) { ...@@ -88,9 +88,9 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) {
this.readBytes().tryDecryptOrNull()?.toReadPacket() this.readBytes().tryDecryptOrNull()?.toReadPacket()
}?.debugPrint("sso/uni body=")?.let { }?.debugPrint("sso/uni body=")?.let {
if (flag1 == 0x0A) { if (flag1 == 0x0A) {
parseSsoFrame(it) parseSsoFrame(flag3, it)
} else { } else {
parseSsoFrame(it) parseSsoFrame(flag3, it)
} }
}?.let { }?.let {
val bytes = it.data.readBytes() val bytes = it.data.readBytes()
...@@ -205,7 +205,7 @@ private fun ByteReadPacket.parseOicqResponse(body: ByteReadPacket.() -> Unit) { ...@@ -205,7 +205,7 @@ private fun ByteReadPacket.parseOicqResponse(body: ByteReadPacket.() -> Unit) {
* 解析 SSO 层包装 * 解析 SSO 层包装
*/ */
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingPacket { private fun parseSsoFrame(flag3: Int, input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
val commandName: String val commandName: String
val ssoSequenceId: Int val ssoSequenceId: Int
...@@ -235,7 +235,14 @@ private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingP ...@@ -235,7 +235,14 @@ private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingP
println("找不到包 PacketFactory") println("找不到包 PacketFactory")
PacketLogger.verbose("传递给 PacketFactory 的数据 = ${input.readBytes().toUHexString()}") 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())
} }
......
@file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS") @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 kotlinx.io.core.*
import net.mamoe.mirai.message.MessageType import net.mamoe.mirai.message.MessageType
......
...@@ -8,7 +8,7 @@ import net.mamoe.mirai.contact.MemberPermission ...@@ -8,7 +8,7 @@ import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.contact.groupInternalId import net.mamoe.mirai.contact.groupInternalId
import net.mamoe.mirai.data.Packet import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.message.data.MessageChain 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.network.BotNetworkHandler
import net.mamoe.mirai.timpc.internal.RawGroupInfo import net.mamoe.mirai.timpc.internal.RawGroupInfo
import net.mamoe.mirai.timpc.network.TIMProtocol import net.mamoe.mirai.timpc.network.TIMProtocol
......
...@@ -4,7 +4,7 @@ package net.mamoe.mirai.timpc.network.packet.action ...@@ -4,7 +4,7 @@ package net.mamoe.mirai.timpc.network.packet.action
import kotlinx.io.core.* import kotlinx.io.core.*
import net.mamoe.mirai.message.data.MessageChain 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.network.BotNetworkHandler
import net.mamoe.mirai.data.Packet import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.utils.NoLog import net.mamoe.mirai.utils.NoLog
......
...@@ -5,7 +5,7 @@ import kotlinx.io.core.discardExact ...@@ -5,7 +5,7 @@ import kotlinx.io.core.discardExact
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.message.GroupMessage 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.message.FriendMessage
import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.PacketVersion
import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.MiraiLogger
......
...@@ -21,12 +21,17 @@ import kotlin.contracts.contract ...@@ -21,12 +21,17 @@ import kotlin.contracts.contract
@UseExperimental(ExperimentalContracts::class) @UseExperimental(ExperimentalContracts::class)
@MessageDsl @MessageDsl
inline fun CoroutineScope.subscribeMessages(crossinline listeners: MessageSubscribersBuilder<MessagePacket<*, *>>.() -> Unit) { inline fun CoroutineScope.subscribeMessages(crossinline listeners: MessageSubscribersBuilder<MessagePacket<*, *>>.() -> Unit) {
// contract 可帮助 IDE 进行类型推断. 无实际代码作用.
contract { contract {
callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) callsInPlace(listeners, InvocationKind.EXACTLY_ONCE)
} }
MessageSubscribersBuilder<MessagePacket<*, *>> { listener ->
MessageSubscribersBuilder { messageListener: MessageListener<MessagePacket<*, *>> ->
// subscribeAlways 即注册一个监听器. 这个监听器收到消息后就传递给 [listener]
// listener 即为 DSL 里 `contains(...) { }`, `startsWith(...) { }` 的代码块.
subscribeAlways { subscribeAlways {
listener(it, this.message.toString()) messageListener.invoke(this, this.message.toString())
// this.message.toString() 即为 messageListener 中 it 接收到的值
} }
}.apply { listeners() } }.apply { listeners() }
} }
...@@ -112,6 +117,13 @@ inline fun Bot.subscribeFriendMessages(crossinline listeners: MessageSubscribers ...@@ -112,6 +117,13 @@ inline fun Bot.subscribeFriendMessages(crossinline listeners: MessageSubscribers
} }
/**
* 消息事件的处理器.
*
* 注:
* 接受者 T 为 [MessagePacket]
* 参数 String 为 转为字符串了的消息 ([Message.toString])
*/
typealias MessageListener<T> = @MessageDsl suspend T.(String) -> Unit typealias MessageListener<T> = @MessageDsl suspend T.(String) -> Unit
/** /**
...@@ -124,6 +136,9 @@ typealias MessageListener<T> = @MessageDsl suspend T.(String) -> Unit ...@@ -124,6 +136,9 @@ typealias MessageListener<T> = @MessageDsl suspend T.(String) -> Unit
@Suppress("unused") @Suppress("unused")
@MessageDsl @MessageDsl
class MessageSubscribersBuilder<T : MessagePacket<*, *>>( class MessageSubscribersBuilder<T : MessagePacket<*, *>>(
/**
* invoke 这个 lambda 时, 它将会把 [消息事件的处理器][MessageListener] 注册给事件, 并返回注册完成返回的监听器.
*/
val subscriber: (MessageListener<T>) -> Listener<T> val subscriber: (MessageListener<T>) -> Listener<T>
) { ) {
/** /**
......
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