Commit a81eea42 authored by Him188's avatar Him188

Face decoding

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