/YamlBot

基于mirai实现的使用yaml来创建指令的qqbot

Primary LanguageKotlin

YamlBot

简介

一个简单的 通过向config下的yml配置文件进行运行bot的插件

你可以用此实现诸多功能

例如:

  • 创建并使用指令
  • 简单的可调用的账号系统

在未来我们还会实现更多的内容!

你可以将你的相关配置(如:CommandReg.yml) 以 功能+原名 的方式上传到 your config

TODO

  • 指令系统
  • 群公告调用支持
  • JavaKotlin支持的部分 如:switch(when)
  • 监听事件

需要

里面含有部分功能需要ffmpeg的支持,如果你想要有完整的功能支持,请配置好ffmpeg

由于yml是一个对空格敏感的格式 因此在解析yml时可能会导致相关的报错

请保证你的.yml文件格式是正确的 再运行本插件!

相关教程

关于调用函数方面,你可以前往TemplateDoc 获取帮助

配置的说明,请可查看configs下的内容

除了CommandReg中展示的普通指令(NormalCommand) 的创建说明,请查看ArgCommandDocOnlyRunCommandDoc

示例

以下我们以每日一图这样较为复杂的功能为例,逐一解释其原理

我们可以找到一个可以提供每日一言功能的api网站,以下以必应每日一图为例

首先我们先声明它的名称,一般来说当有人发出这些内容时,指令就会被调用

name:
  - 每日一图
  - bing一图
  - '/image bing'

在接下来,我们可以设定它的回复内容。

我们希望它会回复原信息,并且信息中包含有名称,图片以及来源

answeringMethod: QUOTE

可是我们并不知道它会得到什么内容,要如何声明呢?

在这方面,YamlBot支持了声明与调用一个变量,你可以使用%call-变量名%来调用变量

answerContent: '『%call-name%』%call-image%\n%call-from%'

接下来就是最重要的“声明变量”部分了,它叫做run

首先,我们需要获取今日的一图信息。

由于我们需要这个api网站的内容,所以我们需要调用HTTP内的content功能

- use: HTTP
  call: content
  args:
    - 'https://api.xygeng.cn/bing/'
  name: content

这样子,就算是声明了一个变量,它的名称取决于name中的内容

use你可以理解为import,使YamlBot能够由这里找到你所需要的函数

content就变为了 https://api.xygeng.cn/bing/ 网站的内容:

{
 "code": 200,
 "data": {
   "id": 247,
   "time": "20230126",
   "title": "通往天门的阶梯",
   "url": "https://cn.bing.com/th?id=OHR.HighArchChina_ZH-CN8170154553_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
   "urlbase": "/th?id=OHR.HighArchChina_ZH-CN8170154553",
   "copyright": "天门洞,湖南天门山国家森林公园,** (© Shane P. White/Minden Pictures)",
   "copyrightlink": "...",
   "urls": [
     "..."
   ]
 },
 "updateTime": 1674670336679
}

我们从中发现Json"data""title","url","copyright"为我们所需要的内容

可是我们该怎么解析这个字符串呢?

我们注意到它是Json格式的,所以我们可以找到BASEparseJson功能来解析Json

- use: BASE
  call: parseJson
  args:
    - '%call-content%'
    - data
    - title
  name: name

- use: BASE
  call: parseJson
  args:
    - '%call-content%'
    - data
    - url
  name: downlandUrl

- use: BASE
  call: parseJson
  args:
    - '%call-content%'
    - data
    - copyright
  name: from

这样,我们就成功获取了我们想要的内容;同时,我们还声明了name,downlandUrl,from几个变量

可是我们只是得到了它的下载链接,我们还需要把它下载到存储中

- use: HTTP
  call: downland
  args:
    - '%call-downlandUrl%'
  name: imagePath

这样我们就得到了下载到系统中的链接

接下来我们再上传一个图片到指定群聊里

 - use: MIRAI
   call: upload
   args:
     - '%call-imagePath%'
     - image
   name: image

这样子,我们需要做的就基本完成了

最后再加上条件的判断,因为它不需要条件,所以我们可以用[]代替

condition: [ ]

这样子,我们就成功构建了一个指令,让我们来试试吧! img.png

可以看到,指令成功运行了,同时用对应的数据代替了原本的%call-变量名%

我们的任务就到此为止了

如果在运行中,你遇到了相关的bug,可以使日志等级为ALL,查看相关的debug信息

最终,我们就得到了以下内容

COMMAND:
  - name:
      - 每日一图
      - bing一图
      - '/image bing'
    answeringMethod: QUOTE
    answerContent: '『%call-name%』%call-image%\n%call-from%'
    run:
      - use: HTTP
        call: content
        args:
          - 'https://api.xygeng.cn/bing/'
        name: content
      - use: BASE
        call: parseJson
        args:
          - '%call-content%'
          - data
          - title
        name: name
      - use: BASE
        call: parseJson
        args:
          - '%call-content%'
          - data
          - url
        name: downlandUrl
      - use: BASE
        call: parseJson
        args:
          - '%call-content%'
          - data
          - copyright
        name: from
      - use: HTTP
        call: downland
        args:
          - '%call-downlandUrl%'
        name: imagePath
      - use: MIRAI
        call: upload
        args:
          - '%call-imagePath%'
          - image
        name: image
    condition: [ ]

以上内容你可以在bingimage-Command.yml找到