# nirc-rs nirc-rs is a multi-protocol terminal chat client written in Rust. It provides a unified TUI interface for IRC, Matrix, Discord, ADC/DC++, BitChat (P2P via libp2p), Revolt/Stout, Spacebar, and Nerimity — all in a single ncurses-style terminal window. ## Features - **Multi-protocol**: IRC (with TLS/SASL), Matrix (megolm E2EE), Discord (Gateway + REST), ADC/DC++, BitChat (P2P Gossipsub), Stout, Spacebar, Nerimity - **naim-style TUI**: Right-side window list panel, chat area with naim-compatible formatting, status bar, input bar, debug console overlay - **HTML-like message markup**: Bold, italic, underline, color, monospace, links, custom emoji themes - **File transfers**: P2P file send via libp2p request-response (BitChat), progress bars, SHA-256 verification, cancellation - **Plugin system**: Dynamic .so plugin loading for custom commands - **Per-channel logging**: naim-format log files per channel/protocol - **Encrypted tunnels**: Noise protocol tunnels between peers - **Multiplexed streams**: yamux-based stream multiplexing for concurrent file transfers and tunnels ## Supported Protocols | Protocol | Tag | Description | |-----------|-----|------------------------------------------| | IRC | IRC | Classic IRC with TLS, SASL, ISUPPORT | | Matrix | Mtx | Matrix.org with megolm E2EE | | Discord | Dsc | Discord Gateway + REST API | | ADC/DC++ | ADC | Direct Connect hub client | | BitChat | P2P | P2P chat via libp2p Gossipsub | | Stout | Sto | Revolt/Stout REST + WebSocket | | Spacebar | Spc | Spacebar REST + WebSocket | | Nerimity | Ner | Nerimity REST + WebSocket | ## Building Requires Rust 1.75+ and a C compiler (for dependencies like `sha2`, `ring`). ```bash # Clone git clone https://git.dcos.net/dcosnet/nirc-rs.git cd nirc-rs # Build (release) cargo build --release # Or use the provided build script ./build.sh # release ./build.sh debug # debug ./build.sh check # cargo check only ./build.sh test # run tests ./build.sh clippy # lint ``` The binary is output to `target/release/nirc-rs` (or `target/debug/nirc-rs`). ## Configuration nirc-rs reads configuration from `~/.nirc/config.toml`. Create it manually or let the first run generate a template: ```bash mkdir -p ~/.nirc nirc-rs # generates a template config on first run ``` ### Server entries Each protocol connection is defined as a `[[servers]]` block: ```toml # IRC example [[servers]] name = "libera" protocol = "irc" address = "irc.libera.chat:6697" tls = true nick = "myuser" [servers.extra] password = "optional_nickserv_pass" # Matrix example [[servers]] name = "matrix" protocol = "matrix" address = "https://matrix.org" user_id = "@you:matrix.org" [servers.extra] password = "your_password" # Discord example [[servers]] name = "discord" protocol = "discord" address = "https://discord.com/api" bot_token = "your_bot_token_here" # BitChat (P2P) example [[servers]] name = "bitchat" protocol = "bitchat" address = "/ip4/0.0.0.0/tcp/9394" [servers.extra] bootstrap = "/ip4/1.2.3.4/tcp/9394/p2p/QmSomePeerId" nickname = "myhandle" ``` ## Usage ``` nirc-rs [config-path] ``` ### Key bindings | Key | Action | |------------|----------------------------------| | Ctrl+N | Next window | | Ctrl+P | Previous window | | Alt+1-9 | Switch to window 1-9 | | Page Up/Down| Scroll chat history | | Tab | Cycle nickname completions | | /command | Enter command mode | | Ctrl+^ | Toggle debug console overlay | | Ctrl+L | Redraw screen | ### Commands - `/connect ` — Connect to a configured server - `/join ` — Join a channel - `/part` — Leave current channel - `/msg ` — Send a direct message - `/me ` — Send an action/emote - `/quit` — Exit nirc-rs - `/bitchat peers` — List discovered P2P peers - `/matrix verify ` — Start SAS device verification ## Architecture - `src/main.rs` — Application entry, event loop, TUI rendering - `src/config.rs` — TOML config parser - `src/core/` — Core types: App, ChatMessage, ProtocolType, commands - `src/protocols/` — Protocol backends (IRC, Matrix, Discord, etc.) - `src/engine/` — Dispatcher, crypto tunnels, multiplexer - `src/tui/` — Terminal UI: chat view, winlist, input bar, console - `src/transfer/` — File transfer engine and state management - `src/plugins/` — Dynamic plugin loader (.so) ## License MIT — see [LICENSE](LICENSE) for details.