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
37fa8055
Commit
37fa8055
authored
Sep 13, 2019
by
Him188moe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated network
parent
96a9e6f3
Changes
27
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
330 additions
and
382 deletions
+330
-382
mirai-core/src/main/java/net/mamoe/mirai/network/BotNetworkHandlerImpl.kt
...ain/java/net/mamoe/mirai/network/BotNetworkHandlerImpl.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt
mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt
+4
-2
mirai-core/src/main/java/net/mamoe/mirai/network/handler/ActionPacketHandler.kt
...va/net/mamoe/mirai/network/handler/ActionPacketHandler.kt
+8
-8
mirai-core/src/main/java/net/mamoe/mirai/network/handler/DataPacketSocket.kt
.../java/net/mamoe/mirai/network/handler/DataPacketSocket.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/handler/MessagePacketHandler.kt
...a/net/mamoe/mirai/network/handler/MessagePacketHandler.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ClientPacket.kt
.../main/java/net/mamoe/mirai/network/packet/ClientPacket.kt
+13
-27
mirai-core/src/main/java/net/mamoe/mirai/network/packet/GradeInfo.kt
...src/main/java/net/mamoe/mirai/network/packet/GradeInfo.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Heartbeat.kt
...src/main/java/net/mamoe/mirai/network/packet/Heartbeat.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/SKey.kt
...core/src/main/java/net/mamoe/mirai/network/packet/SKey.kt
+2
-2
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
...c/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
+10
-7
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Session.kt
...e/src/main/java/net/mamoe/mirai/network/packet/Session.kt
+4
-5
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Touch.kt
...ore/src/main/java/net/mamoe/mirai/network/packet/Touch.kt
+12
-10
mirai-core/src/main/java/net/mamoe/mirai/network/packet/VerificationCode.kt
...n/java/net/mamoe/mirai/network/packet/VerificationCode.kt
+8
-8
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/AddContact.kt
.../java/net/mamoe/mirai/network/packet/action/AddContact.kt
+5
-3
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendFriendMessagePacket.kt
...ai/network/packet/action/ClientSendFriendMessagePacket.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendGroupMessagePacket.kt
...rai/network/packet/action/ClientSendGroupMessagePacket.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
.../net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
+4
-2
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ClientChangeOnlineStatusPacket.kt
...ai/network/packet/login/ClientChangeOnlineStatusPacket.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ClientLogin.kt
.../java/net/mamoe/mirai/network/packet/login/ClientLogin.kt
+10
-10
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ServerLoginResponseKeyExchangePacket.kt
...work/packet/login/ServerLoginResponseKeyExchangePacket.kt
+4
-4
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ServerLoginResponsePasswordVerifiedPacket.kt
...packet/login/ServerLoginResponsePasswordVerifiedPacket.kt
+6
-4
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ServerLoginResponseVerificationCodeInitPacket.kt
...et/login/ServerLoginResponseVerificationCodeInitPacket.kt
+6
-4
mirai-core/src/main/java/net/mamoe/mirai/utils/TEA.kt
mirai-core/src/main/java/net/mamoe/mirai/utils/TEA.kt
+205
-213
mirai-core/src/main/java/net/mamoe/mirai/utils/Tested.kt
mirai-core/src/main/java/net/mamoe/mirai/utils/Tested.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/utils/Utils.kt
mirai-core/src/main/java/net/mamoe/mirai/utils/Utils.kt
+13
-11
mirai-core/src/main/java/net/mamoe/mirai/utils/Varint.kt
mirai-core/src/main/java/net/mamoe/mirai/utils/Varint.kt
+7
-6
mirai-core/src/test/java/PacketTest.kt
mirai-core/src/test/java/PacketTest.kt
+0
-47
No files found.
mirai-core/src/main/java/net/mamoe/mirai/network/BotNetworkHandlerImpl.kt
View file @
37fa8055
...
@@ -185,7 +185,7 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
...
@@ -185,7 +185,7 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
* Not async
* Not async
*/
*/
@Synchronized
@Synchronized
@ExperimentalUnsignedTypes
override
fun
sendPacket
(
packet
:
ClientPacket
)
{
override
fun
sendPacket
(
packet
:
ClientPacket
)
{
checkNotNull
(
socket
)
{
"network closed"
}
checkNotNull
(
socket
)
{
"network closed"
}
if
(
socket
!!
.
isClosed
)
{
if
(
socket
!!
.
isClosed
)
{
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.network
package
net.mamoe.mirai.network
import
java.net.InetAddress
import
java.net.InetAddress
...
@@ -72,7 +74,7 @@ object Protocol {
...
@@ -72,7 +74,7 @@ object Protocol {
private
val
hexToByteArrayCacheMap
:
MutableMap
<
Int
,
ByteArray
>
=
mutableMapOf
()
private
val
hexToByteArrayCacheMap
:
MutableMap
<
Int
,
ByteArray
>
=
mutableMapOf
()
@ExperimentalUnsignedTypes
fun
hexToBytes
(
hex
:
String
):
ByteArray
{
fun
hexToBytes
(
hex
:
String
):
ByteArray
{
hex
.
hashCode
().
let
{
id
->
hex
.
hashCode
().
let
{
id
->
if
(
hexToByteArrayCacheMap
.
containsKey
(
id
))
{
if
(
hexToByteArrayCacheMap
.
containsKey
(
id
))
{
...
@@ -86,7 +88,7 @@ object Protocol {
...
@@ -86,7 +88,7 @@ object Protocol {
}
}
}
}
@ExperimentalUnsignedTypes
fun
hexToUBytes
(
hex
:
String
):
UByteArray
=
Arrays
fun
hexToUBytes
(
hex
:
String
):
UByteArray
=
Arrays
.
stream
(
hex
.
split
(
" "
.
toRegex
()).
dropLastWhile
{
it
.
isEmpty
()
}.
toTypedArray
())
.
stream
(
hex
.
split
(
" "
.
toRegex
()).
dropLastWhile
{
it
.
isEmpty
()
}.
toTypedArray
())
.
map
{
value
->
value
.
trim
{
it
<=
' '
}
}
.
map
{
value
->
value
.
trim
{
it
<=
' '
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/handler/ActionPacketHandler.kt
View file @
37fa8055
...
@@ -31,7 +31,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -31,7 +31,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
private
var
sKeyRefresherFuture
:
ScheduledFuture
<
*
>?
=
null
private
var
sKeyRefresherFuture
:
ScheduledFuture
<
*
>?
=
null
@ExperimentalUnsignedTypes
override
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
override
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
when
(
packet
)
{
when
(
packet
)
{
is
ServerCanAddFriendResponsePacket
->
{
is
ServerCanAddFriendResponsePacket
->
{
...
@@ -74,12 +74,12 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -74,12 +74,12 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
}
}
}
}
@ExperimentalUnsignedTypes
fun
addFriend
(
qqNumber
:
Long
,
message
:
Supplier
<
String
>)
{
fun
addFriend
(
qqNumber
:
Long
,
message
:
Supplier
<
String
>)
{
addFriend
(
qqNumber
,
lazy
{
message
.
get
()
})
addFriend
(
qqNumber
,
lazy
{
message
.
get
()
})
}
}
@ExperimentalUnsignedTypes
@JvmSynthetic
@JvmSynthetic
fun
addFriend
(
qqNumber
:
Long
,
message
:
Lazy
<
String
>
=
lazyOf
(
""
)):
CompletableFuture
<
AddFriendResult
>
{
fun
addFriend
(
qqNumber
:
Long
,
message
:
Lazy
<
String
>
=
lazyOf
(
""
)):
CompletableFuture
<
AddFriendResult
>
{
val
future
=
CompletableFuture
<
AddFriendResult
>()
val
future
=
CompletableFuture
<
AddFriendResult
>()
...
@@ -89,12 +89,12 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -89,12 +89,12 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
return
future
return
future
}
}
@ExperimentalUnsignedTypes
fun
requestSKey
()
{
fun
requestSKey
()
{
session
.
socket
.
sendPacket
(
ClientSKeyRequestPacket
(
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
))
session
.
socket
.
sendPacket
(
ClientSKeyRequestPacket
(
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
))
}
}
@ExperimentalUnsignedTypes
fun
requestAccountInfo
()
{
fun
requestAccountInfo
()
{
session
.
socket
.
sendPacket
(
ClientAccountInfoRequestPacket
(
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
))
session
.
socket
.
sendPacket
(
ClientAccountInfoRequestPacket
(
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
))
}
}
...
@@ -111,7 +111,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -111,7 +111,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
)
:
Closeable
{
)
:
Closeable
{
lateinit
var
id
:
ByteArray
lateinit
var
id
:
ByteArray
@ExperimentalUnsignedTypes
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
if
(!
::
id
.
isInitialized
)
{
if
(!
::
id
.
isInitialized
)
{
return
return
...
@@ -164,7 +164,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -164,7 +164,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
)
:
Closeable
{
)
:
Closeable
{
lateinit
var
id
:
ByteArray
lateinit
var
id
:
ByteArray
@ExperimentalUnsignedTypes
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
if
(!
::
id
.
isInitialized
)
{
if
(!
::
id
.
isInitialized
)
{
return
return
...
@@ -201,7 +201,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -201,7 +201,7 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
}
}
}
}
@ExperimentalUnsignedTypes
fun
sendAddRequest
()
{
fun
sendAddRequest
()
{
session
.
socket
.
sendPacket
(
ClientCanAddFriendPacket
(
session
.
bot
.
account
.
qqNumber
,
qq
,
session
.
sessionKey
).
also
{
this
.
id
=
it
.
packetIdLast
})
session
.
socket
.
sendPacket
(
ClientCanAddFriendPacket
(
session
.
bot
.
account
.
qqNumber
,
qq
,
session
.
sessionKey
).
also
{
this
.
id
=
it
.
packetIdLast
})
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/handler/DataPacketSocket.kt
View file @
37fa8055
...
@@ -16,7 +16,7 @@ interface DataPacketSocket : Closeable {
...
@@ -16,7 +16,7 @@ interface DataPacketSocket : Closeable {
fun
distributePacket
(
packet
:
ServerPacket
)
fun
distributePacket
(
packet
:
ServerPacket
)
@ExperimentalUnsignedTypes
fun
sendPacket
(
packet
:
ClientPacket
)
fun
sendPacket
(
packet
:
ClientPacket
)
fun
isClosed
():
Boolean
fun
isClosed
():
Boolean
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/handler/MessagePacketHandler.kt
View file @
37fa8055
...
@@ -74,7 +74,7 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -74,7 +74,7 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
session
.
socket
.
sendPacket
(
ClientSendFriendMessagePacket
(
session
.
bot
.
account
.
qqNumber
,
qq
.
number
,
session
.
sessionKey
,
message
))
session
.
socket
.
sendPacket
(
ClientSendFriendMessagePacket
(
session
.
bot
.
account
.
qqNumber
,
qq
.
number
,
session
.
sessionKey
,
message
))
}
}
fun
sendGroupMessage
(
group
:
Group
,
message
:
Message
)
:
Unit
{
fun
sendGroupMessage
(
group
:
Group
,
message
:
Message
)
{
TODO
()
TODO
()
//sendPacket(ClientSendGroupMessagePacket(group.groupId, bot.account.qqNumber, sessionKey, message))
//sendPacket(ClientSendGroupMessagePacket(group.groupId, bot.account.qqNumber, sessionKey, message))
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ClientPacket.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
,
"EXPERIMENTAL_UNSIGNED_LITERALS"
)
package
net.mamoe.mirai.network.packet
package
net.mamoe.mirai.network.packet
import
lombok.Getter
import
lombok.Getter
...
@@ -12,12 +14,12 @@ import java.security.MessageDigest
...
@@ -12,12 +14,12 @@ import java.security.MessageDigest
/**
/**
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
abstract
class
ClientPacket
:
ByteArrayDataOutputStream
(),
Packet
{
abstract
class
ClientPacket
:
ByteArrayDataOutputStream
(),
Packet
{
@Getter
@Getter
val
idHex
:
String
val
idHex
:
String
var
encoded
:
Boolean
=
false
private
var
encoded
:
Boolean
=
false
init
{
init
{
val
annotation
=
this
.
javaClass
.
getAnnotation
(
PacketId
::
class
.
java
)
val
annotation
=
this
.
javaClass
.
getAnnotation
(
PacketId
::
class
.
java
)
...
@@ -84,7 +86,6 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
...
@@ -84,7 +86,6 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeIP
(
ip
:
String
)
{
fun
DataOutputStream
.
writeIP
(
ip
:
String
)
{
for
(
s
in
ip
.
trim
().
split
(
"\\."
.
toRegex
()).
dropLastWhile
{
it
.
isEmpty
()
}.
toTypedArray
())
{
for
(
s
in
ip
.
trim
().
split
(
"\\."
.
toRegex
()).
dropLastWhile
{
it
.
isEmpty
()
}.
toTypedArray
())
{
...
@@ -97,10 +98,9 @@ fun DataOutputStream.writeTime() {
...
@@ -97,10 +98,9 @@ fun DataOutputStream.writeTime() {
this
.
writeInt
(
System
.
currentTimeMillis
().
toInt
())
this
.
writeInt
(
System
.
currentTimeMillis
().
toInt
())
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeHex
(
h
ex
:
String
)
{
fun
DataOutputStream
.
writeHex
(
uH
ex
:
String
)
{
for
(
s
in
h
ex
.
trim
().
split
(
" "
.
toRegex
()).
dropLastWhile
{
it
.
isEmpty
()
}.
toTypedArray
())
{
for
(
s
in
uH
ex
.
trim
().
split
(
" "
.
toRegex
()).
dropLastWhile
{
it
.
isEmpty
()
}.
toTypedArray
())
{
if
(
s
.
isEmpty
())
{
if
(
s
.
isEmpty
())
{
continue
continue
}
}
...
@@ -116,12 +116,10 @@ fun DataOutputStream.encryptAndWrite(key: ByteArray, encoder: (ByteArrayDataOutp
...
@@ -116,12 +116,10 @@ fun DataOutputStream.encryptAndWrite(key: ByteArray, encoder: (ByteArrayDataOutp
this
.
write
(
TEA
.
encrypt
(
ByteArrayDataOutputStream
().
also
(
encoder
).
toByteArray
(),
key
))
this
.
write
(
TEA
.
encrypt
(
ByteArrayDataOutputStream
().
also
(
encoder
).
toByteArray
(),
key
))
}
}
@ExperimentalUnsignedTypes
fun
DataOutputStream
.
encryptAndWrite
(
keyHex
:
String
,
encoder
:
(
ByteArrayDataOutputStream
)
->
Unit
)
{
fun
DataOutputStream
.
encryptAndWrite
(
keyHex
:
String
,
encoder
:
(
ByteArrayDataOutputStream
)
->
Unit
)
{
this
.
encryptAndWrite
(
keyHex
.
hexToBytes
(),
encoder
)
this
.
encryptAndWrite
(
keyHex
.
hexToBytes
(),
encoder
)
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeTLV0006
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
)
{
fun
DataOutputStream
.
writeTLV0006
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
)
{
ByteArrayDataOutputStream
().
let
{
ByteArrayDataOutputStream
().
let
{
...
@@ -146,12 +144,10 @@ fun DataOutputStream.writeTLV0006(qq: Long, password: String, loginTime: Int, lo
...
@@ -146,12 +144,10 @@ fun DataOutputStream.writeTLV0006(qq: Long, password: String, loginTime: Int, lo
}
}
}
}
@ExperimentalUnsignedTypes
@Tested
@TestedSuccessfully
fun
DataOutputStream
.
writeCRC32
()
=
writeCRC32
(
getRandomByteArray
(
16
))
fun
DataOutputStream
.
writeCRC32
()
=
writeCRC32
(
getRandomByteArray
(
16
))
@ExperimentalUnsignedTypes
fun
DataOutputStream
.
writeCRC32
(
key
:
ByteArray
)
{
fun
DataOutputStream
.
writeCRC32
(
key
:
ByteArray
)
{
key
.
let
{
key
.
let
{
write
(
it
)
//key
write
(
it
)
//key
...
@@ -159,8 +155,8 @@ fun DataOutputStream.writeCRC32(key: ByteArray) {
...
@@ -159,8 +155,8 @@ fun DataOutputStream.writeCRC32(key: ByteArray) {
}
}
}
}
@ExperimentalUnsignedTypes
@Tested
Successfully
@Tested
fun
DataOutputStream
.
writeDeviceName
(
random
:
Boolean
=
false
)
{
fun
DataOutputStream
.
writeDeviceName
(
random
:
Boolean
=
false
)
{
val
deviceName
:
String
=
if
(
random
)
{
val
deviceName
:
String
=
if
(
random
)
{
String
(
getRandomByteArray
(
10
))
String
(
getRandomByteArray
(
10
))
...
@@ -185,7 +181,7 @@ fun Int.toByteArray(): ByteArray = byteArrayOf(
...
@@ -185,7 +181,7 @@ fun Int.toByteArray(): ByteArray = byteArrayOf(
/**
/**
* 255u -> 00 00 00 FF
* 255u -> 00 00 00 FF
*/
*/
@ExperimentalUnsignedTypes
fun
UInt
.
toByteArray
():
ByteArray
=
byteArrayOf
(
fun
UInt
.
toByteArray
():
ByteArray
=
byteArrayOf
(
(
this
.
shr
(
24
)
and
255
u
).
toByte
(),
(
this
.
shr
(
24
)
and
255
u
).
toByte
(),
(
this
.
shr
(
16
)
and
255
u
).
toByte
(),
(
this
.
shr
(
16
)
and
255
u
).
toByte
(),
...
@@ -193,24 +189,14 @@ fun UInt.toByteArray(): ByteArray = byteArrayOf(
...
@@ -193,24 +189,14 @@ fun UInt.toByteArray(): ByteArray = byteArrayOf(
(
this
.
shr
(
0
)
and
255
u
).
toByte
()
(
this
.
shr
(
0
)
and
255
u
).
toByte
()
)
)
/**
* 255 -> FF 00 00 00
*/
fun
Int
.
toLByteArray
():
ByteArray
=
byteArrayOf
(
(
this
.
ushr
(
0
)
and
0
xFF
).
toByte
(),
(
this
.
ushr
(
8
)
and
0
xFF
).
toByte
(),
(
this
.
ushr
(
16
)
and
0
xFF
).
toByte
(),
(
this
.
ushr
(
24
)
and
0
xFF
).
toByte
()
)
@ExperimentalUnsignedTypes
fun
Int
.
toUHexString
(
separator
:
String
=
" "
):
String
=
this
.
toByteArray
().
toUHexString
(
separator
)
fun
Int
.
toUHexString
(
separator
:
String
=
" "
):
String
=
this
.
toByteArray
().
toUHexString
(
separator
)
internal
fun
md5
(
str
:
String
):
ByteArray
=
MessageDigest
.
getInstance
(
"MD5"
).
digest
(
str
.
toByteArray
())
internal
fun
md5
(
str
:
String
):
ByteArray
=
MessageDigest
.
getInstance
(
"MD5"
).
digest
(
str
.
toByteArray
())
internal
fun
md5
(
byteArray
:
ByteArray
):
ByteArray
=
MessageDigest
.
getInstance
(
"MD5"
).
digest
(
byteArray
)
internal
fun
md5
(
byteArray
:
ByteArray
):
ByteArray
=
MessageDigest
.
getInstance
(
"MD5"
).
digest
(
byteArray
)
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeZero
(
count
:
Int
)
{
fun
DataOutputStream
.
writeZero
(
count
:
Int
)
{
repeat
(
count
)
{
repeat
(
count
)
{
...
@@ -225,13 +211,13 @@ fun DataOutputStream.writeRandom(length: Int) {
...
@@ -225,13 +211,13 @@ fun DataOutputStream.writeRandom(length: Int) {
}
}
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeQQ
(
qq
:
Long
)
{
fun
DataOutputStream
.
writeQQ
(
qq
:
Long
)
{
this
.
write
(
qq
.
toUInt
().
toByteArray
())
this
.
write
(
qq
.
toUInt
().
toByteArray
())
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeGroup
(
groupIdOrGroupNumber
:
Long
)
{
fun
DataOutputStream
.
writeGroup
(
groupIdOrGroupNumber
:
Long
)
{
this
.
write
(
groupIdOrGroupNumber
.
toUInt
().
toByteArray
())
this
.
write
(
groupIdOrGroupNumber
.
toUInt
().
toByteArray
())
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/GradeInfo.kt
View file @
37fa8055
...
@@ -9,7 +9,7 @@ import java.io.DataInputStream
...
@@ -9,7 +9,7 @@ import java.io.DataInputStream
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 5C"
)
@PacketId
(
"00 5C"
)
class
ClientAccountInfoRequestPacket
(
class
ClientAccountInfoRequestPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Heartbeat.kt
View file @
37fa8055
...
@@ -7,7 +7,7 @@ import java.io.IOException
...
@@ -7,7 +7,7 @@ import java.io.IOException
/**
/**
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 58"
)
@PacketId
(
"00 58"
)
class
ClientHeartbeatPacket
(
class
ClientHeartbeatPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/SKey.kt
View file @
37fa8055
...
@@ -10,7 +10,7 @@ import java.io.DataInputStream
...
@@ -10,7 +10,7 @@ import java.io.DataInputStream
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 1D"
)
@PacketId
(
"00 1D"
)
class
ClientSKeyRequestPacket
(
class
ClientSKeyRequestPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
@@ -31,7 +31,7 @@ class ClientSKeyRequestPacket(
...
@@ -31,7 +31,7 @@ class ClientSKeyRequestPacket(
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"00 1D"
)
@PacketId
(
"00 1D"
)
@ExperimentalUnsignedTypes
class
ClientSKeyRefreshmentRequestPacket
(
class
ClientSKeyRefreshmentRequestPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
private
val
sessionKey
:
ByteArray
private
val
sessionKey
:
ByteArray
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.network.packet
package
net.mamoe.mirai.network.packet
import
net.mamoe.mirai.message.FaceID
import
net.mamoe.mirai.message.FaceID
...
@@ -22,7 +24,7 @@ import java.util.zip.GZIPInputStream
...
@@ -22,7 +24,7 @@ import java.util.zip.GZIPInputStream
abstract
class
ServerEventPacket
(
input
:
DataInputStream
,
val
packetId
:
ByteArray
,
val
eventIdentity
:
ByteArray
)
:
ServerPacket
(
input
)
{
abstract
class
ServerEventPacket
(
input
:
DataInputStream
,
val
packetId
:
ByteArray
,
val
eventIdentity
:
ByteArray
)
:
ServerPacket
(
input
)
{
@PacketId
(
"00 17"
)
@PacketId
(
"00 17"
)
class
Raw
(
input
:
DataInputStream
,
private
val
packetId
:
ByteArray
)
:
ServerPacket
(
input
)
{
class
Raw
(
input
:
DataInputStream
,
private
val
packetId
:
ByteArray
)
:
ServerPacket
(
input
)
{
@ExperimentalUnsignedTypes
fun
distribute
():
ServerEventPacket
{
fun
distribute
():
ServerEventPacket
{
val
eventIdentity
=
this
.
input
.
readNBytes
(
16
)
val
eventIdentity
=
this
.
input
.
readNBytes
(
16
)
val
type
=
this
.
input
.
goto
(
18
).
readNBytes
(
2
)
val
type
=
this
.
input
.
goto
(
18
).
readNBytes
(
2
)
...
@@ -80,6 +82,7 @@ class ServerGroupUploadFileEventPacket(input: DataInputStream, packetId: ByteArr
...
@@ -80,6 +82,7 @@ class ServerGroupUploadFileEventPacket(input: DataInputStream, packetId: ByteArr
}
//todo test
}
//todo test
}
}
@Suppress
(
"EXPERIMENTAL_API_USAGE"
)
class
ServerGroupMessageEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
{
class
ServerGroupMessageEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
{
var
groupNumber
:
Long
=
0
var
groupNumber
:
Long
=
0
var
qq
:
Long
=
0
var
qq
:
Long
=
0
...
@@ -100,16 +103,16 @@ class ServerGroupMessageEventPacket(input: DataInputStream, packetId: ByteArray,
...
@@ -100,16 +103,16 @@ class ServerGroupMessageEventPacket(input: DataInputStream, packetId: ByteArray,
OTHER
,
OTHER
,
}
}
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
groupNumber
=
this
.
input
.
goto
(
51
).
readInt
().
toLong
()
groupNumber
=
this
.
input
.
goto
(
51
).
readInt
().
toLong
()
qq
=
this
.
input
.
goto
(
56
).
readLong
()
.
toUInt
().
toLong
()
qq
=
this
.
input
.
goto
(
56
).
readLong
()
val
fontLength
=
this
.
input
.
goto
(
108
).
readShort
()
val
fontLength
=
this
.
input
.
goto
(
108
).
readShort
()
//println(this.input.goto(110 + fontLength).readNBytesAt(2).toUHexString())//always 00 00
//println(this.input.goto(110 + fontLength).readNBytesAt(2).toUHexString())//always 00 00
messageType
=
when
(
val
id
=
this
.
input
.
goto
(
110
+
fontLength
+
2
).
readByte
().
toInt
())
{
messageType
=
when
(
val
id
=
this
.
input
.
goto
(
110
+
fontLength
+
2
).
readByte
().
toInt
())
{
0
x13
->
MessageType
.
NORMAL
0
x13
->
MessageType
.
NORMAL
0
xE
->
MessageType
.
XML
0
x
0
E
->
MessageType
.
XML
0
x06
->
MessageType
.
AT
0
x06
->
MessageType
.
AT
...
@@ -188,7 +191,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray
...
@@ -188,7 +191,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray
var
qq
:
Long
=
0
var
qq
:
Long
=
0
lateinit
var
message
:
MessageChain
lateinit
var
message
:
MessageChain
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
input
.
goto
(
0
)
input
.
goto
(
0
)
println
()
println
()
...
@@ -291,7 +294,7 @@ B1 89 BE 09 8F 00 1A E5 00 0B 03 A2 09 90 BB 7A 1F 40 00 A6 00 00 00 20 00 05 00
...
@@ -291,7 +294,7 @@ B1 89 BE 09 8F 00 1A E5 00 0B 03 A2 09 90 BB 7A 1F 40 00 A6 00 00 00 20 00 05 00
* 告知服务器已经收到数据
* 告知服务器已经收到数据
*/
*/
@PacketId
(
""
)
//随后写入
@PacketId
(
""
)
//随后写入
@ExperimentalUnsignedTypes
class
ClientMessageResponsePacket
(
class
ClientMessageResponsePacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
private
val
packetIdFromServer
:
ByteArray
,
//4bytes
private
val
packetIdFromServer
:
ByteArray
,
//4bytes
...
@@ -329,7 +332,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray
...
@@ -329,7 +332,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray
lateinit var message: String
lateinit var message: String
@ExperimentalUnsignedTypes
override fun decode() {
override fun decode() {
//start at Sep1.0:27
//start at Sep1.0:27
qq = input.readIntAt(0)
qq = input.readIntAt(0)
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Session.kt
View file @
37fa8055
...
@@ -2,7 +2,6 @@ package net.mamoe.mirai.network.packet
...
@@ -2,7 +2,6 @@ package net.mamoe.mirai.network.packet
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.getRandomByteArray
import
net.mamoe.mirai.utils.lazyEncode
import
net.mamoe.mirai.utils.lazyEncode
import
java.io.DataInputStream
import
java.io.DataInputStream
import
java.net.InetAddress
import
java.net.InetAddress
...
@@ -10,7 +9,7 @@ import java.net.InetAddress
...
@@ -10,7 +9,7 @@ import java.net.InetAddress
/**
/**
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"08 28 04 34"
)
@PacketId
(
"08 28 04 34"
)
class
ClientSessionRequestPacket
(
class
ClientSessionRequestPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
@@ -48,12 +47,12 @@ class ClientSessionRequestPacket(
...
@@ -48,12 +47,12 @@ class ClientSessionRequestPacket(
it
.
writeHex
(
"01 0B 00 85 00 02"
)
it
.
writeHex
(
"01 0B 00 85 00 02"
)
it
.
writeHex
(
"B9 ED EF D7 CD E5 47 96 7A B5 28 34 CA 93 6B 5C"
)
//fix2
it
.
writeHex
(
"B9 ED EF D7 CD E5 47 96 7A B5 28 34 CA 93 6B 5C"
)
//fix2
it
.
write
(
getRandomByteArray
(
1
)
)
it
.
write
Random
(
1
)
it
.
writeHex
(
"10 00 00 00 00 00 00 00 02"
)
it
.
writeHex
(
"10 00 00 00 00 00 00 00 02"
)
//fix3
//fix3
it
.
writeHex
(
"00 63 3E 00 63 02 04 03 06 02 00 04 00 52 D9 00 00 00 00 A9 58 3E 6D 6D 49 AA F6 A6 D9 33 0A E7 7E 36 84 03 01 00 00 68 20 15 8B 00 00 01 02 00 00 03 00 07 DF 00 0A 00 0C 00 01 00 04 00 03 00 04 20 5C 00"
)
it
.
writeHex
(
"00 63 3E 00 63 02 04 03 06 02 00 04 00 52 D9 00 00 00 00 A9 58 3E 6D 6D 49 AA F6 A6 D9 33 0A E7 7E 36 84 03 01 00 00 68 20 15 8B 00 00 01 02 00 00 03 00 07 DF 00 0A 00 0C 00 01 00 04 00 03 00 04 20 5C 00"
)
it
.
write
(
getRandomByteArray
(
32
)
)
//md5 32
it
.
write
Random
(
32
)
//md5 32
it
.
writeHex
(
"68"
)
it
.
writeHex
(
"68"
)
it
.
writeHex
(
"00 00 00 00 00 2D 00 06 00 01"
)
it
.
writeHex
(
"00 00 00 00 00 2D 00 06 00 01"
)
...
@@ -70,7 +69,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d
...
@@ -70,7 +69,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d
lateinit
var
sessionKey
:
ByteArray
lateinit
var
sessionKey
:
ByteArray
lateinit
var
tlv0105
:
ByteArray
lateinit
var
tlv0105
:
ByteArray
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
when
(
dataLength
)
{
when
(
dataLength
)
{
407
->
{
407
->
{
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Touch.kt
View file @
37fa8055
package
net.mamoe.mirai.network.packet
package
net.mamoe.mirai.network.packet
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.login.ClientPasswordSubmissionPacket
import
net.mamoe.mirai.utils.ByteArrayDataOutputStream
import
net.mamoe.mirai.utils.ByteArrayDataOutputStream
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.hexToBytes
import
net.mamoe.mirai.utils.hexToBytes
...
@@ -11,11 +12,12 @@ import java.io.IOException
...
@@ -11,11 +12,12 @@ import java.io.IOException
/**
/**
* A packet received when logging in, used to redirect server address
* A packet received when logging in, used to redirect server address
*
*
* @see
net.mamoe.mirai.network.packet.client.login.
ClientServerRedirectionPacket
* @see ClientServerRedirectionPacket
* @see
net.mamoe.mirai.network.packet.client.login.
ClientPasswordSubmissionPacket
* @see ClientPasswordSubmissionPacket
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@Suppress
(
"EXPERIMENTAL_API_USAGE"
)
@PacketId
(
"08 25 31 01"
)
@PacketId
(
"08 25 31 01"
)
class
ServerTouchResponsePacket
(
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
class
ServerTouchResponsePacket
(
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
var
serverIP
:
String
?
=
null
var
serverIP
:
String
?
=
null
...
@@ -29,9 +31,9 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
...
@@ -29,9 +31,9 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
TYPE_08_25_31_02
,
TYPE_08_25_31_02
,
}
}
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
when
(
val
id
=
input
.
readByte
().
to
UByte
().
to
Int
())
{
when
(
val
id
=
input
.
readByte
().
toInt
())
{
0
xFE
->
{
0
xFE
->
{
input
.
skip
(
94
)
input
.
skip
(
94
)
serverIP
=
input
.
readIP
()
serverIP
=
input
.
readIP
()
...
@@ -52,7 +54,7 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
...
@@ -52,7 +54,7 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
}
}
class
Encrypted
(
private
val
type
:
Type
,
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
class
Encrypted
(
private
val
type
:
Type
,
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
@ExperimentalUnsignedTypes
fun
decrypt
():
ServerTouchResponsePacket
=
ServerTouchResponsePacket
(
decryptBy
(
when
(
type
)
{
fun
decrypt
():
ServerTouchResponsePacket
=
ServerTouchResponsePacket
(
decryptBy
(
when
(
type
)
{
Type
.
TYPE_08_25_31_02
->
Protocol
.
redirectionKey
.
hexToBytes
()
Type
.
TYPE_08_25_31_02
->
Protocol
.
redirectionKey
.
hexToBytes
()
Type
.
TYPE_08_25_31_01
->
Protocol
.
key0825
.
hexToBytes
()
Type
.
TYPE_08_25_31_01
->
Protocol
.
key0825
.
hexToBytes
()
...
@@ -65,10 +67,10 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
...
@@ -65,10 +67,10 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"08 25 31 01"
)
@PacketId
(
"08 25 31 01"
)
class
ClientTouchPacket
(
private
val
qq
:
Long
,
private
val
serverIp
:
String
)
:
ClientPacket
()
{
class
ClientTouchPacket
(
private
val
qq
:
Long
,
private
val
serverIp
:
String
)
:
ClientPacket
()
{
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
override
fun
encode
()
{
override
fun
encode
()
{
this
.
writeQQ
(
qq
)
this
.
writeQQ
(
qq
)
...
@@ -80,7 +82,7 @@ class ClientTouchPacket(private val qq: Long, private val serverIp: String) : Cl
...
@@ -80,7 +82,7 @@ class ClientTouchPacket(private val qq: Long, private val serverIp: String) : Cl
it
.
writeHex
(
Protocol
.
constantData2
)
it
.
writeHex
(
Protocol
.
constantData2
)
it
.
writeQQ
(
qq
)
it
.
writeQQ
(
qq
)
it
.
writeHex
(
"00 00 00 00 03 09 00 08 00 01"
)
it
.
writeHex
(
"00 00 00 00 03 09 00 08 00 01"
)
it
.
writeIP
(
serverIp
)
;
it
.
writeIP
(
serverIp
)
it
.
writeHex
(
"00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19"
)
it
.
writeHex
(
"00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19"
)
it
.
writeHex
(
Protocol
.
publicKey
)
it
.
writeHex
(
Protocol
.
publicKey
)
}
}
...
@@ -92,10 +94,10 @@ class ClientTouchPacket(private val qq: Long, private val serverIp: String) : Cl
...
@@ -92,10 +94,10 @@ class ClientTouchPacket(private val qq: Long, private val serverIp: String) : Cl
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"08 25 31 02"
)
@PacketId
(
"08 25 31 02"
)
class
ClientServerRedirectionPacket
(
private
val
serverIP
:
String
,
private
val
qq
:
Long
)
:
ClientPacket
()
{
class
ClientServerRedirectionPacket
(
private
val
serverIP
:
String
,
private
val
qq
:
Long
)
:
ClientPacket
()
{
@ExperimentalUnsignedTypes
override
fun
encode
()
{
override
fun
encode
()
{
this
.
writeQQ
(
qq
)
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
fixVer
)
this
.
writeHex
(
Protocol
.
fixVer
)
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/VerificationCode.kt
View file @
37fa8055
...
@@ -2,14 +2,14 @@ package net.mamoe.mirai.network.packet
...
@@ -2,14 +2,14 @@ package net.mamoe.mirai.network.packet
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.Tested
Successfully
import
net.mamoe.mirai.utils.Tested
import
net.mamoe.mirai.utils.hexToBytes
import
net.mamoe.mirai.utils.hexToBytes
import
java.io.DataInputStream
import
java.io.DataInputStream
/**
/**
* 客户端请求验证码图片数据的第几部分
* 客户端请求验证码图片数据的第几部分
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 BA 31"
)
@PacketId
(
"00 BA 31"
)
class
ClientVerificationCodeTransmissionRequestPacket
(
class
ClientVerificationCodeTransmissionRequestPacket
(
private
val
packetId
:
Int
,
private
val
packetId
:
Int
,
...
@@ -18,7 +18,7 @@ class ClientVerificationCodeTransmissionRequestPacket(
...
@@ -18,7 +18,7 @@ class ClientVerificationCodeTransmissionRequestPacket(
private
val
verificationSequence
:
Int
,
private
val
verificationSequence
:
Int
,
private
val
token00BA
:
ByteArray
private
val
token00BA
:
ByteArray
)
:
ClientPacket
()
{
)
:
ClientPacket
()
{
@Tested
Successfully
@Tested
override
fun
encode
()
{
override
fun
encode
()
{
this
.
writeByte
(
packetId
)
//part of packet id
this
.
writeByte
(
packetId
)
//part of packet id
...
@@ -46,7 +46,7 @@ class ClientVerificationCodeTransmissionRequestPacket(
...
@@ -46,7 +46,7 @@ class ClientVerificationCodeTransmissionRequestPacket(
* 提交验证码
* 提交验证码
*/
*/
@PacketId
(
"00 BA 32"
)
@PacketId
(
"00 BA 32"
)
@ExperimentalUnsignedTypes
class
ClientVerificationCodeSubmitPacket
(
class
ClientVerificationCodeSubmitPacket
(
private
val
packetIdLast
:
Int
,
private
val
packetIdLast
:
Int
,
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
@@ -93,7 +93,7 @@ class ClientVerificationCodeSubmitPacket(
...
@@ -93,7 +93,7 @@ class ClientVerificationCodeSubmitPacket(
* 刷新验证码
* 刷新验证码
*/
*/
@PacketId
(
"00 BA 31"
)
@PacketId
(
"00 BA 31"
)
@ExperimentalUnsignedTypes
class
ClientVerificationCodeRefreshPacket
(
class
ClientVerificationCodeRefreshPacket
(
private
val
packetIdLast
:
Int
,
private
val
packetIdLast
:
Int
,
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
@@ -142,7 +142,7 @@ open class ServerVerificationCodeTransmissionPacket(input: DataInputStream, priv
...
@@ -142,7 +142,7 @@ open class ServerVerificationCodeTransmissionPacket(input: DataInputStream, priv
lateinit
var
token00BA
:
ByteArray
//40 bytes
lateinit
var
token00BA
:
ByteArray
//40 bytes
var
packetIdLast
:
Int
=
0
var
packetIdLast
:
Int
=
0
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
this
.
verificationToken
=
this
.
input
.
readNBytesAt
(
10
,
56
)
this
.
verificationToken
=
this
.
input
.
readNBytesAt
(
10
,
56
)
...
@@ -181,7 +181,7 @@ class ServerVerificationCodeCorrectPacket(input: DataInputStream) : ServerVerifi
...
@@ -181,7 +181,7 @@ class ServerVerificationCodeCorrectPacket(input: DataInputStream) : ServerVerifi
lateinit
var
token00BA
:
ByteArray
//56 bytes
lateinit
var
token00BA
:
ByteArray
//56 bytes
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
token00BA
=
this
.
input
.
readNBytesAt
(
10
,
56
)
token00BA
=
this
.
input
.
readNBytesAt
(
10
,
56
)
}
}
...
@@ -191,7 +191,7 @@ abstract class ServerVerificationCodePacket(input: DataInputStream) : ServerPack
...
@@ -191,7 +191,7 @@ abstract class ServerVerificationCodePacket(input: DataInputStream) : ServerPack
@PacketId
(
"00 BA"
)
@PacketId
(
"00 BA"
)
class
Encrypted
(
input
:
DataInputStream
,
private
val
id
:
String
)
:
ServerPacket
(
input
)
{
class
Encrypted
(
input
:
DataInputStream
,
private
val
id
:
String
)
:
ServerPacket
(
input
)
{
@ExperimentalUnsignedTypes
fun
decrypt
():
ServerVerificationCodePacket
{
fun
decrypt
():
ServerVerificationCodePacket
{
this
.
input
goto
14
this
.
input
goto
14
val
data
=
TEA
.
decrypt
(
this
.
input
.
readAllBytes
().
cutTail
(
1
),
Protocol
.
key00BA
.
hexToBytes
())
val
data
=
TEA
.
decrypt
(
this
.
input
.
readAllBytes
().
cutTail
(
1
),
Protocol
.
key00BA
.
hexToBytes
())
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/AddContact.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
,
"EXPERIMENTAL_UNSIGNED_LITERALS"
)
package
net.mamoe.mirai.network.packet.action
package
net.mamoe.mirai.network.packet.action
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
...
@@ -13,7 +15,7 @@ import java.util.*
...
@@ -13,7 +15,7 @@ import java.util.*
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"00 A7"
)
@PacketId
(
"00 A7"
)
@ExperimentalUnsignedTypes
class
ClientCanAddFriendPacket
(
class
ClientCanAddFriendPacket
(
val
bot
:
Long
,
val
bot
:
Long
,
val
qq
:
Long
,
val
qq
:
Long
,
...
@@ -47,7 +49,7 @@ class ServerCanAddFriendResponsePacket(input: DataInputStream) : ServerPacket(in
...
@@ -47,7 +49,7 @@ class ServerCanAddFriendResponsePacket(input: DataInputStream) : ServerPacket(in
FAILED
,
FAILED
,
}
}
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
val
data
=
input
.
goto
(
0
).
readAllBytes
()
val
data
=
input
.
goto
(
0
).
readAllBytes
()
if
(
data
.
size
==
99
)
{
if
(
data
.
size
==
99
)
{
...
@@ -78,7 +80,7 @@ class ServerCanAddFriendResponsePacket(input: DataInputStream) : ServerPacket(in
...
@@ -78,7 +80,7 @@ class ServerCanAddFriendResponsePacket(input: DataInputStream) : ServerPacket(in
* 请求添加好友
* 请求添加好友
*/
*/
@PacketId
(
"00 AE"
)
@PacketId
(
"00 AE"
)
@ExperimentalUnsignedTypes
class
ClientAddFriendPacket
(
class
ClientAddFriendPacket
(
val
bot
:
Long
,
val
bot
:
Long
,
val
qq
:
Long
,
val
qq
:
Long
,
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendFriendMessagePacket.kt
View file @
37fa8055
...
@@ -10,7 +10,7 @@ import java.io.DataInputStream
...
@@ -10,7 +10,7 @@ import java.io.DataInputStream
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"00 CD"
)
@PacketId
(
"00 CD"
)
@ExperimentalUnsignedTypes
class
ClientSendFriendMessagePacket
(
class
ClientSendFriendMessagePacket
(
private
val
botQQ
:
Long
,
private
val
botQQ
:
Long
,
private
val
targetQQ
:
Long
,
private
val
targetQQ
:
Long
,
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendGroupMessagePacket.kt
View file @
37fa8055
...
@@ -9,7 +9,7 @@ import java.io.DataInputStream
...
@@ -9,7 +9,7 @@ import java.io.DataInputStream
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"00 02"
)
@PacketId
(
"00 02"
)
@ExperimentalUnsignedTypes
class
ClientSendGroupMessagePacket
(
class
ClientSendGroupMessagePacket
(
private
val
groupId
:
Long
,
//不是 number
private
val
groupId
:
Long
,
//不是 number
private
val
botQQ
:
Long
,
private
val
botQQ
:
Long
,
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
,
"EXPERIMENTAL_UNSIGNED_LITERALS"
)
package
net.mamoe.mirai.network.packet.image
package
net.mamoe.mirai.network.packet.image
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.*
...
@@ -15,7 +17,7 @@ import java.io.DataInputStream
...
@@ -15,7 +17,7 @@ import java.io.DataInputStream
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"03 88"
)
@PacketId
(
"03 88"
)
@ExperimentalUnsignedTypes
class
ClientTryGetGroupImageIDPacket
(
class
ClientTryGetGroupImageIDPacket
(
private
val
bot
:
Long
,
private
val
bot
:
Long
,
private
val
sessionKey
:
ByteArray
,
private
val
sessionKey
:
ByteArray
,
...
@@ -108,7 +110,7 @@ abstract class ServerTryUploadGroupImageResponsePacket(input: DataInputStream) :
...
@@ -108,7 +110,7 @@ abstract class ServerTryUploadGroupImageResponsePacket(input: DataInputStream) :
class
ServerTryUploadGroupImageSuccessPacket
(
input
:
DataInputStream
)
:
ServerTryUploadGroupImageResponsePacket
(
input
)
{
class
ServerTryUploadGroupImageSuccessPacket
(
input
:
DataInputStream
)
:
ServerTryUploadGroupImageResponsePacket
(
input
)
{
lateinit
var
uKey
:
ByteArray
lateinit
var
uKey
:
ByteArray
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
uKey
=
this
.
input
.
gotoWhere
(
ubyteArrayOf
(
0
x42u
,
0
x80u
,
0
x01u
)).
readNBytes
(
128
)
uKey
=
this
.
input
.
gotoWhere
(
ubyteArrayOf
(
0
x42u
,
0
x80u
,
0
x01u
)).
readNBytes
(
128
)
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ClientChangeOnlineStatusPacket.kt
View file @
37fa8055
...
@@ -9,7 +9,7 @@ import net.mamoe.mirai.utils.ClientLoginStatus
...
@@ -9,7 +9,7 @@ import net.mamoe.mirai.utils.ClientLoginStatus
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 EC"
)
@PacketId
(
"00 EC"
)
class
ClientChangeOnlineStatusPacket
(
class
ClientChangeOnlineStatusPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ClientLogin.kt
View file @
37fa8055
...
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
...
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.utils.ByteArrayDataOutputStream
import
net.mamoe.mirai.utils.ByteArrayDataOutputStream
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.Tested
Successfully
import
net.mamoe.mirai.utils.Tested
import
net.mamoe.mirai.utils.hexToBytes
import
net.mamoe.mirai.utils.hexToBytes
import
java.io.DataOutputStream
import
java.io.DataOutputStream
...
@@ -14,8 +14,8 @@ import java.io.DataOutputStream
...
@@ -14,8 +14,8 @@ import java.io.DataOutputStream
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"08 36 31 03"
)
@PacketId
(
"08 36 31 03"
)
@ExperimentalUnsignedTypes
@Tested
Successfully
@Tested
class
ClientPasswordSubmissionPacket
(
class
ClientPasswordSubmissionPacket
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
private
val
password
:
String
,
private
val
password
:
String
,
...
@@ -24,7 +24,7 @@ class ClientPasswordSubmissionPacket(
...
@@ -24,7 +24,7 @@ class ClientPasswordSubmissionPacket(
private
val
tgtgtKey
:
ByteArray
,
private
val
tgtgtKey
:
ByteArray
,
private
val
token0825
:
ByteArray
private
val
token0825
:
ByteArray
)
:
ClientPacket
()
{
)
:
ClientPacket
()
{
@ExperimentalUnsignedTypes
override
fun
encode
()
{
override
fun
encode
()
{
this
.
writeQQ
(
qq
)
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
passwordSubmissionKey1
)
this
.
writeHex
(
Protocol
.
passwordSubmissionKey1
)
...
@@ -40,21 +40,21 @@ class ClientPasswordSubmissionPacket(
...
@@ -40,21 +40,21 @@ class ClientPasswordSubmissionPacket(
}
}
@PacketId
(
"08 36 31 04"
)
@PacketId
(
"08 36 31 04"
)
@ExperimentalUnsignedTypes
class
ClientLoginResendPacket3104
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
token00BA
:
ByteArray
,
tlv0006
:
ByteArray
?
=
null
)
class
ClientLoginResendPacket3104
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
token00BA
:
ByteArray
,
tlv0006
:
ByteArray
?
=
null
)
:
ClientLoginResendPacket
(
qq
,
password
,
loginTime
,
loginIP
,
tgtgtKey
,
token0825
,
token00BA
,
tlv0006
)
:
ClientLoginResendPacket
(
qq
,
password
,
loginTime
,
loginIP
,
tgtgtKey
,
token0825
,
token00BA
,
tlv0006
)
@PacketId
(
"08 36 31 05"
)
@PacketId
(
"08 36 31 05"
)
@ExperimentalUnsignedTypes
class
ClientLoginResendPacket3105
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
token00BA
:
ByteArray
)
class
ClientLoginResendPacket3105
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
token00BA
:
ByteArray
)
:
ClientLoginResendPacket
(
qq
,
password
,
loginTime
,
loginIP
,
tgtgtKey
,
token0825
,
token00BA
,
null
)
:
ClientLoginResendPacket
(
qq
,
password
,
loginTime
,
loginIP
,
tgtgtKey
,
token0825
,
token00BA
,
null
)
@PacketId
(
"08 36 31 06"
)
@PacketId
(
"08 36 31 06"
)
@ExperimentalUnsignedTypes
class
ClientLoginResendPacket3106
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
token00BA
:
ByteArray
,
tlv0006
:
ByteArray
?
=
null
)
class
ClientLoginResendPacket3106
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
token00BA
:
ByteArray
,
tlv0006
:
ByteArray
?
=
null
)
:
ClientLoginResendPacket
(
qq
,
password
,
loginTime
,
loginIP
,
tgtgtKey
,
token0825
,
token00BA
,
tlv0006
)
:
ClientLoginResendPacket
(
qq
,
password
,
loginTime
,
loginIP
,
tgtgtKey
,
token0825
,
token00BA
,
tlv0006
)
@ExperimentalUnsignedTypes
open
class
ClientLoginResendPacket
internal
constructor
(
open
class
ClientLoginResendPacket
internal
constructor
(
val
qq
:
Long
,
val
qq
:
Long
,
val
password
:
String
,
val
password
:
String
,
...
@@ -93,7 +93,7 @@ open class ClientLoginResendPacket internal constructor(
...
@@ -93,7 +93,7 @@ open class ClientLoginResendPacket internal constructor(
/**
/**
* @author Him188moe
* @author Him188moe
*/
*/
@ExperimentalUnsignedTypes
private
fun
DataOutputStream
.
writePart1
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
tlv0006
:
ByteArray
?
=
null
)
{
private
fun
DataOutputStream
.
writePart1
(
qq
:
Long
,
password
:
String
,
loginTime
:
Int
,
loginIP
:
String
,
tgtgtKey
:
ByteArray
,
token0825
:
ByteArray
,
tlv0006
:
ByteArray
?
=
null
)
{
//this.writeInt(System.currentTimeMillis().toInt())
//this.writeInt(System.currentTimeMillis().toInt())
...
@@ -130,7 +130,7 @@ private fun DataOutputStream.writePart1(qq: Long, password: String, loginTime: I
...
@@ -130,7 +130,7 @@ private fun DataOutputStream.writePart1(qq: Long, password: String, loginTime: I
this
.
writeHex
(
"60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6"
)
//key
this
.
writeHex
(
"60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6"
)
//key
}
}
@ExperimentalUnsignedTypes
private
fun
DataOutputStream
.
writePart2
()
{
private
fun
DataOutputStream
.
writePart2
()
{
this
.
writeHex
(
"03 12"
)
//tag
this
.
writeHex
(
"03 12"
)
//tag
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ServerLoginResponseKeyExchangePacket.kt
View file @
37fa8055
...
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
...
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.ServerPacket
import
net.mamoe.mirai.network.packet.ServerPacket
import
net.mamoe.mirai.network.packet.goto
import
net.mamoe.mirai.network.packet.goto
import
net.mamoe.mirai.utils.Tested
Successfully
import
net.mamoe.mirai.utils.Tested
import
java.io.DataInputStream
import
java.io.DataInputStream
/**
/**
...
@@ -23,7 +23,7 @@ class ServerLoginResponseKeyExchangePacket(input: DataInputStream, val flag: Fla
...
@@ -23,7 +23,7 @@ class ServerLoginResponseKeyExchangePacket(input: DataInputStream, val flag: Fla
var
tokenUnknown
:
ByteArray
?
=
null
var
tokenUnknown
:
ByteArray
?
=
null
lateinit
var
tgtgtKey
:
ByteArray
//16bytes
lateinit
var
tgtgtKey
:
ByteArray
//16bytes
@Tested
Successfully
@Tested
override
fun
decode
()
{
override
fun
decode
()
{
this
.
input
.
skip
(
5
)
this
.
input
.
skip
(
5
)
tgtgtKey
=
this
.
input
.
readNBytes
(
16
)
//22
tgtgtKey
=
this
.
input
.
readNBytes
(
16
)
//22
...
@@ -46,8 +46,8 @@ class ServerLoginResponseKeyExchangePacket(input: DataInputStream, val flag: Fla
...
@@ -46,8 +46,8 @@ class ServerLoginResponseKeyExchangePacket(input: DataInputStream, val flag: Fla
}
}
class
Encrypted
(
input
:
DataInputStream
,
private
val
flag
:
Flag
)
:
ServerPacket
(
input
)
{
class
Encrypted
(
input
:
DataInputStream
,
private
val
flag
:
Flag
)
:
ServerPacket
(
input
)
{
@ExperimentalUnsignedTypes
@Tested
Successfully
@Tested
fun
decrypt
(
tgtgtKey
:
ByteArray
):
ServerLoginResponseKeyExchangePacket
{
fun
decrypt
(
tgtgtKey
:
ByteArray
):
ServerLoginResponseKeyExchangePacket
{
return
ServerLoginResponseKeyExchangePacket
(
this
.
decryptBy
(
Protocol
.
shareKey
,
tgtgtKey
),
flag
).
setId
(
this
.
idHex
)
return
ServerLoginResponseKeyExchangePacket
(
this
.
decryptBy
(
Protocol
.
shareKey
,
tgtgtKey
),
flag
).
setId
(
this
.
idHex
)
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ServerLoginResponsePasswordVerifiedPacket.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.network.packet.login
package
net.mamoe.mirai.network.packet.login
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
...
@@ -5,7 +7,7 @@ import net.mamoe.mirai.network.packet.ServerPacket
...
@@ -5,7 +7,7 @@ import net.mamoe.mirai.network.packet.ServerPacket
import
net.mamoe.mirai.network.packet.goto
import
net.mamoe.mirai.network.packet.goto
import
net.mamoe.mirai.network.packet.readNBytesAt
import
net.mamoe.mirai.network.packet.readNBytesAt
import
net.mamoe.mirai.network.packet.readString
import
net.mamoe.mirai.network.packet.readString
import
net.mamoe.mirai.utils.Tested
Successfully
import
net.mamoe.mirai.utils.Tested
import
net.mamoe.mirai.utils.toUHexString
import
net.mamoe.mirai.utils.toUHexString
import
java.io.DataInputStream
import
java.io.DataInputStream
...
@@ -21,8 +23,8 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream) : ServerPacket(in
...
@@ -21,8 +23,8 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream) : ServerPacket(in
lateinit
var
encryptionKey
:
ByteArray
lateinit
var
encryptionKey
:
ByteArray
@Tested
Successfully
@Tested
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
this
.
input
.
skip
(
7
)
//8
this
.
input
.
skip
(
7
)
//8
this
.
encryptionKey
=
this
.
input
.
readNBytes
(
16
)
//24
this
.
encryptionKey
=
this
.
input
.
readNBytes
(
16
)
//24
...
@@ -52,7 +54,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream) : ServerPacket(in
...
@@ -52,7 +54,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream) : ServerPacket(in
class
Encrypted
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
Encrypted
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
@ExperimentalUnsignedTypes
fun
decrypt
(
tgtgtKey
:
ByteArray
):
ServerLoginResponseSuccessPacket
{
fun
decrypt
(
tgtgtKey
:
ByteArray
):
ServerLoginResponseSuccessPacket
{
input
goto
14
input
goto
14
return
ServerLoginResponseSuccessPacket
(
this
.
decryptBy
(
Protocol
.
shareKey
,
tgtgtKey
)).
setId
(
this
.
idHex
)
return
ServerLoginResponseSuccessPacket
(
this
.
decryptBy
(
Protocol
.
shareKey
,
tgtgtKey
)).
setId
(
this
.
idHex
)
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/login/ServerLoginResponseVerificationCodeInitPacket.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.network.packet.login
package
net.mamoe.mirai.network.packet.login
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.ServerPacket
import
net.mamoe.mirai.network.packet.ServerPacket
import
net.mamoe.mirai.network.packet.dataInputStream
import
net.mamoe.mirai.network.packet.dataInputStream
import
net.mamoe.mirai.network.packet.goto
import
net.mamoe.mirai.network.packet.goto
import
net.mamoe.mirai.utils.Tested
Successfully
import
net.mamoe.mirai.utils.Tested
import
net.mamoe.mirai.utils.hexToUBytes
import
net.mamoe.mirai.utils.hexToUBytes
import
java.io.DataInputStream
import
java.io.DataInputStream
...
@@ -20,8 +22,8 @@ class ServerLoginResponseVerificationCodeInitPacket(input: DataInputStream, priv
...
@@ -20,8 +22,8 @@ class ServerLoginResponseVerificationCodeInitPacket(input: DataInputStream, priv
var
unknownBoolean
:
Boolean
?
=
null
var
unknownBoolean
:
Boolean
?
=
null
@Tested
Successfully
@Tested
@ExperimentalUnsignedTypes
override
fun
decode
()
{
override
fun
decode
()
{
val
verifyCodeLength
=
this
.
input
.
goto
(
78
).
readShort
()
//2bytes
val
verifyCodeLength
=
this
.
input
.
goto
(
78
).
readShort
()
//2bytes
this
.
verifyCodePart1
=
this
.
input
.
readNBytes
(
verifyCodeLength
.
toInt
())
this
.
verifyCodePart1
=
this
.
input
.
readNBytes
(
verifyCodeLength
.
toInt
())
...
@@ -39,7 +41,7 @@ class ServerLoginResponseVerificationCodeInitPacket(input: DataInputStream, priv
...
@@ -39,7 +41,7 @@ class ServerLoginResponseVerificationCodeInitPacket(input: DataInputStream, priv
}
}
@ExperimentalUnsignedTypes
fun
decrypt
():
ServerLoginResponseVerificationCodeInitPacket
{
fun
decrypt
():
ServerLoginResponseVerificationCodeInitPacket
{
this
.
input
goto
14
this
.
input
goto
14
val
data
=
this
.
decryptBy
(
Protocol
.
shareKey
).
goto
(
0
).
readAllBytes
()
val
data
=
this
.
decryptBy
(
Protocol
.
shareKey
).
goto
(
0
).
readAllBytes
()
...
...
mirai-core/src/main/java/net/mamoe/mirai/utils/TEA.kt
View file @
37fa8055
This diff is collapsed.
Click to expand it.
mirai-core/src/main/java/net/mamoe/mirai/utils/Tested.kt
View file @
37fa8055
...
@@ -5,4 +5,4 @@ package net.mamoe.mirai.utils
...
@@ -5,4 +5,4 @@ package net.mamoe.mirai.utils
*
*
* @author Him188moe
* @author Him188moe
*/
*/
internal
annotation
class
TestedSuccessfully
internal
annotation
class
Tested
\ No newline at end of file
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/utils/Utils.kt
View file @
37fa8055
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
,
"EXPERIMENTAL_UNSIGNED_LITERALS"
)
package
net.mamoe.mirai.utils
package
net.mamoe.mirai.utils
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
...
@@ -26,14 +28,14 @@ fun ByteArray.toHexString(separator: String = " "): String = this.joinToString(s
...
@@ -26,14 +28,14 @@ fun ByteArray.toHexString(separator: String = " "): String = this.joinToString(s
return
@
joinToString
ret
return
@
joinToString
ret
}
}
@ExperimentalUnsignedTypes
fun
ByteArray
.
toUHexString
(
separator
:
String
=
" "
):
String
=
this
.
toUByteArray
().
toUHexString
(
separator
)
fun
ByteArray
.
toUHexString
(
separator
:
String
=
" "
):
String
=
this
.
toUByteArray
().
toUHexString
(
separator
)
@ExperimentalUnsignedTypes
@JvmSynthetic
@JvmSynthetic
fun
ByteArray
.
toUHexString
():
String
=
this
.
toUByteArray
().
toUHexString
()
fun
ByteArray
.
toUHexString
():
String
=
this
.
toUByteArray
().
toUHexString
()
@ExperimentalUnsignedTypes
@JvmSynthetic
@JvmSynthetic
fun
UByteArray
.
toUHexString
(
separator
:
String
=
" "
):
String
{
fun
UByteArray
.
toUHexString
(
separator
:
String
=
" "
):
String
{
return
this
.
joinToString
(
separator
)
{
return
this
.
joinToString
(
separator
)
{
...
@@ -45,36 +47,36 @@ fun UByteArray.toUHexString(separator: String = " "): String {
...
@@ -45,36 +47,36 @@ fun UByteArray.toUHexString(separator: String = " "): String {
}
}
}
}
@ExperimentalUnsignedTypes
@JvmSynthetic
@JvmSynthetic
fun
UByteArray
.
toUHexString
():
String
=
this
.
toUHexString
(
" "
)
fun
UByteArray
.
toUHexString
():
String
=
this
.
toUHexString
(
" "
)
@ExperimentalUnsignedTypes
fun
Byte
.
toUHexString
():
String
=
this
.
toUByte
().
toString
(
16
)
fun
Byte
.
toUHexString
():
String
=
this
.
toUByte
().
toString
(
16
)
@ExperimentalUnsignedTypes
fun
String
.
hexToBytes
():
ByteArray
=
Protocol
.
hexToBytes
(
this
)
fun
String
.
hexToBytes
():
ByteArray
=
Protocol
.
hexToBytes
(
this
)
@ExperimentalUnsignedTypes
fun
String
.
hexToUBytes
():
UByteArray
=
Protocol
.
hexToUBytes
(
this
)
fun
String
.
hexToUBytes
():
UByteArray
=
Protocol
.
hexToUBytes
(
this
)
@ExperimentalUnsignedTypes
fun
String
.
hexToInt
():
Int
=
hexToBytes
().
toUInt
().
toInt
()
fun
String
.
hexToInt
():
Int
=
hexToBytes
().
toUInt
().
toInt
()
@ExperimentalUnsignedTypes
fun
ByteArray
.
toUInt
():
UInt
=
fun
ByteArray
.
toUInt
():
UInt
=
this
[
0
].
toUInt
().
and
(
255
u
).
shl
(
24
)
+
this
[
1
].
toUInt
().
and
(
255
u
).
shl
(
16
)
+
this
[
2
].
toUInt
().
and
(
255
u
).
shl
(
8
)
+
this
[
3
].
toUInt
().
and
(
255
u
).
shl
(
0
)
this
[
0
].
toUInt
().
and
(
255
u
).
shl
(
24
)
+
this
[
1
].
toUInt
().
and
(
255
u
).
shl
(
16
)
+
this
[
2
].
toUInt
().
and
(
255
u
).
shl
(
8
)
+
this
[
3
].
toUInt
().
and
(
255
u
).
shl
(
0
)
open
class
ByteArrayDataOutputStream
:
DataOutputStream
(
ByteArrayOutputStream
())
{
open
class
ByteArrayDataOutputStream
:
DataOutputStream
(
ByteArrayOutputStream
())
{
open
fun
toByteArray
():
ByteArray
=
(
out
as
ByteArrayOutputStream
).
toByteArray
()
open
fun
toByteArray
():
ByteArray
=
(
out
as
ByteArrayOutputStream
).
toByteArray
()
@ExperimentalUnsignedTypes
open
fun
toUByteArray
():
UByteArray
=
(
out
as
ByteArrayOutputStream
).
toByteArray
().
toUByteArray
()
open
fun
toUByteArray
():
UByteArray
=
(
out
as
ByteArrayOutputStream
).
toByteArray
().
toUByteArray
()
}
}
@JvmSynthetic
@JvmSynthetic
fun
lazyEncode
(
t
:
(
ByteArrayDataOutputStream
)
->
Unit
):
ByteArray
=
ByteArrayDataOutputStream
().
also
(
t
).
toByteArray
()
fun
lazyEncode
(
t
:
(
ByteArrayDataOutputStream
)
->
Unit
):
ByteArray
=
ByteArrayDataOutputStream
().
also
(
t
).
toByteArray
()
@ExperimentalUnsignedTypes
fun
getRandomByteArray
(
length
:
Int
):
ByteArray
{
fun
getRandomByteArray
(
length
:
Int
):
ByteArray
{
val
bytes
=
LinkedList
<
Byte
>()
val
bytes
=
LinkedList
<
Byte
>()
repeat
(
length
)
{
bytes
.
add
((
Math
.
random
()
*
255
).
toByte
())
}
repeat
(
length
)
{
bytes
.
add
((
Math
.
random
()
*
255
).
toByte
())
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/utils/Varint.kt
View file @
37fa8055
@
file
:
JvmName
(
"Varint"
)
@
file
:
JvmName
(
"Varint"
)
@
file
:
Suppress
(
"EXPERIMENTAL_API_USAGE"
)
package
net.mamoe.mirai.utils
package
net.mamoe.mirai.utils
...
@@ -21,7 +22,7 @@ fun encodeZigZag32(signedInt: Int): Long {
...
@@ -21,7 +22,7 @@ fun encodeZigZag32(signedInt: Int): Long {
return
(
signedInt
shl
1
xor
(
signedInt
shr
31
)).
toLong
()
return
(
signedInt
shl
1
xor
(
signedInt
shr
31
)).
toLong
()
}
}
@ExperimentalUnsignedTypes
@JvmSynthetic
@JvmSynthetic
fun
decodeZigZag32
(
uint
:
UInt
):
Int
{
fun
decodeZigZag32
(
uint
:
UInt
):
Int
{
return
decodeZigZag32
(
uint
.
toLong
())
return
decodeZigZag32
(
uint
.
toLong
())
...
@@ -39,25 +40,25 @@ fun decodeZigZag64(signedLong: Long): Long {
...
@@ -39,25 +40,25 @@ fun decodeZigZag64(signedLong: Long): Long {
return
signedLong
.
ushr
(
1
)
xor
-(
signedLong
and
1
)
return
signedLong
.
ushr
(
1
)
xor
-(
signedLong
and
1
)
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataInputStream
.
readVarInt
():
Int
{
fun
DataInputStream
.
readVarInt
():
Int
{
return
decodeZigZag32
(
this
.
readUnsignedVarInt
())
return
decodeZigZag32
(
this
.
readUnsignedVarInt
())
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataInputStream
.
readUnsignedVarInt
():
UInt
{
fun
DataInputStream
.
readUnsignedVarInt
():
UInt
{
return
read
(
this
,
5
).
toUInt
()
return
read
(
this
,
5
).
toUInt
()
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataInputStream
.
readVarLong
():
Long
{
fun
DataInputStream
.
readVarLong
():
Long
{
return
decodeZigZag64
(
readUnsignedVarLong
().
toLong
())
return
decodeZigZag64
(
readUnsignedVarLong
().
toLong
())
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataInputStream
.
readUnsignedVarLong
():
ULong
{
fun
DataInputStream
.
readUnsignedVarLong
():
ULong
{
return
read
(
this
,
10
).
toULong
()
return
read
(
this
,
10
).
toULong
()
...
@@ -68,7 +69,7 @@ fun DataOutputStream.writeVarInt(signedInt: Int) {
...
@@ -68,7 +69,7 @@ fun DataOutputStream.writeVarInt(signedInt: Int) {
this
.
writeUVarInt
(
encodeZigZag32
(
signedInt
))
this
.
writeUVarInt
(
encodeZigZag32
(
signedInt
))
}
}
@ExperimentalUnsignedTypes
@Throws
(
IOException
::
class
)
@Throws
(
IOException
::
class
)
fun
DataOutputStream
.
writeUVarInt
(
uint
:
UInt
)
{
fun
DataOutputStream
.
writeUVarInt
(
uint
:
UInt
)
{
return
writeUVarInt
(
uint
.
toLong
())
return
writeUVarInt
(
uint
.
toLong
())
...
...
mirai-core/src/test/java/PacketTest.kt
deleted
100644 → 0
View file @
96a9e6f3
import
net.mamoe.mirai.network.packet.login.ClientPasswordSubmissionPacket
import
net.mamoe.mirai.utils.toUHexString
@ExperimentalUnsignedTypes
fun
main
(){
/*
val data = "00 37 13 08 25 31 01 EB 10 08 30 69 50 1C 84 A9 C2 16 D7 52 B9 1C 79 CA 5A CF FD BC EB 10 08 30 69 50 1C 84 A9 C2 16 D7 52 B9 1C 79 CA 5A CF FD BC AE D8 A6 BB DC 21 6E 79 26 E1 A2 23 11 AA B0 9A AE D8 A6 BB DC 21 6E 79 26 E1 A2 23 11 AA B0 9A 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A4 F1 91 88 C9 82 14 99 0C 9E 56 55 91 23 C8 3D C3 47 F0 25 A1 8E 74 EF 1E 0B 32 5B 20 8A FA 3B 0B 52 8F 86 E6 04 F1 D6 F8 63 75 60 8C 0C 7D 06 D1 E0 22 F8 49 EF AF 61 EE 7E 69 72 EB 10 08 30 69 50 1C 84 A9 C2 16 D7 52 B9 1C 79 CA 5A CF FD BC AE D8 A6 BB DC 21 6E 79 26 E1 A2 23 11 AA B0 9A 49 39 72 ED 61 12 B6 88 4D A2 56 23 E9 92 11 92 27 4A 70 00 C9 01 7B 03";
val s = DataInputStream(data.hexToBytes().inputStream())
val packet = ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, s)
packet.decode()
System.out.println(packet.token.toUByteArray().toUHexString(" "))
System.out.println(packet.loginTime.toUHexString(" "))
System.out.println(packet.loginIP)
*/
// val packet = ClientPasswordSubmissionPacket(1994701021,"xiaoqqq",)
/*
val data = "00 01 09 00 70 00 01 5C 71 80 A6 BA 20 62 2E C1 BE BF F2 47 37 40 A1 00 38 91 25 85 58 18 D3 67 77 2C 4D 02 D8 66 A6 F7 3E 57 D8 CE 01 47 7F D0 8F 13 C8 3A E5 19 A2 60 BC 4C 9A 35 4E 92 9F 21 48 6C 67 68 36 6B 94 C1 6F 11 8D 55 6B 04 9A 22 C3 00 20 29 7E D4 A7 16 02 07 14 41 90 3A 65 06 AC CB 28 AB 90 DB 46 33 C9 C0 1D 06 44 7A 92 17 C3 A5 F3 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 07 01 D3 00 01 00 16 00 00 00 01 00 00 00 64 00 00 0D B6 00 09 3A 80 00 00 00 3C 00 02 2E 29 4E 47 5F 68 78 2C 47 25 5F 59 50 65 60 5D 00 88 00 04 5D 59 45 17 B7 5F F8 D4 00 00 00 00 00 78 38 E0 3B 23 4A C5 0E 93 CB C1 66 96 37 8B 46 B2 86 23 3F 2D 09 45 E0 16 1C E9 9C 11 7A FA 2D A8 50 47 42 74 01 06 84 76 0E 5F C6 04 29 1A 4A 65 AA 93 49 DF BD 00 ED 80 B8 26 CA 80 E8 20 6D 15 43 DD D8 E6 48 C2 8A 5A F8 70 6B 51 3A E2 2D 21 95 4B 6A 75 A8 90 CA B1 C0 E5 73 99 D7 59 D8 DD 3D C9 5C E4 49 61 22 11 60 85 48 C4 7D E0 84 62 AD B3 13 84 61 C1 9E 19 35 41 44 44 37 3F 21 33 64 4B 37 5D 77 6D 61 3F 00 78 00 01 5D 59 45 17 00 70 A4 D9 44 9E 95 51 B4 B0 91 CC 1E DB 34 F9 F7 13 8B 30 08 C0 AE 33 22 9C FF 87 CF 9B A2 B0 E5 E1 D0 E0 AD DD 8F E9 F6 1E 01 1F AA 74 46 66 B4 81 54 B9 29 E5 FC 0B 7F C9 13 AE 32 BA D6 55 2E B0 A1 30 24 B6 F2 E7 62 F9 2E 00 E4 51 61 50 7C D1 36 E8 61 96 36 FF B7 32 74 3C 2A F7 74 63 DA 7D 57 84 18 ED 84 E9 D8 87 6D 66 1D D5 84 D4 23 99 00 83 01 63 2A 69 2E 25 79 28 3B 29 33 29 40 28 54 7E 21 00 70 00 01 5D 59 45 17 00 68 6F 1F FB 31 7B D7 B7 D8 91 32 D7 20 8B 8A F6 02 C8 22 E5 24 8C 25 F2 6A C5 B0 ED 35 01 BF AF 42 72 33 4E FB 3F D3 02 BA F4 46 2B 68 20 0B E3 39 81 B1 D3 8A E0 1B 0F 69 D1 70 AE 49 A5 24 4F BB 58 4F F8 31 A0 37 4C CD F1 12 35 80 99 7D 25 CA F9 E9 45 B6 B0 57 56 66 61 C5 7B 90 57 BF E2 2C 94 91 80 1A B0 D7 21 A8 44 2C 33 4A 29 77 5F 71 40 41 38 3D 7A 41 65 33 01 08 00 29 00 01 00 25 00 1D 02 5B 14 28 E0 B9 91 E2 80 A2 CC 80 CF 89 E2 80 A2 CC 81 E0 B9 91 29 02 13 80 02 00 05 00 04 00 00 00 01 01 15 00 10 F9 86 85 81 30 F6 1B E0 E7 97 98 F6 46 C3 4F B2"
val s = DataInputStream(data.hexToBytes().inputStream())
val packet = ServerLoginResponseSuccessPacket(s,(data.length+1)/3)
packet.decode()
System.out.println("0828key: \n" + packet._0828_rec_decr_key.toUByteArray().toUHexString(" "))
System.out.println("token88: \n" + packet.token88.toUByteArray().toUHexString(" "))
System.out.println("token38: \n" + packet.token38.toUByteArray().toUHexString(" "))
System.out.println("enckey: \n" + packet.encryptionKey.toUByteArray().toUHexString(" "))
System.out.println("nick: " + packet.nick)
System.out.println("age: " + packet.age)
System.out.println("gender: " + packet.gender)
*/
/*
val data = "FB 01 04 03 33 00 01 00 BA 02 03 2C 13 00 05 01 00 00 01 23 00 38 F5 C3 CF F4 B4 27 C5 8F 9B D3 ED 18 73 7D E9 CB 43 1F 57 43 BE D3 1B 9A F5 26 2B F4 D9 43 14 9A ED 3B C3 6C E5 7F 4E B0 0C BA 55 57 18 06 78 E1 13 A7 B2 A8 7F 47 E1 1C 02 BC 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 82 00 00 00 35 08 03 00 00 00 BA 12 C3 02 00 00 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00 00 6C 50 4C 54 45 F6 F8 F4 E3 EE FD E5 FD FF EE FD F0 F6 F9 E7 F7 F9 EC F4 FE FF F7 F7 F9 F5 F4 FF EC F7 FF E6 F4 E0 F5 FC F8 49 5B 8F CB DB FA BB C9 F5 2B 40 7C D6 E6 FF FD FB FF ED F1 F0 2A 43 B3 D6 F6 FF FC F1 FC 1C 38 91 A7 BD F6 63 74 BD 70 8B CC 34 4F A5 DE F3 F1 75 88 E7 A4 B7 D3 73 82 A1 8C A3 DC F3 FB D8 4D 68 B9 94 A8 FB 8D 9C B6 CB 42 B0 8E 00 00 0A 6F 49 44 41 54 58 C3 B4 57 89 76 EB 2A 12 14 20 B1 09 10 42 68 DF 2C FB FF FF 71 0A 79 49 E2 E4 CE CC 79 37 8F 13 59 B6 72 EC 2E AA BB AB 9A 2C FB 61 89 8F 95 E5 79 A9 70 CB B2 22 C7 2A 65 DB 5E 72 21 F1 A9 90 B2 28 C4 F9 AF 5F 5F 05 30 9C 28 D2 4B C6 58 F9 8C 92 17 39 13 6D 9B FF EB 10 8A 3B 0F 2F 10 52 64 45 51 64 42 A6 37 79 21 DA FC F2 6F 40 08 9F AE B7 9C A4 C8 27 31 F2 C4 50 A4 D4 9C F9 01 BC A2 90 0F 08 E1 2F AE 1F E3 7E 7D 24 52 F4 67 2C 91 02 E3 CA 13 2F 78 97 00 86 DF 4E C4 23 56 F1 F8 7B 10 90 42 3D D2 93 EE 27 04 F1 80 F0 4B 99 10 4F 62 5E D9 2D EE 57 8A F1 A0 E1 64 20 2B 55 F9 C8 C3 67 08 F8 81 7F F2 F7 BE FD 67 1D 9E 9B 4F EB 89 25 21 28 19 63 09 5D A9 94 2A 59 AA 87 B3 32 4E 84 FF 3C 13 8F AF 06 F1 29 FD E2 C1 02 54 E0 8C 5E 5C 2E A5 72 43 65 F4 E5 72 61 5C 4A 45 81 41 97 79 0A 9E FF 62 22 C2 EB 7E 42 48 45 80 2B 0F 58 B9 66 D6 1C 63 75 D3 97 BC F4 08 0F 08 5C 6B 8D CC 14 1F 10 C4 5F B4 C3 37 66 EE E5 78 CF 42 12 05 CD F5 4D 29 EB 36 AD 19 82 CF 76 35 C6 86 B2 94 A7 36 FC 62 39 BE A8 B8 D7 02 78 08 8F 66 E4 44 45 DF BB AB A3 34 92 14 DF 54 C6 32 1D 00 21 7F 41 08 7F C9 7F F8 28 88 4F B5 90 89 3A 21 90 9E DF E8 DE 34 4D 8C D1 EF C6 AC 6B 7F 74 8E B1 FA 84 90 7F B0 F0 CF 5A E2 27 4C AF 8E 28 EF 24 48 B2 AF B1 9A 96 3E F6 43 75 38 6F 29 5D 1A C7 59 78 87 F0 1B B2 F0 95 05 3C 93 B2 26 B6 9F BA 18 AB AE 59 EC 88 17 17 A9 8F 4B B3 CE 60 A1 CD F2 CB 03 42 10 7F D9 06 1F 76 80 8E 4F 6D 9F 56 99 05 25 A5 DD AA EB 62 7A 6F 87 E6 B8 0E 5D 33 C6 99 C6 C4 02 24 EB 74 8C 87 98 64 F8 5E A9 9E 1E F7 72 FB FF B3 21 8A A4 00 01 00 28 F9 59 C5 E6 34 43 53 95 C8 17 2E 62 78 BF E8 27 BF 20 BA 11 5A 74 D1 7C D0 95 6C F6 A3 41 D2 84 BD 7D F6 64 BC 27 40 50 01 15 00 10 44 98 EB B8 30 3B DE 7D 2B CC 4C 41 B3 1C 92 86"
val s = DataInputStream(data.hexToBytes().inputStream())
val packet = ServerLoginResponseVerificationCodePacket(s,(data.length+1)/3)
packet.decode()
println(packet.token00BA.toUByteArray().toUHexString(" "))
println(packet.verifyCode.toUByteArray().toUHexString(" "))
println(packet.verifyCodeLength)
File(System.getProperty("user.dir") + "/5.png").createNewFile()
packet.verifyCode.inputStream().transferTo(FileOutputStream(System.getProperty("user.dir") + "/5.png"))
*/
val
packet
=
ClientPasswordSubmissionPacket
(
1994701021
,
"xiaoqqq"
,
131513
,
"123.123.123.123"
,
"tgtgtKey"
.
toByteArray
(),
""
.
toByteArray
())
packet
.
encodeToByteArray
().
toUByteArray
().
toUHexString
(
" "
)
}
\ 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