模块化摸鱼派机器人框架
- 👂 监听聊天室消息;
- 🤖自动分流类型消息;
- 📦 模块化机器人功能;
- 🔌 可插拔机器人模块;
- 执行
npm run init
,并根据提示填写账号信息(仅第一次);
- 执行
npm install
; - 使用 Visual Studio Code 运行调试(直接按下
F5
即可)。
服务器需安装 nodejs
和 npm
。部署执行如下脚本:
npm install
编译前端代码:
npm run build
启动服务:
npm start
以守护进程方式,启动服务:
pm2 start -n fishpi-bot npm -- start
- .vscode - VSCode 调试配置
- bot - 机器人模块
- lib - 自定义类库
- script - 初始化脚本
- src - 机器人入口
- config.json - 运行配置档案
nginx 配置示例:nginx.conf
-
机器人的核心在于
bot
文件夹,内包含使用聊天室消息类型命名的多个子文件夹,每个文件夹即为一个模块。消息类型包含:- online: 在线用户
- discussChanged: 话题修改
- revoke: 消息撤回
- msg: 消息
- redPacket: 红包
- redPacketStatus: 红包状态
- barrager: 弹幕
-
每个模块包含入口文件
index.js
,其定义如下:export interface Robot { exec?: (msg: Message, fishpi: Fishpi) => any, }
-
只要实现该函数,即可接收对应消息进行处理;
-
已经有添加了
msg
,redPacket
,redPacketStatus
三种消息的处理。
msg
模块对聊天室的的普通聊天消息进行自动化处理,内含一个 roles
文件夹,除了 index.ts
为自动载入规则入口,其余每一个文件代表一条处理规则。
每条规则定义如下:
export interface Role {
/**
* 正则匹配规则
*/
match: RegExp[],
/**
* 规则执行
* @param msg 红包消息
* @param fishpi FishPi实例
*/
exec: (msg: ChatMsg, fishpi: FishPi) => any,
/**
* 是否启用
*/
enable?: boolean,
}
比如 record.ts
,match
为 /^赌狗记录/
也就是只要在聊天内容匹配到赌狗记录
起始的内容,就会触发 exec
函数,从 storage
中读取猜拳胜负记录,并调用 fishpi
的聊天室发送接口发送出去:
fishpi.chatroom.send(`【${userName}】 ${record.lost}胜:${record.zero}平:${record.win}负`);
redPacket
模块与 msg
模块一样,都具有一个 roles
文件夹,除了 index.ts
为自动载入规则入口,其余每一个文件代表一种类型的红包处理规则。
每条规则定义如下:
export interface Role {
/**
* 红包状态更新消息
* @param msg 红包状态更新消息
* @param fishpi FishPi实例
*/
update?: (msg: RedPacketStatusMsg, fishpi: Fishpi) => any,
/**
* 红包规则执行
* @param msg 红包消息
* @param fishpi FishPi实例
*/
exec?: (msg: ChatMsg, fishpi: Fishpi) => any,
/**
* 是否启用
*/
enable?: boolean,
}
比如 heartbeat.ts
,会处理所有心跳红包。监测到心跳红包,就会将红包 id 加入列表:
oIds.push(oId);
然后设定 3 秒后开启:
setTimeout(() => {
// 如果心跳包的 oId 还在心跳包列表中,就打开它
if (oIds.includes(oId)) fishpi.chatroom.redpacket.open(oId);
}, 3000)
然后,使用 update
接口接收其他人开启红包的消息,如果有人开出正数积分,就将 id 从列表移出:
update({ got, oId }: RedPacketStatusMsg, fishpi: Fishpi) {
if (got > 0 && oIds.includes(oId)) {
// 如果心跳包已经被领了,就把它从心跳包列表中移除
oIds.splice(oIds.indexOf(oId), 1);
}
},