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
6350638e
Commit
6350638e
authored
Aug 31, 2019
by
Him188moe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Message receiver is working!
parent
aa6e9562
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
358 additions
and
76 deletions
+358
-76
mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
.../main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
+56
-28
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/AccountInfo.kt
.../mamoe/mirai/network/packet/client/session/AccountInfo.kt
+2
-3
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
...ava/net/mamoe/mirai/network/packet/server/ServerPacket.kt
+13
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/event/MessageEvent.kt
...t/mamoe/mirai/network/packet/server/event/MessageEvent.kt
+73
-11
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/event/ServerEventPacket.kt
...oe/mirai/network/packet/server/event/ServerEventPacket.kt
+137
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerVerificationCodePacket.kt
...twork/packet/server/login/ServerVerificationCodePacket.kt
+44
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacket.kt
.../packet/server/security/ServerSessionKeyResponsePacket.kt
+0
-5
mirai-core/src/main/java/net/mamoe/mirai/task/MiraiTaskManager.java
.../src/main/java/net/mamoe/mirai/task/MiraiTaskManager.java
+16
-18
mirai-core/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java
...e/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java
+11
-7
mirai-core/src/main/java/net/mamoe/mirai/utils/MiraiLogger.kt
...i-core/src/main/java/net/mamoe/mirai/utils/MiraiLogger.kt
+6
-3
No files found.
mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
View file @
6350638e
package
net.mamoe.mirai.network
package
net.mamoe.mirai.network
import
kotlinx.coroutines.GlobalScope
import
kotlinx.coroutines.async
import
net.mamoe.mirai.MiraiServer
import
net.mamoe.mirai.MiraiServer
import
net.mamoe.mirai.network.packet.client.ClientPacket
import
net.mamoe.mirai.network.packet.client.ClientPacket
import
net.mamoe.mirai.network.packet.client.login.*
import
net.mamoe.mirai.network.packet.client.login.*
...
@@ -12,11 +10,12 @@ import net.mamoe.mirai.network.packet.client.touch.ServerHeartbeatResponsePacket
...
@@ -12,11 +10,12 @@ import net.mamoe.mirai.network.packet.client.touch.ServerHeartbeatResponsePacket
import
net.mamoe.mirai.network.packet.client.writeHex
import
net.mamoe.mirai.network.packet.client.writeHex
import
net.mamoe.mirai.network.packet.client.writeRandom
import
net.mamoe.mirai.network.packet.client.writeRandom
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.event.*
import
net.mamoe.mirai.network.packet.server.login.*
import
net.mamoe.mirai.network.packet.server.login.*
import
net.mamoe.mirai.network.packet.server.security.*
import
net.mamoe.mirai.network.packet.server.security.*
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import
net.mamoe.mirai.task.MiraiT
askManager
import
net.mamoe.mirai.task.MiraiT
hreadPool
import
net.mamoe.mirai.util.*
import
net.mamoe.mirai.util.*
import
net.mamoe.mirai.utils.MiraiLogger
import
net.mamoe.mirai.utils.MiraiLogger
import
java.io.ByteArrayInputStream
import
java.io.ByteArrayInputStream
...
@@ -24,7 +23,7 @@ import java.io.FileOutputStream
...
@@ -24,7 +23,7 @@ import java.io.FileOutputStream
import
java.net.DatagramPacket
import
java.net.DatagramPacket
import
java.net.DatagramSocket
import
java.net.DatagramSocket
import
java.net.InetSocketAddress
import
java.net.InetSocketAddress
import
kotlin.system.exitProcess
import
java.util.concurrent.TimeUnit
/**
/**
...
@@ -51,8 +50,14 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -51,8 +50,14 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
Thread
{
Thread
{
while
(
true
)
{
while
(
true
)
{
val
dp1
=
DatagramPacket
(
ByteArray
(
2048
),
2048
)
val
dp1
=
DatagramPacket
(
ByteArray
(
2048
),
2048
)
socket
.
receive
(
dp1
)
try
{
GlobalScope
.
async
{
socket
.
receive
(
dp1
)
}
catch
(
e
:
Exception
)
{
if
(
e
.
message
==
"socket closed"
)
{
return
@Thread
}
}
MiraiThreadPool
.
getInstance
().
submit
{
var
i
=
dp1
.
data
.
size
-
1
;
var
i
=
dp1
.
data
.
size
-
1
;
while
(
dp1
.
data
[
i
]
==
zeroByte
)
{
while
(
dp1
.
data
[
i
]
==
zeroByte
)
{
--
i
--
i
...
@@ -62,7 +67,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -62,7 +67,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
}
catch
(
e
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
e
.
printStackTrace
()
}
}
}
.
start
()
}
}
}
}.
start
()
}.
start
()
}
}
...
@@ -105,7 +110,10 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -105,7 +110,10 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
@ExperimentalUnsignedTypes
@ExperimentalUnsignedTypes
internal
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
internal
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
packet
.
decode
()
packet
.
decode
()
println
(
"Packet received: $packet"
)
MiraiLogger
info
"Packet received: $packet"
if
(
packet
is
ServerEventPacket
)
{
sendPacket
(
ClientMessageResponsePacket
(
this
.
number
,
packet
.
packetId
,
this
.
sessionKey
,
packet
.
eventIdentity
))
}
when
(
packet
)
{
when
(
packet
)
{
is
ServerTouchResponsePacket
->
{
is
ServerTouchResponsePacket
->
{
if
(
packet
.
serverIP
!=
null
)
{
//redirection
if
(
packet
.
serverIP
!=
null
)
{
//redirection
...
@@ -122,7 +130,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -122,7 +130,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
}
}
is
ServerLoginResponseFailedPacket
->
{
is
ServerLoginResponseFailedPacket
->
{
println
(
"Login failed: "
+
packet
.
state
.
toString
()
)
MiraiLogger
error
"Login failed: "
+
packet
.
state
.
toString
(
)
return
return
}
}
...
@@ -185,11 +193,16 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -185,11 +193,16 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
}
}
}
}
is
ServerVerificationCodePacket
->
{
this
.
sequence
++
}
is
ServerSessionKeyResponsePacket
->
{
is
ServerSessionKeyResponsePacket
->
{
this
.
sessionKey
=
packet
.
sessionKey
this
.
sessionKey
=
packet
.
sessionKey
MiraiT
askManager
.
getInstance
().
repeatingTask
({
MiraiT
hreadPool
.
getInstance
().
scheduleWithFixedDelay
({
sendPacket
(
ClientHeartbeatPacket
(
this
.
number
,
this
.
sessionKey
))
sendPacket
(
ClientHeartbeatPacket
(
this
.
number
,
this
.
sessionKey
))
},
90000
)
},
90000
,
90000
,
TimeUnit
.
MILLISECONDS
)
this
.
tlv0105
=
packet
.
tlv0105
this
.
tlv0105
=
packet
.
tlv0105
sendPacket
(
ClientLoginStatusPacket
(
this
.
number
,
this
.
sessionKey
,
ClientLoginStatus
.
ONLINE
))
sendPacket
(
ClientLoginStatusPacket
(
this
.
number
,
this
.
sessionKey
,
ClientLoginStatus
.
ONLINE
))
}
}
...
@@ -202,9 +215,10 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -202,9 +215,10 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
this
.
sKey
=
packet
.
sKey
this
.
sKey
=
packet
.
sKey
this
.
cookies
=
"uin=o"
+
this
.
number
+
";skey="
+
this
.
sKey
+
";"
this
.
cookies
=
"uin=o"
+
this
.
number
+
";skey="
+
this
.
sKey
+
";"
MiraiT
askManager
.
getInstance
().
repeatingTask
({
MiraiT
hreadPool
.
getInstance
().
scheduleWithFixedDelay
({
sendPacket
(
ClientRefreshSKeyRequestPacket
(
this
.
number
,
this
.
sessionKey
))
sendPacket
(
ClientRefreshSKeyRequestPacket
(
this
.
number
,
this
.
sessionKey
))
},
1800000
)
},
1800000
,
1800000
,
TimeUnit
.
MILLISECONDS
)
this
.
gtk
=
getGTK
(
sKey
)
this
.
gtk
=
getGTK
(
sKey
)
sendPacket
(
ClientAccountInfoRequestPacket
(
this
.
number
,
this
.
sessionKey
))
sendPacket
(
ClientAccountInfoRequestPacket
(
this
.
number
,
this
.
sessionKey
))
}
}
...
@@ -217,6 +231,22 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -217,6 +231,22 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
}
}
is
ServerMessageEventPacketRaw
->
onPacketReceived
(
packet
.
analyze
())
is
ServerFriendMessageEventPacket
->
{
//friend message
}
is
ServerGroupMessageEventPacket
->
{
//group message
}
is
ServerUnknownEventPacket
->
{
//unknown message event
}
is
ServerVerificationCodePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
token00BA
))
is
ServerLoginResponseVerificationCodePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
())
is
ServerLoginResponseVerificationCodePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
())
is
ServerLoginResponseResendPacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
tgtgtKey
!!
))
is
ServerLoginResponseResendPacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
tgtgtKey
!!
))
is
ServerLoginResponseSuccessPacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
tgtgtKey
!!
))
is
ServerLoginResponseSuccessPacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
tgtgtKey
!!
))
...
@@ -224,6 +254,8 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -224,6 +254,8 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
is
ServerTouchResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
())
is
ServerTouchResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
())
is
ServerSKeyResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
sessionKey
))
is
ServerSKeyResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
sessionKey
))
is
ServerAccountInfoResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
sessionKey
))
is
ServerAccountInfoResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
sessionKey
))
is
ServerMessageEventPacketRawEncoded
->
onPacketReceived
(
packet
.
decrypt
(
this
.
sessionKey
))
else
->
throw
IllegalArgumentException
(
packet
.
toString
())
else
->
throw
IllegalArgumentException
(
packet
.
toString
())
}
}
...
@@ -232,21 +264,17 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
...
@@ -232,21 +264,17 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
@ExperimentalUnsignedTypes
@ExperimentalUnsignedTypes
fun
sendPacket
(
packet
:
ClientPacket
)
{
fun
sendPacket
(
packet
:
ClientPacket
)
{
MiraiThreadPool
.
getInstance
().
submit
{
try
{
try
{
packet
.
encode
()
packet
.
encode
()
}
catch
(
e
:
Exception
)
{
packet
.
writeHex
(
Protocol
.
tail
)
e
.
printStackTrace
()
}
val
data
=
packet
.
toByteArray
()
packet
.
writeHex
(
Protocol
.
tail
)
socket
.
send
(
DatagramPacket
(
data
,
data
.
size
))
MiraiLogger
info
"Packet sent: $packet"
val
data
=
packet
.
toByteArray
()
}
catch
(
e
:
Throwable
)
{
try
{
e
.
printStackTrace
()
socket
.
send
(
DatagramPacket
(
data
,
data
.
size
))
}
MiraiLogger
info
"Packet sent: ${data.toUByteArray().toUHexString()}"
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
exitProcess
(
1
)
}
}
}
}
}
}
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/AccountInfo.kt
View file @
6350638e
...
@@ -6,7 +6,6 @@ import net.mamoe.mirai.network.packet.client.*
...
@@ -6,7 +6,6 @@ import net.mamoe.mirai.network.packet.client.*
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.network.packet.server.security.ServerSKeyResponsePacket
import
net.mamoe.mirai.util.TEACryptor
import
net.mamoe.mirai.util.TEACryptor
import
java.io.DataInputStream
import
java.io.DataInputStream
...
@@ -47,9 +46,9 @@ class ServerAccountInfoResponsePacketEncrypted(inputStream: DataInputStream) : S
...
@@ -47,9 +46,9 @@ class ServerAccountInfoResponsePacketEncrypted(inputStream: DataInputStream) : S
}
}
fun
decrypt
(
sessionKey
:
ByteArray
):
Server
SKey
ResponsePacket
{
fun
decrypt
(
sessionKey
:
ByteArray
):
Server
AccountInfo
ResponsePacket
{
this
.
input
goto
14
this
.
input
goto
14
val
data
=
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
}
val
data
=
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
}
return
Server
SKey
ResponsePacket
(
TEACryptor
.
decrypt
(
data
,
sessionKey
).
dataInputStream
());
return
Server
AccountInfo
ResponsePacket
(
TEACryptor
.
decrypt
(
data
,
sessionKey
).
dataInputStream
());
}
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
View file @
6350638e
...
@@ -4,6 +4,7 @@ import net.mamoe.mirai.network.packet.Packet
...
@@ -4,6 +4,7 @@ import net.mamoe.mirai.network.packet.Packet
import
net.mamoe.mirai.network.packet.client.session.ServerAccountInfoResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.client.session.ServerAccountInfoResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.client.toHexString
import
net.mamoe.mirai.network.packet.client.toHexString
import
net.mamoe.mirai.network.packet.client.touch.ServerHeartbeatResponsePacket
import
net.mamoe.mirai.network.packet.client.touch.ServerHeartbeatResponsePacket
import
net.mamoe.mirai.network.packet.server.event.ServerMessageEventPacketRawEncoded
import
net.mamoe.mirai.network.packet.server.login.*
import
net.mamoe.mirai.network.packet.server.login.*
import
net.mamoe.mirai.network.packet.server.security.ServerLoginSuccessPacket
import
net.mamoe.mirai.network.packet.server.security.ServerLoginSuccessPacket
import
net.mamoe.mirai.network.packet.server.security.ServerSKeyResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.server.security.ServerSKeyResponsePacketEncrypted
...
@@ -11,6 +12,7 @@ import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePa
...
@@ -11,6 +12,7 @@ import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePa
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import
net.mamoe.mirai.util.getAllDeclaredFields
import
net.mamoe.mirai.util.getAllDeclaredFields
import
net.mamoe.mirai.util.hexToBytes
import
net.mamoe.mirai.util.toUHexString
import
net.mamoe.mirai.util.toUHexString
import
java.io.DataInputStream
import
java.io.DataInputStream
...
@@ -31,6 +33,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
...
@@ -31,6 +33,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
stream
.
skip
(
3
)
stream
.
skip
(
3
)
return
when
(
val
idHex
=
stream
.
readInt
().
toHexString
(
" "
))
{
return
when
(
val
idHex
=
stream
.
readInt
().
toHexString
(
" "
))
{
"08 25 31 01"
->
ServerTouchResponsePacketEncrypted
(
ServerTouchResponsePacket
.
Type
.
TYPE_08_25_31_01
,
stream
)
"08 25 31 01"
->
ServerTouchResponsePacketEncrypted
(
ServerTouchResponsePacket
.
Type
.
TYPE_08_25_31_01
,
stream
)
...
@@ -76,7 +79,12 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
...
@@ -76,7 +79,12 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
"00 5C"
->
ServerAccountInfoResponsePacketEncrypted
(
stream
)
"00 5C"
->
ServerAccountInfoResponsePacketEncrypted
(
stream
)
"00 58"
->
ServerHeartbeatResponsePacket
(
stream
)
"00 58"
->
ServerHeartbeatResponsePacket
(
stream
)
//"00 CE" ->
"00 BA"
->
ServerVerificationCodePacketEncrypted
(
stream
)
"00 CE"
,
"00 17"
->
ServerMessageEventPacketRawEncoded
(
stream
,
idHex
.
hexToBytes
())
else
->
throw
IllegalArgumentException
(
idHex
)
else
->
throw
IllegalArgumentException
(
idHex
)
}
}
...
@@ -120,6 +128,10 @@ fun DataInputStream.readIP(): String {
...
@@ -120,6 +128,10 @@ fun DataInputStream.readIP(): String {
return
buff
return
buff
}
}
fun
DataInputStream
.
readShortVarString
():
String
{
return
String
(
this
.
readNBytes
(
this
.
readShort
().
toInt
()))
}
fun
DataInputStream
.
readVarString
(
length
:
Int
):
String
{
fun
DataInputStream
.
readVarString
(
length
:
Int
):
String
{
return
String
(
this
.
readNBytes
(
length
))
return
String
(
this
.
readNBytes
(
length
))
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/event/MessageEvent.kt
View file @
6350638e
package
net.mamoe.mirai.network.packet.server.event
package
net.mamoe.mirai.network.packet.server.event
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.client.ClientPacket
import
net.mamoe.mirai.network.packet.client.ClientPacket
import
net.mamoe.mirai.network.packet.client.encryptAndWrite
import
net.mamoe.mirai.network.packet.client.writeHex
import
net.mamoe.mirai.network.packet.client.writeQQ
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.util.TEACryptor
import
net.mamoe.mirai.util.toUHexString
import
java.io.DataInputStream
import
java.io.DataInputStream
/**
/**
*
@author Him188moe
*
告知服务器已经收到数据
*/
*/
class
ServerMessageEventPacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
@PacketId
(
""
)
//随后写入
@ExperimentalUnsignedTypes
open
class
ClientMessageResponsePacket
(
private
val
qq
:
Int
,
private
val
packetIdFromServer
:
ByteArray
,
private
val
sessionKey
:
ByteArray
,
private
val
eventIdentity
:
ByteArray
)
:
ClientPacket
()
{
override
fun
encode
()
{
this
.
write
(
packetIdFromServer
)
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
_fixVer
)
this
.
encryptAndWrite
(
sessionKey
)
{
it
.
write
(
eventIdentity
)
}
}
}
/**
* 群聊和好友消息分析
*/
@PacketId
(
"00 17"
)
class
ServerMessageEventPacketRaw
(
input
:
DataInputStream
,
private
val
dataLength
:
Int
,
private
val
packetId
:
ByteArray
)
:
ServerPacket
(
input
)
{
lateinit
var
type
:
ByteArray
;
lateinit
var
eventIdentity
:
ByteArray
;
override
fun
decode
()
{
override
fun
decode
()
{
eventIdentity
=
this
.
input
.
readNBytes
(
16
)
type
=
this
.
input
.
goto
(
18
).
readNBytes
(
2
)
}
fun
analyze
():
ServerEventPacket
=
when
(
val
typeHex
=
type
.
toUHexString
())
{
"00 C4"
->
{
if
(
this
.
input
.
goto
(
33
).
readBoolean
())
{
ServerAndroidOnlineEventPacket
(
this
.
input
,
packetId
,
eventIdentity
)
}
else
{
ServerAndroidOfflineEventPacket
(
this
.
input
,
packetId
,
eventIdentity
)
}
}
"00 2D"
->
ServerGroupUploadFileEventPacket
(
this
.
input
,
packetId
,
eventIdentity
)
"00 52"
->
ServerGroupMessageEventPacket
(
this
.
input
,
packetId
,
eventIdentity
)
"00 A6"
->
ServerFriendMessageEventPacket
(
this
.
input
,
packetId
,
eventIdentity
)
"02 10"
->
ServerUnknownEventPacket
(
this
.
input
,
packetId
,
eventIdentity
)
else
->
throw
IllegalArgumentException
(
typeHex
)
}
}
}
}
@ExperimentalUnsignedTypes
class
ServerUnknownEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
class
ClientGroupMessageResponsePacket
:
ClientMessageResponsePacket
()
{
}
/**
@PacketId
(
"00 17"
)
* 告知服务器已经收到数据
class
ServerMessageEventPacketRawEncoded
(
input
:
DataInputStream
,
val
packetId
:
ByteArray
)
:
ServerPacket
(
input
)
{
*/
@ExperimentalUnsignedTypes
open
class
ClientMessageResponsePacket
:
ClientPacket
()
{
override
fun
decode
()
{
override
fun
encode
()
{
}
}
fun
decrypt
(
sessionKey
:
ByteArray
):
ServerMessageEventPacketRaw
{
this
.
input
goto
14
val
data
=
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
}
return
ServerMessageEventPacketRaw
(
TEACryptor
.
decrypt
(
data
,
sessionKey
).
dataInputStream
(),
data
.
size
,
packetId
);
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/event/ServerEventPacket.kt
0 → 100644
View file @
6350638e
package
net.mamoe.mirai.network.packet.server.event
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.utils.MiraiLogger
import
java.io.ByteArrayOutputStream
import
java.io.DataInputStream
import
java.util.zip.GZIPInputStream
/**
* @author Him188moe
*/
open
class
ServerEventPacket
(
input
:
DataInputStream
,
val
packetId
:
ByteArray
,
val
eventIdentity
:
ByteArray
)
:
ServerPacket
(
input
)
{
override
fun
decode
()
{
}
}
/**
* Android 客户端上线
*/
class
ServerAndroidOnlineEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
/**
* Android 客户端上线
*/
class
ServerAndroidOfflineEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
/**
* 群文件上传
*/
class
ServerGroupUploadFileEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
{
lateinit
var
message
:
String
override
fun
decode
()
{
message
=
String
(
this
.
input
.
goto
(
64
).
readNBytes
(
this
.
input
.
goto
(
60
).
readShort
().
toInt
()))
}
//todo test
}
class
ServerGroupMessageEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
{
var
group
:
Int
=
0
var
qq
:
Int
=
0
lateinit
var
message
:
String
lateinit
var
messageType
:
MessageType
enum
class
MessageType
{
NORMAL
,
XML
,
AT
,
IMAGE
,
OTHER
,
}
override
fun
decode
()
{
group
=
this
.
input
.
goto
(
51
).
readInt
()
qq
=
this
.
input
.
goto
(
56
).
readInt
()
val
fontLength
=
this
.
input
.
goto
(
108
).
readShort
()
println
(
this
.
toString
())
messageType
=
when
(
val
id
=
this
.
input
.
goto
(
110
+
fontLength
+
2
).
readByte
().
toInt
())
{
19
->
MessageType
.
NORMAL
14
->
MessageType
.
XML
2
->
MessageType
.
IMAGE
6
->
MessageType
.
AT
else
->
MessageType
.
OTHER
}
when
(
messageType
)
{
MessageType
.
NORMAL
->
{
val
gzippedMessage
=
this
.
input
.
goto
(
110
+
fontLength
+
16
).
readNBytes
(
this
.
input
.
goto
(
110
+
fontLength
+
3
).
readShort
().
toInt
()
-
11
)
ByteArrayOutputStream
().
let
{
GZIPInputStream
(
gzippedMessage
.
inputStream
()).
transferTo
(
it
)
message
=
String
(
it
.
toByteArray
())
}
}
MessageType
.
XML
->
{
val
gzippedMessage
=
this
.
input
.
goto
(
110
+
fontLength
+
9
).
readNBytes
(
this
.
input
.
goto
(
110
+
fontLength
+
3
).
readShort
().
toInt
()
-
4
)
ByteArrayOutputStream
().
let
{
GZIPInputStream
(
gzippedMessage
.
inputStream
()).
transferTo
(
it
)
message
=
String
(
it
.
toByteArray
())
}
}
MessageType
.
IMAGE
->
{
val
faceId
=
this
.
input
.
goto
(
110
+
fontLength
+
8
).
readByte
()
message
=
"[face${faceId}.gif]"
}
MessageType
.
AT
,
MessageType
.
OTHER
->
{
var
messageLength
:
Int
=
this
.
input
.
goto
(
110
+
fontLength
+
6
).
readShort
().
toInt
()
message
=
String
(
this
.
input
.
goto
(
110
+
fontLength
+
8
).
readNBytes
(
messageLength
))
val
oeLength
:
Int
if
(
this
.
input
.
readByte
().
toInt
()
==
6
)
{
oeLength
=
this
.
input
.
readShort
().
toInt
()
this
.
input
.
skip
(
4
)
val
messageLength2
=
this
.
input
.
readShort
().
toInt
()
val
message2
=
String
(
this
.
input
.
readNBytes
(
messageLength2
))
message
+=
message2
messageLength
+=
messageLength2
}
else
{
oeLength
=
this
.
input
.
readShort
().
toInt
()
}
//读取 nick, ignore.
/*
when (this.input.goto(110 + fontLength + 3 + oeLength).readByte().toInt()) {
12 -> {
this.input.skip(4)//maybe 5?
}
19 -> {
}
0x0E -> {
}
else -> {
}
}*/
}
}
MiraiLogger
info
this
.
toString
()
}
}
class
ServerFriendMessageEventPacket
(
input
:
DataInputStream
,
packetId
:
ByteArray
,
eventIdentity
:
ByteArray
)
:
ServerEventPacket
(
input
,
packetId
,
eventIdentity
)
{
override
fun
decode
()
{
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerVerificationCodePacket.kt
0 → 100644
View file @
6350638e
package
net.mamoe.mirai.network.packet.server.login
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.util.TEACryptor
import
java.io.DataInputStream
/**
* @author Him188moe
*/
class
ServerVerificationCodePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
lateinit
var
verifyCode
:
ByteArray
lateinit
var
verifyToken
:
ByteArray
var
unknownBoolean
:
Boolean
?
=
null
lateinit
var
token00BA
:
ByteArray
var
count
:
Int
=
0
@ExperimentalUnsignedTypes
override
fun
decode
()
{
TODO
()
val
verifyCodeLength
=
this
.
input
.
goto
(
78
).
readShort
()
//2bytes
this
.
verifyCode
=
this
.
input
.
readNBytes
(
verifyCodeLength
.
toInt
())
this
.
input
.
skip
(
1
)
this
.
unknownBoolean
=
this
.
input
.
readByte
().
toInt
()
==
1
//this.token00BA = this.input.goto(packetLength - 60).readNBytes(40)
}
}
class
ServerVerificationCodePacketEncrypted
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
override
fun
decode
()
{
}
fun
decrypt
(
token00BA
:
ByteArray
):
ServerVerificationCodePacket
{
this
.
input
goto
14
val
data
=
TEACryptor
.
decrypt
(
token00BA
,
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
});
return
ServerVerificationCodePacket
(
data
.
dataInputStream
())
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacket.kt
View file @
6350638e
...
@@ -53,11 +53,6 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, val dataLengt
...
@@ -53,11 +53,6 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, val dataLengt
}
}
}
}
/**
* Encrypted using [0828_rec_decr_key], decrypting in RobotNetworkHandler
*
* @author Him188moe
*/
class
ServerSessionKeyResponsePacketEncrypted
(
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
class
ServerSessionKeyResponsePacketEncrypted
(
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
override
fun
decode
()
{
override
fun
decode
()
{
...
...
mirai-core/src/main/java/net/mamoe/mirai/task/MiraiTaskManager.java
View file @
6350638e
...
@@ -10,14 +10,11 @@ import java.util.concurrent.atomic.AtomicInteger;
...
@@ -10,14 +10,11 @@ import java.util.concurrent.atomic.AtomicInteger;
import
java.util.function.Consumer
;
import
java.util.function.Consumer
;
import
java.util.function.Predicate
;
import
java.util.function.Predicate
;
public
class
MiraiTaskManager
{
public
final
class
MiraiTaskManager
{
private
static
MiraiTaskManager
instance
;
private
static
MiraiTaskManager
instance
=
new
MiraiTaskManager
()
;
public
static
MiraiTaskManager
getInstance
(){
public
static
MiraiTaskManager
getInstance
()
{
if
(
MiraiTaskManager
.
instance
==
null
){
MiraiTaskManager
.
instance
=
new
MiraiTaskManager
();
}
return
MiraiTaskManager
.
instance
;
return
MiraiTaskManager
.
instance
;
}
}
...
@@ -34,19 +31,19 @@ public class MiraiTaskManager {
...
@@ -34,19 +31,19 @@ public class MiraiTaskManager {
}
}
/**
/**
基础Future处理
*
基础Future处理
*/
*/
public
void
execute
(
Runnable
runnable
){
public
void
execute
(
Runnable
runnable
)
{
this
.
execute
(
runnable
,
MiraiTaskExceptionHandler
.
byDefault
());
this
.
execute
(
runnable
,
MiraiTaskExceptionHandler
.
byDefault
());
}
}
public
void
execute
(
Runnable
runnable
,
MiraiTaskExceptionHandler
handler
){
public
void
execute
(
Runnable
runnable
,
MiraiTaskExceptionHandler
handler
)
{
this
.
pool
.
execute
(()
->
this
.
pool
.
execute
(()
->
{
{
try
{
try
{
runnable
.
run
();
runnable
.
run
();
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
handler
.
onHandle
(
e
);
handler
.
onHandle
(
e
);
}
}
});
});
...
@@ -69,13 +66,13 @@ public class MiraiTaskManager {
...
@@ -69,13 +66,13 @@ public class MiraiTaskManager {
}
}
/**
/**
异步任务
*
异步任务
*/
*/
public
<
D
>
void
ansycTask
(
Callable
<
D
>
callable
,
Consumer
<
D
>
callback
){
public
<
D
>
void
ansycTask
(
Callable
<
D
>
callable
,
Consumer
<
D
>
callback
)
{
this
.
ansycTask
(
callable
,
callback
,
MiraiTaskExceptionHandler
.
byDefault
());
this
.
ansycTask
(
callable
,
callback
,
MiraiTaskExceptionHandler
.
byDefault
());
}
}
public
<
D
>
void
ansycTask
(
Callable
<
D
>
callable
,
Consumer
<
D
>
callback
,
MiraiTaskExceptionHandler
handler
)
{
public
<
D
>
void
ansycTask
(
Callable
<
D
>
callable
,
Consumer
<
D
>
callback
,
MiraiTaskExceptionHandler
handler
)
{
this
.
pool
.
execute
(()
->
{
this
.
pool
.
execute
(()
->
{
try
{
try
{
callback
.
accept
(
callable
.
call
());
callback
.
accept
(
callable
.
call
());
...
@@ -86,7 +83,7 @@ public class MiraiTaskManager {
...
@@ -86,7 +83,7 @@ public class MiraiTaskManager {
}
}
/**
/**
定时任务
*
定时任务
*/
*/
public
void
repeatingTask
(
Runnable
runnable
,
long
intervalMillis
)
{
public
void
repeatingTask
(
Runnable
runnable
,
long
intervalMillis
)
{
...
@@ -102,12 +99,13 @@ public class MiraiTaskManager {
...
@@ -102,12 +99,13 @@ public class MiraiTaskManager {
}
}
public
void
repeatingTask
(
Runnable
runnable
,
long
intervalMillis
,
int
times
,
MiraiTaskExceptionHandler
handler
)
{
public
void
repeatingTask
(
Runnable
runnable
,
long
intervalMillis
,
int
times
,
MiraiTaskExceptionHandler
handler
)
{
AtomicInteger
integer
=
new
AtomicInteger
(
times
-
1
);
AtomicInteger
integer
=
new
AtomicInteger
(
times
-
1
);
this
.
repeatingTask
(
this
.
repeatingTask
(
runnable
,
intervalMillis
,
a
->
integer
.
getAndDecrement
()
>
0
,
handler
runnable
,
intervalMillis
,
a
->
integer
.
getAndDecrement
()
>
0
,
handler
);
);
}
}
public
<
D
extends
Runnable
>
void
repeatingTask
(
D
runnable
,
long
intervalMillis
,
Predicate
<
D
>
shouldContinue
,
MiraiTaskExceptionHandler
handler
)
{
public
<
D
extends
Runnable
>
void
repeatingTask
(
D
runnable
,
long
intervalMillis
,
Predicate
<
D
>
shouldContinue
,
MiraiTaskExceptionHandler
handler
)
{
new
Thread
(()
->
{
new
Thread
(()
->
{
do
{
do
{
...
@@ -129,7 +127,7 @@ public class MiraiTaskManager {
...
@@ -129,7 +127,7 @@ public class MiraiTaskManager {
public
void
deletingTask
(
Runnable
runnable
,
long
intervalMillis
)
{
public
void
deletingTask
(
Runnable
runnable
,
long
intervalMillis
)
{
new
Thread
(()
->
{
new
Thread
(()
->
{
try
{
try
{
Thread
.
sleep
(
intervalMillis
);
Thread
.
sleep
(
intervalMillis
);
}
catch
(
InterruptedException
e
)
{
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
...
...
mirai-core/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java
View file @
6350638e
package
net.mamoe.mirai.task
;
package
net.mamoe.mirai.task
;
import
java.io.Closeable
;
import
java.io.Closeable
;
import
java.util.concurrent.SynchronousQueue
;
import
java.util.concurrent.ScheduledThreadPoolExecutor
;
import
java.util.concurrent.ThreadPoolExecutor
;
import
java.util.concurrent.TimeUnit
;
public
final
class
MiraiThreadPool
extends
ThreadPoolExecutor
implements
Closeable
{
public
final
class
MiraiThreadPool
extends
ScheduledThreadPoolExecutor
implements
Closeable
{
private
static
MiraiThreadPool
instance
=
new
MiraiThreadPool
();
protected
MiraiThreadPool
(){
public
static
MiraiThreadPool
getInstance
()
{
super
(
0
,
return
instance
;
}
MiraiThreadPool
()
{
super
(
0
);
/*super(0,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
60L,
60L,
TimeUnit.SECONDS,
TimeUnit.SECONDS,
new SynchronousQueue<>()
new SynchronousQueue<>()
);
);
*/
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/utils/MiraiLogger.kt
View file @
6350638e
...
@@ -11,6 +11,10 @@ object MiraiLogger {
...
@@ -11,6 +11,10 @@ object MiraiLogger {
this
.
print
(
o
.
toString
())
this
.
print
(
o
.
toString
())
}
}
infix
fun
error
(
o
:
Any
?)
{
this
.
print
(
o
.
toString
(),
LoggerTextFormat
.
RED
)
}
infix
fun
log
(
o
:
Any
?)
=
info
(
o
)
infix
fun
log
(
o
:
Any
?)
=
info
(
o
)
infix
fun
println
(
o
:
Any
?)
=
info
(
o
)
infix
fun
println
(
o
:
Any
?)
=
info
(
o
)
...
@@ -27,11 +31,10 @@ object MiraiLogger {
...
@@ -27,11 +31,10 @@ object MiraiLogger {
this.print(e.cause.toString())*/
this.print(e.cause.toString())*/
}
}
private
fun
print
(
value
:
String
?)
{
private
fun
print
(
value
:
String
?
,
color
:
LoggerTextFormat
=
LoggerTextFormat
.
BLUE
)
{
val
s
=
SimpleDateFormat
(
"MM-dd HH:mm:ss"
).
format
(
Date
())
val
s
=
SimpleDateFormat
(
"MM-dd HH:mm:ss"
).
format
(
Date
())
kotlin
.
io
.
println
(
LoggerTextFormat
.
BLUE
.
toString
()
+
"
[Mirai] $s : $value"
)
kotlin
.
io
.
println
(
"$color
[Mirai] $s : $value"
)
}
}
}
}
...
...
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