Face decoding

This commit is contained in:
Him188 2020-02-19 20:28:10 +08:00
parent 7de048245e
commit a81eea422b
2 changed files with 162 additions and 298 deletions

View File

@ -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 = (0x1445 - 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))

View File

@ -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 = 0xff
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(0xffu)
@JvmStatic
val jingya: FaceId = FaceId(0u)
@JvmStatic
val piezui: FaceId = FaceId(1u)
@JvmStatic
val se: FaceId = FaceId(2u)
@JvmStatic
val fadai: FaceId = FaceId(3u)
@JvmStatic
val deyi: FaceId = FaceId(4u)
@JvmStatic
val liulei: FaceId = FaceId(5u)
@JvmStatic
val haixiu: FaceId = FaceId(6u)
@JvmStatic
val bizui: FaceId = FaceId(7u)
@JvmStatic
val shui: FaceId = FaceId(8u)
@JvmStatic
val daku: FaceId = FaceId(9u)
@JvmStatic
val ganga: FaceId = FaceId(10u)
@JvmStatic
val fanu: FaceId = FaceId(11u)
@JvmStatic
val tiaopi: FaceId = FaceId(12u)
@JvmStatic
val ciya: FaceId = FaceId(13u)
@JvmStatic
val weixiao: FaceId = FaceId(14u)
@JvmStatic
val nanguo: FaceId = FaceId(15u)
@JvmStatic
val ku: FaceId = FaceId(16u)
@JvmStatic
val zhuakuang: FaceId = FaceId(18u)
@JvmStatic
val tu: FaceId = FaceId(19u)
@JvmStatic
val touxiao: FaceId = FaceId(20u)
@JvmStatic
val keai: FaceId = FaceId(21u)
@JvmStatic
val baiyan: FaceId = FaceId(22u)
@JvmStatic
val aoman: FaceId = FaceId(23u)
@JvmStatic
val ji_e: FaceId = FaceId(24u)
@JvmStatic
val kun: FaceId = FaceId(25u)
@JvmStatic
val jingkong: FaceId = FaceId(26u)
@JvmStatic
val liuhan: FaceId = FaceId(27u)
@JvmStatic
val hanxiao: FaceId = FaceId(28u)
@JvmStatic
val dabing: FaceId = FaceId(29u)
@JvmStatic
val fendou: FaceId = FaceId(30u)
@JvmStatic
val zhouma: FaceId = FaceId(31u)
@JvmStatic
val yiwen: FaceId = FaceId(32u)
@JvmStatic
val yun: FaceId = FaceId(34u)
@JvmStatic
val zhemo: FaceId = FaceId(35u)
@JvmStatic
val shuai: FaceId = FaceId(36u)
@JvmStatic
val kulou: FaceId = FaceId(37u)
@JvmStatic
val qiaoda: FaceId = FaceId(38u)
@JvmStatic
val zaijian: FaceId = FaceId(39u)
@JvmStatic
val fadou: FaceId = FaceId(41u)
@JvmStatic
val aiqing: FaceId = FaceId(42u)
@JvmStatic
val tiaotiao: FaceId = FaceId(43u)
@JvmStatic
val zhutou: FaceId = FaceId(46u)
@JvmStatic
val yongbao: FaceId = FaceId(49u)
@JvmStatic
val dan_gao: FaceId = FaceId(53u)
@JvmStatic
val shandian: FaceId = FaceId(54u)
@JvmStatic
val zhadan: FaceId = FaceId(55u)
@JvmStatic
val dao: FaceId = FaceId(56u)
@JvmStatic
val zuqiu: FaceId = FaceId(57u)
@JvmStatic
val bianbian: FaceId = FaceId(59u)
@JvmStatic
val kafei: FaceId = FaceId(60u)
@JvmStatic
val fan: FaceId = FaceId(61u)
@JvmStatic
val meigui: FaceId = FaceId(63u)
@JvmStatic
val diaoxie: FaceId = FaceId(64u)
@JvmStatic
val aixin: FaceId = FaceId(66u)
@JvmStatic
val xinsui: FaceId = FaceId(67u)
@JvmStatic
val liwu: FaceId = FaceId(69u)
@JvmStatic
val taiyang: FaceId = FaceId(74u)
@JvmStatic
val yueliang: FaceId = FaceId(75u)
@JvmStatic
val qiang: FaceId = FaceId(76u)
@JvmStatic
val ruo: FaceId = FaceId(77u)
@JvmStatic
val woshou: FaceId = FaceId(78u)
@JvmStatic
val shengli: FaceId = FaceId(79u)
@JvmStatic
val feiwen: FaceId = FaceId(85u)
@JvmStatic
val naohuo: FaceId = FaceId(86u)
@JvmStatic
val xigua: FaceId = FaceId(89u)
@JvmStatic
val lenghan: FaceId = FaceId(96u)
@JvmStatic
val cahan: FaceId = FaceId(97u)
@JvmStatic
val koubi: FaceId = FaceId(98u)
@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)"
}
}