Skip to content

Vescrity/QBot_Jiemeng

Repository files navigation

QBot_Jiemeng

桔梦(QBot_Jiemeng)是一个以 Onebot 标准的实现项目作为前端的 bot 项目。以词库匹配作为核心机制。

V26 计划

  • 将部分逻辑转移至 Lua 。
  • 理清处理逻辑,完善文档。
  • 词库是否应转为 Lua 表以实现与 Lua 更好的集成?

说明

  • 本说明适用于 v25
  • 项目主要用于个人开发练习。
  • 本说明用于介绍桔梦基本功能,组成,并帮助您快速上手。
  • 具体的详细说明请参照进阶说明。

提示

v25 为功能较为完善、稳定、易拓展的版本,但文档和处理逻辑仍不够完善。计划将于 v26 进行改善,不能保证兼容性。

平台

验证可用的平台

  • Linux-x86_64
  • Linux-aarch64 (Termux Proot-distro 内可构建、可使用)

不支持的平台

  • Windows 等类 UNIX 环境: 完全放弃兼容。

已实现的特色应用场景举例

  1. 定时消息
  2. 远程指令执行
  3. 可简易配置的第三方api调用
  4. 用于 Dice! 的牌堆调用兼容
  5. 群聊检测到满足条件的信息向 bot 主或特定群聊上报消息。

特色

v25 新功能:Lua 脚本支持

可以编写 Lua 脚本来一定程度上更自由的控制 Bot 了。

词库配置为中心

“一切皆消息”

将所有的事件都转换为文本消息来处理,以“收到消息——词库检索——执行应答”的流程处理所有事件。

检索条件:使用正则表达式,

  • 为了解决使用单一正则表达式表达复杂的匹配逻辑时的困难与难以阅读,利用 json 数组的结构特点优化了表达

较复杂的应答选取逻辑

  • 提供了可调控概率的应答随机选取方法。
  • 树状逻辑的应答库嵌套,即一个应答可以是若干的应答的组合,可实现更丰富的应答。
  • 例如你预想的应答可分为3个部分,使用桔梦你可以很轻松的使你的随机输出可包括例如A B1 C2d 3a Cb 等等任意组合。

从应答库到控制一切

结合 Lua,几乎可以控制 Bot 的所有行为。而应答库则可以为这个控制提供接口。将你需要的行为使用 Lua 实现,再将它注册到应答库中即可。

开发者的一些废话

非计算机相关专业,纯业余开发,技术稀烂,代码可读性极差,总之图一乐

构建

  • 依赖:
    • cmake
    • g++
    • nlohmann-json
    • lua
    • sol2
    • boost

执行 ./build.sh 可在 build 目录下构建基础的工作文件夹。

运行依赖

  • boost
  • lagrange 等支持正向 WebSocket 的 OneBot 实现
  • python(可选)
  • python-pillow(可选) 用于txt2img功能支持
  • ...

使用说明

快速开始

1. 修改 config.json

  1. Self_ID 字段的值改为 bot qq 号
  2. group_list 中添加你想启用 bot 功能的群聊
  3. admin_list 中 100 前的数字改为 bot 主的 QQ 号

2. 向 Answer 文件夹内添加内容

这里应当是若干个标准的 json 文件。具体格式如下:

{
  "Answers": [

  ]
}

在这个中括号内部添加应答组。

所有在这个文件夹中的json最后将会在运行时被合并到一起。

应答组配置快速上手

一个应答组至少要包含三个字段:regex anss pri。 其运行的逻辑是:

  1. 将所有的应答组依照其 pri 值,从大到小排序。
  2. 收到消息后,依照顺序根据 regex 检查是否符合要求
  3. 若符合要求,依照 anss 来执行应答操作。
regex

regex 用于描述匹配要求。从实例来解释:

  1. 要求当消息中出现 时判定为符合要求:

    "regex": "早"

  2. 要求当消息中需同时出现 时判定为符合要求:

    "regex": {"and":["早","好"]}

  3. 要求当消息中出现 时即判定为符合要求:

    "regex": ["早","好"]

  4. 要求当消息中不出现 时即判定为符合要求:

    "regex": {"not":["早","好"]}

  5. 要求当消息中需要 <同时出现 时> 或 <出现 你好 时> 即判定为符合要求:

    "regex": [{"and":["早","好"]},"你好"]

  6. 要求当消息中出现 时,同时不出现即判定为符合要求:

    "regex": {"and":[["早","好"],{"not":["晚","午"]}]}

anss

anss 用于描述应答操作。从实例来解释:

  1. 只执行输出 你好

    "anss": ["你好"]

  2. 执行输出 你好你不好

    "anss": ["你好","你不好"]

  3. 执行输出 你好你不好, 概率为 5:1 :

    "anss": [{"text":"你好","weight":5},"你不好"]

  4. 执行输出 A B C1 2 的任意组合:

    "anss": {"and":[["A","B","C"],["1","2"]]}

Deck 模块 (Dice! 牌堆)

将所有牌堆文件放入 deck 文件夹中。将如下的应答组放入应答库中,即可通过 .draw#... 来调用牌堆。

{
      "regex": "^\\.draw#",
      "anss":[
        {"lua_call": "draw_deck"}
      ],
      "pri": 105
}
  • 注意:并不完全兼容。需要对牌堆内部分特殊文本(如{nick}进行替换)

Lua 控制

已将 Bot 控制相关的部分函数注册到了 Lua 环境中。另:

  • 启动时将会从 ./luarc ./user_luarc 目录中加载脚本。
    • ./luarc 默认存放由项目本身所携带的辅助脚本,不建议修改其内容。
    • ./user_luarc 默认存放用户自定义的启动脚本。除执行顺序在 ./luarc 后外与其无地位差别。
    • 子目录的脚本不会被加载。

详细文档参考(这里)[code/luarc/README.md]

应答内容替换

替换后
[year]
[month]
[yday] 一年第x天
[mday] 一月第x天
[wday] 一周第x天
[hour]
[min]
[sec]
[group_name] 群名
[group_id] 群号
[user_name] 昵称/名片
[user_id] qq号

开始使用:

  • 请确保已完成所有配置
  • 分别启动 OneBot 与 桔梦。

已知问题

  1. 各附加功能尚未完全支持

About

适配OneBot, C++开发的QQ聊天机器人

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages