sirc - simple irc
=================

A simple multi-server terminal IRC client written in C. Single source file, no runtime
dependencies beyond ncurses, OpenSSL, and pthreads.


LAYOUT
------

+------------------+--------------------------------------------------+----------------+
| CHANNELS         | Don't paste spam. Use a pastebin. Be excellent.  | USERS (42)     |
|                  +--------------------------------------------------+                |
| irc.libera.chat  | 12:34 -> alice joined                            | @ChanServ      |
|   *status*       | 12:34 <kky> hello everyone                       | @alice         |
| > #python        | 12:34 <alice> hey!                               | +bob           |
| + #linux         |                                                  |  charlie       |
|                  |                                                  |                |
| irc.oftc.net     |                                                  |                |
|   *status*       |                                                  |                |
|   #debian        | > _                                              |                |
+------------------+--------------------------------------------------+----------------+

Header bar   -- topic of the active channel. Blank if no topic is set.
               Starts from the left, truncated on the right if too long.

Channel list -- grouped by server hostname. A ~ prefix on the server name
               means disconnected. Channel indicators:
                 >   active channel
                 +   unread messages
                 !   unread mention of your nick
               *status* appears under each server for system/server messages.
               Reachable via Ctrl+N/P like any other buffer.

Chat area    -- colour scheme:
                 <nick>        per-nick hashed colour (bold)
                 message body  plain white
                 own messages  yellow bold
                 mentions      red bold
                 actions (/me) magenta italic
                 join/part     gray
                 URLs          blue underline
               IRC formatting codes (^B bold, ^C colour, etc.) are stripped
               before display.

User list    -- sorted by privilege then alphabetically within each group:
                 ~   founder/owner   (red bold)
                 &   protected op    (red bold)
                 @   op              (red bold)
                 %   halfop          (yellow bold)
                 +   voice           (yellow bold)
                     regular         (white)

Input        -- prompt shows "> " with a blinking cursor as you type.


BUILD
-----

Dependencies:

  Library    Arch           Debian/Ubuntu
  -------    ----           -------------
  ncurses    ncurses        libncurses-dev
  OpenSSL    openssl        libssl-dev
  pthreads   (glibc)        (glibc)

Build:

  make

Install to ~/.local/bin/irc:

  make install

System-wide:

  PREFIX=/usr/local make install


USAGE
-----

  ./irc [options]

CLI options configure a single server. For multiple servers use a config file.

  --host HOST        server hostname       (default: irc.libera.chat)
  --port PORT        server port           (default: 6697)
  --nick NICK        nickname              (default: circ_user)
  --channel CHAN     channel(s) to join, comma-separated
  --tls              enable TLS            (default: on)
  --no-tls           disable TLS (plain, typically port 6667)
  --sasl-user USER   SASL username
  --sasl-pass PASS   SASL password
  --config FILE      path to config file

Examples:

  # TLS with SASL
  ./irc --host irc.libera.chat --nick kky --sasl-user kky --sasl-pass hunter2

  # Plain text
  ./irc --host irc.libera.chat --port 6667 --no-tls --nick kky

  # Join multiple channels
  ./irc --host irc.libera.chat --nick kky --channel '#python,#linux'


CONFIG FILE
-----------

Loaded from ~/.sirc or ~/.config/sirc/config (first found wins).
CLI flags override the first server in the config.

Use [server] blocks for multiple servers. Each block is an independent
connection with its own nick, channels, and credentials. All servers
connect simultaneously on startup.

  # Global defaults (before any [server] block)
  nick    = kky
  ignore  = badbot,spammer

  [server]
  host      = irc.libera.chat
  port      = 6697
  tls       = true
  channel   = #python,#linux
  sasl_user = kky
  sasl_pass = hunter2

  [server]
  host    = irc.oftc.net
  port    = 6697
  tls     = true
  channel = #debian,#tor

  [server]
  host    = irc.rizon.net
  port    = 6667
  tls     = false
  nick    = kky_rizon
  channel = #rice

Per [server] keys:

  host        server hostname
  port        port number
  nick        nickname for this server
  channel     comma-separated channels to auto-join
  tls         true / false
  sasl_user   SASL PLAIN username
  sasl_pass   SASL PLAIN password

Global keys (before any [server] block):

  nick        default nick inherited by all servers
  ignore      comma-separated nicks to ignore globally


COMMANDS
--------

All commands act on the current server (server of the active channel).

Messaging:
  /msg <nick> <text>       open a private message window
  /notice <target> <text>  send a NOTICE
  /me <text>               CTCP ACTION  (* nick text)
  /ctcp <nick> <cmd>       send a raw CTCP request

Channels:
  /join [#chan]             join a channel
  /part [#chan]             leave a channel (defaults to current)
  /cycle [#chan]            part and immediately rejoin
  /names [#chan]            list users in a channel
  /topic [text]            get the current topic, or set a new one
  /invite <nick> [#chan]   invite someone to a channel
  /kick <nick> [reason]    kick a user from the current channel
  /mode [target] [modes]   get or set channel/user modes

Users:
  /nick                    show your current nickname
  /nick <n>                change your nickname
  /whois <nick>            full whois lookup
  /who [target]            WHO query on a channel or nick
  /away [message]          set an away message
  /back                    clear away status
  /ignore [nick]           ignore a nick (no arg = list ignored nicks)
  /unignore <nick>         stop ignoring a nick

Server:
  /list [pattern]          list channels on the current server
  /raw <line>              send a raw IRC line  (alias: /quote)
  /server <host> [port]    connect to an additional server at runtime
  /connect                 reconnect the current server
  /quit [message]          disconnect all servers and exit

UI:
  /clear                   clear the current channel's scrollback
  /help                    show command reference in *status*


KEYS
----

  Tab          nick completion -- cycle through matches
               colon suffix (nick: ) added at start of line
  Ctrl+N       next channel
  Ctrl+P       previous channel
  PgUp         scroll chat up
  PgDn         scroll chat down
  Ctrl+W       delete word left
  Up / Down    step through input history
  Left / Right move cursor
  Home / End   jump to start/end of input
  Delete       delete character under cursor


FEATURES
--------

  - Multiple simultaneous servers, each with its own thread, nick, channels
  - TLS via OpenSSL with certificate verification (SSL_VERIFY_PEER)
  - SASL PLAIN authentication per server, before registration
  - Auto-reconnect with 5-second backoff, rejoins all open channels
  - Per-nick colours: djb2 hash -> 8 colours, consistent in chat and user list
  - IRC formatting stripped: bold, colour, italic, underline, reset, etc.
  - Topic shown in header bar, updated live on TOPIC messages
  - URLs (http://, https://, www.) rendered with blue underline
  - Nick tab-completion with cycling
  - Ring buffer scrollback: 500 lines per channel, O(1) insert
  - Global ignore list, loadable from config


LIMITS
------

  Max servers                   8
  Max channels (total)        128
  Users per channel           512
  Scrollback per channel      500 lines
  Input line length           480 chars
  Input history               256 lines
  Ignore list                  64 nicks
  Auto-join channels/server    16


LICENSE
-------

MIT
