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
b488bee0
Commit
b488bee0
authored
Sep 14, 2019
by
Him188moe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
updated
parent
ff0acc87
Changes
24
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
367 additions
and
179 deletions
+367
-179
mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
+1
-15
mirai-core/src/main/java/net/mamoe/mirai/event/events/bot/BotEvent.java
.../main/java/net/mamoe/mirai/event/events/bot/BotEvent.java
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/event/events/group/GroupMessageEvent.java
...net/mamoe/mirai/event/events/group/GroupMessageEvent.java
+10
-10
mirai-core/src/main/java/net/mamoe/mirai/event/events/qq/FriendEvent.java
...ain/java/net/mamoe/mirai/event/events/qq/FriendEvent.java
+5
-5
mirai-core/src/main/java/net/mamoe/mirai/event/events/qq/FriendMessageEvent.java
...a/net/mamoe/mirai/event/events/qq/FriendMessageEvent.java
+4
-4
mirai-core/src/main/java/net/mamoe/mirai/message/FaceID.java
mirai-core/src/main/java/net/mamoe/mirai/message/FaceID.java
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/message/Message.kt
mirai-core/src/main/java/net/mamoe/mirai/message/Message.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/message/MessageId.kt
...i-core/src/main/java/net/mamoe/mirai/message/MessageId.kt
+3
-3
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/Face.kt
...re/src/main/java/net/mamoe/mirai/message/defaults/Face.kt
+15
-0
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/Image.kt
...e/src/main/java/net/mamoe/mirai/message/defaults/Image.kt
+47
-9
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/PlainText.kt
...c/main/java/net/mamoe/mirai/message/defaults/PlainText.kt
+9
-0
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/UnsolvedImage.kt
...in/java/net/mamoe/mirai/message/defaults/UnsolvedImage.kt
+9
-9
mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt
mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/handler/ActionPacketHandler.kt
...va/net/mamoe/mirai/network/handler/ActionPacketHandler.kt
+6
-6
mirai-core/src/main/java/net/mamoe/mirai/network/handler/MessagePacketHandler.kt
...a/net/mamoe/mirai/network/handler/MessagePacketHandler.kt
+36
-18
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
...c/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
+109
-53
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerPacket.kt
.../main/java/net/mamoe/mirai/network/packet/ServerPacket.kt
+47
-10
mirai-core/src/main/java/net/mamoe/mirai/network/packet/UnknownServerPacket.kt
...ava/net/mamoe/mirai/network/packet/UnknownServerPacket.kt
+6
-0
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
+13
-11
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
.../net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
+11
-15
mirai-core/src/main/java/net/mamoe/mirai/utils/ImageNetworkUtils.java
...rc/main/java/net/mamoe/mirai/utils/ImageNetworkUtils.java
+6
-6
mirai-core/src/main/java/net/mamoe/mirai/utils/Utils.kt
mirai-core/src/main/java/net/mamoe/mirai/utils/Utils.kt
+22
-0
mirai-core/src/test/java/HexComparator.java
mirai-core/src/test/java/HexComparator.java
+3
-0
No files found.
mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
View file @
b488bee0
...
@@ -213,21 +213,7 @@ public final class MiraiServer {
...
@@ -213,21 +213,7 @@ public final class MiraiServer {
String
qqList
=
String
qqList
=
"2573990098----qq123456789\n"
+
"3034551466----zxcvbnm\n"
;
"3303923865----q123456789\n"
+
"3349933294----q123456789\n"
+
"3303708824----q123456789\n"
+
"3227036647----q123456789\n"
+
"3451394431----q123456789\n"
+
"3533243484----q123456789\n"
+
"3364512686----q123456789\n"
+
"3137567463----q123456789\n"
+
"3414786399----q123456789\n"
+
"3347405939----q123456789\n"
+
"3544089622----q123456789\n"
+
"3108512993----q123456789\n"
+
"2985563549----q123456789\n"
+
"3463531892----q123456789\n"
;
private
Bot
getAvailableBot
()
throws
ExecutionException
,
InterruptedException
{
private
Bot
getAvailableBot
()
throws
ExecutionException
,
InterruptedException
{
for
(
String
it
:
qqList
.
split
(
"\n"
))
{
for
(
String
it
:
qqList
.
split
(
"\n"
))
{
...
...
mirai-core/src/main/java/net/mamoe/mirai/event/events/bot/BotEvent.java
View file @
b488bee0
...
@@ -10,7 +10,7 @@ import java.util.Objects;
...
@@ -10,7 +10,7 @@ import java.util.Objects;
* @author Him188moe
* @author Him188moe
*/
*/
public
abstract
class
BotEvent
extends
MiraiEvent
{
public
abstract
class
BotEvent
extends
MiraiEvent
{
p
rivate
final
Bot
bot
;
p
ublic
final
Bot
bot
;
public
BotEvent
(
@NotNull
Bot
bot
)
{
public
BotEvent
(
@NotNull
Bot
bot
)
{
this
.
bot
=
Objects
.
requireNonNull
(
bot
);
this
.
bot
=
Objects
.
requireNonNull
(
bot
);
...
...
mirai-core/src/main/java/net/mamoe/mirai/event/events/group/GroupMessageEvent.java
View file @
b488bee0
...
@@ -10,25 +10,25 @@ import org.jetbrains.annotations.NotNull;
...
@@ -10,25 +10,25 @@ import org.jetbrains.annotations.NotNull;
* @author Him188moe
* @author Him188moe
*/
*/
public
final
class
GroupMessageEvent
extends
GroupEvent
{
public
final
class
GroupMessageEvent
extends
GroupEvent
{
p
rivate
final
QQ
sender
;
p
ublic
final
QQ
sender
;
p
rivate
final
MessageChain
messageC
hain
;
p
ublic
final
MessageChain
c
hain
;
p
rivate
final
String
messageString
;
p
ublic
final
String
message
;
public
GroupMessageEvent
(
@NotNull
Bot
bot
,
@NotNull
Group
group
,
@NotNull
QQ
sender
,
@NotNull
MessageChain
messageC
hain
)
{
public
GroupMessageEvent
(
@NotNull
Bot
bot
,
@NotNull
Group
group
,
@NotNull
QQ
sender
,
@NotNull
MessageChain
c
hain
)
{
super
(
bot
,
group
);
super
(
bot
,
group
);
this
.
sender
=
sender
;
this
.
sender
=
sender
;
this
.
messageChain
=
messageC
hain
;
this
.
chain
=
c
hain
;
this
.
message
String
=
messageC
hain
.
toString
();
this
.
message
=
c
hain
.
toString
();
}
}
@NotNull
@NotNull
public
MessageChain
get
Message
Chain
()
{
public
MessageChain
getChain
()
{
return
messageC
hain
;
return
c
hain
;
}
}
@NotNull
@NotNull
public
String
getMessage
String
()
{
public
String
getMessage
()
{
return
message
String
;
return
message
;
}
}
@NotNull
@NotNull
...
...
mirai-core/src/main/java/net/mamoe/mirai/event/events/qq/FriendEvent.java
View file @
b488bee0
...
@@ -11,15 +11,15 @@ import java.util.Objects;
...
@@ -11,15 +11,15 @@ import java.util.Objects;
* @author Him188moe
* @author Him188moe
*/
*/
public
abstract
class
FriendEvent
extends
BotEvent
{
public
abstract
class
FriendEvent
extends
BotEvent
{
p
rivate
final
QQ
qq
;
p
ublic
final
QQ
sender
;
public
FriendEvent
(
@NotNull
Bot
bot
,
@NotNull
QQ
qq
)
{
public
FriendEvent
(
@NotNull
Bot
bot
,
@NotNull
QQ
sender
)
{
super
(
bot
);
super
(
bot
);
this
.
qq
=
Objects
.
requireNonNull
(
qq
);
this
.
sender
=
Objects
.
requireNonNull
(
sender
);
}
}
@NotNull
@NotNull
public
QQ
get
QQ
()
{
public
QQ
get
Sender
()
{
return
qq
;
return
sender
;
}
}
}
}
mirai-core/src/main/java/net/mamoe/mirai/event/events/qq/FriendMessageEvent.java
View file @
b488bee0
...
@@ -11,15 +11,15 @@ import java.util.Objects;
...
@@ -11,15 +11,15 @@ import java.util.Objects;
* @author Him188moe
* @author Him188moe
*/
*/
public
final
class
FriendMessageEvent
extends
FriendEvent
{
public
final
class
FriendMessageEvent
extends
FriendEvent
{
p
rivate
final
MessageChain
messageChain
;
p
ublic
final
MessageChain
message
;
public
FriendMessageEvent
(
@NotNull
Bot
bot
,
@NotNull
QQ
sender
,
@NotNull
MessageChain
message
Chain
)
{
public
FriendMessageEvent
(
@NotNull
Bot
bot
,
@NotNull
QQ
sender
,
@NotNull
MessageChain
message
)
{
super
(
bot
,
sender
);
super
(
bot
,
sender
);
this
.
message
Chain
=
Objects
.
requireNonNull
(
messageChain
);
this
.
message
=
Objects
.
requireNonNull
(
message
);
}
}
@NotNull
@NotNull
public
MessageChain
message
()
{
public
MessageChain
message
()
{
return
message
Chain
;
return
message
;
}
}
}
}
mirai-core/src/main/java/net/mamoe/mirai/message/FaceID.java
View file @
b488bee0
...
@@ -166,7 +166,7 @@ public enum FaceID {
...
@@ -166,7 +166,7 @@ public enum FaceID {
return
value
;
return
value
;
}
}
}
}
return
null
;
return
FaceID
.
unknown
;
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/message/Message.kt
View file @
b488bee0
...
@@ -74,7 +74,7 @@ abstract class Message {
...
@@ -74,7 +74,7 @@ abstract class Message {
/**
/**
* 比较两个 Message 的内容是否相等. 如:
* 比较两个 Message 的内容是否相等. 如:
* - [PlainText] 比较 [PlainText.text]
* - [PlainText] 比较 [PlainText.text]
* - [Image] 比较 [Image.imageI
D
]
* - [Image] 比较 [Image.imageI
d
]
*/
*/
abstract
infix
fun
valueEquals
(
another
:
Message
):
Boolean
abstract
infix
fun
valueEquals
(
another
:
Message
):
Boolean
...
...
mirai-core/src/main/java/net/mamoe/mirai/message/MessageId.kt
View file @
b488bee0
...
@@ -10,13 +10,13 @@ package net.mamoe.mirai.message
...
@@ -10,13 +10,13 @@ package net.mamoe.mirai.message
*/
*/
object
MessageId
{
object
MessageId
{
const
val
AT
:
Int
=
0
x0
0
//todo 不知道是多少
const
val
AT
:
Int
=
0
x0
6
const
val
FACE
:
Int
=
0
x0
0
//todo 不知道是多少
const
val
FACE
:
Int
=
0
x0
2
const
val
TEXT
:
Int
=
0
x01
const
val
TEXT
:
Int
=
0
x01
const
val
IMAGE
:
Int
=
0
x0
6
const
val
IMAGE
:
Int
=
0
x0
3
const
val
CHAIN
:
Int
=
0
xff
//仅用于 equals. Packet 中不存在 Chain 概念
const
val
CHAIN
:
Int
=
0
xff
//仅用于 equals. Packet 中不存在 Chain 概念
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/Face.kt
View file @
b488bee0
...
@@ -3,8 +3,10 @@ package net.mamoe.mirai.message.defaults
...
@@ -3,8 +3,10 @@ package net.mamoe.mirai.message.defaults
import
net.mamoe.mirai.message.FaceID
import
net.mamoe.mirai.message.FaceID
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.network.packet.readLVNumber
import
net.mamoe.mirai.network.packet.writeHex
import
net.mamoe.mirai.network.packet.writeHex
import
net.mamoe.mirai.network.packet.writeLVByteArray
import
net.mamoe.mirai.network.packet.writeLVByteArray
import
net.mamoe.mirai.utils.lazyDecode
import
net.mamoe.mirai.utils.lazyEncode
import
net.mamoe.mirai.utils.lazyEncode
/**
/**
...
@@ -41,5 +43,18 @@ class Face(val id: FaceID) : Message() {
...
@@ -41,5 +43,18 @@ class Face(val id: FaceID) : Message() {
}
}
return
this
.
id
==
another
.
id
return
this
.
id
==
another
.
id
}
}
companion
object
{
fun
ofByteArray
(
data
:
ByteArray
):
Face
=
lazyDecode
(
data
)
{
//00 01 AF 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 F0
//00 01 0C 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 4D
it
.
skip
(
1
)
val
id1
=
FaceID
.
ofId
(
it
.
readLVNumber
().
toInt
())
//可能这个是id, 也可能下面那个
it
.
skip
(
it
.
readByte
().
toLong
())
it
.
readLVNumber
()
//某id?
return
@
lazyDecode
Face
(
id1
)
}
}
}
}
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/Image.kt
View file @
b488bee0
...
@@ -2,30 +2,33 @@ package net.mamoe.mirai.message.defaults
...
@@ -2,30 +2,33 @@ package net.mamoe.mirai.message.defaults
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.network.packet.writeHex
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.writeLVByteArray
import
net.mamoe.mirai.utils.lazyDecode
import
net.mamoe.mirai.network.packet.writeLVString
import
net.mamoe.mirai.utils.lazyEncode
import
net.mamoe.mirai.utils.lazyEncode
import
net.mamoe.mirai.utils.skip
import
net.mamoe.mirai.utils.toUHexString
/**
/**
* 图片消息.
* 图片消息.
* 由接收消息时构建, 可直接发送
* 由接收消息时构建, 可直接发送
*
*
* @param imageId 类似 `{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg`. 群的是大写id, 好友的是小写id
*
* @author Him188moe
* @author Him188moe
*/
*/
open
class
Image
internal
constructor
(
val
imageI
D
:
String
)
:
Message
()
{
open
class
Image
internal
constructor
(
val
imageI
d
:
String
)
:
Message
()
{
override
val
type
:
Int
=
MessageId
.
IMAGE
override
val
type
:
Int
=
MessageId
.
IMAGE
override
fun
toStringImpl
():
String
{
override
fun
toStringImpl
():
String
{
return
imageI
D
return
imageI
d
}
}
override
fun
toByteArray
():
ByteArray
=
lazyEncode
{
section
->
override
fun
toByteArray
():
ByteArray
=
lazyEncode
{
section
->
section
.
writeByte
(
0
x03
)
//todo 可能是 0x03?
section
.
writeByte
(
MessageId
.
IMAGE
)
section
.
writeLVByteArray
(
lazyEncode
{
child
->
section
.
writeLVByteArray
(
lazyEncode
{
child
->
child
.
writeByte
(
0
x02
)
child
.
writeByte
(
0
x02
)
child
.
writeLVString
(
this
.
imageI
D
)
child
.
writeLVString
(
this
.
imageI
d
)
child
.
writeHex
(
"04 00 "
+
child
.
writeHex
(
"04 00 "
+
"04 9B 53 B0 08 "
+
"04 9B 53 B0 08 "
+
"05 00 "
+
"05 00 "
+
...
@@ -35,16 +38,51 @@ open class Image internal constructor(val imageID: String) : Message() {
...
@@ -35,16 +38,51 @@ open class Image internal constructor(val imageID: String) : Message() {
"07 00 "
+
"07 00 "
+
"01 43 08 00 00 09 00 01 01 0B 00 00 14 00 04 11 00 00 00 15 00 04 00 00 02 BC 16 00 04 00 00 02 BC 18 00 04 00 00 7D 5E FF 00 5C 15 36 20 39 32 6B 41 31 43 39 62 35 33 62 30 30 38 64 39 38 61 35 61 37 30 20"
)
"01 43 08 00 00 09 00 01 01 0B 00 00 14 00 04 11 00 00 00 15 00 04 00 00 02 BC 16 00 04 00 00 02 BC 18 00 04 00 00 7D 5E FF 00 5C 15 36 20 39 32 6B 41 31 43 39 62 35 33 62 30 30 38 64 39 38 61 35 61 37 30 20"
)
child
.
writeHex
(
"20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20"
)
child
.
writeHex
(
"20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20"
)
child
.
writeBytes
(
this
.
imageI
D
)
child
.
writeBytes
(
this
.
imageI
d
)
child
.
writeByte
(
0
x41
)
child
.
writeByte
(
0
x41
)
})
})
}
}
override
fun
valueEquals
(
another
:
Message
):
Boolean
{
override
fun
valueEquals
(
another
:
Message
):
Boolean
{
if
(
another
is
Image
)
{
if
(
another
is
Image
)
{
return
this
.
imageI
D
==
another
.
imageID
return
this
.
imageI
d
==
another
.
imageId
}
}
return
false
return
false
}
}
companion
object
{
@JvmStatic
fun
ofByteArray0x06
(
data
:
ByteArray
):
Image
=
lazyDecode
(
data
)
{
it
.
skip
(
1
)
println
(
"好友的图片"
)
println
(
data
.
toUHexString
())
val
filenameLength
=
it
.
readShort
()
val
suffix
=
it
.
readString
(
filenameLength
).
substringAfter
(
"."
)
it
.
skip
(
data
.
size
-
37
-
1
-
filenameLength
-
2
)
val
imageId
=
String
(
it
.
readNBytes
(
36
))
println
(
imageId
)
it
.
skip
(
1
)
//0x41
return
@
lazyDecode
Image
(
"{$imageId}.$suffix"
)
}
@JvmStatic
fun
ofByteArray0x03
(
data
:
ByteArray
):
Image
=
lazyDecode
(
data
)
{
it
.
skip
(
1
)
return
@
lazyDecode
Image
(
String
(
it
.
readLVByteArray
()))
/*
println(String(it.readLVByteArray()))
it.readTLVMap()
return@lazyDecode Image(String(it.readLVByteArray().cutTail(5).getRight(42)))
/
it.skip(data.size - 47)
val imageId = String(it.readNBytes(42))
it.skip(1)//0x41
it.skip(1)//0x42
it.skip(1)//0x43
it.skip(1)//0x41
return@lazyDecode Image(imageId)*/
}
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/PlainText.kt
View file @
b488bee0
...
@@ -2,8 +2,10 @@ package net.mamoe.mirai.message.defaults
...
@@ -2,8 +2,10 @@ package net.mamoe.mirai.message.defaults
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.network.packet.readLVString
import
net.mamoe.mirai.network.packet.writeLVByteArray
import
net.mamoe.mirai.network.packet.writeLVByteArray
import
net.mamoe.mirai.network.packet.writeLVString
import
net.mamoe.mirai.network.packet.writeLVString
import
net.mamoe.mirai.utils.lazyDecode
import
net.mamoe.mirai.utils.lazyEncode
import
net.mamoe.mirai.utils.lazyEncode
/**
/**
...
@@ -31,4 +33,11 @@ class PlainText(private val text: String) : Message() {
...
@@ -31,4 +33,11 @@ class PlainText(private val text: String) : Message() {
}
}
return
this
.
text
==
another
.
text
return
this
.
text
==
another
.
text
}
}
companion
object
{
fun
ofByteArray
(
data
:
ByteArray
):
PlainText
=
lazyDecode
(
data
)
{
it
.
skip
(
1
)
PlainText
(
it
.
readLVString
())
}
}
}
}
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/UnsolvedImage.kt
View file @
b488bee0
...
@@ -3,9 +3,9 @@ package net.mamoe.mirai.message.defaults
...
@@ -3,9 +3,9 @@ package net.mamoe.mirai.message.defaults
import
net.mamoe.mirai.contact.Contact
import
net.mamoe.mirai.contact.Contact
import
net.mamoe.mirai.network.LoginSession
import
net.mamoe.mirai.network.LoginSession
import
net.mamoe.mirai.network.packet.image.ClientTryGetImageIDPacket
import
net.mamoe.mirai.network.packet.image.ClientTryGetImageIDPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
FailedPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
FailedPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
ResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
ResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
SuccessPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
SuccessPacket
import
net.mamoe.mirai.network.packet.md5
import
net.mamoe.mirai.network.packet.md5
import
net.mamoe.mirai.utils.ImageNetworkUtils
import
net.mamoe.mirai.utils.ImageNetworkUtils
import
net.mamoe.mirai.utils.toByteArray
import
net.mamoe.mirai.utils.toByteArray
...
@@ -27,16 +27,16 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage
...
@@ -27,16 +27,16 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage
constructor
(
url
:
URL
)
:
this
(
File
(
url
.
file
))
constructor
(
url
:
URL
)
:
this
(
File
(
url
.
file
))
fun
upload
(
session
:
LoginSession
,
contact
:
Contact
):
CompletableFuture
<
Unit
>
{
fun
upload
(
session
:
LoginSession
,
contact
:
Contact
):
CompletableFuture
<
Unit
>
{
return
session
.
expectPacket
<
ServerTry
UploadGroupImage
ResponsePacket
>
{
return
session
.
expectPacket
<
ServerTry
GetImageID
ResponsePacket
>
{
toSend
{
ClientTryGetImageIDPacket
(
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
,
session
.
bot
.
account
.
qqN
umber
,
image
)
}
toSend
{
ClientTryGetImageIDPacket
(
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
,
contact
.
n
umber
,
image
)
}
expect
{
expect
{
when
(
it
)
{
when
(
it
)
{
is
ServerTry
UploadGroupImage
FailedPacket
->
{
is
ServerTry
GetImageID
FailedPacket
->
{
//已经存在于服务器了
//已经存在于服务器了
}
}
is
ServerTry
UploadGroupImage
SuccessPacket
->
{
is
ServerTry
GetImageID
SuccessPacket
->
{
val
data
=
image
.
toByteArray
()
val
data
=
image
.
toByteArray
()
if
(!
ImageNetworkUtils
.
postImage
(
it
.
uKey
.
toUHexString
(),
data
.
size
,
session
.
bot
.
account
.
qqNumber
,
contact
.
number
,
data
))
{
if
(!
ImageNetworkUtils
.
postImage
(
it
.
uKey
.
toUHexString
(),
data
.
size
,
session
.
bot
.
account
.
qqNumber
,
contact
.
number
,
data
))
{
throw
RuntimeException
(
"cannot upload image"
)
throw
RuntimeException
(
"cannot upload image"
)
...
@@ -56,8 +56,8 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage
...
@@ -56,8 +56,8 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage
return
"{"
+
md5
.
copyOfRange
(
0
,
4
).
toUHexString
(
""
)
+
"-"
return
"{"
+
md5
.
copyOfRange
(
0
,
4
).
toUHexString
(
""
)
+
"-"
.
plus
(
md5
.
copyOfRange
(
4
,
6
).
toUHexString
(
""
))
+
"-"
.
plus
(
md5
.
copyOfRange
(
4
,
6
).
toUHexString
(
""
))
+
"-"
.
plus
(
md5
.
copyOfRange
(
6
,
8
).
toUHexString
(
""
))
+
"-"
.
plus
(
md5
.
copyOfRange
(
6
,
8
).
toUHexString
(
""
))
+
"-"
.
plus
(
md5
.
copyOfRange
(
8
,
1
2
).
toUHexString
(
""
))
+
"-"
.
plus
(
md5
.
copyOfRange
(
8
,
1
0
).
toUHexString
(
""
))
+
"-"
.
plus
(
md5
.
copyOfRange
(
1
2
,
16
).
toUHexString
(
""
))
+
"}."
+
if
(
filename
.
endsWith
(
".jpeg"
))
"jpg"
else
filename
.
substringAfter
(
"."
,
"jpg"
)
.
plus
(
md5
.
copyOfRange
(
1
0
,
16
).
toUHexString
(
""
))
+
"}."
+
if
(
filename
.
endsWith
(
".jpeg"
))
"jpg"
else
filename
.
substringAfter
(
"."
,
"jpg"
)
}
}
}
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt
View file @
b488bee0
...
@@ -70,7 +70,7 @@ object Protocol {
...
@@ -70,7 +70,7 @@ object Protocol {
* 发送/接受消息中的一个const (?)
* 发送/接受消息中的一个const (?)
* length=15
* length=15
*/
*/
const
val
friendM
essageConst1
=
"00 00 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91"
const
val
m
essageConst1
=
"00 00 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91"
private
val
hexToByteArrayCacheMap
:
MutableMap
<
Int
,
ByteArray
>
=
mutableMapOf
()
private
val
hexToByteArrayCacheMap
:
MutableMap
<
Int
,
ByteArray
>
=
mutableMapOf
()
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/handler/ActionPacketHandler.kt
View file @
b488bee0
...
@@ -6,9 +6,9 @@ import net.mamoe.mirai.network.packet.action.AddFriendResult
...
@@ -6,9 +6,9 @@ import net.mamoe.mirai.network.packet.action.AddFriendResult
import
net.mamoe.mirai.network.packet.action.ClientAddFriendPacket
import
net.mamoe.mirai.network.packet.action.ClientAddFriendPacket
import
net.mamoe.mirai.network.packet.action.ClientCanAddFriendPacket
import
net.mamoe.mirai.network.packet.action.ClientCanAddFriendPacket
import
net.mamoe.mirai.network.packet.action.ServerCanAddFriendResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerCanAddFriendResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
FailedPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
FailedPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
ResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
ResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
SuccessPacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
SuccessPacket
import
net.mamoe.mirai.task.MiraiThreadPool
import
net.mamoe.mirai.task.MiraiThreadPool
import
net.mamoe.mirai.utils.getGTK
import
net.mamoe.mirai.utils.getGTK
import
java.awt.image.BufferedImage
import
java.awt.image.BufferedImage
...
@@ -39,15 +39,15 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -39,15 +39,15 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
it
.
onPacketReceived
(
packet
)
it
.
onPacketReceived
(
packet
)
}
}
}
}
is
ServerTry
UploadGroupImage
SuccessPacket
->
{
is
ServerTry
GetImageID
SuccessPacket
->
{
// ImageNetworkUtils.postImage(packet.uKey.toUHexString(), )
// ImageNetworkUtils.postImage(packet.uKey.toUHexString(), )
}
}
is
ServerTry
UploadGroupImage
FailedPacket
->
{
is
ServerTry
GetImageID
FailedPacket
->
{
}
}
is
ServerTry
UploadGroupImage
ResponsePacket
.
Encrypted
->
session
.
socket
.
distributePacket
(
packet
.
decrypt
(
session
.
sessionKey
))
is
ServerTry
GetImageID
ResponsePacket
.
Encrypted
->
session
.
socket
.
distributePacket
(
packet
.
decrypt
(
session
.
sessionKey
))
is
ServerAccountInfoResponsePacket
.
Encrypted
->
session
.
socket
.
distributePacket
(
packet
.
decrypt
(
session
.
sessionKey
))
is
ServerAccountInfoResponsePacket
.
Encrypted
->
session
.
socket
.
distributePacket
(
packet
.
decrypt
(
session
.
sessionKey
))
is
ServerAccountInfoResponsePacket
->
{
is
ServerAccountInfoResponsePacket
->
{
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/handler/MessagePacketHandler.kt
View file @
b488bee0
...
@@ -2,18 +2,21 @@ package net.mamoe.mirai.network.handler
...
@@ -2,18 +2,21 @@ package net.mamoe.mirai.network.handler
import
net.mamoe.mirai.contact.Group
import
net.mamoe.mirai.contact.Group
import
net.mamoe.mirai.contact.QQ
import
net.mamoe.mirai.contact.QQ
import
net.mamoe.mirai.event.events.group.GroupMessageEvent
import
net.mamoe.mirai.event.events.qq.FriendMessageEvent
import
net.mamoe.mirai.event.events.qq.FriendMessageEvent
import
net.mamoe.mirai.event.hookWhile
import
net.mamoe.mirai.event.hookWhile
import
net.mamoe.mirai.message.defaults.Image
import
net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.message.defaults.PlainText
import
net.mamoe.mirai.message.defaults.PlainText
import
net.mamoe.mirai.message.defaults.UnsolvedImage
import
net.mamoe.mirai.network.LoginSession
import
net.mamoe.mirai.network.LoginSession
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.ServerFriendMessageEventPacket
import
net.mamoe.mirai.network.packet.ServerGroupMessageEventPacket
import
net.mamoe.mirai.network.packet.ServerGroupUploadFileEventPacket
import
net.mamoe.mirai.network.packet.ServerPacket
import
net.mamoe.mirai.network.packet.action.ClientSendFriendMessagePacket
import
net.mamoe.mirai.network.packet.action.ClientSendFriendMessagePacket
import
net.mamoe.mirai.network.packet.action.ClientSendGroupMessagePacket
import
net.mamoe.mirai.network.packet.action.ClientSendGroupMessagePacket
import
net.mamoe.mirai.network.packet.action.ServerSendFriendMessageResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendFriendMessageResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendGroupMessageResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendGroupMessageResponsePacket
import
java.io.File
/**
/**
* 处理消息事件, 承担消息发送任务.
* 处理消息事件, 承担消息发送任务.
...
@@ -31,21 +34,39 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -31,21 +34,39 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
return
@
hookWhile
false
return
@
hookWhile
false
}
}
when
{
when
{
it
.
message
()
valueEquals
"你好"
->
it
.
qq
.
sendMessage
(
"你好!"
)
it
.
message
valueEquals
"你好"
->
it
.
sender
.
sendMessage
(
"你好!"
)
it
.
message
().
toString
().
startsWith
(
"复读"
)
->
it
.
qq
.
sendMessage
(
it
.
message
())
it
.
message
.
toString
().
startsWith
(
"复读"
)
->
it
.
sender
.
sendMessage
(
it
.
message
())
it
.
message
()
.
toString
().
startsWith
(
"发群"
)
->
{
it
.
message
.
toString
().
startsWith
(
"发群"
)
->
{
it
.
message
().
list
.
toMutableList
().
let
{
messages
->
it
.
message
().
list
.
toMutableList
().
let
{
messages
->
messages
.
removeAt
(
0
)
messages
.
removeAt
(
0
)
sendGroupMessage
(
Group
(
session
.
bot
,
580266363
),
MessageChain
(
messages
))
sendGroupMessage
(
Group
(
session
.
bot
,
580266363
),
MessageChain
(
messages
))
}
}
}
}
it
.
message
()
valueEquals
"发图片"
->
sendGroupMessage
(
Group
(
session
.
bot
,
580266363
),
PlainText
(
"test"
)
+
UnsolvedImage
(
File
(
"C:\\Users\\Him18\\Desktop\\faceImage_1559564477775.jpg"
)).
also
{
image
->
/*it.message valueEquals "发图片群" -> sendGroupMessage(Group(session.bot, 580266363), PlainText("test") + UnsolvedImage(File("C:\\Users\\Him18\\Desktop\\faceImage_1559564477775.jpg")).also { image ->
image
.
upload
(
session
,
it
.
qq
).
get
()
image.upload(session, Group(session.bot, 580266363)).get()
})
})*/
it
.
message
valueEquals
"发图片群2"
->
sendGroupMessage
(
Group
(
session
.
bot
,
580266363
),
Image
(
"{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg"
).
toChain
())
/* it.message valueEquals "发图片" -> sendFriendMessage(it.sender, PlainText("test") + UnsolvedImage(File("C:\\Users\\Him18\\Desktop\\faceImage_1559564477775.jpg")).also { image ->
image.upload(session, it.sender).get()
})*/
it
.
message
valueEquals
"发图片2"
->
sendFriendMessage
(
it
.
sender
,
PlainText
(
"test"
)
+
Image
(
"{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg"
))
}
}
return
@
hookWhile
true
return
@
hookWhile
true
}
}
GroupMessageEvent
::
class
.
hookWhile
{
if
(
session
.
socket
.
isClosed
())
{
return
@
hookWhile
false
}
when
{
it
.
message
.
contains
(
"复读"
)
->
it
.
group
.
sendMessage
(
it
.
chain
)
}
return
@
hookWhile
true
}
}
}
override
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
override
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
...
@@ -55,20 +76,17 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -55,20 +76,17 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
}
}
is
ServerFriendMessageEventPacket
->
{
is
ServerFriendMessageEventPacket
->
{
if
(
ignoreMessage
)
{
if
(
ignoreMessage
)
return
return
}
FriendMessageEvent
(
session
.
bot
,
session
.
bot
.
contacts
.
getQQ
(
packet
.
qq
),
packet
.
message
).
broadcast
()
FriendMessageEvent
(
session
.
bot
,
session
.
bot
.
contacts
.
getQQ
(
packet
.
qq
),
packet
.
message
).
broadcast
()
}
}
is
ServerGroupMessageEventPacket
->
{
is
ServerGroupMessageEventPacket
->
{
//todo message chain
if
(
ignoreMessage
)
return
//GroupMessageEvent(this.bot, bot.contacts.getGroupByNumber(packet.groupNumber), bot.contacts.getQQ(packet.qq), packet.message)
}
is
UnknownServerEventPacket
->
{
if
(
packet
.
qq
==
session
.
bot
.
account
.
qqNumber
)
return
//todo
GroupMessageEvent
(
session
.
bot
,
session
.
bot
.
contacts
.
getGroupByNumber
(
packet
.
groupNumber
),
session
.
bot
.
contacts
.
getQQ
(
packet
.
qq
),
packet
.
message
).
broadcast
()
}
}
is
ServerSendFriendMessageResponsePacket
,
is
ServerSendFriendMessageResponsePacket
,
...
@@ -86,6 +104,6 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
...
@@ -86,6 +104,6 @@ class MessagePacketHandler(session: LoginSession) : PacketHandler(session) {
}
}
fun
sendGroupMessage
(
group
:
Group
,
message
:
MessageChain
)
{
fun
sendGroupMessage
(
group
:
Group
,
message
:
MessageChain
)
{
session
.
socket
.
sendPacket
(
ClientSendGroupMessagePacket
(
group
.
groupId
,
session
.
bot
.
account
.
qqNumber
,
session
.
sessionKey
,
message
))
session
.
socket
.
sendPacket
(
ClientSendGroupMessagePacket
(
session
.
bot
.
account
.
qqNumber
,
group
.
groupId
,
session
.
sessionKey
,
message
))
}
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
View file @
b488bee0
This diff is collapsed.
Click to expand it.
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerPacket.kt
View file @
b488bee0
...
@@ -11,7 +11,7 @@ import net.mamoe.mirai.network.packet.PacketNameFormatter.adjustName
...
@@ -11,7 +11,7 @@ import net.mamoe.mirai.network.packet.PacketNameFormatter.adjustName
import
net.mamoe.mirai.network.packet.action.ServerCanAddFriendResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerCanAddFriendResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendFriendMessageResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendFriendMessageResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendGroupMessageResponsePacket
import
net.mamoe.mirai.network.packet.action.ServerSendGroupMessageResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
UploadGroupImage
ResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTry
GetImageID
ResponsePacket
import
net.mamoe.mirai.network.packet.login.*
import
net.mamoe.mirai.network.packet.login.*
import
net.mamoe.mirai.task.MiraiThreadPool
import
net.mamoe.mirai.task.MiraiThreadPool
import
net.mamoe.mirai.utils.*
import
net.mamoe.mirai.utils.*
...
@@ -82,7 +82,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
...
@@ -82,7 +82,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
println
(
bytes
.
size
)
println
(
bytes
.
size
)
return
ServerLoginResponseFailedPacket
(
when
(
bytes
.
size
)
{
return
ServerLoginResponseFailedPacket
(
when
(
bytes
.
size
)
{
63
,
319
,
135
,
351
->
LoginState
.
WRONG_PASSWORD
//这四个其中一个是被冻结
135
->
LoginState
.
UNKNOWN
//账号已经在另一台电脑登录??
63
,
319
,
351
->
LoginState
.
WRONG_PASSWORD
//63不是密码错误, 应该是登录过频繁
//135 -> LoginState.RETYPE_PASSWORD
//135 -> LoginState.RETYPE_PASSWORD
279
->
LoginState
.
BLOCKED
279
->
LoginState
.
BLOCKED
263
->
LoginState
.
UNKNOWN_QQ_NUMBER
263
->
LoginState
.
UNKNOWN_QQ_NUMBER
...
@@ -121,9 +123,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
...
@@ -121,9 +123,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
"00 A7"
->
ServerCanAddFriendResponsePacket
(
stream
)
"00 A7"
->
ServerCanAddFriendResponsePacket
(
stream
)
"03 88"
->
ServerTry
UploadGroupImage
ResponsePacket
.
Encrypted
(
stream
)
"03 88"
->
ServerTry
GetImageID
ResponsePacket
.
Encrypted
(
stream
)
else
->
throw
IllegalArgumentException
(
idHex
)
else
->
UnknownServerPacket
(
stream
)
}
}
}.
apply
{
this
.
idHex
=
idHex
}
}.
apply
{
this
.
idHex
=
idHex
}
}
}
...
@@ -197,15 +199,48 @@ fun DataInputStream.readIP(): String {
...
@@ -197,15 +199,48 @@ fun DataInputStream.readIP(): String {
return
buff
return
buff
}
}
fun
DataInputStream
.
read
Var
String
():
String
{
fun
DataInputStream
.
read
LV
String
():
String
{
return
String
(
this
.
read
Var
ByteArray
())
return
String
(
this
.
read
LV
ByteArray
())
}
}
fun
DataInputStream
.
read
Var
ByteArray
():
ByteArray
{
fun
DataInputStream
.
read
LV
ByteArray
():
ByteArray
{
return
this
.
readNBytes
(
this
.
readShort
().
toInt
())
return
this
.
readNBytes
(
this
.
readShort
().
toInt
())
}
}
fun
DataInputStream
.
readString
(
length
:
Int
):
String
{
fun
DataInputStream
.
readTLVMap
(
expectingEOF
:
Boolean
=
false
):
Map
<
Int
,
ByteArray
>
{
val
map
=
mutableMapOf
<
Int
,
ByteArray
>()
var
type
:
Int
try
{
type
=
readUnsignedByte
()
}
catch
(
e
:
EOFException
)
{
if
(
expectingEOF
)
{
return
map
}
throw
e
}
while
(
type
!=
0
xff
)
{
map
[
type
]
=
this
.
readLVByteArray
()
try
{
type
=
readUnsignedByte
()
}
catch
(
e
:
EOFException
)
{
if
(
expectingEOF
)
{
return
map
}
throw
e
}
}
return
map
}
fun
Map
<
Int
,
ByteArray
>.
printTLVMap
()
{
println
(
this
.
mapValues
{
(
_
,
value
)
->
value
.
toUHexString
()
})
}
fun
DataInputStream
.
readString
(
length
:
Number
):
String
{
return
String
(
this
.
readNBytes
(
length
))
return
String
(
this
.
readNBytes
(
length
))
}
}
...
@@ -290,8 +325,8 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream {
...
@@ -290,8 +325,8 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream {
if
(
b
!=
matcher
[
i
])
{
if
(
b
!=
matcher
[
i
])
{
continue
@
loop
//todo goto mark
continue
@
loop
//todo goto mark
}
}
return
this
}
}
return
this
}
}
}
while
(
true
)
}
while
(
true
)
}
}
...
@@ -336,4 +371,6 @@ fun DataInputStream.gotoWhere(matcher: ByteArray) {
...
@@ -336,4 +371,6 @@ fun DataInputStream.gotoWhere(matcher: ByteArray) {
} while (true)
} while (true)
}*/
}*/
fun
ByteArray
.
cutTail
(
length
:
Int
):
ByteArray
=
this
.
copyOfRange
(
0
,
this
.
size
-
length
)
fun
ByteArray
.
cutTail
(
length
:
Int
):
ByteArray
=
this
.
copyOfRange
(
0
,
this
.
size
-
length
)
\ No newline at end of file
fun
ByteArray
.
getRight
(
length
:
Int
):
ByteArray
=
this
.
copyOfRange
(
this
.
size
-
length
,
this
.
size
)
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/UnknownServerPacket.kt
View file @
b488bee0
package
net.mamoe.mirai.network.packet
package
net.mamoe.mirai.network.packet
import
net.mamoe.mirai.utils.LoggerTextFormat
import
net.mamoe.mirai.utils.toUHexString
import
java.io.DataInputStream
import
java.io.DataInputStream
/**
/**
...
@@ -7,6 +9,10 @@ import java.io.DataInputStream
...
@@ -7,6 +9,10 @@ import java.io.DataInputStream
*/
*/
class
UnknownServerPacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
UnknownServerPacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
override
fun
decode
()
{
override
fun
decode
()
{
println
(
"UnknownServerPacket data: "
+
this
.
input
.
goto
(
0
).
readAllBytes
().
toUHexString
())
}
override
fun
toString
():
String
{
return
LoggerTextFormat
.
LIGHT_RED
.
toString
()
+
super
.
toString
()
}
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendFriendMessagePacket.kt
View file @
b488bee0
...
@@ -38,7 +38,7 @@ class ClientSendFriendMessagePacket(
...
@@ -38,7 +38,7 @@ class ClientSendFriendMessagePacket(
it
.
writeTime
()
it
.
writeTime
()
it
.
writeRandom
(
4
)
it
.
writeRandom
(
4
)
it
.
writeHex
(
"00 00 00 00 09 00 86"
)
it
.
writeHex
(
"00 00 00 00 09 00 86"
)
it
.
writeHex
(
Protocol
.
friendM
essageConst1
)
//... 85 E9 BB 91
it
.
writeHex
(
Protocol
.
m
essageConst1
)
//... 85 E9 BB 91
it
.
writeZero
(
2
)
it
.
writeZero
(
2
)
it
.
write
(
message
.
toByteArray
())
it
.
write
(
message
.
toByteArray
())
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendGroupMessagePacket.kt
View file @
b488bee0
...
@@ -3,6 +3,7 @@ package net.mamoe.mirai.network.packet.action
...
@@ -3,6 +3,7 @@ package net.mamoe.mirai.network.packet.action
import
net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.utils.lazyEncode
import
net.mamoe.mirai.utils.toUHexString
import
net.mamoe.mirai.utils.toUHexString
import
java.io.DataInputStream
import
java.io.DataInputStream
...
@@ -11,8 +12,8 @@ import java.io.DataInputStream
...
@@ -11,8 +12,8 @@ import java.io.DataInputStream
*/
*/
@PacketId
(
"00 02"
)
@PacketId
(
"00 02"
)
class
ClientSendGroupMessagePacket
(
class
ClientSendGroupMessagePacket
(
private
val
groupId
:
Long
,
//不是 number
private
val
botQQ
:
Long
,
private
val
botQQ
:
Long
,
private
val
groupId
:
Long
,
//不是 number
private
val
sessionKey
:
ByteArray
,
private
val
sessionKey
:
ByteArray
,
private
val
message
:
MessageChain
private
val
message
:
MessageChain
)
:
ClientPacket
()
{
)
:
ClientPacket
()
{
...
@@ -26,18 +27,19 @@ class ClientSendGroupMessagePacket(
...
@@ -26,18 +27,19 @@ class ClientSendGroupMessagePacket(
it
.
writeByte
(
0
x2A
)
it
.
writeByte
(
0
x2A
)
it
.
writeGroup
(
groupId
)
it
.
writeGroup
(
groupId
)
it
.
write
Short
(
50
+
bytes
.
size
)
it
.
write
LVByteArray
(
lazyEncode
{
child
->
it
.
writeHex
(
"00 01 01"
)
child
.
writeHex
(
"00 01 01"
)
it
.
writeHex
(
"00 00 00 00 00 00 00 4D 53 47 00 00 00 00 00"
)
child
.
writeHex
(
"00 00 00 00 00 00 00 4D 53 47 00 00 00 00 00"
)
it
.
writeTime
()
child
.
writeTime
()
it
.
writeRandom
(
4
)
child
.
writeRandom
(
4
)
it
.
writeHex
(
"00 00 00 00 09 00 86"
)
child
.
writeHex
(
"00 00 00 00 09 00 86"
)
it
.
writeHex
(
Protocol
.
friendM
essageConst1
)
child
.
writeHex
(
Protocol
.
m
essageConst1
)
it
.
writeZero
(
2
)
child
.
writeZero
(
2
)
//messages
//messages
it
.
write
(
bytes
)
child
.
write
(
bytes
)
})
/*it.writeByte(0x01)
/*it.writeByte(0x01)
it.writeShort(bytes.size + 3)
it.writeShort(bytes.size + 3)
it.writeByte(0x01)
it.writeByte(0x01)
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
View file @
b488bee0
...
@@ -11,8 +11,8 @@ import java.io.DataInputStream
...
@@ -11,8 +11,8 @@ import java.io.DataInputStream
/**
/**
* 请求上传图片. 将发送图片的 md5, size.
* 请求上传图片. 将发送图片的 md5, size.
* 服务器返回以下之一:
* 服务器返回以下之一:
* - 服务器已经存有这个图片 [ServerTry
UploadGroupImage
FailedPacket]
* - 服务器已经存有这个图片 [ServerTry
GetImageID
FailedPacket]
* - 服务器未存有, 返回一个 key 用于客户端上传 [ServerTry
UploadGroupImage
SuccessPacket]
* - 服务器未存有, 返回一个 key 用于客户端上传 [ServerTry
GetImageID
SuccessPacket]
*
*
* @author Him188moe
* @author Him188moe
*/
*/
...
@@ -20,7 +20,7 @@ import java.io.DataInputStream
...
@@ -20,7 +20,7 @@ import java.io.DataInputStream
class
ClientTryGetImageIDPacket
(
class
ClientTryGetImageIDPacket
(
private
val
botNumber
:
Long
,
private
val
botNumber
:
Long
,
private
val
sessionKey
:
ByteArray
,
private
val
sessionKey
:
ByteArray
,
private
val
groupNumberOrQQNumber
:
Long
,
//todo 为什么还要有qq number呢? bot不就是了么
private
val
groupNumberOrQQNumber
:
Long
,
private
val
image
:
BufferedImage
private
val
image
:
BufferedImage
)
:
ClientPacket
()
{
)
:
ClientPacket
()
{
override
fun
encode
()
{
override
fun
encode
()
{
...
@@ -89,18 +89,18 @@ class ClientTryGetImageIDPacket(
...
@@ -89,18 +89,18 @@ class ClientTryGetImageIDPacket(
}
}
}
}
abstract
class
ServerTry
UploadGroupImage
ResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
abstract
class
ServerTry
GetImageID
ResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
Encrypted
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
Encrypted
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
fun
decrypt
(
sessionKey
:
ByteArray
):
ServerTry
UploadGroupImage
ResponsePacket
{
fun
decrypt
(
sessionKey
:
ByteArray
):
ServerTry
GetImageID
ResponsePacket
{
val
data
=
this
.
decryptAsByteArray
(
sessionKey
)
val
data
=
this
.
decryptAsByteArray
(
sessionKey
)
println
(
data
.
size
)
println
(
data
.
size
)
println
(
data
.
size
)
println
(
data
.
size
)
if
(
data
.
size
==
209
)
{
if
(
data
.
size
==
209
)
{
return
ServerTry
UploadGroupImage
SuccessPacket
(
data
.
dataInputStream
()).
setId
(
this
.
idHex
)
return
ServerTry
GetImageID
SuccessPacket
(
data
.
dataInputStream
()).
setId
(
this
.
idHex
)
}
}
return
ServerTry
UploadGroupImage
FailedPacket
(
data
.
dataInputStream
())
return
ServerTry
GetImageID
FailedPacket
(
data
.
dataInputStream
())
}
}
}
}
}
}
...
@@ -108,25 +108,21 @@ abstract class ServerTryUploadGroupImageResponsePacket(input: DataInputStream) :
...
@@ -108,25 +108,21 @@ abstract class ServerTryUploadGroupImageResponsePacket(input: DataInputStream) :
/**
/**
* 服务器未存有图片, 返回一个 key 用于客户端上传
* 服务器未存有图片, 返回一个 key 用于客户端上传
*/
*/
class
ServerTry
UploadGroupImageSuccessPacket
(
input
:
DataInputStream
)
:
ServerTryUploadGroupImage
ResponsePacket
(
input
)
{
class
ServerTry
GetImageIDSuccessPacket
(
input
:
DataInputStream
)
:
ServerTryGetImageID
ResponsePacket
(
input
)
{
lateinit
var
uKey
:
ByteArray
lateinit
var
uKey
:
ByteArray
override
fun
decode
()
{
override
fun
decode
()
{
uKey
=
this
.
input
.
gotoWhere
(
ubyteArrayOf
(
0
x42u
,
0
x80u
,
0
x01u
)).
readNBytes
(
128
)
this
.
input
.
gotoWhere
(
ubyteArrayOf
(
0
x42u
,
0
x80u
,
0
x01u
))
uKey
=
this
.
input
.
readNBytes
(
128
)
}
}
}
}
/**
/**
* 服务器已经存有这个图片
* 服务器已经存有这个图片
*/
*/
class
ServerTry
UploadGroupImageFailedPacket
(
input
:
DataInputStream
)
:
ServerTryUploadGroupImage
ResponsePacket
(
input
)
{
class
ServerTry
GetImageIDFailedPacket
(
input
:
DataInputStream
)
:
ServerTryGetImageID
ResponsePacket
(
input
)
{
override
fun
decode
()
{
override
fun
decode
()
{
}
}
}
fun
main
()
{
println
(
0
xff
)
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/utils/ImageNetworkUtils.java
View file @
b488bee0
...
@@ -9,18 +9,18 @@ import java.net.URL;
...
@@ -9,18 +9,18 @@ import java.net.URL;
* @author NaturalHG
* @author NaturalHG
*/
*/
public
class
ImageNetworkUtils
{
public
class
ImageNetworkUtils
{
public
static
boolean
postImage
(
String
uKeyHex
,
int
fileSize
,
long
qq
Number
,
long
groupCode
,
byte
[]
img
)
throws
IOException
{
public
static
boolean
postImage
(
String
uKeyHex
,
int
fileSize
,
long
bot
Number
,
long
groupCode
,
byte
[]
img
)
throws
IOException
{
//http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc&ukey=” + 删全部空 (ukey) + “&filesize=” + 到文本 (fileSize) + “&range=0&uin=” + g_uin + “&groupcode=” + Group
//http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc&ukey=” + 删全部空 (ukey) + “&filesize=” + 到文本 (fileSize) + “&range=0&uin=” + g_uin + “&groupcode=” + Group
String
builder
=
"http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc"
+
"&ukey="
+
String
builder
=
"http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc"
+
uKeyHex
.
replace
(
" "
,
""
)
+
"&ukey="
+
uKeyHex
.
replace
(
" "
,
""
)
+
"&filezise="
+
fileSize
+
"&filezise="
+
fileSize
+
"&range="
+
"0"
+
"&range="
+
"0"
+
"&uin="
+
qq
Number
+
"&uin="
+
bot
Number
+
"&groupcode="
+
groupCode
;
"&groupcode="
+
groupCode
;
HttpURLConnection
conn
=
(
HttpURLConnection
)
new
URL
(
builder
).
openConnection
();
HttpURLConnection
conn
=
(
HttpURLConnection
)
new
URL
(
builder
).
openConnection
();
conn
.
setRequestProperty
(
"User-
a
gent"
,
"QQClient"
);
conn
.
setRequestProperty
(
"User-
A
gent"
,
"QQClient"
);
conn
.
setRequestProperty
(
"Content-
l
ength"
,
""
+
fileSize
);
conn
.
setRequestProperty
(
"Content-
L
ength"
,
""
+
fileSize
);
conn
.
setRequestMethod
(
"POST"
);
conn
.
setRequestMethod
(
"POST"
);
conn
.
setDoOutput
(
true
);
conn
.
setDoOutput
(
true
);
conn
.
getOutputStream
().
write
(
img
);
conn
.
getOutputStream
().
write
(
img
);
...
...
mirai-core/src/main/java/net/mamoe/mirai/utils/Utils.kt
View file @
b488bee0
...
@@ -3,15 +3,20 @@
...
@@ -3,15 +3,20 @@
package
net.mamoe.mirai.utils
package
net.mamoe.mirai.utils
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.dataInputStream
import
java.awt.image.BufferedImage
import
java.awt.image.BufferedImage
import
java.io.ByteArrayOutputStream
import
java.io.ByteArrayOutputStream
import
java.io.DataInputStream
import
java.io.DataOutputStream
import
java.io.DataOutputStream
import
java.io.File
import
java.io.File
import
java.lang.reflect.Field
import
java.lang.reflect.Field
import
java.util.*
import
java.util.*
import
java.util.zip.CRC32
import
java.util.zip.CRC32
import
java.util.zip.GZIPInputStream
import
java.util.zip.GZIPOutputStream
import
javax.imageio.ImageIO
import
javax.imageio.ImageIO
/**
/**
* @author Him188moe
* @author Him188moe
* @author NaturalHG
* @author NaturalHG
...
@@ -76,6 +81,12 @@ open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream())
...
@@ -76,6 +81,12 @@ open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream())
@JvmSynthetic
@JvmSynthetic
fun
lazyEncode
(
t
:
(
ByteArrayDataOutputStream
)
->
Unit
):
ByteArray
=
ByteArrayDataOutputStream
().
also
(
t
).
toByteArray
()
fun
lazyEncode
(
t
:
(
ByteArrayDataOutputStream
)
->
Unit
):
ByteArray
=
ByteArrayDataOutputStream
().
also
(
t
).
toByteArray
()
@JvmSynthetic
fun
<
T
>
lazyDecode
(
byteArray
:
ByteArray
,
t
:
(
DataInputStream
)
->
T
):
T
=
byteArray
.
dataInputStream
().
let
(
t
)
fun
DataInputStream
.
skip
(
n
:
Number
)
{
this
.
skip
(
n
.
toLong
())
}
fun
getRandomByteArray
(
length
:
Int
):
ByteArray
{
fun
getRandomByteArray
(
length
:
Int
):
ByteArray
{
val
bytes
=
LinkedList
<
Byte
>()
val
bytes
=
LinkedList
<
Byte
>()
...
@@ -144,4 +155,15 @@ fun BufferedImage.toByteArray(formatName: String = "PNG"): ByteArray {
...
@@ -144,4 +155,15 @@ fun BufferedImage.toByteArray(formatName: String = "PNG"): ByteArray {
return
lazyEncode
{
return
lazyEncode
{
ImageIO
.
write
(
this
,
formatName
,
it
)
ImageIO
.
write
(
this
,
formatName
,
it
)
}
}
}
object
GZip
{
fun
uncompress
(
bytes
:
ByteArray
):
ByteArray
=
lazyEncode
{
GZIPInputStream
(
bytes
.
inputStream
()).
transferTo
(
it
)
}
fun
compress
(
bytes
:
ByteArray
):
ByteArray
=
ByteArrayOutputStream
().
let
{
GZIPOutputStream
(
it
).
write
(
bytes
)
return
it
.
toByteArray
()
}
}
}
\ No newline at end of file
mirai-core/src/test/java/HexComparator.java
View file @
b488bee0
...
@@ -58,6 +58,9 @@ public class HexComparator {
...
@@ -58,6 +58,9 @@ public class HexComparator {
private
static
final
String
_1040400290_
=
"3E 03 3F A2"
;
private
static
final
String
_1040400290_
=
"3E 03 3F A2"
;
private
static
final
String
_1994701021_
=
"76 E4 B8 DD"
;
private
static
final
String
_1994701021_
=
"76 E4 B8 DD"
;
private
static
final
String
_jiahua_
=
"B1 89 BE 09"
;
private
static
final
String
_jiahua_
=
"B1 89 BE 09"
;
private
static
final
String
_Him188moe_
=
UtilsKt
.
toUHexString
(
"Him188moe"
.
getBytes
(),
" "
);
private
static
final
String
发图片
=
UtilsKt
.
toUHexString
(
"发图片"
.
getBytes
(),
" "
);
private
static
final
String
群
=
UtilsKt
.
toUHexString
(
"发图片"
.
getBytes
(),
" "
);
private
static
final
String
SINGLE_PLAIN_MESSAGE_HEAD
=
"00 00 01 00 09 01"
;
private
static
final
String
SINGLE_PLAIN_MESSAGE_HEAD
=
"00 00 01 00 09 01"
;
...
...
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