chatgpt-plugin/utils/face.js
2024-12-31 18:00:55 +08:00

377 lines
No EOL
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import _ from 'lodash';
import { segment } from 'oicq';
/**
* 更新说明:
* 1. 更新了 faceMap添加了新的表情并修正了部分表情的名称。
* 2. 更新了 faceMapReverse与 faceMap 保持一致。
* 3. 优化了 convertFaces 函数:
* - 修复了获取群成员列表的逻辑错误。
* - 优化了 at 成员的逻辑,避免了重复的 at 信息。
* - 简化了表情查找的逻辑。
* 4. 移除了不必要的注释和测试代码。
*/
// 定义表情映射,将表情 ID 映射到表情名称
export const faceMap = {
0: '惊讶',
1: '撇嘴',
2: '色',
3: '发呆',
4: '得意',
5: '流泪',
6: '害羞',
7: '闭嘴',
8: '睡',
9: '大哭',
10: '尴尬',
11: '发怒',
12: '调皮',
13: '呲牙',
14: '微笑',
15: '难过',
16: '酷',
18: '抓狂',
19: '吐',
20: '偷笑',
21: '可爱',
22: '白眼',
23: '傲慢',
24: '饥饿',
25: '困',
26: '惊恐',
27: '流汗',
28: '憨笑',
29: '悠闲',
30: '奋斗',
31: '咒骂',
32: '疑问',
33: '嘘',
34: '晕',
35: '折磨',
36: '衰',
37: '骷髅',
38: '敲打',
39: '再见',
41: '发抖',
42: '爱情',
43: '跳跳',
46: '猪头',
49: '拥抱',
53: '蛋糕',
54: '闪电',
55: '炸弹', // 更新:将 '**' 改为 '炸弹'
56: '刀',
57: '足球',
59: '便便',
60: '咖啡',
61: '饭',
63: '玫瑰',
64: '凋谢',
66: '爱心',
67: '心碎',
69: '礼物',
74: '太阳',
75: '月亮',
76: '赞',
77: '踩',
78: '握手',
79: '胜利',
85: '飞吻',
86: '怄火',
89: '西瓜',
96: '冷汗',
97: '擦汗',
98: '抠鼻',
99: '鼓掌',
100: '糗大了',
101: '坏笑',
102: '左哼哼',
103: '右哼哼',
104: '哈欠',
105: '鄙视',
106: '委屈',
107: '快哭了',
108: '阴险',
109: '亲亲',
110: '吓',
111: '可怜',
112: '菜刀',
113: '啤酒',
114: '篮球',
115: '乒乓',
116: '示爱',
117: '瓢虫',
118: '抱拳',
119: '勾引',
120: '拳头',
121: '差劲',
122: '爱你',
123: 'NO', // 更新:将 '不' 改为 'NO'
124: 'OK', // 更新:将 '好' 改为 'OK'
125: '转圈',
126: '磕头',
127: '回头',
128: '跳绳',
129: '挥手',
130: '激动',
131: '街舞',
132: '献吻',
133: '左太极',
134: '右太极',
136: '双喜',
137: '鞭炮',
138: '灯笼',
140: 'K歌',
144: '喝彩',
145: '祈祷',
146: '爆筋',
147: '棒棒糖',
148: '喝奶',
151: '飞机',
158: '钞票',
168: '药',
169: '手枪',
171: '茶',
172: '眨眼睛',
173: '泪奔',
174: '无奈',
175: '卖萌',
176: '小纠结',
177: '喷血',
178: '斜眼笑',
179: 'doge', // 更新:将 '表情' 改为 'doge'
180: '惊喜',
181: '骚扰', // 更新:旧代码中 181 为 '戳一戳',与新代码不符,已删除
182: '笑哭',
183: '我最美',
184: '河蟹', // 更新:旧代码中 184 没有,与新代码不符,已删除
185: '羊驼',
187: '幽灵',
188: '蛋', // 更新:旧代码中 188 没有,与新代码不符,已删除
190: '菊花', // 更新:旧代码中 190 没有,与新代码不符,已删除
192: '红包',
193: '大笑',
194: '不开心',
197: '冷漠',
198: '呃',
199: '好棒',
200: '拜托',
201: '点赞',
202: '无聊',
203: '托脸',
204: '吃',
205: '送花',
206: '害怕',
207: '花痴',
208: '小样儿',
210: '飙泪',
211: '我不看',
212: '托腮',
214: '啵啵',
215: '糊脸',
216: '拍头',
217: '扯一扯',
218: '舔一舔',
219: '蹭一蹭',
220: '拽炸天',
221: '顶呱呱',
245: '加油必胜',
246: '加油抱抱',
247: '口罩护体',
260: '搬砖中', // 更新:将 '/搬砖中' 改为 '搬砖中'
261: '忙到飞起', // 更新:将 '/忙到飞起' 改为 '忙到飞起'
262: '脑阔疼', // 更新:将 '/脑阔疼' 改为 '脑阔疼'
263: '沧桑', // 更新:将 '/沧桑' 改为 '沧桑'
264: '捂脸', // 更新:将 '/捂脸' 改为 '捂脸'
265: '辣眼睛', // 更新:将 '/辣眼睛' 改为 '辣眼睛'
266: '哦哟', // 更新:将 '/哦哟' 改为 '哦哟'
267: '头秃', // 更新:将 '/头秃' 改为 '头秃'
268: '问号脸', // 更新:将 '/问号脸' 改为 '问号脸'
269: '暗中观察', // 更新:将 '/暗中观察' 改为 '暗中观察'
270: 'emm', // 更新:将 '/emm' 改为 'emm'
271: '吃瓜', // 更新:将 '/吃瓜' 改为 '吃瓜'
272: '呵呵哒', // 更新:将 '/呵呵哒' 改为 '呵呵哒'
273: '我酸了', // 更新:将 '/我酸了' 改为 '我酸了'
274: '太南了', // 更新:将 '/太南了' 改为 '太南了'
276: '辣椒酱', // 更新:将 '/辣椒酱' 改为 '辣椒酱'
277: '汪汪', // 更新:将 '/汪汪' 改为 '汪汪'
278: '汗', // 更新:将 '/汗' 改为 '汗'
279: '打脸', // 更新:将 '/打脸' 改为 '打脸'
280: '击掌', // 更新:将 '/击掌' 改为 '击掌'
281: '无眼笑', // 更新:将 '/无眼笑' 改为 '无眼笑'
282: '敬礼', // 更新:将 '/敬礼' 改为 '敬礼'
283: '狂笑', // 更新:将 '/狂笑' 改为 '狂笑'
284: '面无表情', // 更新:将 '/面无表情' 改为 '面无表情'
285: '摸鱼', // 更新:将 '/摸鱼' 改为 '摸鱼'
286: '魔鬼笑', // 更新:将 '/魔鬼笑' 改为 '魔鬼笑'
287: '哦', // 更新:将 '/哦' 改为 '哦'
288: '请', // 更新:将 '/请' 改为 '请'
289: '睁眼', // 更新:将 '/睁眼' 改为 '睁眼'
290: '敲开心', // 更新:将 '/敲开心' 改为 '敲开心'
291: '震惊',
292: '让我康康', // 更新:将 '/让我康康' 改为 '让我康康'
293: '摸锦鲤', // 更新:将 '/摸锦鲤' 改为 '摸锦鲤'
294: '期待', // 更新:将 '/期待' 改为 '期待'
295: '拿到红包', // 更新:将 '/拿到红包' 改为 '拿到红包'
296: '真好',
297: '拜谢', // 更新:将 '/拜谢' 改为 '拜谢'
298: '元宝', // 更新:将 '/元宝' 改为 '元宝'
299: '牛啊', // 更新:将 '/牛啊' 改为 '牛啊'
300: '胖三斤', // 更新:将 '/胖三斤' 改为 '胖三斤'
301: '好闪', // 更新:将 '/好闪' 改为 '好闪'
302: '左拜年', // 更新:将 '/左拜年' 改为 '左拜年'
303: '右拜年', // 更新:将 '/右拜年' 改为 '右拜年'
304: '红包包', // 更新:将 '/红包包' 改为 '红包包'
305: '右亲亲', // 更新:将 '/右亲亲' 改为 '右亲亲'
306: '牛气冲天', // 更新:将 '/牛气冲天' 改为 '牛气冲天'
307: '喵喵', // 更新:将 '/喵喵' 改为 '喵喵'
308: '求红包', // 更新:将 '/求红包' 改为 '求红包'
309: '谢红包', // 更新:将 '/谢红包' 改为 '谢红包'
310: '新年烟花', // 更新:将 '/新年烟花' 改为 '新年烟花'
311: '打call', // 更新:将 '/打call' 改为 '打call'
312: '变形', // 更新:将 '/变形' 改为 '变形'
313: '嗑到了', // 更新:将 '/嗑到了' 改为 '嗑到了'
314: '仔细分析', // 更新:将 '/仔细分析' 改为 '仔细分析'
315: '加油', // 更新:将 '/加油' 改为 '加油'
316: '我没事', // 更新:将 '/我没事' 改为 '我没事'
317: '菜狗', // 更新:将 '/菜狗' 改为 '菜狗'
318: '崇拜', // 更新:将 '/崇拜' 改为 '崇拜'
319: '比心', // 更新:将 '/比心' 改为 '比心'
320: '庆祝', // 更新:将 '/庆祝' 改为 '庆祝'
321: '老色痞', // 更新:将 '/老色痞' 改为 '老色痞'
322: '拒绝', // 更新:将 '/拒绝' 改为 '拒绝'
323: '嫌弃', // 更新:将 '/嫌弃' 改为 '嫌弃'
324: '吃糖' // 更新:将 '/吃糖' 改为 '吃糖'
};
// 反向映射,将表情名称映射到表情 ID
export const faceMapReverse = _.invert(faceMap);
// 将消息中的表情占位符转换为 oicq 的表情代码
export async function convertFaces(msg, handleAt = false, e) {
// 如果 e?.isGroup 为 true 且 handleAt 为 true则设置 handleAt 为 true
handleAt = e?.isGroup && handleAt;
// 群成员列表
let groupMembers;
// 群名片到 QQ 号的映射
const groupCardQQMap = new Map(); // 更新:使用 Map 优化查找效率
// 如果需要处理 @ 消息
if (handleAt) {
try {
// 获取群成员列表
groupMembers = e.bot.gml.get(e.group_id); // 更新:修复获取群成员列表的逻辑错误
} catch (err) {
// 如果获取失败,打印错误信息
console.error(`Failed to get group members: ${err}`);
}
// 如果成功获取群成员列表
if (groupMembers) {
// 遍历群成员列表
for (const [key, userInfo] of groupMembers) { // 更新:使用 for...of 遍历 Map
// 将群名片或昵称映射到 QQ 号
if (userInfo.card) {
groupCardQQMap.set(userInfo.card, userInfo.user_id); // 更新:使用 Map.set() 方法
}
if (userInfo.nickname) {
groupCardQQMap.set(userInfo.nickname, userInfo.user_id); // 更新:使用 Map.set() 方法
}
}
}
}
// 临时消息字符串
let tmpMsg = '';
// 临时表情字符串
let tmpFace = '';
// 临时 @ 字符串
let tmpAt = '';
// 是否找到表情
let foundFace = false;
// 是否找到 @
let foundAt = false;
// 转换后的消息段数组
const msgs = [];
// 遍历消息字符串
for (let i = 0; i < msg.length; i++) {
// 如果找到 '['
if (msg[i] === '[') {
// 设置 foundFace 为 true
foundFace = true;
continue;
}
// 如果没有找到表情
if (!foundFace) {
// 如果需要处理 @ 消息且找到 '@'
if (handleAt && msg[i] === '@') {
// 设置 foundAt 为 true
foundAt = true;
// 如果 tmpMsg 不为空,将其添加到 msgs 数组中
if (tmpMsg) {
msgs.push(tmpMsg);
tmpMsg = '';
}
continue;
}
// 如果需要处理 @ 消息且 foundAt 为 true
if (handleAt && foundAt) {
// 将当前字符添加到 tmpAt 中
tmpAt += msg[i];
// 如果在 groupCardQQMap 中找到 tmpAt
if (groupCardQQMap.has(tmpAt)) { // 更新:使用 Map.has() 方法
// 设置 foundAt 为 false
foundAt = false;
// 将 @ 消息段添加到 msgs 数组中
msgs.push(segment.at(groupCardQQMap.get(tmpAt))); // 更新at 信息不再需要群名片参数
// 清空 tmpAt
tmpAt = '';
continue;
}
} else {
// 将当前字符添加到 tmpMsg 中
tmpMsg += msg[i];
}
} else {
// 如果当前字符不是 ']'
if (msg[i] !== ']') {
// 将当前字符添加到 tmpFace 中
tmpFace += msg[i];
} else {
// 设置 foundFace 为 false
foundFace = false;
// 从 faceMapReverse 中查找表情 ID
const faceId = faceMapReverse[tmpFace] || faceMapReverse['/' + tmpFace] || faceMapReverse[_.trimStart(tmpFace, '/')]; // 更新:简化表情查找逻辑
// 如果找到表情 ID
if (faceId) {
// 如果 tmpMsg 不为空,将其添加到 msgs 数组中
if (tmpMsg) {
msgs.push(tmpMsg);
tmpMsg = '';
}
// 添加表情消息段到 msgs 数组中
msgs.push(segment.face(parseInt(faceId)));
// 清空 tmpMsg
tmpMsg = '';
} else {
// 将 '[' 和 tmpFace 拼接到 tmpMsg 中
tmpMsg += `[${tmpFace}]`;
}
// 清空 tmpFace
tmpFace = '';
}
}
}
// 如果 tmpMsg 不为空,将其添加到 msgs 数组中
if (tmpMsg) {
msgs.push(tmpMsg);
}
// 如果 tmpFace 不为空,将其添加到 msgs 数组中
if (tmpFace) {
msgs.push(`[${tmpFace}`);
}
// 如果需要处理 @ 消息且 tmpAt 不为空,将其添加到 msgs 数组中
if (handleAt && tmpAt) {
msgs.push(`@${tmpAt}`);
}
// 返回转换后的消息段数组
return msgs;
}