更新face表情,优化了表情发送

This commit is contained in:
gaoao-3 2025-01-03 08:08:41 +08:00
parent 43faf96cfe
commit 9dafe4e343

View file

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