You've heard of chatGPT, well now you have chatFTP! Unfortunately, the only relevance is the funny name.
This is a simple chat client written in Rust that integrates with an FTP server to read and write chat messages to a text file.
- Real-time messaging: Send and receive chat messages to/from other users connected to the same FTP server
- Automatic message polling: Background thread continuously checks for new messages every 2 seconds
- Chat history: Displays existing conversation history when joining the chat
- User-friendly interface: Clean command line interface with clear prompts and feedback
- Configurable chat database: Specify any filename for the chat storage file
- Join/leave notifications: Automatic announcements when users enter or exit the chat
- Rust installed on your machine (1.70+ recommended)
- Access to an FTP server that supports passive mode (PASV)
- Valid FTP username and password
- Network connectivity to the FTP server
- Clone this repository to your machine:
git clone [email protected]:aedrax/chatftp.git cd chatftp
- Build the project:
cargo build --release
- Run the chat client:
cargo run
ChatFTP uses command line arguments for configuration. Here are the available options:
Usage: chatftp [OPTIONS]
Options:
-a, --address <ADDRESS> FTP server address [default: 127.0.0.1]
-p, --port <PORT> FTP server port [default: 21]
-u, --username <USERNAME> FTP username [default: anonymous]
-P, --password <PASSWORD> FTP password [default: anonymous]
-d, --database <DATABASE> Chat database filename [default: chat.txt]
-n, --nickname <NICKNAME> Your nickname for the chat
-h, --help Print help
-V, --version Print version
All Arguments are Optional with Defaults:
--address
/-a
: FTP server address (default: 127.0.0.1)--port
/-p
: FTP server port (default: 21)--username
/-u
: FTP server username (default: anonymous)--password
/-P
: FTP server password (default: anonymous)--database
/-d
: Chat database filename (default: chat.txt)--nickname
/-n
: Your chat nickname (if not provided, you'll be prompted)
Example Usage:
-
Basic usage with local FTP server:
cargo run -- --username myuser --password mypass --nickname Alice
-
Connect to remote FTP server:
cargo run -- --address ftp.example.com --username myuser --password mypass --nickname Bob
-
Custom database file and port:
cargo run -- --address 192.168.1.100 --port 2121 --username ftpuser --password secret --database team_chat.txt --nickname Charlie
-
Help command:
cargo run -- --help
Chat Interface:
- View existing chat history automatically when joining
- Type messages and press Enter to send (your messages appear immediately)
- New messages from other users appear automatically in IRC-style format:
<username> message
- Messages include timestamps in the file but display cleanly in the interface
- You won't see your own messages echoed back (like IRC behavior)
Available Commands:
/exit
or/quit
- Leave the chat/help
- Display available commands/history
- Refresh and display complete chat history
Example Session:
$ cargo run -- --username testuser --password testpass --nickname Alice
=== Welcome to ChatFTP ===
Connecting as 'Alice' to 127.0.0.1:21
Using chat database: chat.txt
Connecting to 127.0.0.1:21...
Successfully connected to FTP server!
=== Chat History ===
2025-01-20 14:30:15 bob: Hello everyone!
2025-01-20 14:31:22 charlie: Hey Bob!
===================
Type your messages below. Use /exit or /quit to leave the chat.
Commands: /help - show this help, /history - refresh chat history
[2025-01-20 14:31:25] <alice> *** alice has joined the chat ***
[2025-01-20 14:31:28] <alice> hey!
[2025-01-20 14:31:28] <bob> hey alice!
Enter a message:
- FTP Protocol: Uses standard FTP commands (USER, PASS, PASV, APPE, RETR, MDTM)
- File Operations: Appends new messages and retrieves entire chat history
- Optimization: Uses MDTM command to check file modification time before downloading (when supported)
- Concurrency: Separate thread for message polling to avoid blocking user input
- Error Handling: Graceful handling of network issues, authentication failures, and file errors
- Message Format:
YYYY-MM-DD HH:MM:SS Username: Message
- Connection Issues: Ensure FTP server allows passive mode connections
- Authentication: Verify username/password and account permissions
- File Access: Make sure the FTP account can read/write files in the working directory
- Firewall: Check that both control (usually 21) and data ports are accessible
This project is licensed under the MIT License. See the LICENSE file for details.