mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-10 20:20:08 +08:00
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:
commit
bd0442c692
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -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
|
||||
|
@ -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())
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
) {
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user