参考文档

文档

Leviathan 聊天客户端的构建、配置与架构说明

本页内容
  1. 架构
  2. 从源码构建
  3. 配置
  4. 账户与登录
  5. 聊天命令
  6. 交易功能(OsirisBot)
  7. 插件
  8. 安全说明

1.架构

Leviathan 是一款基于客户端-服务器模型构建的聊天客户端。它连接到你配置的一个或多个聊天服务器——不会与其他用户建立点对点连接,也没有无服务器模式。客户端为每个已配置的服务器维护一个套接字,按照服务器的标准握手流程完成注册,并使用 epoll 对所有连接进行多路复用。

终端界面基于 ncurses/panel 构建(支持宽字符),因此客户端完全运行在终端模拟器内——没有图形界面工具包,也没有浏览器组件。

加密货币交易功能("OsirisBot")并不属于 C 语言客户端本身,而是一个独立的机器人,像普通用户一样连接到聊天服务器,并响应 !wallet!sell 等命令。目前有两个实例,分别对应葡萄牙语房间(br)和英语房间(usa)。该机器人在服务器端维护自己的状态。

2.从源码构建

你需要一套 C11 工具链和若干开发库:

依赖项用途
gcc、make构建工具链(使用 -std=c11 -Wall -Wextra -Wpedantic 编译)
libncursesw-dev终端界面(支持宽字符的 ncurses + panel)
libssl-dev与聊天服务器之间的 TLS,以及访问 CoinGecko 价格 API 的 HTTPS

各发行版的包名略有不同——在 Debian/Ubuntu 上通常是 libncursesw5-devlibssl-dev;在 Fedora 上是 ncurses-developenssl-devel

git clone <repo-url> leviathan
cd leviathan
make            # 优化构建 -> build/bin/leviathan
make debug      # 调试构建:-g -O0,附带 AddressSanitizer + UBSan
make install    # 安装到 $DESTDIR/usr/local/bin/leviathan

插件通过 dlopen() 加载,因此二进制文件也链接了 libdl。一个后台线程(pthreads)负责刷新加密货币价格,不会阻塞界面。

3.配置

将默认配置复制到你的用户配置目录并进行编辑:

mkdir -p ~/.config/leviathan
cp config/leviathan.yaml.default ~/.config/leviathan/leviathan.yaml

配置文件采用 YAML 格式,支持配置一个服务器列表,因此你可以同时连接多个聊天网络。每一项都有自己的 tls 开关:

servers:
  - name: br
    host: chat.example.org
    port: 6697
    tls: true
    rooms: [br]

log:
  enabled: false
  path: ~/.local/share/leviathan/logs

消息记录功能默认关闭。启用后,客户端会将每个缓冲区的纯文本日志写入上方指定的路径——不会发送到任何其他地方。

4.账户与登录

账户是本地于客户端的,不与任何身份服务绑定。凭据以纯文本形式存储在你的配置目录下的 users.db 文件中,格式为 用户名:密码哈希

已知限制:目前密码使用 DJB2 进行哈希处理,这是一种快速的非加密哈希算法,且不带盐值。这对于本地单用户终端客户端而言已经足够,但不应被视为能够抵御能够访问 users.db 的有心攻击者。请不要重复使用你在其他地方使用的密码。

客户端和交易机器人的任何环节都不涉及邮箱、电话号码或身份验证——登录只需要一个昵称和一个本地密码。

5.聊天命令

命令作用
/server <名称>连接到你配置中定义的服务器
/join 房间加入当前服务器上的某个房间
/msg 昵称 内容发送一条私信
/leave/quit离开房间或断开连接

这些都是标准的客户端-服务器聊天命令,无论连接到哪个服务器,处理方式都是一致的。

6.交易功能(OsirisBot)

OsirisBot 运行在服务器端,存在于你所连接的房间中,并不需要你本地安装。为了实现交易市场的功能,余额是模拟的——机器人在自己的账本中记录谁拥有什么,并在用户的机器人余额之间完成交易结算。

命令作用
!wallet查看你的余额
!prices查看当前 BTC/ETH/XMR/USDT 价格
!sell <币种> <数量> <价格>发布出售数量(需支付挂单手续费,见下文)
!buy <挂单ID>购买一个开放挂单(需支付转账手续费)
!listings查看当前的开放挂单
!history查看你过去的交易记录

价格数据来自 CoinGecko 的公共 API,每隔几分钟轮询一次。该请求由运行机器人的服务器发出,而不是由你的客户端发出,因此使用交易机器人不会将你的 IP 暴露给 CoinGecko。

7.插件

插件是原生共享对象(.so),在启动时通过 dlopen()~/.config/leviathan/plugins/ 加载。一个插件会暴露两个入口点,leviathan_plugin_initleviathan_plugin_shutdown,并获得一个小型函数指针表,用于读取缓冲区、打印内容,以及读写配置值。

插件以完整的进程权限运行。由于插件是加载到同一进程中的原生代码,因此完全没有沙箱隔离——它可以读取任何缓冲区、你用户账户能访问的任何文件,并执行任何系统调用,与主程序本身完全一样。请只安装那些你信任程度不亚于客户端本身的插件。

8.安全说明