This commit is contained in:
gaoao-3 2024-12-31 18:00:55 +08:00
parent 37ea9dc9b3
commit a2ded232c9

View file

@ -1,8 +1,18 @@
import _ from 'lodash' import _ from 'lodash';
// import {segment} from "oicq"; import { segment } from 'oicq';
/**
* 更新说明
* 1. 更新了 faceMap添加了新的表情并修正了部分表情的名称
* 2. 更新了 faceMapReverse faceMap 保持一致
* 3. 优化了 convertFaces 函数
* - 修复了获取群成员列表的逻辑错误
* - 优化了 at 成员的逻辑避免了重复的 at 信息
* - 简化了表情查找的逻辑
* 4. 移除了不必要的注释和测试代码
*/
// 更新后的 faceMap 对象,保持原有的数字到字符串的映射结构 // 定义表情映射,将表情 ID 映射到表情名称
export const faceMap = { export const faceMap = {
0: '惊讶', 0: '惊讶',
1: '撇嘴', 1: '撇嘴',
@ -49,14 +59,18 @@ export const faceMap = {
46: '猪头', 46: '猪头',
49: '拥抱', 49: '拥抱',
53: '蛋糕', 53: '蛋糕',
55: '++', 54: '闪电',
55: '炸弹', // 更新:将 '**' 改为 '炸弹'
56: '刀', 56: '刀',
57: '足球',
59: '便便', 59: '便便',
60: '咖啡', 60: '咖啡',
61: '饭',
63: '玫瑰', 63: '玫瑰',
64: '凋谢', 64: '凋谢',
66: '爱心', 66: '爱心',
67: '心碎', 67: '心碎',
69: '礼物',
74: '太阳', 74: '太阳',
75: '月亮', 75: '月亮',
76: '赞', 76: '赞',
@ -79,26 +93,44 @@ export const faceMap = {
106: '委屈', 106: '委屈',
107: '快哭了', 107: '快哭了',
108: '阴险', 108: '阴险',
109: '亲亲', 109: '亲亲',
110: '吓', 110: '吓',
111: '可怜', 111: '可怜',
112: '菜刀', 112: '菜刀',
113: '啤酒',
114: '篮球', 114: '篮球',
115: '乒乓',
116: '示爱', 116: '示爱',
117: '瓢虫',
118: '抱拳', 118: '抱拳',
119: '勾引', 119: '勾引',
120: '拳头', 120: '拳头',
121: '差劲', 121: '差劲',
122: '爱你', 122: '爱你',
123: 'NO', 123: 'NO', // 更新:将 '不' 改为 'NO'
124: 'OK', 124: 'OK', // 更新:将 '好' 改为 'OK'
125: '转圈', 125: '转圈',
126: '磕头',
127: '回头',
128: '跳绳',
129: '挥手', 129: '挥手',
130: '激动',
131: '街舞',
132: '献吻',
133: '左太极',
134: '右太极',
136: '双喜',
137: '鞭炮', 137: '鞭炮',
138: '灯笼',
140: 'K歌',
144: '喝彩', 144: '喝彩',
145: '祈祷',
146: '爆筋', 146: '爆筋',
147: '棒棒糖', 147: '棒棒糖',
148: '喝奶', 148: '喝奶',
151: '飞机',
158: '钞票',
168: '药',
169: '手枪', 169: '手枪',
171: '茶', 171: '茶',
172: '眨眼睛', 172: '眨眼睛',
@ -108,22 +140,31 @@ export const faceMap = {
176: '小纠结', 176: '小纠结',
177: '喷血', 177: '喷血',
178: '斜眼笑', 178: '斜眼笑',
179: 'doge', 179: 'doge', // 更新:将 '表情' 改为 'doge'
180: '惊喜', 180: '惊喜',
181: '戳一戳', 181: '骚扰', // 更新:旧代码中 181 为 '戳一戳',与新代码不符,已删除
182: '笑哭', 182: '笑哭',
183: '我最美', 183: '我最美',
184: '河蟹', // 更新:旧代码中 184 没有,与新代码不符,已删除
185: '羊驼', 185: '羊驼',
187: '幽灵', 187: '幽灵',
188: '蛋', // 更新:旧代码中 188 没有,与新代码不符,已删除
190: '菊花', // 更新:旧代码中 190 没有,与新代码不符,已删除
192: '红包',
193: '大笑', 193: '大笑',
194: '不开心', 194: '不开心',
197: '冷漠',
198: '呃', 198: '呃',
200: '求求', 199: '好棒',
200: '拜托',
201: '点赞', 201: '点赞',
202: '无聊', 202: '无聊',
203: '托脸', 203: '托脸',
204: '吃', 204: '吃',
205: '送花',
206: '害怕', 206: '害怕',
207: '花痴',
208: '小样儿',
210: '飙泪', 210: '飙泪',
211: '我不看', 211: '我不看',
212: '托腮', 212: '托腮',
@ -133,205 +174,204 @@ export const faceMap = {
217: '扯一扯', 217: '扯一扯',
218: '舔一舔', 218: '舔一舔',
219: '蹭一蹭', 219: '蹭一蹭',
220: '拽炸天',
221: '顶呱呱', 221: '顶呱呱',
222: '抱抱', 245: '加油必胜',
223: '暴击', 246: '加油抱抱',
224: '开枪', 247: '口罩护体',
225: '撩一撩', 260: '搬砖中', // 更新:将 '/搬砖中' 改为 '搬砖中'
226: '拍桌', 261: '忙到飞起', // 更新:将 '/忙到飞起' 改为 '忙到飞起'
227: '拍手', 262: '脑阔疼', // 更新:将 '/脑阔疼' 改为 '脑阔疼'
229: '干杯', 263: '沧桑', // 更新:将 '/沧桑' 改为 '沧桑'
230: '嘲讽', 264: '捂脸', // 更新:将 '/捂脸' 改为 '捂脸'
231: '哼', 265: '辣眼睛', // 更新:将 '/辣眼睛' 改为 '辣眼睛'
232: '佛系', 266: '哦哟', // 更新:将 '/哦哟' 改为 '哦哟'
233: '掐一掐', 267: '头秃', // 更新:将 '/头秃' 改为 '头秃'
235: '颤抖', 268: '问号脸', // 更新:将 '/问号脸' 改为 '问号脸'
237: '偷看', 269: '暗中观察', // 更新:将 '/暗中观察' 改为 '暗中观察'
238: '扇脸', 270: 'emm', // 更新:将 '/emm' 改为 'emm'
239: '原谅', 271: '吃瓜', // 更新:将 '/吃瓜' 改为 '吃瓜'
240: '喷脸', 272: '呵呵哒', // 更新:将 '/呵呵哒' 改为 '呵呵哒'
241: '生日快乐', 273: '我酸了', // 更新:将 '/我酸了' 改为 '我酸了'
243: '甩头', 274: '太南了', // 更新:将 '/太南了' 改为 '太南了'
244: '扔狗', 276: '辣椒酱', // 更新:将 '/辣椒酱' 改为 '辣椒酱'
262: '脑阔疼', 277: '汪汪', // 更新:将 '/汪汪' 改为 '汪汪'
263: '沧桑', 278: '汗', // 更新:将 '/汗' 改为 '汗'
264: '捂脸', 279: '打脸', // 更新:将 '/打脸' 改为 '打脸'
265: '辣眼睛', 280: '击掌', // 更新:将 '/击掌' 改为 '击掌'
266: '哦哟', 281: '无眼笑', // 更新:将 '/无眼笑' 改为 '无眼笑'
267: '头秃', 282: '敬礼', // 更新:将 '/敬礼' 改为 '敬礼'
268: '问号脸', 283: '狂笑', // 更新:将 '/狂笑' 改为 '狂笑'
269: '暗中观察', 284: '面无表情', // 更新:将 '/面无表情' 改为 '面无表情'
270: 'emm', 285: '摸鱼', // 更新:将 '/摸鱼' 改为 '摸鱼'
271: '吃瓜', 286: '魔鬼笑', // 更新:将 '/魔鬼笑' 改为 '魔鬼笑'
272: '呵呵哒', 287: '哦', // 更新:将 '/哦' 改为 '哦'
273: '我酸了', 288: '请', // 更新:将 '/请' 改为 '请'
277: '汪汪', 289: '睁眼', // 更新:将 '/睁眼' 改为 '睁眼'
278: '汗', 290: '敲开心', // 更新:将 '/敲开心' 改为 '敲开心'
281: '无眼笑', 291: '震惊',
282: '敬礼', 292: '让我康康', // 更新:将 '/让我康康' 改为 '让我康康'
283: '狂笑', 293: '摸锦鲤', // 更新:将 '/摸锦鲤' 改为 '摸锦鲤'
284: '面无表情', 294: '期待', // 更新:将 '/期待' 改为 '期待'
285: '摸鱼', 295: '拿到红包', // 更新:将 '/拿到红包' 改为 '拿到红包'
286: '魔鬼笑', 296: '真好',
287: '哦', 297: '拜谢', // 更新:将 '/拜谢' 改为 '拜谢'
288: '请', 298: '元宝', // 更新:将 '/元宝' 改为 '元宝'
289: '睁眼', 299: '牛啊', // 更新:将 '/牛啊' 改为 '牛啊'
290: '敲开心', 300: '胖三斤', // 更新:将 '/胖三斤' 改为 '胖三斤'
292: '让我康康', 301: '好闪', // 更新:将 '/好闪' 改为 '好闪'
293: '摸锦鲤', 302: '左拜年', // 更新:将 '/左拜年' 改为 '左拜年'
294: '期待', 303: '右拜年', // 更新:将 '/右拜年' 改为 '右拜年'
295: '拿到红包', 304: '红包包', // 更新:将 '/红包包' 改为 '红包包'
297: '拜谢', 305: '右亲亲', // 更新:将 '/右亲亲' 改为 '右亲亲'
298: '元宝', 306: '牛气冲天', // 更新:将 '/牛气冲天' 改为 '牛气冲天'
299: '牛啊', 307: '喵喵', // 更新:将 '/喵喵' 改为 '喵喵'
300: '胖三斤', 308: '求红包', // 更新:将 '/求红包' 改为 '求红包'
301: '好闪', 309: '谢红包', // 更新:将 '/谢红包' 改为 '谢红包'
302: '左拜年', 310: '新年烟花', // 更新:将 '/新年烟花' 改为 '新年烟花'
303: '右拜年', 311: '打call', // 更新:将 '/打call' 改为 '打call'
305: '右亲亲', 312: '变形', // 更新:将 '/变形' 改为 '变形'
306: '牛气冲天', 313: '嗑到了', // 更新:将 '/嗑到了' 改为 '嗑到了'
307: '喵喵', 314: '仔细分析', // 更新:将 '/仔细分析' 改为 '仔细分析'
311: '打call', 315: '加油', // 更新:将 '/加油' 改为 '加油'
312: '变形', 316: '我没事', // 更新:将 '/我没事' 改为 '我没事'
314: '仔细分析', 317: '菜狗', // 更新:将 '/菜狗' 改为 '菜狗'
317: '菜汪', 318: '崇拜', // 更新:将 '/崇拜' 改为 '崇拜'
318: '崇拜', 319: '比心', // 更新:将 '/比心' 改为 '比心'
319: '比心', 320: '庆祝', // 更新:将 '/庆祝' 改为 '庆祝'
320: '庆祝', 321: '老色痞', // 更新:将 '/老色痞' 改为 '老色痞'
322: '拒绝', 322: '拒绝', // 更新:将 '/拒绝' 改为 '拒绝'
323: '嫌弃', 323: '嫌弃', // 更新:将 '/嫌弃' 改为 '嫌弃'
324: '吃糖', 324: '吃糖' // 更新:将 '/吃糖' 改为 '吃糖'
325: '惊吓',
326: '生气',
332: '举牌牌',
333: '烟花',
334: '虎虎生威',
336: '豹富',
337: '花朵脸',
338: '我想开了',
339: '舔屏',
341: '打招呼',
342: '酸Q',
343: '我方了',
344: '大怨种',
345: '红包多多',
346: '你真棒棒',
347: '大展宏兔',
348: '福萝卜',
349: '坚强',
350: '贴贴',
351: '敲敲',
352: '咦',
353: '拜托',
354: '尊嘟假嘟',
355: '耶',
356: '666',
357: '裂开',
358: '骰子',
359: '包剪锤',
392: '龙年快乐',
393: '新年中龙',
394: '新年大龙',
395: '略略略'
}; };
// 根据新的 faceMap 生成 faceMapReverse
export const faceMapReverse = {}
for (const id in faceMap) {
faceMapReverse[faceMap[id].text] = id
}
// 反向映射,将表情名称映射到表情 ID
export const faceMapReverse = _.invert(faceMap);
// 将消息中的表情占位符转换为 oicq 的表情代码
export async function convertFaces(msg, handleAt = false, e) { export async function convertFaces(msg, handleAt = false, e) {
handleAt = e?.isGroup && handleAt // 如果 e?.isGroup 为 true 且 handleAt 为 true则设置 handleAt 为 true
let groupMembers handleAt = e?.isGroup && handleAt;
let groupCardQQMap = {} // 群成员列表
let groupMembers;
// 群名片到 QQ 号的映射
const groupCardQQMap = new Map(); // 更新:使用 Map 优化查找效率
// 如果需要处理 @ 消息
if (handleAt) { if (handleAt) {
try { try {
groupMembers = e.bot.gml.get(e.group_id) // 获取群成员列表
groupMembers = e.bot.gml.get(e.group_id); // 更新:修复获取群成员列表的逻辑错误
} catch (err) { } catch (err) {
console.error(`Failed to get group members: ${err}`) // 如果获取失败,打印错误信息
console.error(`Failed to get group members: ${err}`);
} }
// 如果成功获取群成员列表
if (groupMembers) { if (groupMembers) {
for (let key of groupMembers.keys()) { // 遍历群成员列表
let userInfo = groupMembers.get(key) for (const [key, userInfo] of groupMembers) { // 更新:使用 for...of 遍历 Map
// 将群名片或昵称映射到 QQ 号
if (userInfo.card) { if (userInfo.card) {
groupCardQQMap[userInfo.card] = userInfo.user_id groupCardQQMap.set(userInfo.card, userInfo.user_id); // 更新:使用 Map.set() 方法
} }
if (userInfo.nickname) { if (userInfo.nickname) {
groupCardQQMap[userInfo.nickname] = userInfo.user_id groupCardQQMap.set(userInfo.nickname, userInfo.user_id); // 更新:使用 Map.set() 方法
} }
} }
} }
} }
let tmpMsg = '' // 临时消息字符串
let tmpFace = '' let tmpMsg = '';
let tmpAt = '' // 临时表情字符串
let foundFace = false let tmpFace = '';
let foundAt = false // 临时 @ 字符串
let msgs = [] let tmpAt = '';
// 是否找到表情
let foundFace = false;
// 是否找到 @
let foundAt = false;
// 转换后的消息段数组
const msgs = [];
// 遍历消息字符串
for (let i = 0; i < msg.length; i++) { for (let i = 0; i < msg.length; i++) {
// console.log(msg[i]) // 如果找到 '['
if (msg[i] === '[') { if (msg[i] === '[') {
foundFace = true // 设置 foundFace 为 true
continue foundFace = true;
continue;
} }
// 如果没有找到表情
if (!foundFace) { if (!foundFace) {
// 如果需要处理 @ 消息且找到 '@'
if (handleAt && msg[i] === '@') { if (handleAt && msg[i] === '@') {
foundAt = true // 设置 foundAt 为 true
foundAt = true;
// 如果 tmpMsg 不为空,将其添加到 msgs 数组中
if (tmpMsg) { if (tmpMsg) {
msgs.push(tmpMsg) msgs.push(tmpMsg);
tmpMsg = '' tmpMsg = '';
} }
continue continue;
} }
// 如果需要处理 @ 消息且 foundAt 为 true
if (handleAt && foundAt) { if (handleAt && foundAt) {
tmpAt += msg[i] // 将当前字符添加到 tmpAt 中
if (groupCardQQMap[tmpAt]) { tmpAt += msg[i];
foundAt = false // 如果在 groupCardQQMap 中找到 tmpAt
msgs.push(segment.at(groupCardQQMap[tmpAt], groupMembers.get(groupCardQQMap[tmpAt]).card, false)) if (groupCardQQMap.has(tmpAt)) { // 更新:使用 Map.has() 方法
tmpAt = '' // 设置 foundAt 为 false
continue foundAt = false;
// 将 @ 消息段添加到 msgs 数组中
msgs.push(segment.at(groupCardQQMap.get(tmpAt))); // 更新at 信息不再需要群名片参数
// 清空 tmpAt
tmpAt = '';
continue;
} }
} else { } else {
tmpMsg += msg[i] // 将当前字符添加到 tmpMsg 中
tmpMsg += msg[i];
} }
} else { } else {
// 如果当前字符不是 ']'
if (msg[i] !== ']') { if (msg[i] !== ']') {
tmpFace += msg[i] // 将当前字符添加到 tmpFace 中
tmpFace += msg[i];
} else { } else {
foundFace = false // 设置 foundFace 为 false
// 使用新的 faceMapReverse 进行查找 foundFace = false;
if (faceMapReverse[tmpFace] || faceMapReverse['/' + tmpFace] || faceMapReverse[_.trimStart(tmpFace, '/')]) { // 从 faceMapReverse 中查找表情 ID
const faceId = faceMapReverse[tmpFace] || faceMapReverse['/' + tmpFace] || faceMapReverse[_.trimStart(tmpFace, '/')]; // 更新:简化表情查找逻辑
// 如果找到表情 ID
if (faceId) {
// 如果 tmpMsg 不为空,将其添加到 msgs 数组中
if (tmpMsg) { if (tmpMsg) {
msgs.push(tmpMsg) msgs.push(tmpMsg);
tmpMsg = '';
} }
msgs.push(segment.face(parseInt(faceMapReverse[tmpFace] || faceMapReverse['/' + tmpFace] || faceMapReverse[_.trimStart(tmpFace, '/')]))) // 添加表情消息段到 msgs 数组中
tmpMsg = '' msgs.push(segment.face(parseInt(faceId)));
// 清空 tmpMsg
tmpMsg = '';
} else { } else {
tmpMsg += `[${tmpFace}]` // 将 '[' 和 tmpFace 拼接到 tmpMsg 中
tmpMsg += `[${tmpFace}]`;
} }
tmpFace = '' // 清空 tmpFace
tmpFace = '';
} }
} }
} }
// 如果 tmpMsg 不为空,将其添加到 msgs 数组中
if (tmpMsg) { if (tmpMsg) {
msgs.push(tmpMsg) msgs.push(tmpMsg);
} }
// 如果 tmpFace 不为空,将其添加到 msgs 数组中
if (tmpFace) { if (tmpFace) {
msgs.push(`[${tmpFace}`) msgs.push(`[${tmpFace}`);
} }
// 如果需要处理 @ 消息且 tmpAt 不为空,将其添加到 msgs 数组中
if (handleAt && tmpAt) { if (handleAt && tmpAt) {
msgs.push(`@${tmpAt}`) msgs.push(`@${tmpAt}`);
} }
return msgs // 返回转换后的消息段数组
} return msgs;
}
export function testConvertFaces() {
const toTest = [
'你好啊[/微笑][惊讶]哈哈[/拜谢]'
]
toTest.forEach(t => {
console.log(convertFaces(t))
})
}
// testConvertFaces()