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-dev 和 libssl-dev;在 Fedora 上是 ncurses-devel 和 openssl-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 文件中,格式为 用户名:密码哈希。
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_init 和 leviathan_plugin_shutdown,并获得一个小型函数指针表,用于读取缓冲区、打印内容,以及读写配置值。
8.安全说明
- 当服务器区块设置了
tls: true时,与聊天服务器的连接会使用 TLS 加密。这可以保护你与该服务器之间的链路不被网络窃听者截获。 - 但这无法保护你的消息不被服务器运营方看到。Leviathan 并未实现端到端消息加密——你连接的聊天服务器会收到并可以记录纯文本消息内容,这与任何客户端-服务器聊天系统一样。
- 客户端目前没有内置 Tor 或 SOCKS 代理支持。如果你需要向所连接的服务器隐藏自己的 IP,需要自行通过系统级代理或 VPN 来路由客户端;Leviathan 目前不会为你处理这一点。
- 查看隐私政策了解客户端在本地存储了什么、又有什么数据离开了你的设备。