UNPKG

keli-ai

Version:

keli 的小爱同学插件,接入小爱同学实现智能聊天功能,支持文字、语音回复,多种触发方式

85 lines (69 loc) 2.73 kB
const { Plugin, segment } = require('keli') const { fetchReply } = require('./services.js') const { name, version } = require('./package.json') const plugin = new Plugin(name, version) /** 默认配置,实际执行时会被插件数据目录的配置覆盖 */ const config = { /** 回复模式,默认文本 text,语音改为 audio,语音需要配置 ffmpeg */ mode: 'text', /** 触发词列表,仅群聊生效 */ words: ['小爱'], /** 是否开启艾特触发,默认开启,仅群聊生效 */ enableAt: true, /** API 请求错误时的回复 */ errorReply: '让小爱思考一下再给你答复吧', /** 忽略群列表 */ ignoreGroups: [], /** 忽略 QQ 列表,群聊私聊中均会忽略,这里默认忽略 Q 群管家 */ ignoreFriends: [2854196310], /** 强制忽略词列表 */ ignoreWords: ['#', '/', '自爆', '同归于尽'] } plugin.onMounted((bot, admins) => { // 使用插件数据配置文件合并配置,优先使用:框架目录/data/plugins/小爱同学/config.json Object.assign(config, plugin.loadConfig()) // 保存合并的配置 plugin.saveConfig(config) plugin.onMessage(async (event, bot) => { const { message_type, raw_message: msg, sender } = event // 检测到强制忽略词则忽略 if (config.ignoreWords.some(word => msg.includes(word))) { return } // 过滤屏蔽好友 if (config.ignoreFriends.includes(sender.user_id)) { return } let isIgnore = false let hitAt = false if (message_type === 'discuss') { isIgnore = config.ignoreGroups.includes(event.discuss_id) hitAt = config.enableAt && event.message.some(e => e.type === 'at' && e.qq === bot.uin) } else if (message_type === 'group') { isIgnore = config.ignoreGroups.includes(event.group_id) hitAt = config.enableAt && event.message.some(e => e.type === 'at' && e.qq === bot.uin) } const hitWords = config.words.some(e => msg.includes(e)) const isHit = hitAt || hitWords // 当群被屏蔽,或者未触发小爱时(通过艾特或者触发词触发时),不处理 if (isIgnore || !isHit) { return } const rawText = msg.replace(/\[.*\]/g, '').trim() const isAudio = config.mode === 'audio' try { // 请求小爱同学官方接口数据 const { url, displayText } = await fetchReply(rawText) // 分模式发送 if (isAudio) { event.reply(url ? segment.record(url, true) : config.errorReply, true) } else { event.reply(displayText || config.errorReply, true) } } catch (e) { plugin.logger.error(e) event.reply(config.errorReply, true) } }) }) module.exports = { plugin }