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; }