{"version":3,"sources":["jsdelivr-header.js","/npm/mirai-circlebot@2.2.1/src/index.ts","/npm/mirai-circlebot@2.2.1/src/Instance/Bot.ts","/npm/mirai-circlebot@2.2.1/src/handle/DefaultHandler.ts","/npm/mirai-circlebot@2.2.1/src/handle/ReplyHandler.ts","/npm/mirai-circlebot@2.2.1/src/handle/NudgeHandler.ts"],"names":[],"mappings":"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","file":"/npm/mirai-circlebot@2.2.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/mirai-circlebot@2.2.1/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { CircleBot } from './Instance/Bot'\r\n\r\n// 机器人\r\nexport { CircleBot }\r\n// Handler相关类型\r\nexport { ReplyHandlerType, NudgeHandlerType } from './types/HandlerType'\r\n// Mod拓展\r\nexport { ReplyModType, NudgeModType } from './types/ModType'\r\n// 处理器\r\nexport * from './handle'\r\n","import { Logger, Mirai, MiraiApiHttpSetting, MiraiInstance } from 'mirai-ts'\r\nimport { CircleBotType } from '../types/Bot'\r\nimport { HandlerList, OtherUse } from '../types/UseType'\r\nimport * as yaml from 'js-yaml'\r\nimport * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport { ReplyHandlerType } from '../types/HandlerType'\r\nimport { HandlerWhiteListType } from '../types/ReplyConfigType'\r\n\r\nexport class CircleBot implements CircleBotType {\r\n\t/**\r\n\t * 用户\r\n\t */\r\n\tqq: number\r\n\t/**\r\n\t * Mirai实例\r\n\t */\r\n\tmirai: MiraiInstance\r\n\t/**\r\n\t * apiHttp配置\r\n\t */\r\n\tsetting: MiraiApiHttpSetting\r\n\t/**\r\n\t * handler列表\r\n\t */\r\n\thandlerList: Array<HandlerList>\r\n\t/**\r\n\t * 用于存放其他UseMod\r\n\t */\r\n\tOtherUse: Array<OtherUse>\r\n\t/**\r\n\t * 配置文件的绝对目录\r\n\t */\r\n\tconfigtPath: string\r\n\t/**\r\n\t * log\r\n\t */\r\n\tlog: Logger\r\n\r\n\tgroupWhiteList: Array<number>\r\n\tfriendWhiteList: Array<number>\r\n\t_whiteListPath: string\r\n\t/**\r\n\t * user\r\n\t * httpsetting\r\n\t */\r\n\tconstructor(qq: number, settingPath: string) {\r\n\t\tthis.log = new Logger()\r\n\t\tif (!fs.existsSync(path.resolve(process.cwd(), 'configs'))) {\r\n\t\t\tfs.mkdirSync(path.resolve(process.cwd(), 'configs'))\r\n\t\t}\r\n\t\tthis.configtPath = ''\r\n\t\tconst settingConfig = this.resolveApiHttpConfig(settingPath)\r\n\t\tthis.setting = settingConfig as MiraiApiHttpSetting\r\n\t\tthis.qq = qq\r\n\t\tthis.mirai = new Mirai(settingConfig)\r\n\t\tthis.OtherUse = []\r\n\t\tthis.handlerList = []\r\n\t\tthis.groupWhiteList = []\r\n\t\tthis.friendWhiteList = []\r\n\t\tthis._whiteListPath = path.resolve(\r\n\t\t\tprocess.cwd(),\r\n\t\t\t'configs/HandlerWhiteList.yml'\r\n\t\t)\r\n\t}\r\n\t/**\r\n\t * 将模块添加到Bot中来\r\n\t * @param useMod\r\n\t */\r\n\tasync use(useMod: HandlerList | OtherUse) {\r\n\t\tthis.log.info('正在加载处理器')\r\n\t\tawait this.loadHandlerWhiteList()\r\n\t\tconst handler = isOfType<ReplyHandlerType>(useMod, 'handler')\r\n\t\tif (handler) {\r\n\t\t\tuseMod.load(this.friendWhiteList, this.groupWhiteList, this.mirai)\r\n\t\t\tthis.handlerList.push(useMod as HandlerList)\r\n\t\t} else {\r\n\t\t\tthis.OtherUse.push(useMod as OtherUse)\r\n\t\t\tthis.log.warning('加载了一个非内置的处理器，请注意是否是正确的处理器。')\r\n\t\t}\r\n\t\tthis.log.success('处理器加载成功')\r\n\t}\r\n\r\n\tstart() {\r\n\t\tthis.mirai?.link(this.qq)\r\n\t\tthis.mirai?.on('message', msg => {\r\n\t\t\tthis.handlerList.forEach(item => {\r\n\t\t\t\tif (item.type === 'Message') {\r\n\t\t\t\t\titem.watchChatMessage(msg)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t})\r\n\t\tthis.mirai?.on('NudgeEvent', msg => {\r\n\t\t\tthis.handlerList.forEach(item => {\r\n\t\t\t\tif (item.type === 'Nudge') {\r\n\t\t\t\t\titem.watchNudge(msg)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t})\r\n\t\tthis.mirai?.listen()\r\n\t}\r\n\t/**\r\n\t * 处理setting.yml路径\r\n\t * @param settingPath\r\n\t * @returns\r\n\t */\r\n\tresolveApiHttpConfig = (settingPath: string) => {\r\n\t\tlet sPath = ''\r\n\t\tconst isAbsolute = path.isAbsolute(settingPath)\r\n\t\tif (isAbsolute) {\r\n\t\t\tsPath = settingPath\r\n\t\t} else {\r\n\t\t\tsPath = path.resolve(process.cwd(), settingPath)\r\n\t\t}\r\n\t\tthis.configtPath = sPath\r\n\t\ttry {\r\n\t\t\tconst setting = yaml.load(\r\n\t\t\t\tfs.readFileSync(sPath, 'utf8')\r\n\t\t\t) as MiraiApiHttpSetting\r\n\r\n\t\t\treturn setting\r\n\t\t} catch (err) {\r\n\t\t\tthrow new Error('没有找到' + sPath + '的配置文件，请检查路径是否正确。')\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 加载白名单列表\r\n\t */\r\n\tasync loadHandlerWhiteList() {\r\n\t\tthis.log.info('正在加载处理器白名单列表')\r\n\t\tconst exist = fs.existsSync(this._whiteListPath)\r\n\t\ttry {\r\n\t\t\tif (!exist) {\r\n\t\t\t\tconst whiteListTemplate: HandlerWhiteListType = {\r\n\t\t\t\t\tgroupWhiteList: [],\r\n\t\t\t\t\tfriendWhiteList: [],\r\n\t\t\t\t}\r\n\t\t\t\tconst whiteList = yaml.dump(whiteListTemplate)\r\n\t\t\t\tfs.writeFile(this._whiteListPath, whiteList, 'utf-8', err => {\r\n\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\tthrow err\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tconst res = await fs.promises.readFile(this._whiteListPath, 'utf-8')\r\n\t\t\t\tconst originWhiteList = yaml.load(res) as HandlerWhiteListType\r\n\t\t\t\tconst { groupWhiteList, friendWhiteList } =\r\n\t\t\t\t\toriginWhiteList === undefined\r\n\t\t\t\t\t\t? ({} as HandlerWhiteListType)\r\n\t\t\t\t\t\t: originWhiteList\r\n\r\n\t\t\t\tconst writeListTemplate: HandlerWhiteListType = {\r\n\t\t\t\t\tgroupWhiteList: groupWhiteList === undefined ? [] : groupWhiteList,\r\n\t\t\t\t\tfriendWhiteList: friendWhiteList === undefined ? [] : friendWhiteList,\r\n\t\t\t\t}\r\n\t\t\t\tthis.friendWhiteList = writeListTemplate.friendWhiteList\r\n\t\t\t\tthis.groupWhiteList = writeListTemplate.groupWhiteList\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tthis.log.error('请检查HandlerWhiteList白名单是否配置正确')\r\n\t\t}\r\n\t\tthis.log.success('处理器白名单列表加载成功')\r\n\t}\r\n}\r\n\r\n/**\r\n * 判断是否是某个类型\r\n * @param use\r\n * @param propertyToCheckFor\r\n * @returns\r\n */\r\nfunction isOfType<T>(use: any, propertyToCheckFor: keyof T): use is T {\r\n\treturn (use as T)[propertyToCheckFor] !== undefined\r\n}\r\n","import { EventType, Logger, MiraiInstance } from 'mirai-ts'\r\nimport { DefaultHandlerType, HandlerType } from '../types/HandlerType'\r\nimport { MessageType } from 'mirai-ts'\r\n\r\nexport abstract class DefaultHandler implements DefaultHandlerType {\r\n\thandler: true\r\n\tmirai: MiraiInstance\r\n\tlog: Logger\r\n\tgroupWhiteList: Array<number>\r\n\tfriendWhiteList: Array<number>\r\n\tabstract type: HandlerType\r\n\tconstructor() {\r\n\t\tthis.handler = true\r\n\t\tthis.log = new Logger()\r\n\t\tthis.groupWhiteList = []\r\n\t\tthis.friendWhiteList = []\r\n\t\tthis.mirai = {} as MiraiInstance\r\n\t}\r\n\twatchChatMessage(msg: MessageType.ChatMessage): void {}\r\n\twatchNudge(event: EventType.BaseEvent): void {}\r\n\tabstract send(\r\n\t\tmsg: MessageType.ChatMessage,\r\n\t\tsendMsg: MessageType.MessageChain | string\r\n\t): void\r\n\r\n\tload(\r\n\t\tfriendWhiteList: number[],\r\n\t\tgroupWhiteList: number[],\r\n\t\tmirai: MiraiInstance\r\n\t) {\r\n\t\tthis.friendWhiteList = friendWhiteList\r\n\t\tthis.groupWhiteList = groupWhiteList\r\n\t\tthis.mirai = mirai\r\n\t}\r\n\r\n\tisOfType<T>(use: any, propertyToCheckFor: keyof T): use is T {\r\n\t\treturn (use as T)[propertyToCheckFor] !== undefined\r\n\t}\r\n\r\n\t/**\r\n\t * 打印 接收到的信息\r\n\t * @param msg\r\n\t * @returns\r\n\t */\r\n\tmsgLog(msg: MessageType.ChatMessage) {\r\n\t\tconst type = msg.type\r\n\t\tconst formatMsgChain = (msgChain: MessageType.MessageChain) => {\r\n\t\t\tconst source = msgChain.filter(item => {\r\n\t\t\t\treturn item.type !== 'Source' && item.type !== 'Plain'\r\n\t\t\t})\r\n\t\t\treturn source.length === 0 ? `` : `包含${source.length}个非文本内容`\r\n\t\t}\r\n\t\tswitch (type) {\r\n\t\t\tcase 'FriendMessage':\r\n\t\t\t\treturn `[好友：${msg.sender.nickname}]：${msg.plain} ${formatMsgChain(\r\n\t\t\t\t\tmsg.messageChain\r\n\t\t\t\t)}`\r\n\r\n\t\t\tcase 'GroupMessage':\r\n\t\t\t\treturn `[群：${msg.sender.group.id}]：${msg.plain} ${formatMsgChain(\r\n\t\t\t\t\tmsg.messageChain\r\n\t\t\t\t)}`\r\n\t\t\tcase 'TempMessage':\r\n\t\t\t\treturn ''\r\n\t\t}\r\n\t}\r\n}\r\n","import { MessageType } from 'mirai-ts'\r\nimport { DefaultHandler } from './DefaultHandler'\r\nimport { ReplyModType } from '../types/ModType'\r\nimport fs from 'fs'\r\nimport path from 'path'\r\nimport yaml from 'js-yaml'\r\nimport { ReplyModConfigType } from '../types/ReplyConfigType'\r\nimport { HandlerType, ReplyHandlerType } from '../types/HandlerType'\r\n\r\nexport class ReplyHandler extends DefaultHandler implements ReplyHandlerType {\r\n\thandler: true\r\n\ttype: HandlerType\r\n\t_modConfigPath: string\r\n\tmods: { [key: string]: ReplyModType }\r\n\r\n\tconstructor() {\r\n\t\tsuper()\r\n\t\tthis.type = 'Message'\r\n\t\tthis._modConfigPath = path.resolve(\r\n\t\t\tprocess.cwd(),\r\n\t\t\t'configs/ReplyModConfig.yml'\r\n\t\t)\r\n\t\tthis.handler = true\r\n\t\tthis.mods = {}\r\n\t\tthis.loadMod()\r\n\t}\r\n\r\n\t/**\r\n\t * 监听ChatMessage消息，然后从这里开始处理\r\n\t * @param msg\r\n\t */\r\n\twatchChatMessage(msg: MessageType.ChatMessage) {\r\n\t\t//处理器白名单拦截\r\n\t\tif (!this.validateWhiteList(msg)) {\r\n\t\t\tthis.log.info('非白名单' + this.msgLog(msg))\r\n\t\t\treturn\r\n\t\t}\r\n\t\tthis.log.info(this.msgLog(msg))\r\n\t\t// 处理回复\r\n\t\tfor (const item of Object.entries(this.mods)) {\r\n\t\t\tlet reply = {\r\n\t\t\t\talways: false,\r\n\t\t\t\twhiteList: false,\r\n\t\t\t\tkeyword: false,\r\n\t\t\t\tcanReply: false,\r\n\t\t\t}\r\n\t\t\tif (item[1].isAlwaysReply) {\r\n\t\t\t\treply.always = true\r\n\t\t\t}\r\n\t\t\t// 白名单拦截 如果是always 就不用判断，直接走就行了\r\n\t\t\tif (!reply.always || this.filterWhiteList(item[1], msg)) {\r\n\t\t\t\treply.whiteList = true\r\n\t\t\t}\r\n\t\t\t//拦截关键词 如果whiteList是true说明不是always。如果是false就说明没有通过白名单\r\n\t\t\tif (reply.whiteList && this.filterKeywordList(item[1], msg)) {\r\n\t\t\t\treply.keyword = true\r\n\t\t\t}\r\n\r\n\t\t\tif (reply.always || (reply.whiteList && reply.keyword)) {\r\n\t\t\t\treply.canReply = true\r\n\t\t\t}\r\n\r\n\t\t\tif (reply.canReply) {\r\n\t\t\t\titem[1].reply(this, msg, msg.plain)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 发送消息\r\n\t * @param msg 接受到的消息 rawMessage\r\n\t * @param sendMsg 处理好的MessageChain或者stirng\r\n\t */\r\n\tsend(\r\n\t\tmsg: MessageType.ChatMessage,\r\n\t\tsendMsg: MessageType.MessageChain | string\r\n\t) {\r\n\t\tmsg.reply(sendMsg).then(() => {\r\n\t\t\tthis.log.info(`我回复->${sendMsg}`)\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * 加载mod\r\n\t */\r\n\tasync loadMod() {\r\n\t\ttry {\r\n\t\t\tconst modsDir = fs.existsSync(\r\n\t\t\t\tpath.resolve(path.resolve(process.cwd(), 'src/mods'))\r\n\t\t\t)\r\n\t\t\tif (!modsDir) {\r\n\t\t\t\tfs.promises.mkdir(path.resolve(process.cwd(), 'src/mods'))\r\n\t\t\t}\r\n\t\t\tconst modFile = path.resolve(process.cwd(), 'src/mods/index.ts')\r\n\t\t\tconst exist = fs.existsSync(modFile)\r\n\t\t\tif (!exist) {\r\n\t\t\t\tfs.writeFile(\r\n\t\t\t\t\tpath.join(modFile),\r\n\t\t\t\t\t`export {Reply} from './Reply/Reply'//在这个文件中导出所有mod函数，你可以使用你的结构来导出。`,\r\n\t\t\t\t\t'utf-8',\r\n\t\t\t\t\terr => {\r\n\t\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\t\tthrow err\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t)\r\n\t\t\t\tconst data = template\r\n\t\t\t\tawait fs.promises.mkdir(\r\n\t\t\t\t\tpath.resolve(process.cwd(), 'src', 'mods', 'Reply')\r\n\t\t\t\t)\r\n\t\t\t\tawait fs.promises.writeFile(\r\n\t\t\t\t\tpath.resolve(process.cwd(), 'src/mods/Reply/Reply.ts'),\r\n\t\t\t\t\tdata\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tthrow err\r\n\t\t}\r\n\r\n\t\tconst templateMod = require(path.resolve(\r\n\t\t\tprocess.cwd(),\r\n\t\t\t'src',\r\n\t\t\t'mods',\r\n\t\t\t'index.ts'\r\n\t\t))\r\n\r\n\t\tfor (const item of Object.entries(templateMod)) {\r\n\t\t\tconst key = item[0]\r\n\t\t\tconst mod = templateMod[key]()\r\n\t\t\tconst isReplyMod = this.isOfType<ReplyModType>(mod, 'replyHandler')\r\n\t\t\tif (isReplyMod) {\r\n\t\t\t\tthis.mods[key] = mod\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Object.keys(this.mods).length === 0) {\r\n\t\t\tthis.log.info('没有任何mod被使用')\r\n\t\t} else {\r\n\t\t\tconst avaMod: string[] = []\r\n\t\t\tconst keys = Object.keys(this.mods)\r\n\t\t\tkeys.forEach(key => {\r\n\t\t\t\tavaMod.push(this.mods[key].name)\r\n\t\t\t})\r\n\t\t\tthis.log.success(`模块[${avaMod.join(',')}]加载成功`)\r\n\t\t}\r\n\t\tthis.createConfigFile()\r\n\t}\r\n\t/**\r\n\t * 验证白名单\r\n\t */\r\n\tvalidateWhiteList(msg: MessageType.ChatMessage): boolean {\r\n\t\tconst type = msg.type\r\n\t\tswitch (type) {\r\n\t\t\tcase 'GroupMessage':\r\n\t\t\t\treturn this.groupWhiteList.includes(msg.sender.group.id)\r\n\t\t\tcase 'FriendMessage':\r\n\t\t\t\treturn this.friendWhiteList.includes(msg.sender.id)\r\n\t\t\tcase 'TempMessage':\r\n\t\t\t\treturn false\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 生成配置文档\r\n\t */\r\n\tasync createConfigFile() {\r\n\t\ttry {\r\n\t\t\tthis.log.info('正在生成配置文件')\r\n\t\t\t//读取原有配置\r\n\t\t\tconst exist = fs.existsSync(this._modConfigPath)\r\n\t\t\tlet originConfig: ReplyModConfigType = {} as ReplyModConfigType\r\n\t\t\tlet config: ReplyModConfigType = {} as ReplyModConfigType\r\n\t\t\tif (exist) {\r\n\t\t\t\tconfig = yaml.load(\r\n\t\t\t\t\tawait fs.promises.readFile(this._modConfigPath, 'utf-8')\r\n\t\t\t\t) as ReplyModConfigType\r\n\t\t\t} else {\r\n\t\t\t\tthis.log.info('首次创建，完成后可根据配置文件修改相应配置。')\r\n\t\t\t}\r\n\t\t\tif (config !== undefined) {\r\n\t\t\t\toriginConfig = config\r\n\t\t\t}\r\n\r\n\t\t\t// 合并配置\r\n\t\t\tconst configTemplate: ReplyModConfigType = {} as ReplyModConfigType\r\n\r\n\t\t\tfor (const [key, obj] of Object.entries(this.mods)) {\r\n\t\t\t\t// 配置写入的模板\r\n\t\t\t\tconfigTemplate[key] = {\r\n\t\t\t\t\tname: obj.name,\r\n\t\t\t\t\tisAlwaysReply:\r\n\t\t\t\t\t\toriginConfig[key] && originConfig[key].isAlwaysReply\r\n\t\t\t\t\t\t\t? originConfig[key].isAlwaysReply\r\n\t\t\t\t\t\t\t: obj.isAlwaysReply === false\r\n\t\t\t\t\t\t\t? false\r\n\t\t\t\t\t\t\t: undefined,\r\n\t\t\t\t\tkeywords:\r\n\t\t\t\t\t\toriginConfig[key] && originConfig[key].keywords\r\n\t\t\t\t\t\t\t? originConfig[key].keywords\r\n\t\t\t\t\t\t\t: [],\r\n\t\t\t\t\twhiteList:\r\n\t\t\t\t\t\toriginConfig[key] && originConfig[key].whiteList\r\n\t\t\t\t\t\t\t? originConfig[key].whiteList\r\n\t\t\t\t\t\t\t: [],\r\n\t\t\t\t\tkeywordRule:\r\n\t\t\t\t\t\toriginConfig[key] && originConfig[key].keywordRule\r\n\t\t\t\t\t\t\t? originConfig[key].keywordRule\r\n\t\t\t\t\t\t\t: [],\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst configContent = yaml.dump(configTemplate)\r\n\t\t\t// 写入配置\r\n\t\t\tfs.writeFile(this._modConfigPath, configContent, 'utf-8', err => {\r\n\t\t\t\tif (err) {\r\n\t\t\t\t\tthrow err\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tthis.log.success('配置文件创建完成')\r\n\t\t\tthis.loadWhiteList(configTemplate)\r\n\t\t\tthis.loadKeywordConfig(configTemplate)\r\n\t\t} catch (err) {\r\n\t\t\tthis.log.error('请检查配置文件是否正确')\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 给现有的mod加载白名单\r\n\t */\r\n\tloadWhiteList(configTemplate: ReplyModConfigType) {\r\n\t\tthis.log.info('正在加载命令白名单列表')\r\n\t\tfor (const [key, obj] of Object.entries(this.mods)) {\r\n\t\t\tconst config = configTemplate[key]\r\n\t\t\tif (config.whiteList !== undefined) {\r\n\t\t\t\tobj.isAlwaysReply = config.isAlwaysReply\r\n\t\t\t\tobj.whiteList = config.whiteList\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.log.success('命令白名单列表加载成功')\r\n\t}\r\n\r\n\tloadKeywordConfig(configTemplate: ReplyModConfigType) {\r\n\t\tthis.log.info('正在加载关键词配置')\r\n\t\tfor (const [key, obj] of Object.entries(this.mods)) {\r\n\t\t\tconst config = configTemplate[key]\r\n\t\t\tif (config.keywords !== undefined) {\r\n\t\t\t\tobj.keywords = config.keywords\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tif (config.keywordRule !== undefined) {\r\n\t\t\t\t\tobj.keywordRule = config.keywordRule.map(regList => {\r\n\t\t\t\t\t\treturn new RegExp(regList)\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {\r\n\t\t\t\tthis.log.error('请提供一个正确的正则表达式。->' + key)\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.log.success('关键词配置加载成功')\r\n\t}\r\n\t/**\r\n\t * 过滤信息。根据白名单列表\r\n\t */\r\n\tfilterWhiteList(modInstance: ReplyModType, msg: MessageType.ChatMessage) {\r\n\t\tconst type = msg.type\r\n\t\tlet number\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase 'FriendMessage':\r\n\t\t\t\tnumber = msg.sender.id\r\n\t\t\t\tbreak\r\n\t\t\tcase 'GroupMessage':\r\n\t\t\t\tnumber = msg.sender.group.id\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t\tif (number === undefined) {\r\n\t\t\treturn false\r\n\t\t} else {\r\n\t\t\treturn modInstance.whiteList.includes(number)\r\n\t\t}\r\n\t}\r\n\tfilterKeywordList(modInstance: ReplyModType, msg: MessageType.ChatMessage) {\r\n\t\tlet isKeyword = []\r\n\t\t// 判断是否有keywordRule\r\n\t\tif (modInstance.keywordRule !== undefined) {\r\n\t\t\tisKeyword.push(\r\n\t\t\t\tmodInstance.keywordRule.some(reg => {\r\n\t\t\t\t\treturn reg.test(msg.plain)\r\n\t\t\t\t})\r\n\t\t\t)\r\n\t\t}\r\n\t\tif (typeof modInstance.keywords === 'string') {\r\n\t\t\tisKeyword.push(msg.plain.includes(modInstance.keywords))\r\n\t\t} else {\r\n\t\t\tisKeyword.push(\r\n\t\t\t\tmodInstance.keywords.some(value => {\r\n\t\t\t\t\treturn msg.plain.includes(value)\r\n\t\t\t\t})\r\n\t\t\t)\r\n\t\t}\r\n\t\treturn isKeyword.includes(true)\r\n\t}\r\n}\r\n\r\nconst template = `\r\nimport { MessageType } from 'mirai-ts'\r\nimport { ReplyHandler,ReplyModType } from 'mirai-circlebot'\r\n\r\n/**\r\n *\r\n * @returns 一些配置可以根据ReplyModType来查看\r\n */\r\nexport const Reply = (): ReplyModType => {\r\n\tconst name = '测试'\r\n\tconst isAlwaysReply: boolean = false\r\n\tconst keywords: string[] = []\r\n\tconst keywordRule: RegExp[] = []\r\n\tconst whiteList: number[] = []\r\n\r\n\tconst reply = (\r\n\t\thandler: ReplyHandler,\r\n\t\trawMsg: MessageType.ChatMessage,\r\n\t\tmsg?: MessageType.MessageChain | string\r\n\t) => {\r\n\t\tsetTimeout(() => {\r\n\t\t\thandler.send(rawMsg, msg + 'hello')\r\n\t\t}, 3000)\r\n\t}\r\n\r\n\treturn {\r\n\t\tname,\r\n\t\tkeywords,\r\n\t\twhiteList,\r\n\t\treplyHandler: true,\r\n\t\treply,\r\n\t\tisAlwaysReply,\r\n\t\tkeywordRule,\r\n\t}\r\n}\r\n`\r\n","import { MessageType, EventType } from 'mirai-ts'\r\nimport { HandlerType, NudgeHandlerType } from '../types/HandlerType'\r\nimport { NudgeModType } from '../types/ModType'\r\nimport { DefaultHandler } from './DefaultHandler'\r\n\r\n/**\r\n * 戳一戳处理器\r\n */\r\nexport class NudgeHandler extends DefaultHandler implements NudgeHandlerType {\r\n\thandler: true\r\n\ttype: HandlerType\r\n\tnudgeMod: NudgeModType\r\n\tconstructor(nudgeMod: NudgeModType) {\r\n\t\tsuper()\r\n\t\tthis.type = 'Nudge'\r\n\t\tthis.handler = true\r\n\t\tthis.nudgeMod = nudgeMod\r\n\t}\r\n\tsend(msg: MessageType.ChatMessage, sendMsg: MessageType.MessageChain): void {}\r\n\twatchNudge(event: EventType.NudgeEvent): void {\r\n\t\tthis.nudgeMod.reply(this, event)\r\n\t}\r\n}\r\n"]}