feat: add IRC wire protocol listener with shared service layer
All checks were successful
check / check (push) Successful in 1m0s
All checks were successful
check / check (push) Successful in 1m0s
Adds a backward-compatible IRC wire protocol listener (RFC 1459/2812) with a shared service layer used by both IRC and HTTP transports. - TCP listener on configurable port (default :6667) - Full IRC protocol: NICK, USER, JOIN, PART, PRIVMSG, MODE, TOPIC, etc. - Shared service layer (internal/service/) for consistent code paths - Tier 2 join restrictions (ban, invite-only, key, limit) in service layer - Ban check on PRIVMSG in service layer - SetChannelFlag handles +i and +s modes - Command dispatch via map[string]cmdHandler pattern - EXPOSE 6667 in Dockerfile - Service layer unit tests closes #89
This commit is contained in:
65
README.md
65
README.md
@@ -27,6 +27,7 @@ web client as a convenience/reference implementation, but the API comes first.
|
||||
- [Federation](#federation-server-to-server)
|
||||
- [Storage](#storage)
|
||||
- [Configuration](#configuration)
|
||||
- [IRC Protocol Listener](#irc-protocol-listener)
|
||||
- [Deployment](#deployment)
|
||||
- [Client Development Guide](#client-development-guide)
|
||||
- [Rate Limiting & Abuse Prevention](#rate-limiting--abuse-prevention)
|
||||
@@ -2266,6 +2267,7 @@ directory is also loaded automatically via
|
||||
| `NEOIRC_OPER_PASSWORD` | string | `""` | Server operator (o-line) password. Both name and password must be set to enable OPER. |
|
||||
| `LOGIN_RATE_LIMIT` | float | `1` | Allowed login attempts per second per IP address. |
|
||||
| `LOGIN_RATE_BURST` | int | `5` | Maximum burst of login attempts per IP before rate limiting kicks in. |
|
||||
| `IRC_LISTEN_ADDR` | string | `:6667` | TCP address for the traditional IRC protocol listener. Set to empty string to disable. |
|
||||
| `MAINTENANCE_MODE` | bool | `false` | Maintenance mode flag (reserved) |
|
||||
|
||||
### Example `.env` file
|
||||
@@ -2282,6 +2284,69 @@ NEOIRC_HASHCASH_BITS=20
|
||||
|
||||
---
|
||||
|
||||
## IRC Protocol Listener
|
||||
|
||||
neoirc includes an optional traditional IRC wire protocol listener (RFC
|
||||
1459/2812) that allows standard IRC clients to connect directly. This enables
|
||||
backward compatibility with existing IRC clients like irssi, weechat, hexchat,
|
||||
and others.
|
||||
|
||||
### Configuration
|
||||
|
||||
The IRC listener is **enabled by default** on `:6667`. To disable it, set
|
||||
`IRC_LISTEN_ADDR` to an empty string:
|
||||
|
||||
```bash
|
||||
IRC_LISTEN_ADDR=
|
||||
```
|
||||
|
||||
### Supported Commands
|
||||
|
||||
| Category | Commands |
|
||||
|------------|------------------------------------------------------|
|
||||
| Connection | `NICK`, `USER`, `PASS`, `QUIT`, `PING`/`PONG`, `CAP` |
|
||||
| Channels | `JOIN`, `PART`, `MODE`, `TOPIC`, `NAMES`, `LIST`, `KICK`, `INVITE` |
|
||||
| Messaging | `PRIVMSG`, `NOTICE` |
|
||||
| Info | `WHO`, `WHOIS`, `LUSERS`, `MOTD`, `AWAY` |
|
||||
| Operator | `OPER` (requires `NEOIRC_OPER_NAME` and `NEOIRC_OPER_PASSWORD`) |
|
||||
|
||||
### Protocol Details
|
||||
|
||||
- **Wire format**: CR-LF delimited lines, max 512 bytes per line
|
||||
- **Connection registration**: Clients must send `NICK` and `USER` to register.
|
||||
An optional `PASS` before registration sets the session password (minimum 8
|
||||
characters).
|
||||
- **CAP negotiation**: `CAP LS` and `CAP END` are silently handled for
|
||||
compatibility with modern clients. No capabilities are advertised.
|
||||
- **Channel prefixes**: Channels must start with `#`. If omitted, it's
|
||||
automatically prepended.
|
||||
- **First joiner**: The first user to join a channel is automatically granted
|
||||
operator status (`@`).
|
||||
- **Channel modes**: `+m` (moderated), `+t` (topic lock), `+o` (operator),
|
||||
`+v` (voice)
|
||||
|
||||
### Bridge to HTTP API
|
||||
|
||||
Messages sent by IRC clients appear in channels visible to HTTP/JSON API
|
||||
clients and vice versa. The IRC listener and HTTP API share the same database,
|
||||
broker, and session infrastructure. A user connected via IRC and a user
|
||||
connected via the HTTP API can communicate in the same channels seamlessly.
|
||||
|
||||
### Docker Usage
|
||||
|
||||
To expose the IRC port in Docker (the listener is enabled by default on
|
||||
`:6667`):
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 8080:8080 \
|
||||
-p 6667:6667 \
|
||||
-v neoirc-data:/var/lib/neoirc \
|
||||
neoirc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deployment
|
||||
|
||||
### Docker (Recommended)
|
||||
|
||||
Reference in New Issue
Block a user