Yunzai-Bot插件编写指南

news/2024/7/7 20:34:37

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

http://lihuaxi.xjx100.cn/news/1098398.html

相关文章

Linux网络编程:socket、客户端服务器端使用socket通信

socket socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)…

智慧校园系统平台实现校内导航资产管线一体化管理

构建智慧校园系统平台是国家和大专院校共同倡议的校园信息化建设方向,是运用物联网技术搭建的一体化综合平台,基于各种应用服务系统,把学校的教务、办公、教学、学习、管理、资产、校园安全、安防、消防等各个环节融为一体,提高学…

SIP的voip语音通话后30秒左右挂断呼叫怎么解决

我们经常会遇到客户抱怨这样的问题,电话通话时,在大概30秒左右就断线。这样的问题最主要的原因是SIP终端没有收到ACK消息。SIP终端发送了 200 OK以后就开始了媒体的创建,RTP语音流开始启动,事实上,SIP终端可能还没有收…

LTE IA attach流程介绍

IA apn用于LTE attach。 手机检测到sim卡后,便会加载这个attach apn. 不过很多运营商并没有严格规定attach apn,所以常常使用default类型的apn。 IA Attach Spec Spec 24.301 4.1 The NAS for EPS follows the protocol architecture model for layer 3 as described in 3G…

PCO(Protocol Configuration Option)功能介绍

协议配置选项PCO(Protocol Configuration Option)用于为UE提供连接网络的附加信息。这是一个可选协议字段,只有当UE请求PCO时,PCO才会出现在Attach Accept信令消息中。 PCO Spec According to 3GPP TS24.008 10.5.6.3, Protocol Configuration Option (PCO) is used to…

16 个必知必会的 Python 教程,助你高效编程

介绍 Python 是一门用途广泛的编程语言,它具有大量的库和框架。有一些鲜为人知的 Python 编码技巧和库可以让你作为开发人员的工作更为轻松,编写代码更高效。 本文中将探讨一些鲜为人知的 Python 技巧,这些技巧非常有用,但并不广…

springboot 整合ehchace 缓存教程

ehcache介绍 Ehcache是一种高性能、开源的Java缓存框架,被广泛应用于许多大规模、高并发的分布式系统中。它提供了一种快速、可扩展、分布式的数据缓存方案,支持各种内存级别的缓存、磁盘级别的缓存、分布式缓存等。Ehcache设计目标主要是提供高性能和可…

五音不全?手把手教你用自己声音唱任何歌;最详细的Auto-GPT整理;4月AI绘画模型推荐;HayoAI平台简直太酷了 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『ChatGPT Code Interpreter Magic』魔法!离谱!正在怀疑人生… OpenAI 近期面向部分用户发放了 Code Interp…