Commit Graph

2 Commits

Author SHA1 Message Date
user
d81ea2b61a add comprehensive IRC integration test with two clients
All checks were successful
check / check (push) Successful in 57s
Adds integration_test.go with four test functions that exercise
all major IRC features using real TCP connections:

TestIntegrationTwoClients: sequential two-client test covering
NICK/USER registration, JOIN, PRIVMSG (channel + DM), NOTICE
(channel + DM), TOPIC (set/get/lock/unlock), MODE (query, +m,
+v, -t/+t), NAMES, LIST, WHO, WHOIS (with channels), LUSERS,
NICK change (with relay), duplicate NICK, KICK (with relay +
reason), KICK non-op error, PING/PONG, unknown command, MOTD,
AWAY (set/clear/RPL_AWAY on DM), PASS post-registration, PART
(with reason + relay), PART non-existent channel, user MODE
query, multi-channel messaging, and QUIT (with relay).

TestIntegrationModeSecret: verifies +s mode can be set and
is reflected in MODE queries.

TestIntegrationModeModerated: verifies +m blocks non-voiced
users and +v enables sending in moderated channels.

TestIntegrationThirdClientObserver: verifies three-client
channel message fanout.

closes #97
2026-03-31 20:08:40 -07:00
0250f14fea feat: add traditional IRC wire protocol listener (closes #89) (#94)
All checks were successful
check / check (push) Successful in 5s
## Summary

Adds a backward-compatible IRC wire protocol listener (RFC 1459/2812) that allows standard IRC clients (irssi, weechat, hexchat, etc.) to connect directly via TCP.

## Changes

### New package: `internal/ircserver/`

- **`parser.go`** — IRC wire protocol message parser and formatter
- **`server.go`** — TCP listener with Fx lifecycle integration
- **`conn.go`** — Per-connection handler with registration flow, PING/PONG, welcome burst
- **`commands.go`** — All IRC command handlers (JOIN, PART, PRIVMSG, MODE, TOPIC, KICK, WHOIS, etc.)
- **`relay.go`** — Message relay goroutine that delivers queued messages to IRC clients in wire format

### Modified files

- **`internal/config/config.go`** — Added `IRC_LISTEN_ADDR` environment variable
- **`internal/handlers/handlers.go`** — Broker is now injected via Fx (shared with IRC server)
- **`cmd/neoircd/main.go`** — Registered `broker.New`, `ircserver.New` as Fx providers
- **`pkg/irc/commands.go`** — Added `CmdUser` and `CmdInvite` constants
- **`README.md`** — Added IRC Protocol Listener documentation section

### Tests

- Parser unit tests (table-driven, round-trip verification)
- Integration tests: registration, PING/PONG, JOIN, PART, PRIVMSG (channel + DM), NICK change, duplicate nick rejection, LIST, WHOIS, QUIT, TOPIC, MODE, WHO, LUSERS, MOTD, AWAY, PASS, CAP negotiation, unknown commands, pre-registration errors
- Benchmarks for parser and formatter

## Key Design Decisions

- **Optional**: Listener is only started when `IRC_LISTEN_ADDR` is set
- **Shared infrastructure**: Same DB, broker, and session system as HTTP API
- **Full bridge**: IRC ↔ HTTP messages are interoperable
- **No schema changes**: Reuses existing tables
- **Broker as Fx dependency**: Extracted from handlers to be shared

## Supported 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, USERHOST
Operator: OPER

closes #89

Co-authored-by: user <user@Mac.lan guest wan>
Co-authored-by: Jeffrey Paul <sneak@noreply.example.org>
Reviewed-on: sneak/chat#94
Co-authored-by: clawbot <sneak+clawbot@sneak.cloud>
Co-committed-by: clawbot <sneak+clawbot@sneak.cloud>
2026-04-01 05:00:04 +02:00