Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
Mirai
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
Mirai
Commits
56840643
Commit
56840643
authored
Nov 11, 2019
by
Him188
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AddContact preview
parent
14152815
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
241 additions
and
59 deletions
+241
-59
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt
+102
-11
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt
.../src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt
+0
-4
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt
...c/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt
+1
-1
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/Packet.kt
...lin/net.mamoe.mirai/network/protocol/tim/packet/Packet.kt
+1
-1
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/PacketId.kt
...n/net.mamoe.mirai/network/protocol/tim/packet/PacketId.kt
+4
-0
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/action/AddContact.kt
...oe.mirai/network/protocol/tim/packet/action/AddContact.kt
+109
-39
mirai-debug/src/main/kotlin/PacketDebuger.kt
mirai-debug/src/main/kotlin/PacketDebuger.kt
+0
-3
mirai-debug/src/main/kotlin/test/ProfileTest.kt
mirai-debug/src/main/kotlin/test/ProfileTest.kt
+24
-0
No files found.
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt
View file @
56840643
This diff is collapsed.
Click to expand it.
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt
View file @
56840643
...
@@ -147,10 +147,6 @@ open class QQ internal constructor(bot: Bot, id: UInt) : Contact(bot, id) {
...
@@ -147,10 +147,6 @@ open class QQ internal constructor(bot: Bot, id: UInt) : Contact(bot, id) {
}
}
}
}
suspend
fun
QQ
.
addAsFriend
()
{
}
override
fun
toString
():
String
{
override
fun
toString
():
String
{
return
"QQ(${this.id})"
return
"QQ(${this.id})"
}
}
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt
View file @
56840643
...
@@ -102,7 +102,7 @@ class BotSession(
...
@@ -102,7 +102,7 @@ class BotSession(
/**
/**
* 发送一个数据包, 并期待接受一个特定的 [ServerPacket][P].
* 发送一个数据包, 并期待接受一个特定的 [ServerPacket][P].
*
您
将能从本函数的返回值 [CompletableDeferred] 接收到所期待的 [P]
* 将能从本函数的返回值 [CompletableDeferred] 接收到所期待的 [P]
*/
*/
suspend
inline
fun
<
reified
P
:
Packet
>
OutgoingPacket
.
sendAndExpect
(
checkSequence
:
Boolean
=
true
):
CompletableDeferred
<
P
>
=
suspend
inline
fun
<
reified
P
:
Packet
>
OutgoingPacket
.
sendAndExpect
(
checkSequence
:
Boolean
=
true
):
CompletableDeferred
<
P
>
=
sendAndExpect
<
P
,
P
>(
checkSequence
)
{
it
}
sendAndExpect
<
P
,
P
>(
checkSequence
)
{
it
}
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/Packet.kt
View file @
56840643
...
@@ -23,4 +23,4 @@ class UnknownPacket(val id: PacketId, val body: ByteReadPacket) : Packet {
...
@@ -23,4 +23,4 @@ class UnknownPacket(val id: PacketId, val body: ByteReadPacket) : Packet {
*/
*/
object
NoPacket
:
Packet
{
object
NoPacket
:
Packet
{
override
fun
toString
():
String
=
"NoPacket"
override
fun
toString
():
String
=
"NoPacket"
}
}
\ No newline at end of file
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/PacketId.kt
View file @
56840643
...
@@ -72,11 +72,15 @@ enum class KnownPacketId(override inline val value: UShort, override inline val
...
@@ -72,11 +72,15 @@ enum class KnownPacketId(override inline val value: UShort, override inline val
inline
SEND_GROUP_MESSAGE
(
0
x0002u
,
SendGroupMessagePacket
),
inline
SEND_GROUP_MESSAGE
(
0
x0002u
,
SendGroupMessagePacket
),
inline
SEND_FRIEND_MESSAGE
(
0
x00CDu
,
SendFriendMessagePacket
),
inline
SEND_FRIEND_MESSAGE
(
0
x00CDu
,
SendFriendMessagePacket
),
inline
CAN_ADD_FRIEND
(
0
x00A7u
,
CanAddFriendPacket
),
inline
CAN_ADD_FRIEND
(
0
x00A7u
,
CanAddFriendPacket
),
inline
ADD_FRIEND
(
0
x00A8u
,
AddFriendPacket
),
inline
REQUEST_FRIEND_ADDITION_KEY
(
0
x00AEu
,
RequestFriendAdditionKeyPacket
),
inline
GROUP_IMAGE_ID
(
0
x0388u
,
GroupImageIdRequestPacket
),
inline
GROUP_IMAGE_ID
(
0
x0388u
,
GroupImageIdRequestPacket
),
inline
FRIEND_IMAGE_ID
(
0
x0352u
,
FriendImageIdRequestPacket
),
inline
FRIEND_IMAGE_ID
(
0
x0352u
,
FriendImageIdRequestPacket
),
inline
REQUEST_PROFILE_AVATAR
(
0
x0031u
,
RequestProfileAvatarPacket
),
inline
REQUEST_PROFILE_AVATAR
(
0
x0031u
,
RequestProfileAvatarPacket
),
inline
REQUEST_PROFILE_DETAILS
(
0
x003Cu
,
RequestProfileDetailsPacket
),
inline
REQUEST_PROFILE_DETAILS
(
0
x003Cu
,
RequestProfileDetailsPacket
),
inline
QUERY_PREVIOUS_NAME
(
0
x01BCu
,
QueryPreviousNamePacket
),
// @Suppress("DEPRECATION")
// @Suppress("DEPRECATION")
// inline SUBMIT_IMAGE_FILE_NAME(0x01BDu, SubmitImageFilenamePacket),
// inline SUBMIT_IMAGE_FILE_NAME(0x01BDu, SubmitImageFilenamePacket),
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/action/AddContact.kt
View file @
56840643
...
@@ -2,28 +2,14 @@
...
@@ -2,28 +2,14 @@
package
net.mamoe.mirai.network.protocol.tim.packet.action
package
net.mamoe.mirai.network.protocol.tim.packet.action
import
kotlinx.io.core.ByteReadPacket
import
kotlinx.io.core.*
import
kotlinx.io.core.discardExact
import
kotlinx.io.core.readUByte
import
kotlinx.io.core.readUInt
import
net.mamoe.mirai.contact.QQ
import
net.mamoe.mirai.contact.QQ
import
net.mamoe.mirai.network.BotNetworkHandler
import
net.mamoe.mirai.network.BotNetworkHandler
import
net.mamoe.mirai.network.protocol.tim.TIMProtocol
import
net.mamoe.mirai.network.protocol.tim.packet.*
import
net.mamoe.mirai.network.protocol.tim.packet.*
import
net.mamoe.mirai.network.protocol.tim.packet.event.EventPacket
import
net.mamoe.mirai.network.protocol.tim.packet.event.EventPacket
import
net.mamoe.mirai.utils.io.*
import
net.mamoe.mirai.utils.io.*
// 01BC 曾用名查询. 查到的是这个人的
// 发送 00 00
// 3E 03 3F A2 //bot
// 59 17 3E 05 //目标
//
// 接受: 00 00 00 03
// [00 00 00 0C] E6 A5 BC E4 B8 8A E5 B0 8F E7 99 BD
// [00 00 00 10] 68 69 6D 31 38 38 E7 9A 84 E5 B0 8F 64 69 63 6B
// [00 00 00 0F] E4 B8 B6 E6 9A 97 E8 A3 94 E5 89 91 E9 AD 94
/**
/**
* 查询某人与机器人账号有关的曾用名 (备注).
* 查询某人与机器人账号有关的曾用名 (备注).
*
*
...
@@ -31,8 +17,9 @@ import net.mamoe.mirai.utils.io.*
...
@@ -31,8 +17,9 @@ import net.mamoe.mirai.utils.io.*
* - 昵称
* - 昵称
* - 共同群内的群名片
* - 共同群内的群名片
*/
*/
@PacketVersion
(
date
=
"2019.11.02"
,
timVersion
=
"2.3.2.21173"
)
@AnnotatedId
(
KnownPacketId
.
QUERY_PREVIOUS_NAME
)
object
QueryPreviousNamePacket
:
SessionPacketFactory
<
QueryPreviousNameResponse
>()
{
@PacketVersion
(
date
=
"2019.11.11"
,
timVersion
=
"2.3.2.21173"
)
object
QueryPreviousNamePacket
:
SessionPacketFactory
<
PreviousNameList
>()
{
operator
fun
invoke
(
operator
fun
invoke
(
bot
:
UInt
,
bot
:
UInt
,
sessionKey
:
SessionKey
,
sessionKey
:
SessionKey
,
...
@@ -43,17 +30,29 @@ object QueryPreviousNamePacket : SessionPacketFactory<QueryPreviousNameResponse>
...
@@ -43,17 +30,29 @@ object QueryPreviousNamePacket : SessionPacketFactory<QueryPreviousNameResponse>
writeQQ
(
target
)
writeQQ
(
target
)
}
}
override
suspend
fun
ByteReadPacket
.
decode
(
id
:
PacketId
,
sequenceId
:
UShort
,
handler
:
BotNetworkHandler
<
*
>):
QueryPreviousNameResponse
=
// 01BC 曾用名查询. 查到的是这个人的
QueryPreviousNameResponse
().
apply
{
// 发送 00 00
names
=
Array
(
readUInt
().
toInt
())
{
// 3E 03 3F A2 //bot
// 59 17 3E 05 //目标
//
// 接受: 00 00 00 03
// [00 00 00 0C] E6 A5 BC E4 B8 8A E5 B0 8F E7 99 BD
// [00 00 00 10] 68 69 6D 31 38 38 E7 9A 84 E5 B0 8F 64 69 63 6B
// [00 00 00 0F] E4 B8 B6 E6 9A 97 E8 A3 94 E5 89 91 E9 AD 94
override
suspend
fun
ByteReadPacket
.
decode
(
id
:
PacketId
,
sequenceId
:
UShort
,
handler
:
BotNetworkHandler
<
*
>):
PreviousNameList
=
PreviousNameList
(
ArrayList
<
String
>(
readUInt
().
toInt
()).
apply
{
repeat
(
size
)
{
discardExact
(
2
)
discardExact
(
2
)
readUShortLVString
(
)
add
(
readUShortLVString
()
)
}
}
}
}
)
}
}
class
QueryPreviousNameResponse
:
Packet
{
class
PreviousNameList
(
lateinit
var
names
:
Array
<
String
>
list
:
List
<
String
>
)
:
Packet
,
List
<
String
>
by
list
{
override
fun
toString
():
String
=
this
.
joinToString
(
prefix
=
"PreviousNameList("
,
postfix
=
")"
,
separator
=
", "
)
}
}
// 需要验证消息
// 需要验证消息
...
@@ -89,6 +88,7 @@ enum class AddFriendResult {
...
@@ -89,6 +88,7 @@ enum class AddFriendResult {
* @author Him188moe
* @author Him188moe
*/
*/
@AnnotatedId
(
KnownPacketId
.
CAN_ADD_FRIEND
)
@AnnotatedId
(
KnownPacketId
.
CAN_ADD_FRIEND
)
@PacketVersion
(
date
=
"2019.11.11"
,
timVersion
=
"2.3.2.21173"
)
object
CanAddFriendPacket
:
SessionPacketFactory
<
CanAddFriendResponse
>()
{
object
CanAddFriendPacket
:
SessionPacketFactory
<
CanAddFriendResponse
>()
{
operator
fun
invoke
(
operator
fun
invoke
(
bot
:
UInt
,
bot
:
UInt
,
...
@@ -104,6 +104,7 @@ object CanAddFriendPacket : SessionPacketFactory<CanAddFriendResponse>() {
...
@@ -104,6 +104,7 @@ object CanAddFriendPacket : SessionPacketFactory<CanAddFriendResponse>() {
}
}
val
qq
:
QQ
=
readUInt
().
qq
()
val
qq
:
QQ
=
readUInt
().
qq
()
discardExact
(
0
)
return
when
(
val
state
=
readUByte
().
toUInt
())
{
return
when
(
val
state
=
readUByte
().
toUInt
())
{
//09 4E A4 B1 00 03
//09 4E A4 B1 00 03
...
@@ -152,34 +153,103 @@ sealed class CanAddFriendResponse : EventPacket {
...
@@ -152,34 +153,103 @@ sealed class CanAddFriendResponse : EventPacket {
)
:
CanAddFriendResponse
()
)
:
CanAddFriendResponse
()
}
}
/*
包ID 0115, 在点击提交好友申请时
发出 03 5D 12 93 30
接受 03 00 00 00 00 01 30 5D 12 93 30 00 14 00 00 00 00 10 30 36 35 39 E4 B8 80 E7 BE 8E E5 A4 A9 E9 9D 99 02 0A 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 1E
*/
inline
class
FriendAdditionKey
(
val
value
:
IoBuffer
)
/**
/**
* 请求
添加好友
* 请求
一个 32 位 Key, 在添加好友时发出
*/
*/
@AnnotatedId
(
KnownPacketId
.
CAN_ADD_FRIEND
)
@AnnotatedId
(
KnownPacketId
.
REQUEST_FRIEND_ADDITION_KEY
)
object
AddFriendPacket
:
SessionPacketFactory
<
AddFriendPacket
.
AddFriendResponse
>()
{
@PacketVersion
(
date
=
"2019.11.11"
,
timVersion
=
"2.3.2.21173"
)
object
RequestFriendAdditionKeyPacket
:
SessionPacketFactory
<
RequestFriendAdditionKeyPacket
.
Response
>()
{
operator
fun
invoke
(
operator
fun
invoke
(
bot
:
UInt
,
bot
:
UInt
,
qq
:
UInt
,
qq
:
UInt
,
sessionKey
:
SessionKey
sessionKey
:
SessionKey
):
OutgoingPacket
=
buildOutgoingPacket
{
)
=
buildSessionPacket
(
bot
,
sessionKey
)
{
writeQQ
(
bot
)
//01 00 01 02 B3 74 F6
writeHex
(
TIMProtocol
.
fixVer2
)
writeHex
(
"01 00 01"
)
encryptAndWrite
(
sessionKey
)
{
writeQQ
(
qq
)
writeHex
(
"01 00 01"
)
writeQQ
(
qq
)
}
}
}
override
suspend
fun
BotNetworkHandler
<*>.
handlePacket
(
packet
:
AddFriendResponse
)
{
override
suspend
fun
ByteReadPacket
.
decode
(
id
:
PacketId
,
sequenceId
:
UShort
,
handler
:
BotNetworkHandler
<
*
>):
Response
{
//01 00 01 00 00 20 01 C2 76 47 98 38 A1 FF AB 64 04 A9 81 1F CC 2B 2B A6 29 FC 97 80 A6 90 2D 26 C8 37 EE 1D 8A FA
discardExact
(
4
)
return
Response
(
FriendAdditionKey
(
readIoBuffer
(
readUShort
().
toInt
())))
}
}
data class
Response
(
val
key
:
FriendAdditionKey
)
:
Packet
}
/**
* 请求添加好友
*/
@AnnotatedId
(
KnownPacketId
.
ADD_FRIEND
)
@PacketVersion
(
date
=
"2019.11.11"
,
timVersion
=
"2.3.2.21173"
)
object
AddFriendPacket
:
SessionPacketFactory
<
AddFriendPacket
.
Response
>()
{
operator
fun
invoke
(
bot
:
UInt
,
qq
:
UInt
,
sessionKey
:
SessionKey
,
/**
* 验证消息
*/
message
:
String
,
/**
* 备注名
*/
remark
:
String
,
key
:
FriendAdditionKey
):
OutgoingPacket
=
buildSessionPacket
(
bot
,
sessionKey
)
{
//02 5D 12 93 30
// 00
// 00 [00 20] 3C 00 0C 44 17 C2 15 99 F9 94 96 DC 1C D5 E3 45 41 4B DB C5 B6 B6 52 85 14 D5 89 D2 06 72 BC C3
// 01 [00 1E] E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A
// 00 2A 00 01 00 01 00 00 00 1B E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A 00 05 00 00 00 00 01 00
class
AddFriendResponse
:
Packet
//02 02 B3 74 F6
// 00 00
// [00 20] 06 51 61 A0 CE 33 FE 3E B1 32 41 AF 9A F0 EB FD 16 D5 3A 71 89 3A A4 5C 00 0F C4 57 31 A3 35 76
// 01 00 00 00 0F 00 01 00 01 00 00 00 00 00 05 00 00 00 00 01 00
//02 02 B3 74 F6
// 00
// 00 [00 20] 01 C2 76 47 98 38 A1 FF AB 64 04 A9 81 1F CC 2B 2B A6 29 FC 97 80 A6 90 2D 26 C8 37 EE 1D 8A FA
// 01 [00 00]
// 00 0F 00 01 00 01 00 00 00 00 00 05 00 00 00 00 01 00
writeUByte
(
0
x02u
)
writeQQ
(
qq
)
writeByte
(
0
)
writeByte
(
0
);
writeShort
(
key
.
value
.
readRemaining
.
toShort
());
writeFully
(
key
.
value
)
writeByte
(
1
);
writeShortLVString
(
message
)
writeShortLVPacket
{
//00 01 00 01 00 00 00 1B E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A E5 95 8A 00 05 00 00 00 00 01
//00 01 00 01 00 00 00 00 00 05 00 00 00 00 01
writeHex
(
"00 01 00 01 00 00"
)
// TODO: 2019/11/11 这里面或者下面那个hex可能包含分组信息. 这两次测试都是用的默认分组即我的好友
writeShortLVString
(
remark
)
writeHex
(
"00 05 00 00 00 00 01"
)
}
writeByte
(
0
)
// write
}
object
Response
:
Packet
{
override
fun
toString
():
String
=
"AddFriendPacket.Response"
}
override
suspend
fun
ByteReadPacket
.
decode
(
id
:
PacketId
,
sequenceId
:
UShort
,
handler
:
BotNetworkHandler
<
*
>):
AddFriendResponse
{
override
suspend
fun
ByteReadPacket
.
decode
(
id
:
PacketId
,
sequenceId
:
UShort
,
handler
:
BotNetworkHandler
<
*
>):
Response
{
TODO
()
//02 02 B3 74 F6 00 //02 B3 74 F6 是QQ号
return
Response
}
}
}
}
mirai-debug/src/main/kotlin/PacketDebuger.kt
View file @
56840643
...
@@ -32,9 +32,6 @@ import kotlin.concurrent.thread
...
@@ -32,9 +32,6 @@ import kotlin.concurrent.thread
import
kotlin.coroutines.CoroutineContext
import
kotlin.coroutines.CoroutineContext
import
kotlin.io.use
import
kotlin.io.use
/**
* 需使用 32 位 JDK
*/
fun
main
()
{
fun
main
()
{
/*
/*
check(System.getProperty("os.arch") == "x86") { "Jpcap can only work with x86 JDK" }
check(System.getProperty("os.arch") == "x86") { "Jpcap can only work with x86 JDK" }
...
...
mirai-debug/src/main/kotlin/test/ProfileTest.kt
0 → 100644
View file @
56840643
package
test
import
net.mamoe.mirai.utils.io.hexToBytes
import
net.mamoe.mirai.utils.io.read
import
net.mamoe.mirai.utils.io.readTLVMap
import
net.mamoe.mirai.utils.io.toUHexString
@ExperimentalStdlibApi
@Suppress
(
"EXPERIMENTAL_API_USAGE"
)
fun
main
()
{
val
newMap
=
"4E 22 00 03 E5 AE 89 4E 25 00 06 35 31 31 34 39 35 4E 26 00 01 2D 4E 27 00 01 2D 4E 29 00 01 02 4E 2A 00 06 56 69 76 69 61 6E 4E 2B 00 10 31 35 36 31 34 38 39 31 33 40 71 71 2E 63 6F 6D 4E 2D 00 1D 68 74 74 70 3A 2F 2F 31 35 36 31 34 38 39 31 33 2E 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 4E 2E 00 02 33 00 4E 2F 00 04 33 33 39 00 4E 30 00 01 2D 4E 31 00 01 00 4E 33 00 2D E6 88 91 E7 95 99 E9 95 BF E7 9A 84 E5 A4 B4 E5 8F 91 EF BC 8C E6 98 AF E4 BD A0 E9 94 99 E8 BF 87 E7 9A 84 E5 B9 B4 E5 8D 8E 2E 2E 2E 4E 35 00 18 E5 B9 BF E4 B8 9C E6 8A 80 E6 9C AF E5 B8 88 E8 8C 83 E5 AD A6 E9 99 A2 4E 36 00 01 0A 4E 37 00 01 03 4E 38 00 01 01 4E 3F 00 04 07 C2 0B 02 4E 40 00 0C 00 00 00 31 00 00 34 34 00 00 00 33 4E 41 00 02 00 00 4E 42 00 02 00 00 4E 43 00 02 00 00 4E 45 00 01 21 4E 49 00 04 00 00 00 00 4E 4B 00 04 00 00 00 00 4E 4F 00 01 00 4E 54 00 00 4E 5B 00 00 52 0B 00 04 13 88 02 02 52 0F 00 14 00 00 00 00 00 00 00 00 12 05 10 58 89 10 00 00 00 00 00 00 5D C2 00 0C 00 00 00 31 00 00 34 34 00 00 31 34 5D C8 00 1E E7 B4 A2 E5 B0 BC EF BC 88 E4 B8 AD E5 9B BD EF BC 89 E6 9C 89 E9 99 90 E5 85 AC E5 8F B8 65 97 00 01 11 69 9D 00 04 00 00 00 00 69 A9 00 00 9D A5 00 02 00 00 A4 91 00 02 00 00 A4 93 00 02 00 00 A4 94 00 02 00 00 A4 9C 00 02 00 00 A4 B5 00 02 00 00"
.
hexToBytes
().
read
{
readTLVMap
(
tagSize
=
2
,
expectingEOF
=
true
)
}
newMap
.
forEach
{
(
key
,
value
)
->
if
(!(
value
.
isEmpty
()
||
value
.
all
{
it
.
toInt
()
==
0
}))
{
println
(
key
.
toUShort
().
toUHexString
()
+
"="
+
value
.
decodeToString
())
}
}
return
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment