253 lines
8.0 KiB
Plaintext
253 lines
8.0 KiB
Plaintext
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 ~/.ircrc or ~/.config/irc/ircrc (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
|