koishi-plugin-chat-patch 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/web/dist/assets/Chat-B448YOeN.js +28 -0
- package/client/web/dist/assets/{MsgBody-DLeOklIb.js → MsgBody-DDacjWJ9.js} +1 -1
- package/client/web/dist/assets/MsgBody.vue_vue_type_script_setup_true_lang-B1dWyCB0.js +67 -0
- package/client/web/dist/assets/{index-Cz89G4we.js → index-BlLut5xn.js} +121 -129
- package/client/web/dist/assets/index-fW_zcub3.css +1 -0
- package/client/web/dist/assets/pinyin-Dsq98249.js +157657 -0
- package/client/web/dist/index.html +2 -2
- package/client/web/dist/notice_local.json +1 -0
- package/client/web/package-lock.json +49 -0
- package/client/web/package.json +1 -0
- package/client/web/public/notice_local.json +1 -0
- package/client/web/src/components/EmojiFace.vue +0 -6
- package/client/web/src/components/FacePan.vue +0 -12
- package/client/web/src/components/MsgBody.vue +3 -4
- package/client/web/src/components/SettingsTab.vue +133 -0
- package/client/web/src/function/connect.ts +34 -14
- package/client/web/src/function/model/emoji.ts +7 -67
- package/client/web/src/function/msg.ts +68 -26
- package/client/web/src/function/utils/appUtil.ts +1 -4
- package/client/web/src/function/utils/msgUtil.ts +86 -52
- package/client/web/src/function/utils/pinyin.ts +25 -65
- package/client/web/src/function/utils/sessionUtil.ts +90 -14
- package/client/web/src/pages/Friends.vue +49 -13
- package/client/web/src/pages/Messages.vue +39 -12
- package/client/web/src/pages/Options.vue +4 -4
- package/client/web/src/pages/options/OptDev.vue +1 -14
- package/package.json +1 -1
- package/client/web/dist/assets/Chat-BoNiWGxb.js +0 -28
- package/client/web/dist/assets/MsgBody.vue_vue_type_script_setup_true_lang-CGjy4Jzz.js +0 -67
- package/client/web/dist/assets/index-BgOX_tNa.css +0 -1
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
<link rel="stylesheet" href="./bcui/css/style.css">
|
|
12
12
|
<link rel="stylesheet" href="./bcui/css/color-light.css">
|
|
13
13
|
<link rel="stylesheet" href="./css/append-light.css">
|
|
14
|
-
<script type="module" crossorigin src="./assets/index-
|
|
15
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
14
|
+
<script type="module" crossorigin src="./assets/index-BlLut5xn.js"></script>
|
|
15
|
+
<link rel="stylesheet" crossorigin href="./assets/index-fW_zcub3.css">
|
|
16
16
|
</head>
|
|
17
17
|
|
|
18
18
|
<body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"jsonpath": "^1.1.1",
|
|
31
31
|
"markdown-it": "^14.1.1",
|
|
32
32
|
"pinia": "^3.0.3",
|
|
33
|
+
"pinyin": "^4.0.0",
|
|
33
34
|
"pofile": "^1.1.4",
|
|
34
35
|
"querystring": "^0.2.1",
|
|
35
36
|
"spacingjs": "^1.0.8",
|
|
@@ -2422,6 +2423,12 @@
|
|
|
2422
2423
|
"underscore": "1.13.6"
|
|
2423
2424
|
}
|
|
2424
2425
|
},
|
|
2426
|
+
"node_modules/keypress": {
|
|
2427
|
+
"version": "0.1.0",
|
|
2428
|
+
"resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz",
|
|
2429
|
+
"integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA==",
|
|
2430
|
+
"license": "MIT"
|
|
2431
|
+
},
|
|
2425
2432
|
"node_modules/klona": {
|
|
2426
2433
|
"version": "2.0.6",
|
|
2427
2434
|
"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
|
|
@@ -2645,6 +2652,48 @@
|
|
|
2645
2652
|
}
|
|
2646
2653
|
}
|
|
2647
2654
|
},
|
|
2655
|
+
"node_modules/pinyin": {
|
|
2656
|
+
"version": "4.0.0",
|
|
2657
|
+
"resolved": "https://registry.npmjs.org/pinyin/-/pinyin-4.0.0.tgz",
|
|
2658
|
+
"integrity": "sha512-vHpV5K+vpp6XUUpZNGRDuHoN+1xcmieM3EWlH4QjSX2kkpG/gVOwpqwV9EOJ9x9c9UERFKeLml5XVSukE/PLgQ==",
|
|
2659
|
+
"license": "MIT",
|
|
2660
|
+
"dependencies": {
|
|
2661
|
+
"commander": "~1.1.1"
|
|
2662
|
+
},
|
|
2663
|
+
"bin": {
|
|
2664
|
+
"pinyin": "bin/pinyin"
|
|
2665
|
+
},
|
|
2666
|
+
"engines": {
|
|
2667
|
+
"install-node": "^18.0.0"
|
|
2668
|
+
},
|
|
2669
|
+
"peerDependencies": {
|
|
2670
|
+
"@node-rs/jieba": "^1.6.0",
|
|
2671
|
+
"nodejieba": "^3.4.4",
|
|
2672
|
+
"segmentit": "^2.0.3"
|
|
2673
|
+
},
|
|
2674
|
+
"peerDependenciesMeta": {
|
|
2675
|
+
"@node-rs/jieba": {
|
|
2676
|
+
"optional": true
|
|
2677
|
+
},
|
|
2678
|
+
"nodejieba": {
|
|
2679
|
+
"optional": true
|
|
2680
|
+
},
|
|
2681
|
+
"segmentit": {
|
|
2682
|
+
"optional": true
|
|
2683
|
+
}
|
|
2684
|
+
}
|
|
2685
|
+
},
|
|
2686
|
+
"node_modules/pinyin/node_modules/commander": {
|
|
2687
|
+
"version": "1.1.1",
|
|
2688
|
+
"resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz",
|
|
2689
|
+
"integrity": "sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==",
|
|
2690
|
+
"dependencies": {
|
|
2691
|
+
"keypress": "0.1.x"
|
|
2692
|
+
},
|
|
2693
|
+
"engines": {
|
|
2694
|
+
"node": ">= 0.6.x"
|
|
2695
|
+
}
|
|
2696
|
+
},
|
|
2648
2697
|
"node_modules/pofile": {
|
|
2649
2698
|
"version": "1.1.4",
|
|
2650
2699
|
"resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz",
|
package/client/web/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -10,12 +10,6 @@
|
|
|
10
10
|
:icon="['fas', 'face-grin-wide']"
|
|
11
11
|
:title="$t('表情')"
|
|
12
12
|
class="emoji-face" />
|
|
13
|
-
<img v-else-if="emoji.type === 'apng'"
|
|
14
|
-
class="emoji-face"
|
|
15
|
-
loading="lazy"
|
|
16
|
-
:alt="emoji.description"
|
|
17
|
-
:title="emoji.description"
|
|
18
|
-
:src="emoji.value">
|
|
19
13
|
<span v-else
|
|
20
14
|
:title="emoji.description"
|
|
21
15
|
class="emoji-face">
|
|
@@ -26,18 +26,6 @@
|
|
|
26
26
|
</template>
|
|
27
27
|
</div>
|
|
28
28
|
</template>
|
|
29
|
-
<div class="title">
|
|
30
|
-
<span>{{ $t('小黄脸表情') }}</span>
|
|
31
|
-
</div>
|
|
32
|
-
<div class="face">
|
|
33
|
-
<template v-for="num in Emoji.normalList" :key="num">
|
|
34
|
-
<div>
|
|
35
|
-
<EmojiFace
|
|
36
|
-
:emoji="Emoji.get(num)"
|
|
37
|
-
@click="addBaseFace(num)" />
|
|
38
|
-
</div>
|
|
39
|
-
</template>
|
|
40
|
-
</div>
|
|
41
29
|
<div class="title">
|
|
42
30
|
<span>{{ $t('emoji 表情') }}</span>
|
|
43
31
|
</div>
|
|
@@ -81,9 +81,9 @@
|
|
|
81
81
|
<!-- 超级表情 -->
|
|
82
82
|
<template v-else-if="isSuperFaceMsg()">
|
|
83
83
|
<div class="msg-img face lottie-face alone">
|
|
84
|
-
<
|
|
85
|
-
:
|
|
86
|
-
|
|
84
|
+
<EmojiFace
|
|
85
|
+
:emoji="Emoji.get(Number(data.message[0].id))!"
|
|
86
|
+
class="msg-face" />
|
|
87
87
|
</div>
|
|
88
88
|
</template>
|
|
89
89
|
<template v-else-if="!hasCard()">
|
|
@@ -436,7 +436,6 @@ const chatStore = useChatStore()
|
|
|
436
436
|
const settingsStore = useSettingsStore()
|
|
437
437
|
import Emoji from '../function/model/emoji'
|
|
438
438
|
import EmojiFace from './EmojiFace.vue'
|
|
439
|
-
import LazyLottie from './LazyLottie.vue'
|
|
440
439
|
import { Img } from '../function/model/img'
|
|
441
440
|
import { dbGetImage, hashUrl } from '../function/utils/localHistoryUtil'
|
|
442
441
|
import JsonSegComp from './msg-component/JsonSegComp.vue'
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<!-- 设置页专用选项卡,避免 BcTab 在多实例/HMR 下取错 tab body -->
|
|
3
|
+
<div class="tab-main">
|
|
4
|
+
<Card>
|
|
5
|
+
<ul v-if="tabs.length" class="tab-bar">
|
|
6
|
+
<span v-if="title">{{ title }}</span>
|
|
7
|
+
<li
|
|
8
|
+
v-for="(tab, index) in tabs"
|
|
9
|
+
:key="tab.name"
|
|
10
|
+
:class="{ select: activeIndex === index }"
|
|
11
|
+
@click="selectTab(index)">
|
|
12
|
+
<span>{{ tab.name }}</span>
|
|
13
|
+
<div
|
|
14
|
+
v-if="index === tabs.length - 1"
|
|
15
|
+
:style="getTabLineStyle(index)" />
|
|
16
|
+
</li>
|
|
17
|
+
</ul>
|
|
18
|
+
</Card>
|
|
19
|
+
<div ref="bodyRef" class="tab-body">
|
|
20
|
+
<slot />
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<script setup lang="ts">
|
|
26
|
+
import { computed, nextTick, onMounted, ref, useSlots, watch } from 'vue'
|
|
27
|
+
import Card from 'vue3-bcui/packages/ss-card'
|
|
28
|
+
|
|
29
|
+
const props = defineProps<{
|
|
30
|
+
title?: string
|
|
31
|
+
}>()
|
|
32
|
+
|
|
33
|
+
const slots = useSlots()
|
|
34
|
+
const bodyRef = ref<HTMLElement>()
|
|
35
|
+
const activeIndex = ref(0)
|
|
36
|
+
|
|
37
|
+
const tabs = computed(() => {
|
|
38
|
+
const nodes = slots.default?.() ?? []
|
|
39
|
+
return nodes.filter((node) => {
|
|
40
|
+
const props = node.props as Record<string, unknown> | undefined
|
|
41
|
+
return Boolean(props?.name)
|
|
42
|
+
}).map((node) => {
|
|
43
|
+
const props = node.props as Record<string, unknown>
|
|
44
|
+
return {
|
|
45
|
+
name: String(props.name ?? ''),
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
function selectTab(index: number) {
|
|
51
|
+
activeIndex.value = index
|
|
52
|
+
nextTick(() => {
|
|
53
|
+
const children = bodyRef.value?.children
|
|
54
|
+
if (!children) return
|
|
55
|
+
const activeName = tabs.value[index]?.name
|
|
56
|
+
for (let i = 0; i < children.length; i++) {
|
|
57
|
+
const child = children[i] as HTMLElement
|
|
58
|
+
if (child.nodeName === 'DIV' && child.hasAttribute('name')) {
|
|
59
|
+
child.style.display = child.getAttribute('name') === activeName
|
|
60
|
+
? 'block'
|
|
61
|
+
: 'none'
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function getTabLineStyle(maxIndex: number) {
|
|
68
|
+
const offset = maxIndex - activeIndex.value
|
|
69
|
+
return `transform: translateX(calc(-${offset}00% - (var(--bc-tab-margin) * 2 + 10px) * ${offset}))`
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
onMounted(() => {
|
|
73
|
+
selectTab(0)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
watch(tabs, () => {
|
|
77
|
+
nextTick(() => selectTab(activeIndex.value))
|
|
78
|
+
})
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<style scoped>
|
|
82
|
+
.tab-main > div:first-child {
|
|
83
|
+
margin-bottom: 10px;
|
|
84
|
+
}
|
|
85
|
+
.tab-bar {
|
|
86
|
+
--bc-tab-margin: 20px;
|
|
87
|
+
|
|
88
|
+
margin: -17px -20px -17px -40px;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
align-items: center;
|
|
91
|
+
position: relative;
|
|
92
|
+
display: flex;
|
|
93
|
+
}
|
|
94
|
+
.tab-bar > span {
|
|
95
|
+
font-weight: bold;
|
|
96
|
+
flex: 0 0 auto;
|
|
97
|
+
margin-right: 20px;
|
|
98
|
+
}
|
|
99
|
+
.tab-bar > li {
|
|
100
|
+
margin: 0 var(--bc-tab-margin);
|
|
101
|
+
justify-content: center;
|
|
102
|
+
flex-direction: column;
|
|
103
|
+
list-style-type: none;
|
|
104
|
+
align-items: center;
|
|
105
|
+
border-radius: 3px;
|
|
106
|
+
min-width: 30px;
|
|
107
|
+
cursor: pointer;
|
|
108
|
+
padding: 10px;
|
|
109
|
+
display: flex;
|
|
110
|
+
}
|
|
111
|
+
.tab-bar > li span,
|
|
112
|
+
.tab-bar > li svg {
|
|
113
|
+
color: var(--color-font);
|
|
114
|
+
transition: color 0.3s;
|
|
115
|
+
font-size: 0.9rem;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.tab-bar > li > div {
|
|
119
|
+
width: calc(100% + 10px);
|
|
120
|
+
margin-bottom: -10px;
|
|
121
|
+
transition: all .35s;
|
|
122
|
+
border-radius: 7px;
|
|
123
|
+
margin-top: 6px;
|
|
124
|
+
height: 3px;
|
|
125
|
+
}
|
|
126
|
+
.tab-bar > li:last-child > div {
|
|
127
|
+
background: var(--color-main);
|
|
128
|
+
}
|
|
129
|
+
.tab-bar > li.select span,
|
|
130
|
+
.tab-bar > li.select svg {
|
|
131
|
+
color: var(--color-main);
|
|
132
|
+
}
|
|
133
|
+
</style>
|
|
@@ -25,7 +25,11 @@ import { useChatStore } from '../state/chat'
|
|
|
25
25
|
import { useContactStore } from '../state/contact'
|
|
26
26
|
import { useSettingsStore } from '../state/settings'
|
|
27
27
|
import { getMsgRawTxt, hasAtMe, updateBaseOnMsgList } from './utils/msgUtil'
|
|
28
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
getSessionDedupKey,
|
|
30
|
+
normalizeSessionId,
|
|
31
|
+
setSessionContact,
|
|
32
|
+
} from './utils/sessionUtil'
|
|
29
33
|
import { buildQqGroupAvatar } from './utils/avatarUtil'
|
|
30
34
|
import type { ConnectionHistoryItem, LoginCacheElem } from './elements/system'
|
|
31
35
|
import type { UserFriendElem, UserGroupElem } from './elements/information'
|
|
@@ -350,9 +354,9 @@ function updateBotStateGroup(
|
|
|
350
354
|
const session = state?.onMsgList.find((item) => String(item.group_id) === sessionId)
|
|
351
355
|
if (!state || !session) return
|
|
352
356
|
apply(session as unknown as Record<string, unknown>)
|
|
353
|
-
const key = normalizeSessionId(String(session.channel_id
|
|
357
|
+
const key = normalizeSessionId(String(session.channel_id || session.channelId || sessionId))
|
|
354
358
|
const baseList = [...state.baseList]
|
|
355
|
-
const baseIndex = baseList.findIndex(([
|
|
359
|
+
const baseIndex = baseList.findIndex(([, value]) => value === session)
|
|
356
360
|
const typedSession = session as unknown as UserFriendElem & UserGroupElem
|
|
357
361
|
if (baseIndex >= 0) {
|
|
358
362
|
baseList[baseIndex] = [key, typedSession]
|
|
@@ -598,6 +602,14 @@ function recordBotMessage(platform: string, selfId: string, msg: Record<string,
|
|
|
598
602
|
guild_id: typeof msg.guild_id === 'string' ? msg.guild_id : undefined,
|
|
599
603
|
}
|
|
600
604
|
const existing = state.onMsgList.find((item) => {
|
|
605
|
+
const itemChannelId = String(item.channel_id || item.channelId || '')
|
|
606
|
+
if (itemChannelId) {
|
|
607
|
+
if (isGroup) {
|
|
608
|
+
return normalizeGroupId(itemChannelId) === normalizeGroupId(channelId || sessionId)
|
|
609
|
+
}
|
|
610
|
+
return itemChannelId.replace(/^(?:private|direct):/i, '')
|
|
611
|
+
=== String(sessionId).replace(/^(?:private|direct):/i, '')
|
|
612
|
+
}
|
|
601
613
|
return isGroup
|
|
602
614
|
? String(item.group_id) === sessionId
|
|
603
615
|
: String(item.user_id) === sessionId
|
|
@@ -631,7 +643,7 @@ function recordBotMessage(platform: string, selfId: string, msg: Record<string,
|
|
|
631
643
|
}
|
|
632
644
|
const baseKey = normalizeSessionId(sessionKey)
|
|
633
645
|
const baseList = [...state.baseList]
|
|
634
|
-
const baseIndex = baseList.findIndex(([
|
|
646
|
+
const baseIndex = baseList.findIndex(([, value]) => value === session)
|
|
635
647
|
const typedSession = session as unknown as UserFriendElem & UserGroupElem
|
|
636
648
|
if (baseIndex >= 0) {
|
|
637
649
|
baseList[baseIndex] = [baseKey, typedSession]
|
|
@@ -773,20 +785,28 @@ export function restoreBotStateFromMessageCache(platform: string, selfId: string
|
|
|
773
785
|
baseList: [],
|
|
774
786
|
onMsgList: [],
|
|
775
787
|
}
|
|
776
|
-
const
|
|
777
|
-
const
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
}
|
|
788
|
+
const baseMap = new Map<string, UserFriendElem & UserGroupElem>()
|
|
789
|
+
for (const [, value] of state.baseList) {
|
|
790
|
+
const id = getSessionDedupKey(value)
|
|
791
|
+
if (!id.endsWith(':0') && !id.endsWith(':')) baseMap.set(id, value)
|
|
792
|
+
}
|
|
793
|
+
const baseList = [...baseMap.entries()]
|
|
794
|
+
const baseKeys = new Set(baseList.map(([key]) => key))
|
|
795
|
+
const existing = new Set(
|
|
796
|
+
state.onMsgList.map((item) => {
|
|
797
|
+
const id = getSessionDedupKey(item)
|
|
798
|
+
return !id.endsWith(':0') && !id.endsWith(':') ? id : ''
|
|
799
|
+
}).filter(Boolean),
|
|
800
|
+
)
|
|
781
801
|
for (const session of sessions) {
|
|
782
|
-
const id =
|
|
783
|
-
if (id && !existing.has(id)) {
|
|
802
|
+
const id = getSessionDedupKey(session)
|
|
803
|
+
if (!id.endsWith(':0') && !id.endsWith(':') && !existing.has(id)) {
|
|
784
804
|
state.onMsgList.unshift(session)
|
|
785
805
|
existing.add(id)
|
|
786
806
|
}
|
|
787
|
-
if (id && !baseKeys.has(
|
|
788
|
-
baseList.push([normalizeSessionId(
|
|
789
|
-
baseKeys.add(
|
|
807
|
+
if (!id.endsWith(':0') && !id.endsWith(':') && !baseKeys.has(id)) {
|
|
808
|
+
baseList.push([normalizeSessionId(String(session.channel_id || session.channelId || session.user_id || session.group_id || '')), session])
|
|
809
|
+
baseKeys.add(id)
|
|
790
810
|
}
|
|
791
811
|
}
|
|
792
812
|
contactStore.botStates.set(selfId, {
|
|
@@ -3,30 +3,7 @@ export default class Emoji {
|
|
|
3
3
|
static readonly descMap = new Map<string, string>()
|
|
4
4
|
static readonly allList = new Set<number>()
|
|
5
5
|
static readonly allSuperList = new Set<number>()
|
|
6
|
-
|
|
7
|
-
static readonly superList: readonly number[] = [
|
|
8
|
-
5, 311, 312, 314, 317, 318, 319, 320, 324, 325, 337,
|
|
9
|
-
338, 339, 341, 342, 343, 344, 345, 346, 181, 74, 75,
|
|
10
|
-
351, 349, 350, 395, 114, 326, 53, 137, 333, 424, 415,
|
|
11
|
-
392, 425, 427, 426, 419, 429, 472, 474, 475, 476, 477,
|
|
12
|
-
478, 479,
|
|
13
|
-
]
|
|
14
|
-
|
|
15
|
-
static readonly normalList: readonly number[] = [
|
|
16
|
-
14, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 0, 15, 16,
|
|
17
|
-
96, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
|
18
|
-
31, 32, 33, 34, 35, 36, 37, 38, 39, 97, 98, 99, 100,
|
|
19
|
-
101, 102, 103, 104, 105, 106, 107, 108, 305, 109, 110,
|
|
20
|
-
111, 172, 182, 179, 173, 174, 212, 175, 178, 177, 176,
|
|
21
|
-
183, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
|
|
22
|
-
272, 277, 307, 306, 281, 282, 283, 284, 285, 293, 286,
|
|
23
|
-
287, 289, 294, 297, 298, 299, 300, 323, 332, 336, 353,
|
|
24
|
-
355, 356, 354, 352, 357, 428, 334, 347, 303, 302, 295,
|
|
25
|
-
49, 66, 63, 64, 187, 146, 116, 67, 60, 185, 76, 124,
|
|
26
|
-
118, 78, 119, 79, 120, 121, 77, 123, 201, 273, 46, 112,
|
|
27
|
-
56, 169, 171, 59, 144, 147, 148, 89, 41, 125, 42, 43, 86, 129,
|
|
28
|
-
85,
|
|
29
|
-
]
|
|
6
|
+
static readonly normalList: readonly number[] = []
|
|
30
7
|
|
|
31
8
|
static readonly emojiList: readonly number[] = [
|
|
32
9
|
128522, 128524, 128538, 128531, 128560, 128541, 128513, 128540,
|
|
@@ -40,19 +17,6 @@ export default class Emoji {
|
|
|
40
17
|
10068, 128299, 128147, 127978,
|
|
41
18
|
]
|
|
42
19
|
|
|
43
|
-
static readonly responseApngId: readonly number[] = [
|
|
44
|
-
5, 314, 318, 319, 320, 324, 337, 338, 339, 341, 342, 343, 344,
|
|
45
|
-
345, 346, 181, 74, 75, 351, 349, 350, 395, 326, 53, 333, 424,
|
|
46
|
-
425, 427, 426, 14, 4, 8, 9, 10, 12, 16, 96, 21, 23, 24, 25, 26,
|
|
47
|
-
27, 28, 29, 30, 32, 33, 34, 38, 39, 97, 98, 99, 100, 101, 102,
|
|
48
|
-
103, 104, 106, 305, 109, 111, 182, 179, 173, 174, 212, 175, 176,
|
|
49
|
-
183, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 277, 307,
|
|
50
|
-
306, 281, 282, 284, 285, 293, 287, 289, 294, 297, 298, 299, 332,
|
|
51
|
-
336, 353, 355, 356, 354, 352, 357, 428, 334, 347, 303, 302, 295,
|
|
52
|
-
49, 66, 63, 116, 60, 76, 124, 118, 78, 79, 120, 123, 201, 273,
|
|
53
|
-
171, 144, 147, 89, 41, 125, 42, 43, 129, 85,
|
|
54
|
-
]
|
|
55
|
-
|
|
56
20
|
static readonly responseEmojiId: readonly number[] = [
|
|
57
21
|
128522, 128524, 128538, 128531, 128560, 128541, 128513, 128540,
|
|
58
22
|
9786, 128532, 128516, 128527, 128530, 128563, 128536, 128557,
|
|
@@ -67,7 +31,7 @@ export default class Emoji {
|
|
|
67
31
|
|
|
68
32
|
private constructor(
|
|
69
33
|
public id: number,
|
|
70
|
-
public type: '
|
|
34
|
+
public type: 'emoji',
|
|
71
35
|
public hasSuper: boolean,
|
|
72
36
|
public superSuffix: number[],
|
|
73
37
|
) {
|
|
@@ -77,28 +41,16 @@ export default class Emoji {
|
|
|
77
41
|
}
|
|
78
42
|
|
|
79
43
|
static get(id: number): Emoji | undefined {
|
|
80
|
-
if (id < 5000)
|
|
81
|
-
const value = this.apngMap.get(id)
|
|
82
|
-
return value ? new Emoji(id, 'apng', value.super, value.suffix) : undefined
|
|
83
|
-
}
|
|
44
|
+
if (id < 5000) return undefined
|
|
84
45
|
return new Emoji(id, 'emoji', false, [])
|
|
85
46
|
}
|
|
86
47
|
|
|
87
48
|
static has(id: number): boolean {
|
|
88
|
-
return id >= 5000
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
static init() {
|
|
92
|
-
for (const id of [...this.superList, ...this.normalList, ...this.responseApngId]) {
|
|
93
|
-
const isSuper = this.superList.includes(id)
|
|
94
|
-
this.apngMap.set(id, { super: isSuper, suffix: [] })
|
|
95
|
-
if (isSuper) this.allSuperList.add(id)
|
|
96
|
-
this.allList.add(id)
|
|
97
|
-
}
|
|
49
|
+
return id >= 5000
|
|
98
50
|
}
|
|
99
51
|
|
|
100
52
|
static get responseId(): readonly number[] {
|
|
101
|
-
return
|
|
53
|
+
return this.responseEmojiId
|
|
102
54
|
}
|
|
103
55
|
|
|
104
56
|
get description(): string {
|
|
@@ -106,22 +58,10 @@ export default class Emoji {
|
|
|
106
58
|
}
|
|
107
59
|
|
|
108
60
|
get value(): string {
|
|
109
|
-
return
|
|
61
|
+
return String.fromCodePoint(this.id)
|
|
110
62
|
}
|
|
111
63
|
|
|
112
64
|
get superValue(): string | undefined {
|
|
113
|
-
|
|
114
|
-
return this.getSuperUrl(this.id, this.suffixId)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private getNormalUrl(id: number): string {
|
|
118
|
-
return `https://lib.stapxs.cn/download/stapxs-qq-lite/qq_emoji/${id}/apng/${id}.png`
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
private getSuperUrl(id: number, suffix?: number): string {
|
|
122
|
-
const name = suffix ? `${id}_${suffix}` : `${id}`
|
|
123
|
-
return `https://lib.stapxs.cn/download/stapxs-qq-lite/qq_emoji/${id}/lottie/${name}.json`
|
|
65
|
+
return undefined
|
|
124
66
|
}
|
|
125
67
|
}
|
|
126
|
-
|
|
127
|
-
setTimeout(Emoji.init.bind(Emoji), 0)
|