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
a81eea42
Commit
a81eea42
authored
Feb 19, 2020
by
Him188
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Face decoding
parent
7de04824
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
162 additions
and
298 deletions
+162
-298
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt
...in/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt
+13
-1
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt
...rc/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt
+149
-297
No files found.
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt
View file @
a81eea42
...
...
@@ -86,6 +86,16 @@ _400Height=0x000000EB(235)
pbReserve=<Empty ByteArray>
}
*/
val
FACE_BUF
=
"00 01 00 04 52 CC F5 D0"
.
hexToBytes
()
internal
fun
Face
.
toJceData
():
ImMsgBody
.
Face
{
return
ImMsgBody
.
Face
(
index
=
this
.
id
,
old
=
(
0
x1445
-
4
+
this
.
id
).
toShort
().
toByteArray
(),
buf
=
FACE_BUF
)
}
internal
fun
CustomFaceFromFile
.
toJceData
():
ImMsgBody
.
CustomFace
{
return
ImMsgBody
.
CustomFace
(
filePath
=
this
.
filepath
,
...
...
@@ -213,6 +223,7 @@ internal fun MessageChain.toRichTextElems(): MutableList<ImMsgBody.Elem> {
is
NotOnlineImageFromServer
->
elements
.
add
(
ImMsgBody
.
Elem
(
notOnlineImage
=
it
.
delegate
))
is
NotOnlineImageFromFile
->
elements
.
add
(
ImMsgBody
.
Elem
(
notOnlineImage
=
it
.
toJceData
()))
is
AtAll
->
elements
.
add
(
atAllData
)
is
Face
->
elements
.
add
(
ImMsgBody
.
Elem
(
face
=
it
.
toJceData
()))
is
QuoteReply
,
is
MessageSource
->
{
...
...
@@ -312,6 +323,7 @@ internal fun List<ImMsgBody.Elem>.joinToMessageChain(message: MessageChain) {
it
.
srcMsg
!=
null
->
message
.
add
(
QuoteReply
(
MessageSourceFromServer
(
it
.
srcMsg
)))
it
.
notOnlineImage
!=
null
->
message
.
add
(
NotOnlineImageFromServer
(
it
.
notOnlineImage
))
it
.
customFace
!=
null
->
message
.
add
(
CustomFaceFromServer
(
it
.
customFace
))
it
.
face
!=
null
->
message
.
add
(
Face
(
it
.
face
.
index
))
it
.
text
!=
null
->
{
if
(
it
.
text
.
attr6Buf
.
isEmpty
())
{
message
.
add
(
it
.
text
.
str
.
toMessage
())
...
...
@@ -323,7 +335,7 @@ internal fun List<ImMsgBody.Elem>.joinToMessageChain(message: MessageChain) {
discardExact
(
7
)
id
=
readUInt
().
toLong
()
}
if
(
id
==
0L
){
if
(
id
==
0L
)
{
message
.
add
(
AtAll
)
}
else
{
message
.
add
(
At
(
id
,
it
.
text
.
str
))
...
...
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt
View file @
a81eea42
...
...
@@ -14,309 +14,161 @@ package net.mamoe.mirai.message.data
import
kotlin.jvm.JvmMultifileClass
import
kotlin.jvm.JvmName
import
kotlin.jvm.JvmStatic
/**
* QQ 自带表情
*/
inline
class
Face
(
val
id
:
FaceId
)
:
Message
{
override
fun
toString
():
String
=
"[
face${id.value}
]"
class
Face
(
val
id
:
Int
)
:
Message
{
override
fun
toString
():
String
=
"[
mirai:face$id
]"
companion
object
Key
:
Message
.
Key
<
Face
>
/**
* @author LamGC
*/
@Suppress
(
"SpellCheckingInspection"
,
"unused"
)
companion
object
IdList
:
Message
.
Key
<
Face
>
{
const
val
unknown
:
Int
=
0
xff
const
val
jingya
:
Int
=
0
const
val
piezui
:
Int
=
1
const
val
se
:
Int
=
2
const
val
fadai
:
Int
=
3
const
val
deyi
:
Int
=
4
const
val
liulei
:
Int
=
5
const
val
haixiu
:
Int
=
6
const
val
bizui
:
Int
=
7
const
val
shui
:
Int
=
8
const
val
daku
:
Int
=
9
const
val
ganga
:
Int
=
10
const
val
fanu
:
Int
=
11
const
val
tiaopi
:
Int
=
12
const
val
ciya
:
Int
=
13
const
val
weixiao
:
Int
=
14
const
val
nanguo
:
Int
=
15
const
val
ku
:
Int
=
16
const
val
zhuakuang
:
Int
=
18
const
val
tu
:
Int
=
19
const
val
touxiao
:
Int
=
20
const
val
keai
:
Int
=
21
const
val
baiyan
:
Int
=
22
const
val
aoman
:
Int
=
23
const
val
ji_e
:
Int
=
24
const
val
kun
:
Int
=
25
const
val
jingkong
:
Int
=
26
const
val
liuhan
:
Int
=
27
const
val
hanxiao
:
Int
=
28
const
val
dabing
:
Int
=
29
const
val
fendou
:
Int
=
30
const
val
zhouma
:
Int
=
31
const
val
yiwen
:
Int
=
32
const
val
yun
:
Int
=
34
const
val
zhemo
:
Int
=
35
const
val
shuai
:
Int
=
36
const
val
kulou
:
Int
=
37
const
val
qiaoda
:
Int
=
38
const
val
zaijian
:
Int
=
39
const
val
fadou
:
Int
=
41
const
val
aiqing
:
Int
=
42
const
val
tiaotiao
:
Int
=
43
const
val
zhutou
:
Int
=
46
const
val
yongbao
:
Int
=
49
const
val
dan_gao
:
Int
=
53
const
val
shandian
:
Int
=
54
const
val
zhadan
:
Int
=
55
const
val
dao
:
Int
=
56
const
val
zuqiu
:
Int
=
57
const
val
bianbian
:
Int
=
59
const
val
kafei
:
Int
=
60
const
val
fan
:
Int
=
61
const
val
meigui
:
Int
=
63
const
val
diaoxie
:
Int
=
64
const
val
aixin
:
Int
=
66
const
val
xinsui
:
Int
=
67
const
val
liwu
:
Int
=
69
const
val
taiyang
:
Int
=
74
const
val
yueliang
:
Int
=
75
const
val
qiang
:
Int
=
76
const
val
ruo
:
Int
=
77
const
val
woshou
:
Int
=
78
const
val
shengli
:
Int
=
79
const
val
feiwen
:
Int
=
85
const
val
naohuo
:
Int
=
86
const
val
xigua
:
Int
=
89
const
val
lenghan
:
Int
=
96
const
val
cahan
:
Int
=
97
const
val
koubi
:
Int
=
98
const
val
guzhang
:
Int
=
99
const
val
qiudale
:
Int
=
100
const
val
huaixiao
:
Int
=
101
const
val
zuohengheng
:
Int
=
102
const
val
youhengheng
:
Int
=
103
const
val
haqian
:
Int
=
104
const
val
bishi
:
Int
=
105
const
val
weiqu
:
Int
=
106
const
val
kuaikule
:
Int
=
107
const
val
yinxian
:
Int
=
108
const
val
qinqin
:
Int
=
109
const
val
xia
:
Int
=
110
const
val
kelian
:
Int
=
111
const
val
caidao
:
Int
=
112
const
val
pijiu
:
Int
=
113
const
val
lanqiu
:
Int
=
114
const
val
pingpang
:
Int
=
115
const
val
shiai
:
Int
=
116
const
val
piaochong
:
Int
=
117
const
val
baoquan
:
Int
=
118
const
val
gouyin
:
Int
=
119
const
val
quantou
:
Int
=
120
const
val
chajin
:
Int
=
121
const
val
aini
:
Int
=
122
const
val
bu
:
Int
=
123
const
val
hao
:
Int
=
124
const
val
zhuanquan
:
Int
=
125
const
val
ketou
:
Int
=
126
const
val
huitou
:
Int
=
127
const
val
tiaosheng
:
Int
=
128
const
val
huishou
:
Int
=
129
const
val
jidong
:
Int
=
130
const
val
jiewu
:
Int
=
131
const
val
xianwen
:
Int
=
132
const
val
zuotaiji
:
Int
=
133
const
val
youtaiji
:
Int
=
134
const
val
shuangxi
:
Int
=
136
const
val
bianpao
:
Int
=
137
const
val
denglong
:
Int
=
138
const
val
facai
:
Int
=
139
const
val
K_ge
:
Int
=
140
const
val
gouwu
:
Int
=
141
const
val
youjian
:
Int
=
142
const
val
shuai_qi
:
Int
=
143
const
val
hecai
:
Int
=
144
const
val
qidao
:
Int
=
145
const
val
baojin
:
Int
=
146
const
val
bangbangtang
:
Int
=
147
const
val
he_nai
:
Int
=
148
const
val
xiamian
:
Int
=
149
const
val
xiangjiao
:
Int
=
150
const
val
feiji
:
Int
=
151
const
val
kaiche
:
Int
=
152
const
val
gaotiezuochetou
:
Int
=
153
const
val
chexiang
:
Int
=
154
const
val
gaotieyouchetou
:
Int
=
155
const
val
duoyun
:
Int
=
156
const
val
xiayu
:
Int
=
157
const
val
chaopiao
:
Int
=
158
const
val
xiongmao
:
Int
=
159
const
val
dengpao
:
Int
=
160
const
val
fengche
:
Int
=
161
const
val
naozhong
:
Int
=
162
const
val
dasan
:
Int
=
163
const
val
caiqiu
:
Int
=
164
const
val
zuanjie
:
Int
=
165
const
val
shafa
:
Int
=
166
const
val
zhijin
:
Int
=
167
const
val
yao
:
Int
=
168
const
val
shouqiang
:
Int
=
169
const
val
qingwa
:
Int
=
170
}
override
fun
eq
(
other
:
Message
):
Boolean
{
return
other
is
Face
&&
other
.
id
==
this
.
id
}
}
/**
* @author LamGC
*/
@Suppress
(
"SpellCheckingInspection"
,
"unused"
)
@UseExperimental
(
ExperimentalUnsignedTypes
::
class
)
inline
class
FaceId
constructor
(
inline
val
value
:
UByte
)
{
companion
object
{
@JvmStatic
val
unknown
:
FaceId
=
FaceId
(
0
xffu
)
@JvmStatic
val
jingya
:
FaceId
=
FaceId
(
0
u
)
@JvmStatic
val
piezui
:
FaceId
=
FaceId
(
1
u
)
@JvmStatic
val
se
:
FaceId
=
FaceId
(
2
u
)
@JvmStatic
val
fadai
:
FaceId
=
FaceId
(
3
u
)
@JvmStatic
val
deyi
:
FaceId
=
FaceId
(
4
u
)
@JvmStatic
val
liulei
:
FaceId
=
FaceId
(
5
u
)
@JvmStatic
val
haixiu
:
FaceId
=
FaceId
(
6
u
)
@JvmStatic
val
bizui
:
FaceId
=
FaceId
(
7
u
)
@JvmStatic
val
shui
:
FaceId
=
FaceId
(
8
u
)
@JvmStatic
val
daku
:
FaceId
=
FaceId
(
9
u
)
@JvmStatic
val
ganga
:
FaceId
=
FaceId
(
10
u
)
@JvmStatic
val
fanu
:
FaceId
=
FaceId
(
11
u
)
@JvmStatic
val
tiaopi
:
FaceId
=
FaceId
(
12
u
)
@JvmStatic
val
ciya
:
FaceId
=
FaceId
(
13
u
)
@JvmStatic
val
weixiao
:
FaceId
=
FaceId
(
14
u
)
@JvmStatic
val
nanguo
:
FaceId
=
FaceId
(
15
u
)
@JvmStatic
val
ku
:
FaceId
=
FaceId
(
16
u
)
@JvmStatic
val
zhuakuang
:
FaceId
=
FaceId
(
18
u
)
@JvmStatic
val
tu
:
FaceId
=
FaceId
(
19
u
)
@JvmStatic
val
touxiao
:
FaceId
=
FaceId
(
20
u
)
@JvmStatic
val
keai
:
FaceId
=
FaceId
(
21
u
)
@JvmStatic
val
baiyan
:
FaceId
=
FaceId
(
22
u
)
@JvmStatic
val
aoman
:
FaceId
=
FaceId
(
23
u
)
@JvmStatic
val
ji_e
:
FaceId
=
FaceId
(
24
u
)
@JvmStatic
val
kun
:
FaceId
=
FaceId
(
25
u
)
@JvmStatic
val
jingkong
:
FaceId
=
FaceId
(
26
u
)
@JvmStatic
val
liuhan
:
FaceId
=
FaceId
(
27
u
)
@JvmStatic
val
hanxiao
:
FaceId
=
FaceId
(
28
u
)
@JvmStatic
val
dabing
:
FaceId
=
FaceId
(
29
u
)
@JvmStatic
val
fendou
:
FaceId
=
FaceId
(
30
u
)
@JvmStatic
val
zhouma
:
FaceId
=
FaceId
(
31
u
)
@JvmStatic
val
yiwen
:
FaceId
=
FaceId
(
32
u
)
@JvmStatic
val
yun
:
FaceId
=
FaceId
(
34
u
)
@JvmStatic
val
zhemo
:
FaceId
=
FaceId
(
35
u
)
@JvmStatic
val
shuai
:
FaceId
=
FaceId
(
36
u
)
@JvmStatic
val
kulou
:
FaceId
=
FaceId
(
37
u
)
@JvmStatic
val
qiaoda
:
FaceId
=
FaceId
(
38
u
)
@JvmStatic
val
zaijian
:
FaceId
=
FaceId
(
39
u
)
@JvmStatic
val
fadou
:
FaceId
=
FaceId
(
41
u
)
@JvmStatic
val
aiqing
:
FaceId
=
FaceId
(
42
u
)
@JvmStatic
val
tiaotiao
:
FaceId
=
FaceId
(
43
u
)
@JvmStatic
val
zhutou
:
FaceId
=
FaceId
(
46
u
)
@JvmStatic
val
yongbao
:
FaceId
=
FaceId
(
49
u
)
@JvmStatic
val
dan_gao
:
FaceId
=
FaceId
(
53
u
)
@JvmStatic
val
shandian
:
FaceId
=
FaceId
(
54
u
)
@JvmStatic
val
zhadan
:
FaceId
=
FaceId
(
55
u
)
@JvmStatic
val
dao
:
FaceId
=
FaceId
(
56
u
)
@JvmStatic
val
zuqiu
:
FaceId
=
FaceId
(
57
u
)
@JvmStatic
val
bianbian
:
FaceId
=
FaceId
(
59
u
)
@JvmStatic
val
kafei
:
FaceId
=
FaceId
(
60
u
)
@JvmStatic
val
fan
:
FaceId
=
FaceId
(
61
u
)
@JvmStatic
val
meigui
:
FaceId
=
FaceId
(
63
u
)
@JvmStatic
val
diaoxie
:
FaceId
=
FaceId
(
64
u
)
@JvmStatic
val
aixin
:
FaceId
=
FaceId
(
66
u
)
@JvmStatic
val
xinsui
:
FaceId
=
FaceId
(
67
u
)
@JvmStatic
val
liwu
:
FaceId
=
FaceId
(
69
u
)
@JvmStatic
val
taiyang
:
FaceId
=
FaceId
(
74
u
)
@JvmStatic
val
yueliang
:
FaceId
=
FaceId
(
75
u
)
@JvmStatic
val
qiang
:
FaceId
=
FaceId
(
76
u
)
@JvmStatic
val
ruo
:
FaceId
=
FaceId
(
77
u
)
@JvmStatic
val
woshou
:
FaceId
=
FaceId
(
78
u
)
@JvmStatic
val
shengli
:
FaceId
=
FaceId
(
79
u
)
@JvmStatic
val
feiwen
:
FaceId
=
FaceId
(
85
u
)
@JvmStatic
val
naohuo
:
FaceId
=
FaceId
(
86
u
)
@JvmStatic
val
xigua
:
FaceId
=
FaceId
(
89
u
)
@JvmStatic
val
lenghan
:
FaceId
=
FaceId
(
96
u
)
@JvmStatic
val
cahan
:
FaceId
=
FaceId
(
97
u
)
@JvmStatic
val
koubi
:
FaceId
=
FaceId
(
98
u
)
@JvmStatic
val
guzhang
:
FaceId
=
FaceId
(
99
u
)
@JvmStatic
val
qiudale
:
FaceId
=
FaceId
(
100
u
)
@JvmStatic
val
huaixiao
:
FaceId
=
FaceId
(
101
u
)
@JvmStatic
val
zuohengheng
:
FaceId
=
FaceId
(
102
u
)
@JvmStatic
val
youhengheng
:
FaceId
=
FaceId
(
103
u
)
@JvmStatic
val
haqian
:
FaceId
=
FaceId
(
104
u
)
@JvmStatic
val
bishi
:
FaceId
=
FaceId
(
105
u
)
@JvmStatic
val
weiqu
:
FaceId
=
FaceId
(
106
u
)
@JvmStatic
val
kuaikule
:
FaceId
=
FaceId
(
107
u
)
@JvmStatic
val
yinxian
:
FaceId
=
FaceId
(
108
u
)
@JvmStatic
val
qinqin
:
FaceId
=
FaceId
(
109
u
)
@JvmStatic
val
xia
:
FaceId
=
FaceId
(
110
u
)
@JvmStatic
val
kelian
:
FaceId
=
FaceId
(
111
u
)
@JvmStatic
val
caidao
:
FaceId
=
FaceId
(
112
u
)
@JvmStatic
val
pijiu
:
FaceId
=
FaceId
(
113
u
)
@JvmStatic
val
lanqiu
:
FaceId
=
FaceId
(
114
u
)
@JvmStatic
val
pingpang
:
FaceId
=
FaceId
(
115
u
)
@JvmStatic
val
shiai
:
FaceId
=
FaceId
(
116
u
)
@JvmStatic
val
piaochong
:
FaceId
=
FaceId
(
117
u
)
@JvmStatic
val
baoquan
:
FaceId
=
FaceId
(
118
u
)
@JvmStatic
val
gouyin
:
FaceId
=
FaceId
(
119
u
)
@JvmStatic
val
quantou
:
FaceId
=
FaceId
(
120
u
)
@JvmStatic
val
chajin
:
FaceId
=
FaceId
(
121
u
)
@JvmStatic
val
aini
:
FaceId
=
FaceId
(
122
u
)
@JvmStatic
val
bu
:
FaceId
=
FaceId
(
123
u
)
@JvmStatic
val
hao
:
FaceId
=
FaceId
(
124
u
)
@JvmStatic
val
zhuanquan
:
FaceId
=
FaceId
(
125
u
)
@JvmStatic
val
ketou
:
FaceId
=
FaceId
(
126
u
)
@JvmStatic
val
huitou
:
FaceId
=
FaceId
(
127
u
)
@JvmStatic
val
tiaosheng
:
FaceId
=
FaceId
(
128
u
)
@JvmStatic
val
huishou
:
FaceId
=
FaceId
(
129
u
)
@JvmStatic
val
jidong
:
FaceId
=
FaceId
(
130
u
)
@JvmStatic
val
jiewu
:
FaceId
=
FaceId
(
131
u
)
@JvmStatic
val
xianwen
:
FaceId
=
FaceId
(
132
u
)
@JvmStatic
val
zuotaiji
:
FaceId
=
FaceId
(
133
u
)
@JvmStatic
val
youtaiji
:
FaceId
=
FaceId
(
134
u
)
@JvmStatic
val
shuangxi
:
FaceId
=
FaceId
(
136
u
)
@JvmStatic
val
bianpao
:
FaceId
=
FaceId
(
137
u
)
@JvmStatic
val
denglong
:
FaceId
=
FaceId
(
138
u
)
@JvmStatic
val
facai
:
FaceId
=
FaceId
(
139
u
)
@JvmStatic
val
K_ge
:
FaceId
=
FaceId
(
140
u
)
@JvmStatic
val
gouwu
:
FaceId
=
FaceId
(
141
u
)
@JvmStatic
val
youjian
:
FaceId
=
FaceId
(
142
u
)
@JvmStatic
val
shuai_qi
:
FaceId
=
FaceId
(
143
u
)
@JvmStatic
val
hecai
:
FaceId
=
FaceId
(
144
u
)
@JvmStatic
val
qidao
:
FaceId
=
FaceId
(
145
u
)
@JvmStatic
val
baojin
:
FaceId
=
FaceId
(
146
u
)
@JvmStatic
val
bangbangtang
:
FaceId
=
FaceId
(
147
u
)
@JvmStatic
val
he_nai
:
FaceId
=
FaceId
(
148
u
)
@JvmStatic
val
xiamian
:
FaceId
=
FaceId
(
149
u
)
@JvmStatic
val
xiangjiao
:
FaceId
=
FaceId
(
150
u
)
@JvmStatic
val
feiji
:
FaceId
=
FaceId
(
151
u
)
@JvmStatic
val
kaiche
:
FaceId
=
FaceId
(
152
u
)
@JvmStatic
val
gaotiezuochetou
:
FaceId
=
FaceId
(
153
u
)
@JvmStatic
val
chexiang
:
FaceId
=
FaceId
(
154
u
)
@JvmStatic
val
gaotieyouchetou
:
FaceId
=
FaceId
(
155
u
)
@JvmStatic
val
duoyun
:
FaceId
=
FaceId
(
156
u
)
@JvmStatic
val
xiayu
:
FaceId
=
FaceId
(
157
u
)
@JvmStatic
val
chaopiao
:
FaceId
=
FaceId
(
158
u
)
@JvmStatic
val
xiongmao
:
FaceId
=
FaceId
(
159
u
)
@JvmStatic
val
dengpao
:
FaceId
=
FaceId
(
160
u
)
@JvmStatic
val
fengche
:
FaceId
=
FaceId
(
161
u
)
@JvmStatic
val
naozhong
:
FaceId
=
FaceId
(
162
u
)
@JvmStatic
val
dasan
:
FaceId
=
FaceId
(
163
u
)
@JvmStatic
val
caiqiu
:
FaceId
=
FaceId
(
164
u
)
@JvmStatic
val
zuanjie
:
FaceId
=
FaceId
(
165
u
)
@JvmStatic
val
shafa
:
FaceId
=
FaceId
(
166
u
)
@JvmStatic
val
zhijin
:
FaceId
=
FaceId
(
167
u
)
@JvmStatic
val
yao
:
FaceId
=
FaceId
(
168
u
)
@JvmStatic
val
shouqiang
:
FaceId
=
FaceId
(
169
u
)
@JvmStatic
val
qingwa
:
FaceId
=
FaceId
(
170
u
)
}
override
fun
toString
():
String
=
"$FaceId($value)"
}
}
\ 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