# 使用Go语言重新实现 [sihuan/XZZ](https://github.com/sihuan/XZZ) 机器人项目 本项目是一个使用Go语言重新实现 [sihuan/XZZ](https://github.com/sihuan/XZZ) 机器人项目。原使用go-cqhttp的机器人项目,由于go-cqhttp不再维护,有众多bug,无法使用,所以更换使用 [napcat](https://github.com/NapNeko/NapCatQQ) 实现。 当前项目的功能都在`workers`目录下。同时所有接收到的消息都保存在一个sqlite数据库中,文件名为`data.db`保存在项目根目录。 ## 部署服务: 1. 先使用docker部署[napcat](https://github.com/NapNeko/NapCatQQ),然后修改配置文件,将机器人的token替换为napcat的token,然后运行项目即可。 部署[napcat](https://github.com/NapNeko/NapCatQQ)可参考下面的docker-compose.yml文件: ```yaml version: '3' services: napcat: image: mlikiowa/napcat-docker:latest container_name: napcat environment: - ACCOUNT= - HTTP_ENABLE=true - HTTP_POST_ENABLE=true - HTTP_URLS=["http://172.17.0.1:5580/"] ports: - "5700:3000" - "6099:6099" volumes: - ~/dockerfile/napcat/config:/usr/src/app/napcat/config - ~/dockerfile/napcat/QQ:/root/.config/QQ ``` 然后启动docker-compose.yml文件即可。 新版的napcat把文件路径改了,所以需要把上面的`~/dockerfile/napcat/QQ:/root/.config/QQ` 改为 `/app/.config/QQ:/app/.config/QQ`,否则会导致获取不到图片地址。 也可以不修改配置,手动创建软链接`ln -s ~/dockerfile/napcat/QQ /app/.config/QQ` 2. 运行本项目前需要先修改配置文件,将本项目目录下的`config example.toml` 重命名为`config.toml`,然后修改配置文件,默认的配置端口跟上面的 docker-compose.yml文件一致,不需要修改。如果需要使用ai功能,需要修改配置文件里的`MODEL`,`OPENAI_API_KEY`和`OPENAI_BaseURL`这三个字段。 3. 启动项目:安装go环境,然后运行`go run main.go`即可。你也可以使用`go build main/go -o go-bot`编译为可执行文件, ## 使用说明: 1. 默认的配置端口是5580,如果需要修改,请修改配置文件里的`APIURL`字段。默认获取以`!`开头的消息,如果需要修改,请修改配置文件里的`Prefix`字段。 2. 现在加入了`Redis`支持,如果需要使用`Redis`,请在配置文件里配置`REDIS`的相关信息,使用`Redis`可以支持`ai`插件的`Context`功能,即支持上下文对话,同时让机器人拥有更高的扩展性。 3. 当前拥有的插件: - `ping`:判断程序运行,会响应`Pong!` - `ip`:查询一个ip的详细信息,使用方法`ip <域名/ip>` - `lsp`:请求`api.lolicon.app`获取`Pixiv`壁纸,暂时只简单实现获取随机壁纸。 - `hhsh`:“能不能好好说话”,使用方式:`hhsh <拼音简写>`,如:`hhsh awsl` - `pkg`:用于查询`ArchLinux`软件包信息,包含官方仓库和`AUR`的软件包,使用方式:`pkg linux` - `ai`:加入`ChatGPT`,支持文字和图片识别,图片识别需要`GPT4`相关模型,使用方式:`ai 你好`,图片识别需要选中回复群聊的图片,然后使用如:`ai 图片上有什么内容`来调用。 ## 编写插件: 所有的插件放在`workers`目录下,并且都要有下面的代码: ```go package workers func init() { plugins := config.GetConfig()["PLUGINS"].([]interface{}) if slices.Contains(plugins, "ping") { RegisterWorkerFactory("ping", func(parms []string, uid, gid, role, mid, rawMsg string) Worker { return &Ping{ StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg), } }) } } type Ping struct { *StdAns } ``` 上面的例子是实现里`ping`这个插件的注册,在群组中以`!ping`指令激活。 同时可以通过修改配置文件的`PLUGINS = ["ai","pkg"]`来决定启用哪些插件。 所有的功能需要写在实现的`GetMsg()`方法里,如`!ping` 命令的: ```go func (a *Ping) GetMsg() string { return "Pong!" } ```