Revert "Use io.ktor.utils.io than kotlinx.io"

This reverts commit 6a85769e
This commit is contained in:
Him188 2020-03-07 18:48:07 +08:00
parent 92504fc313
commit b3c4f24e33
50 changed files with 132 additions and 517 deletions

View File

@ -9,9 +9,9 @@
package net.mamoe.mirai.qqandroid
import io.ktor.utils.io.core.Closeable
import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeoutOrNull
import kotlinx.io.core.Closeable
import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.contact.*
import net.mamoe.mirai.data.*

View File

@ -9,8 +9,8 @@
package net.mamoe.mirai.qqandroid.io.serialization
import io.ktor.utils.io.charsets.Charset
import io.ktor.utils.io.core.*
import kotlinx.io.charsets.Charset
import kotlinx.io.core.*
import kotlinx.serialization.*
import kotlinx.serialization.internal.*
import kotlinx.serialization.modules.EmptyModule

View File

@ -12,10 +12,7 @@
package net.mamoe.mirai.qqandroid.io.serialization
import io.ktor.utils.io.core.BytePacketBuilder
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.readBytes
import io.ktor.utils.io.core.writeFully
import kotlinx.io.core.*
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialDescriptor
import kotlinx.serialization.SerializationStrategy

View File

@ -9,7 +9,10 @@
package net.mamoe.mirai.qqandroid.message
import io.ktor.utils.io.core.*
import kotlinx.io.core.buildPacket
import kotlinx.io.core.discardExact
import kotlinx.io.core.readBytes
import kotlinx.io.core.readUInt
import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.message.data.*

View File

@ -11,9 +11,9 @@
package net.mamoe.mirai.qqandroid.network
import io.ktor.utils.io.core.*
import kotlinx.atomicfu.AtomicInt
import kotlinx.atomicfu.atomic
import kotlinx.io.core.*
import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.RawAccountIdUse
import net.mamoe.mirai.data.OnlineStatus
@ -315,7 +315,7 @@ internal class Pt4Token(data: ByteArray, creationTime: Long, expireTime: Long) :
internal typealias PSKeyMap = MutableMap<String, PSKey>
internal typealias Pt4TokenMap = MutableMap<String, Pt4Token>
internal inline fun Input.readUShortLVString(): String = io.ktor.utils.io.core.String(this.readUShortLVByteArray())
internal inline fun Input.readUShortLVString(): String = kotlinx.io.core.String(this.readUShortLVByteArray())
internal inline fun Input.readUShortLVByteArray(): ByteArray = this.readBytes(this.readUShort().toInt())

View File

@ -18,14 +18,14 @@ import io.ktor.http.content.OutgoingContent
import io.ktor.http.userAgent
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.copyAndClose
import io.ktor.utils.io.core.Input
import io.ktor.utils.io.core.readAvailable
import io.ktor.utils.io.core.readInt
import io.ktor.utils.io.core.use
import io.ktor.utils.io.pool.useInstance
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.io.InputStream
import kotlinx.io.core.Input
import kotlinx.io.core.discardExact
import kotlinx.io.core.readAvailable
import kotlinx.io.core.use
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead

View File

@ -12,10 +12,13 @@
package net.mamoe.mirai.qqandroid.network.highway
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.core.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.io.InputStream
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Input
import kotlinx.io.core.buildPacket
import kotlinx.io.core.writeFully
import net.mamoe.mirai.qqandroid.io.serialization.toByteArray
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead

View File

