Explorar o código

add: uploadPttTosServer to HighwayHelper.kt

mzdluo123 %!s(int64=5) %!d(string=hai) anos
pai
achega
9494472cee

+ 37 - 1
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/HighwayHelper.kt

@@ -12,7 +12,10 @@
 package net.mamoe.mirai.qqandroid.network.highway
 
 import io.ktor.client.HttpClient
+import io.ktor.client.request.parameter
+import io.ktor.client.request.port
 import io.ktor.client.request.post
+import io.ktor.client.request.url
 import io.ktor.http.ContentType
 import io.ktor.http.HttpStatusCode
 import io.ktor.http.URLProtocol
@@ -30,8 +33,8 @@ import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.network.QQAndroidClient
 import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead
 import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Cmd0x388
+import net.mamoe.mirai.qqandroid.utils.*
 import net.mamoe.mirai.qqandroid.utils.PlatformSocket
-import net.mamoe.mirai.qqandroid.utils.SocketException
 import net.mamoe.mirai.qqandroid.utils.addSuppressedMirai
 import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
 import net.mamoe.mirai.qqandroid.utils.io.withUse
@@ -181,6 +184,39 @@ internal object HighwayHelper {
             }
         }
     }
+
+    suspend fun uploadPttToServers(
+        servers: List<Pair<Int, Int>>,
+        content: ByteArray,
+        md5: ByteArray,
+        uKey: ByteArray, fileKey: ByteArray
+    ) {
+        servers.retryWithServers(10 * 1000, {
+            throw IllegalStateException("cannot upload ptt, failed on all servers.", it)
+        }, { s: String, i: Int ->
+            uploadPttToServer(s, i, content, md5, uKey, fileKey)
+        })
+    }
+
+    private suspend fun uploadPttToServer(
+        serverIp: String,
+        serverPort: Int,
+        content: ByteArray,
+        md5: ByteArray,
+        uKey: ByteArray, fileKey: ByteArray
+    ) {
+        HttpClient().post<String> {
+            url("http://$serverIp:$serverPort")
+            parameter("ver", 4679)
+            parameter("ukey", uKey.toUHexString(""))
+            parameter("filekey", fileKey.toUHexString(""))
+            parameter("filesize", content.size)
+            parameter("bmd5", md5.toUHexString(""))
+            parameter("mType", "pttDu")
+            parameter("voice_encodec", 0)
+            body = content
+        }
+    }
 }
 
 

+ 2 - 1
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt

@@ -148,7 +148,8 @@ internal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.
                                 fileType = 4,
                                 // 不知道能不能解决tim无法收听的问题
                                 reserve = "16 36 20 38 36 65 41 31 04 37 61 39 35 37 37 61 33 62 37 30 33 66 65 33 31 20 20 20 20 20 20 35 30 55 49 30 E3 3F 8F 9F FB CA 1D 79 60 6C F4 74 F2 35 35 34 39 33 30 45 33 33 46 38 46 39 46 46 42 43 41 31 44 37 39 36 30 36 43 46 34 37 34 46 32 2E 61 6D 72 41".hexToBytes(),
-                                pbReserve = "08 00".hexToBytes()
+                                pbReserve = "08 00".hexToBytes(),
+                                time = 2
                             )
                         }
                     )

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt


+ 20 - 28
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/voice/PttStore.kt

@@ -8,48 +8,31 @@ import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Cmd0x388
 import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
 import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory
 import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket
+import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image.ImgStore
 import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image.getRandomString
 import net.mamoe.mirai.qqandroid.utils._miraiContentToString
 import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
 import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf
+import net.mamoe.mirai.qqandroid.utils.toUHexString
 
 internal class PttStore {
     object GroupPttUp : OutgoingPacketFactory<GroupPttUp.Response>("PttStore.GroupPttUp") {
 
         sealed class Response : Packet {
 
-            class Resp(
-                val resp: Cmd0x388.RspBody
+            class RequireUpload(
+                val fileId: Long,
+                val uKey: ByteArray,
+                val uploadIpList: List<Int>,
+                val uploadPortList: List<Int>,
+                val fileKey: ByteArray
             ) : Response() {
                 override fun toString(): String {
-                    return resp._miraiContentToString()
+                    return "RequireUpload(fileId=$fileId, uKey=${uKey.contentToString()})"
                 }
             }
         }
 
-        /**
-         * 发语音
-         * 收到请求后可以通过下面的代码来上传到服务器
-         *
-        val up_rsp = response.resp.msgTryupPttRsp!![0]
-        if (!up_rsp.boolFileExit) {
-        val server = up_rsp.uint32UpIp!![0].toIpV4AddressString()
-        val port = up_rsp.uint32UpPort?.get(0)
-        val id = up_rsp.fileid
-
-        HttpClient().post<String> {
-        url("http://$server:$port")
-        parameter("ver", 4679)
-        parameter("ukey", up_rsp.upUkey.toUHexString(""))
-        parameter("filekey", up_rsp.fileKey.toUHexString(""))
-        parameter("filesize", size)
-        parameter("bmd5", md5)
-        parameter("mType", "pttDu")
-        parameter("voice_encodec", 0)
-        body = file.readBytes()
-        }
-
-         * */
 
         @ExperimentalStdlibApi
         operator fun invoke(
@@ -71,7 +54,7 @@ internal class PttStore {
                         fileId = fileId,
                         fileSize = size,
                         fileMd5 = md5,
-                        fileName = getRandomString(16).encodeToByteArray(),
+                        fileName = md5,
                         srcTerm = 5,
                         platformType = 9,
                         buType = 4,
@@ -92,7 +75,16 @@ internal class PttStore {
 
         override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {
             val resp0 = readProtoBuf(Cmd0x388.RspBody.serializer())
-            return Response.Resp(resp0)
+            resp0.msgTryupPttRsp ?: error("cannot find `msgTryupPttRsp` from `Cmd0x388.RspBody`")
+            val resp = resp0.msgTryupPttRsp.first()
+            return Response.RequireUpload(
+                fileId = resp.fileid,
+                uKey = resp.upUkey,
+                uploadIpList = resp.uint32UpIp!!,
+                uploadPortList = resp.uint32UpPort!!,
+                fileKey = resp.fileKey
+            )
+
         }
 
     }

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio