face.js自动转换

This commit is contained in:
gaoao-3 2024-12-29 20:28:20 +08:00 committed by GitHub
parent 221cf4082d
commit 4005af9e99
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,5 +1,7 @@
import _ from 'lodash' import _ from 'lodash';
// import {segment} from "oicq"; import { segment } from 'oicq';
// 更新后的 faceMap 对象,保持原有的数字到字符串的映射结构
export const faceMap = { export const faceMap = {
0: '惊讶', 0: '惊讶',
1: '撇嘴', 1: '撇嘴',
@ -46,18 +48,14 @@ export const faceMap = {
46: '猪头', 46: '猪头',
49: '拥抱', 49: '拥抱',
53: '蛋糕', 53: '蛋糕',
54: '闪电', 55: '++',
55: '炸弹',
56: '刀', 56: '刀',
57: '足球',
59: '便便', 59: '便便',
60: '咖啡', 60: '咖啡',
61: '饭',
63: '玫瑰', 63: '玫瑰',
64: '凋谢', 64: '凋谢',
66: '爱心', 66: '爱心',
67: '心碎', 67: '心碎',
69: '礼物',
74: '太阳', 74: '太阳',
75: '月亮', 75: '月亮',
76: '赞', 76: '赞',
@ -80,44 +78,26 @@ 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: '', 123: 'NO',
124: '', 124: '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: '眨眼睛',
@ -127,31 +107,22 @@ export const faceMap = {
176: '小纠结', 176: '小纠结',
177: '喷血', 177: '喷血',
178: '斜眼笑', 178: '斜眼笑',
179: '表情', 179: 'doge',
180: '惊喜', 180: '惊喜',
181: '骚扰', 181: '戳一戳',
182: '笑哭', 182: '笑哭',
183: '我最美', 183: '我最美',
184: '河蟹',
185: '羊驼', 185: '羊驼',
187: '幽灵', 187: '幽灵',
188: '蛋',
190: '菊花',
192: '红包',
193: '大笑', 193: '大笑',
194: '不开心', 194: '不开心',
197: '冷漠',
198: '呃', 198: '呃',
199: '好棒', 200: '求求',
200: '拜托',
201: '点赞', 201: '点赞',
202: '无聊', 202: '无聊',
203: '托脸', 203: '托脸',
204: '吃', 204: '吃',
205: '送花',
206: '害怕', 206: '害怕',
207: '花痴',
208: '小样儿',
210: '飙泪', 210: '飙泪',
211: '我不看', 211: '我不看',
212: '托腮', 212: '托腮',
@ -161,400 +132,257 @@ export const faceMap = {
217: '扯一扯', 217: '扯一扯',
218: '舔一舔', 218: '舔一舔',
219: '蹭一蹭', 219: '蹭一蹭',
220: '拽炸天',
221: '顶呱呱', 221: '顶呱呱',
245: '加油必胜', 222: '抱抱',
246: '加油抱抱', 223: '暴击',
247: '口罩护体', 224: '开枪',
260: '/搬砖中', 225: '撩一撩',
261: '/忙到飞起', 226: '拍桌',
262: '/脑阔疼', 227: '拍手',
263: '/沧桑', 229: '干杯',
264: '/捂脸', 230: '嘲讽',
265: '/辣眼睛', 231: '哼',
266: '/哦哟', 232: '佛系',
267: '/头秃', 233: '掐一掐',
268: '/问号脸', 235: '颤抖',
269: '/暗中观察', 237: '偷看',
270: '/emm', 238: '扇脸',
271: '/吃瓜', 239: '原谅',
272: '/呵呵哒', 240: '喷脸',
273: '/我酸了', 241: '生日快乐',
274: '/太南了', 243: '甩头',
276: '/辣椒酱', 244: '扔狗',
277: '/汪汪', 262: '脑阔疼',
278: '/汗', 263: '沧桑',
279: '/打脸', 264: '捂脸',
280: '/击掌', 265: '辣眼睛',
281: '/无眼笑', 266: '哦哟',
282: '/敬礼', 267: '头秃',
283: '/狂笑', 268: '问号脸',
284: '/面无表情', 269: '暗中观察',
285: '/摸鱼', 270: 'emm',
286: '/魔鬼笑', 271: '吃瓜',
287: '/哦', 272: '呵呵哒',
288: '/请', 273: '我酸了',
289: '/睁眼', 277: '汪汪',
290: '/敲开心', 278: '汗',
291: '/震惊', 281: '无眼笑',
292: '/让我康康', 282: '敬礼',
293: '/摸锦鲤', 283: '狂笑',
294: '/期待', 284: '面无表情',
295: '/拿到红包', 285: '摸鱼',
296: '/真好', 286: '魔鬼笑',
297: '/拜谢', 287: '哦',
298: '/元宝', 288: '请',
299: '/牛啊', 289: '睁眼',
300: '/胖三斤', 290: '敲开心',
301: '/好闪', 292: '让我康康',
302: '/左拜年', 293: '摸锦鲤',
303: '/右拜年', 294: '期待',
304: '/红包包', 295: '拿到红包',
305: '/右亲亲', 297: '拜谢',
306: '/牛气冲天', 298: '元宝',
307: '/喵喵', 299: '牛啊',
308: '/求红包', 300: '胖三斤',
309: '/谢红包', 301: '好闪',
310: '/新年烟花', 302: '左拜年',
311: '/打call', 303: '右拜年',
312: '/变形', 305: '右亲亲',
313: '/嗑到了', 306: '牛气冲天',
314: '/仔细分析', 307: '喵喵',
315: '/加油', 311: '打call',
316: '/我没事', 312: '变形',
317: '/菜狗', 314: '仔细分析',
318: '/崇拜', 317: '菜汪',
319: '/比心', 318: '崇拜',
320: '/庆祝', 319: '比心',
321: '/老色痞', 320: '庆祝',
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 key in faceMap) {
faceMapReverse[faceMap[key]] = key;
} }
export const faceMapReverse = { // 注释掉 specialFaces
惊讶: '0', // const specialFaces = {
撇嘴: '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'
}
export async function convertFaces (msg, handleAt = false, e) { /**
handleAt = e?.isGroup && handleAt * 将消息中的表情占位符转换为 oicq 的表情代码
let groupMembers * @param {string} msg 要转换的消息
let groupCardQQMap = {} * @param {boolean} [handleAt=false] 是否处理 @ 消息默认为 false
* @param {object} [e=undefined] 消息事件对象可选
* @returns {Array} 转换后的消息段数组
*/
export async function convertFaces(msg, handleAt = false, e) {
// 如果 e?.isGroup 为 true 且 handleAt 为 true则设置 handleAt 为 true
handleAt = e?.isGroup && handleAt;
// 群成员列表
let groupMembers;
// 群名片到 QQ 号的映射
let groupCardQQMap = {};
// 如果需要处理 @ 消息
if (handleAt) { if (handleAt) {
try { try {
groupMembers = e.bot.gml.get(e.group_id) // 获取群成员列表
groupMembers = e.bot.gml;
} 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 of groupMembers.keys()) {
if (userInfo.card) { // 将群名片或昵称映射到 QQ 号
groupCardQQMap[userInfo.card] = userInfo.user_id groupCardQQMap[groupMembers.get(key).card || groupMembers.get(key).nickname] =
} groupMembers.get(key).user_id;
if (userInfo.nickname) {
groupCardQQMap[userInfo.nickname] = userInfo.user_id
}
} }
} }
} }
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 中
tmpAt += msg[i];
// 如果在 groupCardQQMap 中找到 tmpAt
if (groupCardQQMap[tmpAt]) { if (groupCardQQMap[tmpAt]) {
foundAt = false // 设置 foundAt 为 false
msgs.push(segment.at(groupCardQQMap[tmpAt], groupMembers.get(groupCardQQMap[tmpAt]).card, false)) foundAt = false;
tmpAt = '' // 将 @ 消息段添加到 msgs 数组中
continue msgs.push(segment.at(groupCardQQMap[tmpAt], groupMembers.get(groupCardQQMap[tmpAt]).card, false));
// 清空 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
if (faceMapReverse[tmpFace] || faceMapReverse['/' + tmpFace] || faceMapReverse[_.trimStart(tmpFace, '/')]) { foundFace = false;
// 从 faceMapReverse 中查找表情 ID
const faceId = 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 = [ * 测试 convertFaces 函数
'你好啊[/微笑][惊讶]哈哈[/拜谢]' */
] export function testConvertFaces() {
const toTest = ['你好啊[/微笑][惊讶]哈哈[/拜谢]'];
toTest.forEach(t => { toTest.forEach(t => {
console.log(convertFaces(t)) console.log(convertFaces(t));
}) });
} }
// testConvertFaces() // testConvertFaces(); // 注释掉测试代码