GithubHelp home page GithubHelp logo

goodbyelittled / lgtbot Goto Github PK

View Code? Open in Web Editor NEW

This project forked from slontia/lgtbot

0.0 0.0 0.0 16.05 MB

聊天室游戏裁判机器人,将聊天室打造成游戏竞技平台

License: GNU Lesser General Public License v2.1

C++ 98.01% C 0.96% CMake 1.03%

lgtbot's Introduction

Logo

image image

1 项目简介

LGTBot 是一个基于 C++ 实现的,用于在 聊天室其它通讯软件 中,实现多人 文字推理游戏 的裁判机器人库。

  • 提供了通用的 聊天信息交互接口,需要由已实现好的机器人框架调用使用
  • 支持 群组公开游戏私密游戏 两种方式,无需在群组内也可以进行游戏
  • 内置了 24 种已实现好的游戏,同时提供了通用的游戏框架,便于后续开发新游戏
  • 基于 CMake 编译,支持跨平台

其中,「LGT」源自日本漫画家甲斐谷忍创作的《Liar Game》中的虚构组织「Liar Game Tournament事务所」。

本项目是一个面向开发者的机器人库,需要和已有的机器人框架进行结合,如您想直接在通讯工具中使用该机器人库,可以参考以下已结合好的解决方案:

  • 基于 Mirai 框架,用于 QQ 通讯软件:lgtbot-mirai

2 开始

请确保您的编译器支持 C++20 语法,建议使用 g++10 以上版本

# 安装依赖库(Ubuntu 系统)
$ sudo apt-get install -y libgoogle-glog-dev libgflags-dev libgtest-dev libsqlite3-dev libqt5webkit5-dev

# 完整克隆本项目
$ git clone github.com/slontia/lgtbot

# 安装子模块
$ git submodule update --init --recursive

# 构建二进制路径
$ mkdir build

# 编译项目
$ cmake .. -DWITH_GCOV=OFF -DWITH_ASAN=OFF -DWITH_GLOG=OFF -DWITH_SQLITE=ON -DWITH_TEST=ON -DWITH_SIMULATOR=ON -DWITH_GAMES=ON
$ make

3 项目组成

  • bot_core:机器人的核心逻辑,包括开始游戏、结束游戏、查看信息等功能
  • bot_simulator:用于模拟机器人与用户交互的客户端,可以在测试时使用
  • bot_unittest:机器人单元测试
  • game_framework:游戏框架,包括游戏的底层逻辑(如阶段切换等)
  • games:已经实现好的游戏
  • utility:通用组件
  • game_util:通用的游戏组件

4 使用方法

4.1 使用机器人框架链接LGTBot库

如您在理解下述使用方式中遇到困难,请参考 simulator 的调用方式bot_simulaor,或参考基于Mirai框架实现的范例lgtbot-mirai

执行编译后,会在 build 目录下生成 libbot_core.solibbot_core_static.a 两文件,前者为 LGTBot 的动态库,后者为 LGTBot 的静态库。

4.1.1 实现接口,支持机器人发送消息

客户需要实现以下几个接口,用来让机器人可以发送消息。

  • void* OpenMessager(const char* id, bool is_uid):客户需要在此函数中创建一个「消息发送对象」,返回该对象的指针。参数:
    • const char* id:消息发送目标的 ID,可能为用户 ID(即私信用户)或群组 ID
    • bool is_uid:如果为 true,为用户 ID,否则为群组 ID
  • void MessagerPostText(void* p, const char* data, uint64_t len):记录一条文本消息。参数:
    • void* p:指向通过 OpenMessager 创建的对象
    • const char* data:需要发送的字符串
    • uint64_t len:字符串长度
  • void MessagerPostUser(void* p, const char* uid, bool is_at):记录一条用户相关的消息。参数:
    • void* p:指向通过 OpenMessager 创建的对象
    • const char* uid:用户 ID
    • bool is_at:如果为 true,表示 at 对应的用户,否则只需要获取该用户的名字
  • void MessagerPostImage(void* p, const std::filesystem::path::value_type* path):记录一条图片消息。参数:
    • void* p:指向通过 OpenMessager 创建的对象
    • const std::filesystem::path::value_type* path:要发送的图片所在路径
  • void MessagerFlush(void* p):将目前为止所记录的消息发送出去。参数:
    • void* p:指向通过 OpenMessager 创建的对象
  • void CloseMessager(void* p):释放消息发送对象。参数:
    • void* p:指向通过 OpenMessager 创建的对象
  • const char* GetUserName(const char* uid, const char* gid):返回玩家昵称或群昵称。参数:
    • const char* uid:用户 ID
    • const char* gid:群组 ID,可为空,若为空,表示获取用户的昵称;若非空,表示获取玩家在该群的群昵称
  • bool DownloadUserAvatar(const char* uid, const std::filesystem::path::value_type* dest_filename):下载玩家头像,返回是否下载成功。参数:
    • const char* uid:用户 ID
    • const std::filesystem::path::value_type* path:下载头像图片的目标路径

