8.3 KiB
Executable File
nirc-rs — TODO
Tracking open tasks for nirc-rs.
Critical
None at this time.
High
-
Test Matrix protocol against a live server — The Matrix implementation is complete (megolm E2EE, SQLite crypto store, room sync, member events, access token persistence) but has never been tested against matrix.org or any homeserver. This is the highest-priority untested protocol. (Deferred to a dedicated follow-up session per user direction — Matrix is the most complex of the group.)
-
Test Discord protocol against a live server — The Discord implementation uses Gateway WebSocket and REST API but has not been tested. Need to verify connection, event handling, and message send/receive.
-
Test remaining protocols — Stout, Spacebar, Nerimity are all fully implemented but untested. Each needs a live server/peer to verify:
- Stout (Revolt-compatible fork)
- Spacebar (Revolt fork)
- Nerimity (custom platform) (BitChat was on this list but was withdrawn in 0.10.2 — see NOTICES.md.)
-
Inline image rendering (real implementation) — The
try_render_inline_image()function insrc/tui/media.rsis currently a stub returningUnsupported. The real implementation needs to:- Fetch image bytes via reqwest (with a 4 MiB size cap)
- Detect format (PNG / JPEG / GIF / WEBP) from Content-Type
- Emit the appropriate escape sequence (Kitty graphics / iTerm2 / Sixel)
- Track placement so the TUI can refresh it on redraw The graceful-fallback path (text placeholder + external open) is already wired up, so this is a pure feature add with no risk to existing functionality.
-
URL open key binding / click handler — URLs are now visually underlined in the chat view, but the user can only open them via
/url <url>typed manually. A future enhancement would be:- Middle-click on a URL to open it externally
- Or: a
/url 1style command that opens the Nth URL in the visible buffer - Or: a key binding (e.g.
Ctrl-U) that lists visible URLs in a picker
Medium
-
Transfer panel rendering in draw loop — The transfer widget exists but is only visible when toggled via
/transfers. Integrate it into the main draw loop so it can be shown as a persistent panel or split view alongside the chat view. -
Console overlay key binding — The Quake-style debug console overlay lost its key binding when F1 was reassigned to the dropdown menu. Assign a new key (e.g.,
Ctrl-`or F2) to toggle the console overlay. -
ADC I4/U4 in BINF for incoming C-C — When an incoming client-client (C-C) connection arrives in ADC, the BINF message needs to include the correct I4 (IPv4) and U4 (UDP4) fields. Currently may be incomplete for inbound connections.
-
IRC SASL EXTERNAL with client certificates — Implement SASL EXTERNAL mechanism using TLS client certificates stored in the identity vault. This requires reading a PEM certificate and key from the vault and presenting them during the TLS handshake.
-
Configurable throttle limits — The input throttle (per-send cap, window size, window duration) is currently hardcoded in
src/core/throttle.rs. Expose these as config options inconfig.tomlunder a[throttle]section so users can tune them per-environment (e.g. higher limits for power users, lower for noisy channels). -
Reconnect away-state restoration — When the IRC connection drops and reconnects, the local
is_away/away_messagestate inConnStateis lost. The reconnect logic should re-sendAWAY :<msg>if we were previously away, so the user's away status survives network blips.
Low
-
IRC monitor mode (+i invisible) — Support for IRC's user mode
+i(invisible) and potentially a monitor/watch list feature for tracking online status of specific users. -
DCC file transfers for IRC — Implement DCC SEND/ACCEPT for direct client-to-client file transfers over IRC. This is separate from the yamux-multiplexed transfer system used by ADC.
-
Plugin API documentation — Write comprehensive documentation for the
Plugintrait, including how to build a.soplugin, the message types it receives, and how to register hooks. -
Config file hot-reload — Watch
~/.nirc/config.tomlfor changes (via SIGHUP or filesystem notification) and reload without restarting. Must handle errors gracefully and not drop active connections. -
Terminal title set/update — Set
XTITLE/TerminalTitleescape sequences to show the current window name, network, and unread count in the terminal emulator's title bar. -
Scrollback persistence to disk — Currently scrollback is in-memory only (per-tab, up to
max_scrollbackmessages). Persist to disk and reload on startup so history survives restarts.
Completed
- 0.10.2: BitChat protocol module withdrawn — Removed
src/protocols/bitchat.rsand all integrations pending clarity on Jack Dorsey's BitChat project and the India courts situation. Droppedlibp2pdependency. See NOTICES.md for the full rationale and re-evaluation criteria. - 0.10.1: CTCP spec compliance — Outgoing CTCP requests now use PRIVMSG (not NOTICE) per the IRCv3 CTCP spec.
- 0.10.1: Self-targeted CTCP visible —
/ctcp mynick VERSIONnow displays the request in the relevant tab instead of being silently swallowed. - 0.10.1: /away tracking —
is_away/away_messagetracked in ConnState; RPL_NOWAWAY (306) / RPL_UNAWAY (305) explicitly handled. - 0.10.1: IRCv3 away-notify handler — Incoming AWAY messages from other users now have a dedicated handler instead of falling into "Unhandled command".
- 0.10.1: /who hardening — RPL_WHOREPLY (352) correctly splits hopcount/realname, shows H/G flag, marks self-entries; RPL_ENDOFWHO (315) explicit handler.
- 0.10.1: /me local echo — Actions echoed locally so the user sees them even on servers that don't echo own PRIVMSGs.
- 0.10.1: /notice local echo — Same local-echo treatment for sent notices.
- 0.10.1: Input rate throttle + line guard — Per-send cap (4 lines) + sliding-window rate limit (8 lines / 3s) prevents accidental spam.
- 0.10.1: Channel rotation revert — Ctrl-N/Ctrl-P now walk tabs in static insertion order instead of activity-priority tiers.
- 0.10.1: URL detection in chat view — URLs underlined and rendered in cyan; trailing punctuation stripped.
- 0.10.1: Inline photo + external video framework —
/url,/video,/imagecommands wired; graceful fallback for unsupported terminals. - 0.10.1: Top-right bandwidth monitor — Static "nirc" label replaced with live
↓rate ↑rate filename %when transfers are active. - 0.10.1: Line wrapping — Extremely long lines wrap to the next display line instead of being truncated.
- IRC CTCP VERSION auto-response — Automatically replies to CTCP VERSION requests with the nirc-rs version string.
- UTF-8 safe backspace — Backspace correctly handles multi-byte UTF-8 characters (e.g., emoji, accented characters) without corrupting the input buffer.
- Debug log pollution fix — Reduced default log level to
warn; diagnostic output now only appears atinfo/debug/tracelevels. - F1 dropdown menu — QBasic 4.5 / aptitude-style menu bar with arrow-key navigation and command dispatch.
- Ctrl-P / Ctrl-A / Ctrl-Z keybindings — Previous buffer, next active buffer, highlight cycle.
- Transfer ticker footer — Real-time transfer speed and ETA displayed in the status bar footer.
/nickUI update — Nickname changes now immediately update all tab titles and status bar displays.- ADC handshake fix — Corrected HSUP/HSID/INF handshake sequence for reliable hub connections.
- ADC CID generation — Now spec-compliant:
Base32(SHA-256(SID)[..24])→ 39-character CID per ADC specification. The oldNIRC{SID}placeholder is gone. Locked in by 4 unit tests (cid_is_39_chars_and_base32,cid_is_deterministic,cid_differs_for_different_sids,base32_encode_no_padding). BINF version string now sourced fromCARGO_PKG_VERSIONinstead of being hardcoded. - Local IP footer — Status bar shows local network IP address.
- Window list protocol badges — Winlist sidebar shows per-protocol badges (IRC/Mtx/ADC/P2P/Dsc) with color coding.