@ -1,408 +0,0 @@
/*
* Copyright 2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("SpellCheckingInspection")
package net.mamoe.mirai.qqandroid.network.protocol.data.proto
import kotlinx.serialization.SerialId
import kotlinx.serialization.Serializable
import kotlinx.serialization.protobuf.ProtoNumberType
import kotlinx.serialization.protobuf.ProtoType
import net.mamoe.mirai.qqandroid.io.ProtoBuf
import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY
class GroupOpenSysMsg : ProtoBuf {
@Serializable
class LightApp(
@SerialId(1) val app: String = "",
@SerialId(2) val view: String = "",
@SerialId(3) val desc: String = "",
@SerialId(4) val prompt: String = "",
@SerialId(5) val ver: String = "",
@SerialId(6) val meta: String = "",
@SerialId(7) val config: String = "",
@SerialId(8) val source: Source? = null
) : ProtoBuf
@Serializable
class RichMsg(
@SerialId(1) val title: String = "",
@SerialId(2) val desc: String = "",
@SerialId(3) val brief: String = "",
@SerialId(4) val cover: String = "",
@SerialId(5) val url: String = "",
@SerialId(6) val source: Source? = null
) : ProtoBuf
@Serializable
class Sender(
@SerialId(1) val uin: Long = 0L,
@SerialId(2) val nick: String = "",
@SerialId(3) val avatar: String = "",
@SerialId(4) val url: String = ""
) : ProtoBuf
@Serializable
class Source(
@SerialId(1) val name: String = "",
@SerialId(2) val icon: String = "",
@SerialId(3) val url: String = ""
) : ProtoBuf
@Serializable
class SysMsgBody(
@SerialId(1) val groupId: Long = 0L,
@SerialId(2) val appid: Long = 0L,
@SerialId(3) val sender: Sender? = null,
@SerialId(4) val msgType: Int = 0,
@SerialId(5) val content: String = "",
@SerialId(6) val richMsg: RichMsg? = null,
@SerialId(7) val lightApp: LightApp? = null
) : ProtoBuf
}
@Serializable
class TroopTips0x857 : ProtoBuf {
@Serializable
class AIOGrayTipsInfo(
@SerialId(1) val optUint32ShowLastest: Int = 0,
@SerialId(2) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(3) val optUint32Remind: Int = 0,
@SerialId(4) val optBytesBrief: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(5) val receiverUin: Long = 0L,
@SerialId(6) val reliaoAdminOpt: Int = 0,
@SerialId(7) val robotGroupOpt: Int = 0
) : ProtoBuf
@Serializable
class AIOTopTipsInfo(
@SerialId(1) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(2) val optUint32Icon: Int = 0,
@SerialId(3) val optEnumAction: Int /* enum */ = 1,
@SerialId(4) val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(5) val optBytesData: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(6) val optBytesDataI: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(7) val optBytesDataA: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(8) val optBytesDataP: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class FloatedTipsInfo(
@SerialId(1) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class GeneralGrayTipInfo(
@SerialId(1) val busiType: Long = 0L,
@SerialId(2) val busiId: Long = 0L,
@SerialId(3) val ctrlFlag: Int = 0,
@SerialId(4) val c2cType: Int = 0,
@SerialId(5) val serviceType: Int = 0,
@SerialId(6) val templId: Long = 0L,
@SerialId(7) val msgTemplParam: List<TemplParam>? = null,
@SerialId(8) val content: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(10) val tipsSeqId: Long = 0L,
@SerialId(100) val pbReserv: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class GoldMsgTipsElem(
@SerialId(1) val type: Int = 0,
@SerialId(2) val billno: String = "",
@SerialId(3) val result: Int = 0,
@SerialId(4) val amount: Int = 0,
@SerialId(5) val total: Int = 0,
@SerialId(6) val interval: Int = 0,
@SerialId(7) val finish: Int = 0,
@SerialId(8) val uin: List<Long>? = null,
@SerialId(9) val action: Int = 0
) : ProtoBuf
@Serializable
class GroupInfoChange(
@SerialId(1) val groupHonorSwitch: Int = 0
) : ProtoBuf
@Serializable
class GroupNotifyInfo(
@SerialId(1) val optUint32AutoPullFlag: Int = 0,
@SerialId(2) val optBytesFeedsId: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class InstCtrl(
@SerialId(1) val msgSendToInst: List<InstInfo>? = null,
@SerialId(2) val msgExcludeInst: List<InstInfo>? = null,
@SerialId(3) val msgFromInst: InstInfo? = null
) : ProtoBuf
@Serializable
class InstInfo(
@SerialId(1) val apppid: Int = 0,
@SerialId(2) val instid: Int = 0,
@SerialId(3) val platform: Int = 0,
@SerialId(4) val openAppid: Int = 0,
@SerialId(5) val productid: Int = 0,
@SerialId(6) val ssoBid: Int = 0,
@SerialId(7) val guid: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(8) val verMin: Int = 0,
@SerialId(9) val verMax: Int = 0
) : ProtoBuf
@Serializable
class LbsShareChangePushInfo(
@SerialId(1) val msgType: Int = 0,
@SerialId(2) val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(3) val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(4) val groupId: Long = 0L,
@SerialId(5) val operUin: Long = 0L,
@SerialId(6) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(7) val msgSeq: Long = 0L,
@SerialId(8) val joinNums: Int = 0,
@SerialId(99) val pushType: Int = 0,
@SerialId(100) val extInfo: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class LuckyBagNotify(
@SerialId(1) val msgTips: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class MediaChangePushInfo(
@SerialId(1) val msgType: Int = 0,
@SerialId(2) val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(3) val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(4) val groupId: Long = 0L,
@SerialId(5) val operUin: Long = 0L,
@SerialId(6) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(7) val msgSeq: Long = 0L,
@SerialId(8) val joinNums: Int = 0,
@SerialId(9) val msgPerSetting: PersonalSetting? = null,
@SerialId(10) val playMode: Int = 0,
@SerialId(99) val mediaType: Int = 0,
@SerialId(100) val extInfo: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf {
@Serializable
class PersonalSetting(
@SerialId(1) val themeId: Int = 0,
@SerialId(2) val playerId: Int = 0,
@SerialId(3) val fontId: Int = 0
) : ProtoBuf
}
@Serializable
class MessageBoxInfo(
@SerialId(1) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(2) val optBytesTitle: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(3) val optBytesButton: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class MessageRecallReminder(
@SerialId(1) val uin: Long = 0L,
@SerialId(2) val nickname: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(3) val recalledMsgList: List<MessageMeta> = listOf(),
@SerialId(4) val reminderContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(5) val userdef: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(6) val groupType: Int = 0,
@SerialId(7) val opType: Int = 0
) : ProtoBuf {
@Serializable
class MessageMeta(
@SerialId(1) val seq: Int = 0,
@SerialId(2) val time: Int = 0,
@SerialId(3) val msgRandom: Int = 0,
@SerialId(4) val msgType: Int = 0,
@SerialId(5) val msgFlag: Int = 0,
@SerialId(6) val authorUin: Long = 0L
) : ProtoBuf
}
@Serializable
class MiniAppNotify(
@SerialId(1) val msg: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class NotifyMsgBody(
@SerialId(1) val optEnumType: Int /* enum */ = 1,
@SerialId(2) val optUint64MsgTime: Long = 0L,
@SerialId(3) val optUint64MsgExpires: Long = 0L,
@SerialId(4) val optUint64GroupCode: Long = 0L,
@SerialId(5) val optMsgGraytips: AIOGrayTipsInfo? = null,
@SerialId(6) val optMsgMessagebox: MessageBoxInfo? = null,
@SerialId(7) val optMsgFloatedtips: FloatedTipsInfo? = null,
@SerialId(8) val optMsgToptips: AIOTopTipsInfo? = null,
@SerialId(9) val optMsgRedtips: RedGrayTipsInfo? = null,
@SerialId(10) val optMsgGroupNotify: GroupNotifyInfo? = null,
@SerialId(11) val optMsgRecall: MessageRecallReminder? = null,
@SerialId(12) val optMsgThemeNotify: ThemeStateNotify? = null,
@SerialId(13) val serviceType: Int = 0,
@SerialId(14) val optMsgObjmsgUpdate: NotifyObjmsgUpdate? = null,
@SerialId(15) val optMsgWerewolfPush: WereWolfPush? = null,
// @SerialId(16) val optStcmGameState: ApolloGameStatus.STCMGameMessage? = null,
// @SerialId(17) val aplloMsgPush: ApolloPushMsgInfo.STPushMsgElem? = null,
@SerialId(18) val optMsgGoldtips: GoldMsgTipsElem? = null,
@SerialId(20) val optMsgMiniappNotify: MiniAppNotify? = null,
@SerialId(21) val optUint64SenderUin: Long = 0L,
@SerialId(22) val optMsgLuckybagNotify: LuckyBagNotify? = null,
@SerialId(23) val optMsgTroopformtipsPush: TroopFormGrayTipsInfo? = null,
@SerialId(24) val optMsgMediaPush: MediaChangePushInfo? = null,
@SerialId(26) val optGeneralGrayTip: GeneralGrayTipInfo? = null,
@SerialId(27) val optMsgVideoPush: VideoChangePushInfo? = null,
@SerialId(28) val optLbsShareChangePlusInfo: LbsShareChangePushInfo? = null,
@SerialId(29) val optMsgSingPush: SingChangePushInfo? = null,
@SerialId(30) val optMsgGroupInfoChange: GroupInfoChange? = null
) : ProtoBuf
@Serializable
class NotifyObjmsgUpdate(
@SerialId(1) val objmsgId: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(2) val updateType: Int = 0,
@SerialId(3) val extMsg: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class RedGrayTipsInfo(
@SerialId(1) val optUint32ShowLastest: Int = 0,
@SerialId(2) val senderUin: Long = 0L,
@SerialId(3) val receiverUin: Long = 0L,
@SerialId(4) val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(5) val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(6) val authkey: ByteArray = EMPTY_BYTE_ARRAY,
@ProtoType(ProtoNumberType.SIGNED) @SerialId(7) val sint32Msgtype: Int = 0,
@SerialId(8) val luckyFlag: Int = 0,
@SerialId(9) val hideFlag: Int = 0,
@SerialId(10) val pcBody: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(11) val icon: Int = 0,
@SerialId(12) val luckyUin: Long = 0L,
@SerialId(13) val time: Int = 0,
@SerialId(14) val random: Int = 0,
@SerialId(15) val broadcastRichContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(16) val idiom: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(17) val idiomSeq: Int = 0,
@SerialId(18) val idiomAlpha: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(19) val jumpurl: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class ReqBody(
@SerialId(1) val optUint64GroupCode: Long = 0L,
@SerialId(2) val uint64Memberuins: List<Long>? = null,
@SerialId(3) val optUint32Offline: Int = 0,
@SerialId(4) val msgInstCtrl: InstCtrl? = null,
@SerialId(5) val optBytesMsg: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(6) val optUint32BusiType: Int = 0
) : ProtoBuf
@Serializable
class RspBody(
@SerialId(1) val optUint64GroupCode: Long = 0L
) : ProtoBuf
@Serializable
class SingChangePushInfo(
@SerialId(1) val seq: Long = 0L,
@SerialId(2) val actionType: Int = 0,
@SerialId(3) val groupId: Long = 0L,
@SerialId(4) val operUin: Long = 0L,
@SerialId(5) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(6) val joinNums: Int = 0
) : ProtoBuf
@Serializable
class TemplParam(
@SerialId(1) val name: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(2) val value: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class ThemeStateNotify(
@SerialId(1) val state: Int = 0,
@SerialId(2) val feedsId: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(3) val themeName: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(4) val actionUin: Long = 0L,
@SerialId(5) val createUin: Long = 0L
) : ProtoBuf
@Serializable
class TroopFormGrayTipsInfo(
@SerialId(1) val writerUin: Long = 0L,
@SerialId(2) val creatorUin: Long = 0L,
@SerialId(3) val richContent: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(4) val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(5) val creatorNick: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class VideoChangePushInfo(
@SerialId(1) val seq: Long = 0L,
@SerialId(2) val actionType: Int = 0,
@SerialId(3) val groupId: Long = 0L,
@SerialId(4) val operUin: Long = 0L,
@SerialId(5) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(6) val joinNums: Int = 0,
@SerialId(100) val extInfo: ByteArray = EMPTY_BYTE_ARRAY
) : ProtoBuf
@Serializable
class WereWolfPush(
@SerialId(1) val pushType: Int = 0,
@SerialId(2) val gameRoom: Long = 0L,
@SerialId(3) val enumGameState: Int = 0,
@SerialId(4) val gameRound: Int = 0,
@SerialId(5) val roles: List<Role>? = null,
@SerialId(6) val speaker: Long = 0L,
@SerialId(7) val judgeUin: Long = 0L,
@SerialId(8) val judgeWords: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(9) val enumOperation: Int = 0,
@SerialId(10) val srcUser: Long = 0L,
@SerialId(11) val dstUser: Long = 0L,
@SerialId(12) val deadUsers: List<Long>? = null,
@SerialId(13) val gameResult: Int = 0,
@SerialId(14) val timeoutSec: Int = 0,
@SerialId(15) val killConfirmed: Int = 0,
@SerialId(16) val judgeNickname: ByteArray = EMPTY_BYTE_ARRAY,
@SerialId(17) val votedTieUsers: List<Long>? = null
) : ProtoBuf {
@Serializable
class GameRecord(
@SerialId(1) val total: Int = 0,
@SerialId(2) val win: Int = 0,
@SerialId(3) val lose: Int = 0,
@SerialId(4) val draw: Int = 0
) : ProtoBuf
@Serializable
class Role(
@SerialId(1) val uin: Long = 0L,
@SerialId(2) val enumType: Int = 0,
@SerialId(3) val enumState: Int = 0,
@SerialId(4) val canSpeak: Int = 0,
@SerialId(5) val canListen: Int = 0,
@SerialId(6) val position: Int = 0,
@SerialId(7) val canVote: Int = 0,
@SerialId(8) val canVoted: Int = 0,
@SerialId(9) val alreadyChecked: Int = 0,
@SerialId(10) val alreadySaved: Int = 0,
@SerialId(11) val alreadyPoisoned: Int = 0,
@SerialId(12) val playerState: Int = 0,
@SerialId(13) val enumDeadOp: Int = 0,
@SerialId(14) val enumOperation: Int = 0,
@SerialId(15) val dstUser: Long = 0L,
@SerialId(16) val operationRound: Int = 0,
@SerialId(17) val msgGameRecord: GameRecord? = null,
@SerialId(18) val isWerewolf: Int = 0,
@SerialId(19) val defendedUser: Long = 0L,
@SerialId(20) val isSheriff: Int = 0
) : ProtoBuf
}
}

View File

@ -9,7 +9,10 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet
import io.ktor.utils.io.core.*
import kotlinx.io.core.BytePacketBuilder
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.buildPacket
import kotlinx.io.core.writeFully
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.utils.cryptor.ECDH
import net.mamoe.mirai.utils.cryptor.ECDHKeyPair

View File

@ -10,7 +10,10 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet
import io.ktor.utils.io.core.*
import kotlinx.io.core.BytePacketBuilder
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.buildPacket
import kotlinx.io.core.writeFully
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.io.encryptAndWrite
@ -43,7 +46,6 @@ internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket(
body: BytePacketBuilder.(sequenceId: Int) -> Unit
): OutgoingPacket {
@Suppress("DuplicatedCode")
return OutgoingPacket(name, commandName, sequenceId, buildPacket {
writeIntLVPacket(lengthOffset = { it + 4 }) {
writeInt(0x0B)
@ -52,7 +54,7 @@ internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket(
writeByte(0)
client.uin.toString().let {
writeInt(it.length + 4)
writeText(it)
writeStringUtf8(it)
}
encryptAndWrite(key) {
writeUniPacket(commandName, client.outgoingPacketSessionId, extraData) {
@ -75,7 +77,6 @@ internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket(
sequenceId: Int = client.nextSsoSequenceId(),
body: BytePacketBuilder.(sequenceId: Int) -> Unit
): OutgoingPacket {
@Suppress("DuplicatedCode")
return OutgoingPacket(name, commandName, sequenceId, buildPacket {
writeIntLVPacket(lengthOffset = { it + 4 }) {
writeInt(0x0B)
@ -84,7 +85,7 @@ internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket(
writeByte(0)
client.uin.toString().let {
writeInt(it.length + 4)
writeText(it)
writeStringUtf8(it)
}
encryptAndWrite(key) {
writeUniPacket(commandName, client.outgoingPacketSessionId, extraData) {
@ -105,7 +106,7 @@ internal inline fun BytePacketBuilder.writeUniPacket(
writeIntLVPacket(lengthOffset = { it + 4 }) {
commandName.let {
writeInt(it.length + 4)
writeText(it)
writeStringUtf8(it)
}
writeInt(4 + 4)
@ -152,7 +153,7 @@ internal inline fun OutgoingPacketFactory<*>.buildLoginOutgoingPacket(
client.uin.toString().let {
writeInt(it.length + 4)
writeText(it)
writeStringUtf8(it)
}
if (key === NO_ENCRYPT) {
@ -207,7 +208,7 @@ internal inline fun BytePacketBuilder.writeSsoPacket(
}
commandName.let {
writeInt(it.length + 4)
writeText(it)
writeStringUtf8(it)
}
writeInt(4 + 4)
@ -215,7 +216,7 @@ internal inline fun BytePacketBuilder.writeSsoPacket(
client.device.imei.let {
writeInt(it.length + 4)
writeText(it)
writeStringUtf8(it)
}
writeInt(4)

View File

@ -9,8 +9,8 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet
import io.ktor.utils.io.core.*
import io.ktor.utils.io.pool.useInstance
import kotlinx.io.core.*
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.event.Event
import net.mamoe.mirai.qqandroid.QQAndroidBot

View File

@ -9,7 +9,10 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet
import io.ktor.utils.io.core.*
import kotlinx.io.core.BytePacketBuilder
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.toByteArray
import kotlinx.io.core.writeFully
import net.mamoe.mirai.qqandroid.network.protocol.LoginType
import net.mamoe.mirai.qqandroid.utils.NetworkType
import net.mamoe.mirai.utils.currentTimeMillis

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf

View File

@ -9,7 +9,10 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat
import io.ktor.utils.io.core.*
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.buildPacket
import kotlinx.io.core.readBytes
import kotlinx.io.core.toByteArray
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.data.Packet
@ -375,7 +378,7 @@ internal class TroopManagement {
OutgoingPacketFactory<EditGroupNametag.Response>("friendlist.ModifyGroupCardReq") {
object Response : Packet
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): EditGroupNametag.Response {
return Response
}

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf

View File

@ -9,9 +9,10 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.*
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.list
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.decodeUniPacket

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.login
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.JceCharset
import net.mamoe.mirai.qqandroid.io.serialization.decodeUniPacket

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.login
import io.ktor.utils.io.core.ByteReadPacket
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.io.serialization.*

View File

@ -11,7 +11,7 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
import io.ktor.util.InternalAPI
import io.ktor.utils.io.core.*
import kotlinx.io.core.*
import net.mamoe.mirai.data.Packet
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.*
@ -288,7 +288,7 @@ internal class WtLogin {
}
class Picture(
val data: ByteArray,
val data: IoBuffer,
val sign: ByteArray
) : Captcha() {
override fun toString(): String = "LoginPacketResponse.Captcha.Picture"
@ -394,8 +394,11 @@ internal class WtLogin {
imageData.discardExact(2)//image Length
val sign = imageData.readBytes(signInfoLength.toInt())
val buffer = IoBuffer.Pool.borrow()
imageData.readAvailable(buffer)
return LoginPacketResponse.Captcha.Picture(
data = imageData.readBytes(),
data = buffer,
sign = sign
)
// } else error("UNKNOWN CAPTCHA QUESTION: ${question.toUHexString()}, tlvMap=" + tlvMap.contentToString())

View File

@ -11,11 +11,11 @@
package test
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Input
import io.ktor.utils.io.core.readAvailable
import io.ktor.utils.io.core.use
import io.ktor.utils.io.pool.useInstance
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Input
import kotlinx.io.core.readAvailable
import kotlinx.io.core.use
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.MiraiLoggerWithSwitch

View File

@ -11,7 +11,7 @@ package net.mamoe.mirai.qqandroid.io.serialization
/*
import io.ktor.utils.io.core.readBytes
import kotlinx.io.core.readBytes
import kotlinx.serialization.SerialId
import kotlinx.serialization.Serializable
import net.mamoe.mirai.qqandroid.io.JceOutput

View File

@ -28,7 +28,7 @@ fun main() {
println(
File(
"""
E:\Projects\QQAndroidFF\app\src\main\java\tencent\im\oidb\cmd0x857
E:\Projects\QQAndroidFF\app\src\main\java\tencent\im\msgrevoke
""".trimIndent()
)
.generateUnarrangedClasses().toMutableList().arrangeClasses().joinToString("\n\n")

View File

@ -53,6 +53,7 @@ fun File.toExternalImage(): ExternalImage {
md5 = this.inputStream().use { it.md5() },
imageFormat = this.nameWithoutExtension,
input = this.inputStream(),
inputSize = this.length(),
filename = this.name
)
}

View File

@ -13,7 +13,7 @@ import android.annotation.SuppressLint
import android.net.wifi.WifiManager
import android.os.Build
import android.telephony.TelephonyManager
import io.ktor.utils.io.core.toByteArray
import kotlinx.io.core.toByteArray
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.UnstableDefault

View File

@ -9,12 +9,12 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Closeable
import io.ktor.utils.io.nio.readPacketAtMost
import io.ktor.utils.io.nio.writePacket
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable
import kotlinx.io.nio.readPacketAtMost
import kotlinx.io.nio.writePacket
import java.net.InetSocketAddress
import java.nio.channels.DatagramChannel
import java.nio.channels.ReadableByteChannel

View File

@ -9,13 +9,13 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Closeable
import io.ktor.utils.io.core.ExperimentalIoApi
import io.ktor.utils.io.streams.readPacketAtMost
import io.ktor.utils.io.streams.writePacket
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable
import kotlinx.io.core.ExperimentalIoApi
import kotlinx.io.streams.readPacketAtMost
import kotlinx.io.streams.writePacket
import net.mamoe.mirai.utils.MiraiInternalAPI
import java.io.BufferedInputStream
import java.io.BufferedOutputStream

View File

@ -12,7 +12,7 @@ package net.mamoe.mirai.utils
import io.ktor.client.HttpClient
import io.ktor.client.engine.cio.CIO
import io.ktor.util.KtorExperimentalAPI
import io.ktor.utils.io.pool.useInstance
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.io.ByteArrayPool
import java.io.ByteArrayOutputStream
import java.io.DataInput

View File

@ -11,7 +11,7 @@
package net.mamoe.mirai
import io.ktor.utils.io.core.toByteArray
import kotlinx.io.core.toByteArray
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.md5

View File

@ -10,8 +10,8 @@
package net.mamoe.mirai.data
import io.ktor.client.request.get
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.readBytes
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.readBytes
import net.mamoe.mirai.utils.Http
interface ImageLink {

View File

@ -21,7 +21,6 @@ import net.mamoe.mirai.event.events.ImageUploadEvent.Failed
import net.mamoe.mirai.event.events.ImageUploadEvent.Succeed
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.MessageSource
import net.mamoe.mirai.utils.ExternalImage
import net.mamoe.mirai.utils.MiraiExperimentalAPI

View File

@ -12,9 +12,9 @@
package net.mamoe.mirai.utils
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Input
import kotlinx.io.InputStream
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Input
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.QQ

View File

@ -15,13 +15,10 @@ package net.mamoe.mirai.utils
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.ByteWriteChannel
import io.ktor.utils.io.close
import io.ktor.utils.io.core.Output
import io.ktor.utils.io.core.writeFully
import io.ktor.utils.io.pool.useInstance
import io.ktor.utils.io.readAvailable
import kotlinx.io.OutputStream
import kotlinx.io.core.Output
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.io.ByteArrayPool
import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName

View File

@ -9,9 +9,8 @@
package net.mamoe.mirai.utils.cryptor
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.readFully
import io.ktor.utils.io.pool.useInstance
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.io.ByteArrayPool
import net.mamoe.mirai.utils.io.toByteArray

View File

@ -9,8 +9,8 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Closeable
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable
import net.mamoe.mirai.utils.MiraiInternalAPI
/**

View File

@ -9,8 +9,8 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Closeable
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable
import net.mamoe.mirai.utils.MiraiInternalAPI
/**

View File

@ -13,11 +13,11 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.charsets.Charset
import io.ktor.utils.io.charsets.Charsets
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.String
import io.ktor.utils.io.core.use
import kotlinx.io.charsets.Charset
import kotlinx.io.charsets.Charsets
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.String
import kotlinx.io.core.use
import net.mamoe.mirai.utils.checkOffsetAndLength
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind

View File

@ -10,16 +10,14 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Input
import io.ktor.utils.io.core.isNotEmpty
import io.ktor.utils.io.core.readAvailable
import io.ktor.utils.io.pool.useInstance
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.io.InputStream
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Input
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.MiraiInternalAPI

View File

@ -11,6 +11,8 @@
package net.mamoe.mirai.utils.io
import kotlinx.io.core.IoBuffer
import kotlinx.io.pool.ObjectPool
import kotlin.random.Random
import kotlin.random.nextInt
@ -200,3 +202,13 @@ fun ByteArray.toInt(): Int =
(this[0].toInt().and(255) shl 24) + (this[1].toInt().and(255) shl 16) + (this[2].toInt().and(255) shl 8) + (this[3].toInt().and(
255
) shl 0)
/**
* [IoBuffer.Pool] [borrow][ObjectPool.borrow] 一个 [IoBuffer] 然后将 [this] 写入.
* 注意回收 ([ObjectPool.recycle])
*/
fun ByteArray.toIoBuffer(
offset: Int = 0,
length: Int = this.size - offset,
pool: ObjectPool<IoBuffer> = IoBuffer.Pool
): IoBuffer = pool.borrow().let { it.writeFully(this, offset, length); it }

View File

@ -13,7 +13,7 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.*
import kotlinx.io.core.*
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.coerceAtMostOrFail
import net.mamoe.mirai.utils.cryptor.TEA

View File

@ -12,7 +12,7 @@
package net.mamoe.mirai.utils
import io.ktor.client.HttpClient
import io.ktor.utils.io.core.toByteArray
import kotlinx.io.core.toByteArray
/**
* 时间戳

View File

@ -12,9 +12,9 @@
package net.mamoe.mirai.message
import io.ktor.utils.io.ByteWriteChannel
import io.ktor.utils.io.core.Input
import kotlinx.io.core.Input
import io.ktor.utils.io.core.Output
import io.ktor.utils.io.core.use
import kotlinx.io.core.use
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.message.data.Image

View File

@ -11,9 +11,9 @@
package net.mamoe.mirai.message
import io.ktor.utils.io.core.Input
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.io.core.Input
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.OfflineImage

View File

@ -9,7 +9,6 @@
package net.mamoe.mirai.utils
import io.ktor.utils.io.core.use
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@ -21,6 +20,7 @@ import kotlinx.coroutines.io.writeFully
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import kotlinx.io.core.use
import net.mamoe.mirai.Bot
import net.mamoe.mirai.network.BotNetworkHandler
import java.awt.Image

View File

@ -12,13 +12,13 @@
package net.mamoe.mirai.utils
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.core.Input
import io.ktor.utils.io.core.buildPacket
import io.ktor.utils.io.core.copyTo
import io.ktor.utils.io.errors.IOException
import io.ktor.utils.io.streams.asOutput
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext
import kotlinx.io.core.Input
import kotlinx.io.core.buildPacket
import kotlinx.io.core.copyTo
import kotlinx.io.errors.IOException
import kotlinx.io.streams.asOutput
import net.mamoe.mirai.utils.io.getRandomString
import java.awt.image.BufferedImage
import java.io.File

View File

@ -13,7 +13,7 @@ package net.mamoe.mirai.utils
import io.ktor.client.HttpClient
import io.ktor.client.engine.cio.CIO
import io.ktor.utils.io.pool.useInstance
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.io.ByteArrayPool
import java.io.*
import java.net.InetAddress

View File

@ -9,7 +9,7 @@
package net.mamoe.mirai.utils
import io.ktor.utils.io.core.toByteArray
import kotlinx.io.core.toByteArray
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.UnstableDefault

View File

@ -9,13 +9,13 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Closeable
import io.ktor.utils.io.core.ExperimentalIoApi
import io.ktor.utils.io.streams.readPacketAtMost
import io.ktor.utils.io.streams.writePacket
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable
import kotlinx.io.core.ExperimentalIoApi
import kotlinx.io.streams.readPacketAtMost
import kotlinx.io.streams.writePacket
import net.mamoe.mirai.utils.MiraiInternalAPI
import java.io.BufferedInputStream
import java.io.BufferedOutputStream

View File

@ -9,12 +9,12 @@
package net.mamoe.mirai.utils.io
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Closeable
import io.ktor.utils.io.nio.readPacketAtMost
import io.ktor.utils.io.nio.writePacket
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable
import kotlinx.io.nio.readPacketAtMost
import kotlinx.io.nio.writePacket
import java.net.InetSocketAddress
import java.nio.channels.DatagramChannel
import java.nio.channels.ReadableByteChannel