其中,MessagerPost* 的三个接口,并不负责实际发送消息,仅仅是将要发送的消息记录下来,真正发送是在 MessagerFlush 接口中进行。

函数实现后,不需要客户进行调用,函数的定义会在链接 LGTBot 库的过程中被载入,LGTBot 库负责进行函数的调用。

4.1.2 调用接口,实现机器人接收消息

LGTBot 所提供的接口,定义在bot_core/bot_core.h中,包括:

  • Init:进行 LGTBot 的初始化工作,并返回一个 bot handler,需要的参数在 BotOption 类中定义,包括:
    • uint64_t this_uid_:当前机器人所属的用户ID
    • const char* game_path_:游戏库所在路径(即编译出来的 plugins 目录的路径),建议为绝对路径,不可为空
    • const char* image_path_:(暂未使用)
    • const uint64_t* admins_:管理员用户 ID 列表(管理员可以使用管理命令),末尾元素需为 0,可为空,说明无管理员
    • const char* db_path_:SQLite 文件路径,用于存储对战数据,不可为空
  • Release:释放机器人。参数:
    • void* bot:通过 Init 函数获取到的指针
  • HandlePrivateRequest:当收到用户私信的消息时,需要调用该接口,将消息转发给 LGTBot。参数:
    • void* bot:通过 Init 函数获取到的指针
    • const uint64_t uid:发送消息的用户 ID
    • const char* msg:发送的消息
  • HandlePublicRequest:当收到群组中用户发送的消息时,需要调用该接口,将消息转发给 LGTBot
    • void* bot:通过 Init 函数获取到的指针
    • const uint64_t gid:发送消息的群组 ID
    • const uint64_t uid:发送消息的用户 ID
    • const char* msg:发送的消息

4.1.3 支持配置项

LGTBot 本身不提供配置项,但您可以通过配置项更改 glog 输出日志的模式。详情请参考 glog 官方文档。

4.2 使用simulator测试机器人

执行编译后,会在 build 目录下生成 simulator 可执行文件,执行后会进入命令行界面,可在此测试机器人行为。

  • 命令格式:<group_id> <user_id> <msg...>
  • 例如:「1 2 #新游戏 投标扑克」,表示用户 2 在群组 1 中发送了「#新游戏 投标扑克」指令给机器人
  • 若为私信,则将 group_id 置为 「-」,例如 「- 2 #新游戏 投标扑克」,表示用户 2 私信发送了「#新游戏 投标扑克」指令给机器人
  • 通过 quit 命令退出

simulator 有如下附加参数,可在执行二进制时指定:

  • admin_uid:管理员用户 ID,默认为 1
  • bot_uid:机器人用户 ID,默认为 114514
  • color:输出内容是否带颜色,默认为 true
  • db_path:SQLite 数据文件路径,默认为 "simulator.db"
  • game_path:游戏所在路径,默认为 "./plugins"
  • history_filename:历史命令保存路径,默认为 ./.simulator_history.txt

lgtbot's People

Contributors

darkdumptruck avatar goodbyelittled avatar jeffxzy avatar slontia avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.