diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/ChatType.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/ChatType.kt new file mode 100644 index 000000000..d90acb586 --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/ChatType.kt @@ -0,0 +1,25 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat + +/** + * TROOP仍然不知道是什么 + */ +enum class ChatType(val internalID: Int) { + + FRIEND(2),//可以为任何数字 + + CONTACT(1006), + + //推测为"群" + TROOP(1), + TROOP_HCTOPIC(1026), + + //坦白说 + CONFESS_A(1033), + CONFESS_B(1034), + + CM_GAME_TEMP(1036), + + DISCUSSION(3000), + + DEVICE_MSG(9501), +} \ No newline at end of file diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/MessagePacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/MessagePacket.kt new file mode 100644 index 000000000..d2a95a391 --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/MessagePacket.kt @@ -0,0 +1,2 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat + diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/groupimage/GroupImageRequest.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/groupimage/GroupImageRequest.kt new file mode 100644 index 000000000..2f3bbfd51 --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/groupimage/GroupImageRequest.kt @@ -0,0 +1,2 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.groupimage + diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/Cmd0x352Packet.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/Cmd0x352Packet.kt new file mode 100644 index 000000000..ecf966f9a --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/Cmd0x352Packet.kt @@ -0,0 +1,36 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image + +import kotlinx.serialization.SerialId +import kotlinx.serialization.Serializable + +@Serializable +internal class Cmd0x352Packet( + @SerialId(1) val subCommand: Int, //2是GetImgUrlReq 1是UploadImgReq + @SerialId(2) val uploadImgReq: UploadImgReq? = null,// optional + @SerialId(3) val getImgUrlReq: GetImgUrlReq? = null,// optional + @SerialId(4) val deleteImgReq: String? = "",// optional (没有做也不准备做, 没用) + @SerialId(10) val networkType: Int = 5// 数据网络=5 +) { + companion object { + fun createByImageRequest(req: ImgReq, networkType: Int = 5): Cmd0x352Packet { + if (req is UploadImgReq) + return Cmd0x352Packet( + 1, + req, + null, + null, + networkType + ) + if (req is GetImgUrlReq) + return Cmd0x352Packet( + 2, + null, + req, + null, + networkType + ) + error("Unknown ImgReq") + } + } + +} \ No newline at end of file diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageDownPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageDownPacket.kt new file mode 100644 index 000000000..9c3bbea6e --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageDownPacket.kt @@ -0,0 +1,38 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image + +import kotlinx.io.core.ByteReadPacket +import kotlinx.serialization.protobuf.ProtoBuf +import net.mamoe.mirai.data.Packet +import net.mamoe.mirai.qqandroid.QQAndroidBot +import net.mamoe.mirai.qqandroid.network.QQAndroidClient +import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket +import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketFactory +import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgingPacket + +internal object ImageDownPacket : PacketFactory() { + + init { + this._commandName = "LongConn.OffPicDown" + } + + + operator fun invoke(client: QQAndroidClient, req: GetImgUrlReq): OutgoingPacket { + return buildOutgingPacket(client, this._commandName, this._commandName, client.wLoginSigInfo.d2Key) { + ProtoBuf.dump( + Cmd0x352Packet.serializer(), + Cmd0x352Packet.createByImageRequest(req) + ) + } + } + + override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): ImageDownPacketResponse { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + + sealed class ImageDownPacketResponse : Packet { + object Success : ImageDownPacketResponse() + } + + +} \ No newline at end of file diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageRequest.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageRequest.kt new file mode 100644 index 000000000..0c6b54710 --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageRequest.kt @@ -0,0 +1,67 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image + +import kotlinx.serialization.SerialId +import kotlinx.serialization.Serializable +import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY +import net.mamoe.mirai.utils.currentTimeSeconds + +interface ImgReq + +@Serializable +internal class UploadImgReq( + @SerialId(1) val srcUin: Int, + @SerialId(2) val dstUin: Int, + @SerialId(3) val fileId: Int = 0,//从0开始的自增数?貌似有一个连接就要自增1, 但是又会重置回0 + @SerialId(4) val fileMd5: String, + @SerialId(5) val fileSize: Int, + @SerialId(6) val fileName: String,//默认为md5+".jpg" + @SerialId(7) val srcTerm: Int = 5, + @SerialId(8) val platformType: Int = 9, + @SerialId(9) val innerIP: Int = 0, + @SerialId(10) val addressBook: Int = 0,//chatType == 1006为1 我觉得发0没问题 + @SerialId(11) val retry: Int = 0,//default + @SerialId(12) val buType: Int,//1或96 不确定 + @SerialId(13) val imgOriginal: Int,//是否为原图 + @SerialId(14) val imgWidth: Int, + @SerialId(15) val imgHeight: Int, + @SerialId(16) val imgType: Int = 1000, + /** + * ImgType: + * JPG: 1000 + * PNG: 1001 + * WEBP: 1002 + * BMP: 1005 + * GIG: 2000 + * APNG: 2001 + * SHARPP: 1004 + * */ + @SerialId(17) val buildVer: String = "8.2.0.1296",//版本号 + @SerialId(18) val fileIndex: ByteArray = EMPTY_BYTE_ARRAY,//default + @SerialId(19) val fileStoreDays: Int = 0,//default + @SerialId(20) val stepFlag: Int = 0,//default + @SerialId(21) val rejectTryFast: Int = 0,//bool + @SerialId(22) val srvUpload: Int = 1,//typeHotPic[1/2/3] + @SerialId(23) val transferUrl: ByteArray = EMPTY_BYTE_ARRAY//rawDownloadUrl, 如果没有就是EMPTY_BYTE_ARRAY +) : ImgReq + +@Serializable +internal class GetImgUrlReq( + @SerialId(1) val srcUni: Int, + @SerialId(2) val dstUni: Int, + @SerialId(3) val fileResID: String,//UUID + /** + * UUID例子: 没有找到 + */ + @SerialId(4) val urlFlag: Int = 1, + //5 unknown, 好像没用 + @SerialId(6) val urlType: Int = 4, + @SerialId(7) val requestTerm: Int = 5,//确定 + @SerialId(8) val requestPlatformType: Int = 9,//确定 + @SerialId(9) val srcFileType: Int = 1,//2=ftn,1=picplatform,255 + @SerialId(10) val innerIP: Int = 0,//确定 + @SerialId(11) val addressBook: Int = 0,//[ChatType.internalID]== 1006为1[为CONTACT时] 我觉得发0没问题 + @SerialId(12) val buType: Int = 1,//确定 + @SerialId(13) val buildVer: String = "8.2.0.1296",//版本号 + @SerialId(14) val timestamp: Int = currentTimeSeconds.toInt(),//(pic_up_timestamp) + @SerialId(15) val requestTransferType: Int = 1 +) : ImgReq \ No newline at end of file diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageUpPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageUpPacket.kt new file mode 100644 index 000000000..f8dd845d0 --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImageUpPacket.kt @@ -0,0 +1,37 @@ +package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image + +import kotlinx.io.core.ByteReadPacket +import kotlinx.serialization.protobuf.ProtoBuf +import net.mamoe.mirai.data.Packet +import net.mamoe.mirai.qqandroid.QQAndroidBot +import net.mamoe.mirai.qqandroid.network.QQAndroidClient +import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket +import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketFactory +import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgingPacket + +internal object ImageUpPacket : PacketFactory() { + + init { + this._commandName = "LongConn.OffPicUp" + } + + + operator fun invoke(client: QQAndroidClient, req: UploadImgReq): OutgoingPacket { + return buildOutgingPacket(client, this._commandName, this._commandName, client.wLoginSigInfo.d2Key) { + ProtoBuf.dump( + Cmd0x352Packet.serializer(), + Cmd0x352Packet.createByImageRequest(req) + ) + } + } + + override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): ImageUpPacketResponse { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + + sealed class ImageUpPacketResponse : Packet { + object Success : ImageUpPacketResponse() + } + +} \ No newline at end of file diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/image/ImagePacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/image/ImagePacket.kt deleted file mode 100644 index 4d87d1eb6..000000000 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/image/ImagePacket.kt +++ /dev/null @@ -1,106 +0,0 @@ -package net.mamoe.mirai.qqandroid.network.protocol.packet.image - -import kotlinx.io.core.ByteReadPacket -import kotlinx.serialization.SerialId -import kotlinx.serialization.Serializable -import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.qqandroid.QQAndroidBot -import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketFactory -import net.mamoe.mirai.utils.currentTimeSeconds - -@UseExperimental(ExperimentalUnsignedTypes::class) -internal object ImagePacket : PacketFactory() { - init { - this._commandName = "LongConn.OffPicDown" - } - - - sealed class RequestImgUrlResponse : Packet { - object Success : RequestImgUrlResponse() - } - - - private fun createCmd0x325Packet(req: ImgReq, networkType: Int = 5): Cmd0x352Packet { - if (req is UploadImgReq) - return Cmd0x352Packet(1, req, null, null, networkType) - if (req is GetImgUrlReq) - return Cmd0x352Packet(2, null, req, null, networkType) - error("Unknown ImgReq") - } - - @Serializable - internal class Cmd0x352Packet( - @SerialId(1) val subCommand: Int, //2是GetImgUrlReq 1是UploadImgReq - @SerialId(2) val uploadImgReq: UploadImgReq? = null,// optional - @SerialId(3) val getImgUrlReq: GetImgUrlReq? = null,// optional - @SerialId(4) val deleteImgReq: String? = "",// optional (没有做也不准备做, 没用) - @SerialId(10) val networkType: Int = 5// 数据网络=5 - ) - - interface ImgReq - @Serializable - class UploadImgReq( - @SerialId(1) val srcUni: Int, - @SerialId(2) val dstUni: Int, - @SerialId(3) val fileId: Int, - @SerialId(4) val fileMd5: ByteArray, - @SerialId(5) val fileSize: Int, - @SerialId(6) val fileName: String, - @SerialId(7) val srcTerm: Int, - @SerialId(8) val platformType: Int, - @SerialId(9) val innerIP: Int = 0, - @SerialId(10) val addressBook: Int = 0,//chatType == 1006为1 我觉得发0没问题 - @SerialId(11) val retry: Int, - @SerialId(12) val buType: Int, - @SerialId(13) val imgOriginal: Int,//是否为原图 - @SerialId(14) val imgWidth: Int, - @SerialId(15) val imgHeight: Int, - @SerialId(16) val imgType: Int, - @SerialId(17) val buildVer: String = "8.2.0.1296",//版本号 - @SerialId(18) val fileIndex: ByteArray, - @SerialId(19) val fileStoreDays: Int, - @SerialId(20) val stepFlag: Int, - @SerialId(21) val rejectTryFast: Int,//bool - @SerialId(22) val srvUpload: Int, - @SerialId(23) val transferUrl: ByteArray - ) : ImgReq - - @Serializable - class GetImgUrlReq( - @SerialId(1) val srcUni: Int, - @SerialId(2) val dstUni: Int, - @SerialId(3) val fileResID: String,//UUID - /** - * UUID例子: - */ - @SerialId(4) val urlFlag: Int = 1, - //5 unknown, 好像没用 - @SerialId(6) val urlType: Int = 4, - @SerialId(7) val requestTerm: Int = 5,//确定 - @SerialId(8) val requestPlatformType: Int = 9,//确定 - @SerialId(9) val srcFileType: Int = 1,//2=ftn,1=picplatform,255 - @SerialId(10) val innerIP: Int = 0,//确定 - @SerialId(11) val addressBook: Int = 0,//chatType == 1006为1 我觉得发0没问题 - /** - * chattype - * 1008时为Troop - * 1 时为? - * 9999时为? - * 1036时为? - * 1006时为? - */ - @SerialId(12) val buType: Int = 1,//确定 - @SerialId(13) val buildVer: String = "8.2.0.1296",//版本号 - @SerialId(14) val timestamp: Int = currentTimeSeconds.toInt(),//(pic_up_timestamp) - @SerialId(15) val requestTransferType: Int = 1 - ) : ImgReq - - - override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): RequestImgUrlResponse { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - -} - - diff --git a/mirai-core-qqandroid/src/jvmMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt b/mirai-core-qqandroid/src/jvmMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt index e53e85447..d8b33251d 100644 --- a/mirai-core-qqandroid/src/jvmMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt +++ b/mirai-core-qqandroid/src/jvmMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt @@ -12,4 +12,5 @@ internal actual class QQAndroidBot actual constructor( context: Context, account: BotAccount, configuration: BotConfiguration -) : QQAndroidBotBase(context, account, configuration) \ No newline at end of file +) : QQAndroidBotBase(context, account, configuration) +