mirror of
https://github.com/logos-messaging/libchat.git
synced 2026-02-10 17:03:12 +00:00
feat: delete a chat
This commit is contained in:
parent
537d48d5fd
commit
3e4e57ec6c
@ -6,7 +6,8 @@ A terminal chat application built with [ratatui](https://ratatui.rs/) using the
|
|||||||
|
|
||||||
- 💬 End-to-end encrypted messaging using the Double Ratchet algorithm
|
- 💬 End-to-end encrypted messaging using the Double Ratchet algorithm
|
||||||
- 📁 File-based transport for local simulation (no network required)
|
- 📁 File-based transport for local simulation (no network required)
|
||||||
- 💾 Persistent storage (SQLite)
|
- 💾 Persistent storage (SQLite + JSON state)
|
||||||
|
- 🔄 Multiple chat support with chat switching
|
||||||
- 🖥️ Beautiful terminal UI with ratatui
|
- 🖥️ Beautiful terminal UI with ratatui
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@ -40,11 +41,19 @@ cargo run -p chat-cli -- bob
|
|||||||
| `/help` | Show available commands |
|
| `/help` | Show available commands |
|
||||||
| `/intro` | Generate and display your introduction bundle |
|
| `/intro` | Generate and display your introduction bundle |
|
||||||
| `/connect <user> <bundle>` | Connect to a user using their introduction bundle |
|
| `/connect <user> <bundle>` | Connect to a user using their introduction bundle |
|
||||||
| `/peers` | List available peers |
|
| `/chats` | List all your established chats |
|
||||||
|
| `/switch <user>` | Switch to a different chat |
|
||||||
|
| `/delete <user>` | Delete a chat (removes session and crypto state) |
|
||||||
|
| `/peers` | List transport-level peers (users with inbox directories) |
|
||||||
| `/status` | Show connection status and your address |
|
| `/status` | Show connection status and your address |
|
||||||
| `/clear` | Clear message history |
|
| `/clear` | Clear current chat's message history |
|
||||||
| `/quit` or `Esc` or `Ctrl+C` | Exit the application |
|
| `/quit` or `Esc` or `Ctrl+C` | Exit the application |
|
||||||
|
|
||||||
|
#### `/peers` vs `/chats`
|
||||||
|
|
||||||
|
- **`/peers`**: Shows users whose CLI has been started (have inbox directories). These are potential contacts you *could* message.
|
||||||
|
- **`/chats`**: Shows users you have an **encrypted session** with (via `/connect`). These are active conversations.
|
||||||
|
|
||||||
### Sending Messages
|
### Sending Messages
|
||||||
|
|
||||||
Simply type your message and press Enter. Messages are automatically encrypted and delivered via file-based transport.
|
Simply type your message and press Enter. Messages are automatically encrypted and delivered via file-based transport.
|
||||||
@ -62,8 +71,13 @@ Messages are passed between users via files in a shared directory:
|
|||||||
|
|
||||||
### Storage
|
### Storage
|
||||||
|
|
||||||
User data (identity keys, chat state) is stored in SQLite databases at:
|
Data is stored in the `chat-cli-data/` directory:
|
||||||
- `chat-cli-data/<username>.db`
|
|
||||||
|
| File | Purpose |
|
||||||
|
|------|---------|
|
||||||
|
| `<username>.db` | SQLite database for identity keys, inbox keys, chat metadata, and Double Ratchet state |
|
||||||
|
| `<username>_state.json` | CLI state: username↔chat mappings, message history, active chat |
|
||||||
|
| `transport/<username>/` | Inbox directory for receiving messages |
|
||||||
|
|
||||||
### Encryption
|
### Encryption
|
||||||
|
|
||||||
@ -88,6 +102,13 @@ $ cargo run -p chat-cli -- bob
|
|||||||
# Connected! Bob sends "Hello!" automatically
|
# Connected! Bob sends "Hello!" automatically
|
||||||
|
|
||||||
# Now type messages in either terminal to chat!
|
# Now type messages in either terminal to chat!
|
||||||
|
|
||||||
|
# To see your chats:
|
||||||
|
/chats
|
||||||
|
# Output: alice (active)
|
||||||
|
|
||||||
|
# To switch between chats (if you have multiple):
|
||||||
|
/switch alice
|
||||||
```
|
```
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|||||||
@ -206,6 +206,32 @@ impl ChatApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete a chat session.
|
||||||
|
pub fn delete_chat(&mut self, remote_user: &str) -> Result<()> {
|
||||||
|
if let Some(session) = self.state.sessions.remove(remote_user) {
|
||||||
|
// Also delete from the library's storage
|
||||||
|
if let Err(e) = self.manager.delete_chat(&session.chat_id) {
|
||||||
|
// Log but don't fail - the CLI state is already updated
|
||||||
|
self.status = format!("Warning: failed to delete crypto state: {}", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we deleted the active chat, clear it
|
||||||
|
if self.state.active_chat.as_deref() == Some(remote_user) {
|
||||||
|
// Switch to another chat if available, otherwise clear
|
||||||
|
self.state.active_chat = self.state.sessions.keys().next().cloned();
|
||||||
|
}
|
||||||
|
|
||||||
|
self.save_state()?;
|
||||||
|
self.status = format!("Deleted chat with {}", remote_user);
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(anyhow::anyhow!(
|
||||||
|
"No chat with {}. Use /chats to list available chats.",
|
||||||
|
remote_user
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Send a message in the current chat.
|
/// Send a message in the current chat.
|
||||||
pub fn send_message(&mut self, content: &str) -> Result<()> {
|
pub fn send_message(&mut self, content: &str) -> Result<()> {
|
||||||
let active = self
|
let active = self
|
||||||
@ -324,6 +350,8 @@ impl ChatApp {
|
|||||||
self.add_system_message("/connect <user> <bundle> - Connect to a user");
|
self.add_system_message("/connect <user> <bundle> - Connect to a user");
|
||||||
self.add_system_message("/chats - List all chats");
|
self.add_system_message("/chats - List all chats");
|
||||||
self.add_system_message("/switch <user> - Switch to chat with user");
|
self.add_system_message("/switch <user> - Switch to chat with user");
|
||||||
|
self.add_system_message("/delete <user> - Delete chat with user");
|
||||||
|
self.add_system_message("/peers - List transport peers");
|
||||||
self.add_system_message("/status - Show connection status");
|
self.add_system_message("/status - Show connection status");
|
||||||
self.add_system_message("/clear - Clear current chat messages");
|
self.add_system_message("/clear - Clear current chat messages");
|
||||||
self.add_system_message("/quit or Esc or Ctrl+C - Exit");
|
self.add_system_message("/quit or Esc or Ctrl+C - Exit");
|
||||||
@ -370,6 +398,13 @@ impl ChatApp {
|
|||||||
self.switch_chat(args)?;
|
self.switch_chat(args)?;
|
||||||
Ok(Some(format!("Switched to {}", args)))
|
Ok(Some(format!("Switched to {}", args)))
|
||||||
}
|
}
|
||||||
|
"/delete" => {
|
||||||
|
if args.is_empty() {
|
||||||
|
return Ok(Some("Usage: /delete <username>".to_string()));
|
||||||
|
}
|
||||||
|
self.delete_chat(args)?;
|
||||||
|
Ok(Some(format!("Deleted chat with {}", args)))
|
||||||
|
}
|
||||||
"/peers" => {
|
"/peers" => {
|
||||||
let peers = self.transport.list_peers();
|
let peers = self.transport.list_peers();
|
||||||
if peers.is_empty() {
|
if peers.is_empty() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user