Yunzai-Bot插件编写指南

Yunzai-Bot插件编写教学

前言

  • 需要node.js基础,需要会使用redis数据库,
  • 推荐使用VScode编写☞下载

单个的js格式插件(example)

  • oicq文档
  • 先新建一个文件,命名为Helloworld.js
  • 命名可以改的,最好别用中文,改命名时要记得把下面的类名改了(大小写得一样)

输出Hello,world!

  • 代码示例
//引入Yunzai插件功能
import plugin from '../../../../../lib/plugins/plugin.js'

//导出  类  类名===文件名 继承  插件类  
export class Helloworld extends plugin {
    constructor() {
        super({
            //后端信息
            name: 'Helloworld',//插件名字,可以随便写
            dsc: 'Helloworld',//插件介绍,可以随便写
            event: 'message',//这个直接复制即可,别乱改
            priority: 250,//执行优先级:数值越低越6
            rule: [
                {
                    //正则表达试
                    reg: '^#你好$',
                    //函数
                    fnc: 'Helloworld'
                }
            ]
        });
    };

    //函数
    async Helloworld(e) {
        e.reply("Hello, world!");//输出Hello,world!
        //阻止消息不再往下
        return;
    };
};

reply函数的多种用法

  1. 直接发送内容:
    //发送内容:
    e.reply("Hello, world!");
  1. 是否引用回复:
//是否引用回复:
e.reply("Hello, world!", true);//false为不引用,true为引用
  1. 群聊是否撤回消息:
//群聊是否撤回消息:
e.reply("Hello, world!", false, { recallMsg: 5 });//最大120秒后撤回,0则不处理
  1. 是否at用户:
//是否at用户:
e.reply("Hello, world!", false, { recallMsg: 0 }, true);//false为不at用户,true为at用户

如何使用回复组件

  • 代码示例
//引入Yunzai插件功能
import plugin from '../../../../../lib/plugins/plugin.js'

//导出  类  类名:要与文件名一致 继承  插件类  
export class Helloworld extends plugin {
    constructor() {
        super({
            //后端信息
            name: 'Helloworld',//插件名字,可以随便写
            dsc: 'Helloworld',//插件介绍,可以随便写
            event: 'message',//这个直接复制即可,别乱改
            priority: 250,//执行优先级:数值越低越6
            rule: [
                {
                    //正则表达式
                    reg: '^#你干嘛诶哟$',
                    //函数
                    fnc: 'Helloworld'
                }
            ]
        });
    };

    //函数
    async Helloworld(e) {
        /** 设置上下文,后续接收到内容会执行hei方法 */
        this.setContext('hei');
        //发送消息
        e.reply("1+1=?");
    }

    //回复函数
    async hei(e) {
        //获取消息
        let xiaoxi = e.message;
        //判断消息
        if (xiaoxi == 3) {   //是
            //回复
            e.reply("回答正确")
            //结束上下文
            this.finish('hei')
        }
        else {               //否
            //回复
            e.reply("回答错误")
            //再次使用执行hei方法 
            this.setContext('hei')
        }
    }
};

各式的判断

预计...没有预计(开学随缘更新)

大型的插件包(plugin)

文件/文件夹 作用 是否可选 对应文章跳转
index.js 导入apps里的单js插件 点我
apps/ 存放单js插件的位置 点我
data/ 存放插件数据的位置,可存储到Yunzai-Bot自带的data文件夹 点我
resources/ 可存放README所使用的图片之类的资源文件 点我
config/ 存放插件的配置文件 点我
model/ 存放插件的封装文件 点我
guoba.support.js 支持锅巴插件显示信息或配置(显示信息如不添加会是插件索引内的描述) 点我
.gitignore 更新时不选中某些文件或文件夹 点我

index

  • 此js会导入apps文件夹(你可以选中其他的)内的所有js文件
  • 可添加载入提示

编写示例:

//导入node:fs模块
import fs from node:fs

//输出提示
logger.info('更换为你需要的提示')
logger.info('更换为你需要的提示')
logger.info('更换为你需要的提示')
//如需更多可复制粘贴
//info可替换为: debug mark error

//加载插件
const files = fs.readdirSync('./plugins/你插件包的名字/apps').filter(file => file.endsWith('.js'))

let ret = []

files.forEach((file) => {
  ret.push(import(`./apps/${file}`))
})


ret = await Promise.allSettled(ret)

let apps = {}
for (let i in files) {
  let name = files[i].replace('.js', '')

  if (ret[i].status != 'fulfilled') {
      logger.error(`载入插件错误:${logger.red(name)}`)
      logger.error(ret[i].reason)
      continue
  }
  apps[name] = ret[i].value[Object.keys(ret[i].value)[0]]
}


export { apps }

apps

  • 可根据上方教程进行编写单js插件并放置于apps

data

  • 存放插件需要长期储存的文件,可存放于Yunzai-Bot自带的data文件夹

例如:

data/xxxx/xxxx

resources

  • 存放插件的资源文件

例如:

data/README/img
data/README/document
data/common
data/help/help.html
data/help/help.css

config

  • 存放插件的配置文件
  • 例如:
config/config.yaml
config/help.yaml

model

  • 存放插件的封装文件

例如:

config.js
help.js
setting.js

锅巴支持

  • 支持锅巴插件显示信息或配置(显示信息如不添加会是插件索引内的描述)

  • gitignore

  • 更新时不选中某些文件或文件夹

语法:

空格不匹配任意文件,可作为分隔符,可用反斜杠转义
开头的文件标识注释,可以使用反斜杠进行转义
! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
/ 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
/ 开始的模式匹配项目跟目录
如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
** 匹配多级目录,可在开始,中间,结束
? 通用匹配单个字符
* 通用匹配零个或多个字符
[] 通用匹配单个字符列表
  • 示例:
# 忽略所有data内的文件
data/*
# 忽略所有config内的文件
config/*
# 忽略resources/help/themes内的所有文件夹
resources/help/themes/**
# 选择resources/help/themes/default文件夹
!resources/help/themes/default/
# 忽略所有的.txt文件
*.txt

猜你喜欢

转载自blog.csdn.net/2301_76484015/article/details/130483456