### 界面 纯命令行界面实现, 程序界面分为三大块 - 左上角最大的一块 -- 显示聊天记录的区域 - 左下角稍小的一块 -- 用户输入区域 - 右侧一列 -- 状态列 -- 显示使用 `/list` 命令的输出 - 当在一个聊天组中, 默认显示当前聊天组用户列表 (需要包括用户的名称, 用户的在线状态) (效果等效于`/list -s`) ### 命令 进入系统是默认进入一个空的界面, 但是输入框是可以输入的, 然后可以在输入框中输入 `/{cmd}` 来执行各种操作, 具体如下 - `/?` - 列出所有可用的命令选项 - `/help {options}` - 列出 `{option}` 命令的用法. 例如 `/help send_files {文件路径}` : 将 `{文件路径}` 这个文件通过ftp发送 - `/login` - 进入登录状态, 在状态列显示提示输入用户名/ID的提示, 然后可以在输入框中输入用户名. 用户名输入完毕后, 状态列显示输入密码的提示, 然后在输入框中输入密码. 登录成功后在状态列打印登录成功, 然后默认进入公频聊天. - `/signin` - 进入注册状态. 类似登录的流程走一遍注册的流程. - `/info` - 在状态列显示当前的用户信息: 用户名(唯一), ID(自动分配), 状态, 已经加入的聊天组数量(私聊也算聊天组, 不过可以分开打印, 比如说总数x, 私聊y, 群聊x-y), 当前系统存在的聊天组总数, 当前系统存在的用户总数, 当前系统在线的用户总数 - `/list {options}` - `-u` : 在状态列显示所有的用户 (需要包括用户的名称, ID, 用户的在线状态) - `-s`: 在状态列显示**当前聊天组**的所有用户 (需要包括用户的名称, 用户的在线状态) - `-c` : 在状态列显示所有**本用户已经加入的聊天组** - `-g` : 在状态列显示所有的**用户列表长度>2**的聊天组 (也就是群聊而非私聊) - `-f` : 在状态列显示该聊天记录中所有的文件 - `/create_chat {chat_name} {users...}` - 创建一个聊天组, 该聊天组的 *别名* 是 `{chat_name}` , 初始成员为 `{users...}`, (users为可变长参数). 将`users...` 加入到该聊天组的用户列表中 - `/enter_chat {chat_name}` : - 可以进入一个 *别名* 为 `{chat_name}` 的聊天组 **如果本用户存在于这个聊天组的用户列表中** (默认存在的公频的名称为: `public`) - `/join_chat {chat_name}` - 加入到一个 *别名* 为 `{chat_name}` 的聊天组中, **将本用户加入到这个聊天组的用户列表中** - `/send_files {file_path...}` - 将本机的 `{file_path}` 文件传输到服务器上, 等待对方主动接收. `file_path`是可变长参数 - `/recv_files {options}` - `-n`: 接收该聊天组中文件名为 `{file_name...}` 的文件. `file_path`是可变长参数 - `-l`: 列出当前聊天记录中存在的文件 - `-a`: 接收当前聊天记录中所有的文件 - `/exit` - 退出系统, 将状态更新为离线 ### 功能细节 - 聊天记录: - 全部聊天内容存储到服务器端, 与用户实时同步, 并实现漫游 - 在客户端不同用户的聊天记录存储在不同的文件夹中, 若是第一次登录需要先拉取数据, 也就是上面说的漫游. - 如果可以的话, 聊天记录和数据库都用docker部署的数据库存储 ~~但是没学过数据的使用, 有点难顶~~ - 用户状态: 用户登录聊天室就向服务器发送上线信息, 把状态设置为在线; 同理, 用户退出程序就向服务器发送下线信息, 把状态设置为离线. 一旦服务器端存储的用户状态发生了改变, 就要向所有在线的客户端发送新的用户状态, 客户端更新用户状态. - 聊天 - 暂且不分为群聊或者私聊? 按照参与聊天的人来分为一组聊天记录. 比如说张三和李四两个人的聊天, 就创建一个文件夹, 专门存储张三和李四的聊天记录, 且这份聊天记录只有张三和李四有读写权限. 再来一个例子: A, B, C, D 四个人的群聊, 那么就是一份只有ABCD四个人有读写权限的聊天记录. 一份聊天记录以一个文本存放, 按照聊天记录的名字来标记谁在这个群组中, 也就是谁有这个聊天记录文件读写的权限? ~~这样感觉有点太低效了, 不知道如果使用数据库的话有没有更好的方式~~ - 默认存在一个公频, 也就是所有用户都可以自由发言的聊天记录 - 接入**glm-4-flash**, 使用智谱的库, 作为一个默认的用户 - 在私聊中当然是普通的chat, 每次将context作为prompt通过api发送到智谱, **但是智谱应该要如何发言呢**? 也就是LLM在接收了我的请求之后如何响应呢? - 在群聊中, 也就是两个或两个以上存在AI用户的聊天组中, 需要监视每一条新发出的消息, 如果存在 `@AI` 这一个指令, 就将context发送给智谱, 然后让其做出相应的回应 - 收发文件: - 在聊天界面中, 如果两个人同时在线, 那么就可以选择由发送方请求建立ftp协议, 接收方可以选择同意文件传输或者拒绝. 如果拒绝则向发送方发送拒绝消息. 如果同意, 发送方和接收方建立ftp连接, 开始传输文件, 接收方收到的文件需要放在存放用户信息的文件夹下的 `recved_files` 中, 并提示: `接收文件成功! 接受文件的路径+文件名`. - 收发文件应该以命令的方式进行. 比如说我需要发一个文件, 我需要输入 `/send_files {文件路径}`, 以这样的方式出现在聊天记录中, 然后发到服务器端保存. 应当按照聊天组(可以是私聊也可以是群聊)为一个文件夹, 然后在这个聊天组中的所有文件都存储在这个文件夹中 ~~同样的, 可以考虑使用数据库, 不过不会~~ 如果是接收一个文件, 需要主动在聊天框输入 `/recv_files {文件名}` 这个文件名应当是在当前聊天组的聊天记录中存在的文件名. 然后接收的文件存放在用户信息的文件夹下的 `recv_files` 中. 如果 `/recv_files` 后面没有参数, 那么就是将这条聊天记录中的所有文件全部下载到本地