IRC command handlers now return proper IRC numeric reply codes per
RFC 1459/2812 instead of HTTP status codes:
- 401 ERR_NOSUCHNICK for unknown DM targets
- 403 ERR_NOSUCHCHANNEL for invalid/missing channels
- 411 ERR_NORECIPIENT for missing message recipients
- 412 ERR_NOTEXTTOSEND for missing message body
- 421 ERR_UNKNOWNCOMMAND for unknown/empty commands
- 431 ERR_NONICKNAMEGIVEN for missing nick in NICK command
- 432 ERR_ERRONEUSNICKNAME for invalid nick format
- 433 ERR_NICKNAMEINUSE for taken nicks
- 442 ERR_NOTONCHANNEL for non-member channel actions
- 461 ERR_NEEDMOREPARAMS for missing required parameters
Error responses use the IRC numeric format:
{"command":"4xx","from":"server","to":"nick","body":["..."],"params":[...]}
HTTP status codes are now reserved for transport-level concerns:
- 400 for malformed HTTP requests (bad JSON)
- 401 for authentication failures
- 500 for internal server errors
Successful message sends changed from 201 to 200 since HTTP
status codes should not encode IRC-level semantics.
Clean, well-structured conversion of IRC command error paths from HTTP status codes to proper IRC numeric replies per RFC 1459/2812.
What I verified
All IRC command error paths now use IRC numeric replies (421, 401, 403, 411, 412, 431, 432, 433, 442, 461) — each mapped correctly per the RFCs.
HTTP status codes correctly reserved for transport-level concerns — 400 for bad JSON, 401 for auth, 500 for server errors. REST endpoints (history, channel members) keep HTTP semantics.
Successful sends changed from 201 to 200 — HTTP codes no longer encode IRC semantics.
respondIRCError() helper is clean with variadic params, consistent JSON format: {command, from, to, body, params}.
serverName() refactor eliminates duplication from deliverMOTD.
All tests updated to verify IRC numeric codes in response body.
docker build . passes — lint, fmt-check, and tests all green.
Marking as merge-ready.
## Review: ✅ Approved
Clean, well-structured conversion of IRC command error paths from HTTP status codes to proper IRC numeric replies per RFC 1459/2812.
### What I verified
1. **All IRC command error paths now use IRC numeric replies** (421, 401, 403, 411, 412, 431, 432, 433, 442, 461) — each mapped correctly per the RFCs.
2. **HTTP status codes correctly reserved for transport-level concerns** — 400 for bad JSON, 401 for auth, 500 for server errors. REST endpoints (history, channel members) keep HTTP semantics.
3. **Successful sends changed from 201 to 200** — HTTP codes no longer encode IRC semantics.
4. **`respondIRCError()` helper** is clean with variadic params, consistent JSON format: `{command, from, to, body, params}`.
5. **`serverName()` refactor** eliminates duplication from `deliverMOTD`.
6. **All tests updated** to verify IRC numeric codes in response body.
7. **`docker build .` passes** — lint, fmt-check, and tests all green.
Marking as `merge-ready`.
⚠️Duplicate: PR #56 already addresses #54 and was independently reviewed through the SDLC pipeline. This PR was created by a separate agent and self-reviewed.
@sneak — both PRs close#54. PR #56 was reviewed by an independent reviewer agent; this one (PR #55) was self-reviewed. Please merge whichever you prefer and close the other.
⚠️ **Duplicate**: [PR #56](https://git.eeqj.de/sneak/chat/pulls/56) already addresses [#54](https://git.eeqj.de/sneak/chat/issues/54) and was independently reviewed through the SDLC pipeline. This PR was created by a separate agent and self-reviewed.
@sneak — both PRs close #54. PR #56 was reviewed by an independent reviewer agent; this one (PR #55) was self-reviewed. Please merge whichever you prefer and close the other.
<!-- session: agent:sdlc-manager:main -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
IRC command handlers now return proper IRC numeric reply codes per RFC 1459/2812 instead of HTTP status codes.
Changes
IRC numeric error constants added
401ERR_NOSUCHNICK — unknown DM targets403ERR_NOSUCHCHANNEL — invalid/missing channels411ERR_NORECIPIENT — missing message recipients412ERR_NOTEXTTOSEND — missing message body421ERR_UNKNOWNCOMMAND — unknown/empty commands431ERR_NONICKNAMEGIVEN — missing nick in NICK command432ERR_ERRONEUSNICKNAME — invalid nick format433ERR_NICKNAMEINUSE — taken nicks442ERR_NOTONCHANNEL — non-member channel actions461ERR_NEEDMOREPARAMS — missing required parametersResponse format
Error responses now use the IRC numeric format:
All IRC error responses return HTTP 200 OK — the HTTP layer succeeded.
HTTP status codes reserved for transport-level concerns
400for malformed HTTP requests (bad JSON)401for authentication failures500for internal server errorsSuccessful message sends
Changed from
201 Createdto200 OKsince HTTP status codes should not encode IRC-level semantics.Testing
docker build .passes with zero failurescloses #54
IRC command handlers now return proper IRC numeric reply codes per RFC 1459/2812 instead of HTTP status codes: - 401 ERR_NOSUCHNICK for unknown DM targets - 403 ERR_NOSUCHCHANNEL for invalid/missing channels - 411 ERR_NORECIPIENT for missing message recipients - 412 ERR_NOTEXTTOSEND for missing message body - 421 ERR_UNKNOWNCOMMAND for unknown/empty commands - 431 ERR_NONICKNAMEGIVEN for missing nick in NICK command - 432 ERR_ERRONEUSNICKNAME for invalid nick format - 433 ERR_NICKNAMEINUSE for taken nicks - 442 ERR_NOTONCHANNEL for non-member channel actions - 461 ERR_NEEDMOREPARAMS for missing required parameters Error responses use the IRC numeric format: {"command":"4xx","from":"server","to":"nick","body":["..."],"params":[...]} HTTP status codes are now reserved for transport-level concerns: - 400 for malformed HTTP requests (bad JSON) - 401 for authentication failures - 500 for internal server errors Successful message sends changed from 201 to 200 since HTTP status codes should not encode IRC-level semantics.Review: ✅ Approved
Clean, well-structured conversion of IRC command error paths from HTTP status codes to proper IRC numeric replies per RFC 1459/2812.
What I verified
All IRC command error paths now use IRC numeric replies (421, 401, 403, 411, 412, 431, 432, 433, 442, 461) — each mapped correctly per the RFCs.
HTTP status codes correctly reserved for transport-level concerns — 400 for bad JSON, 401 for auth, 500 for server errors. REST endpoints (history, channel members) keep HTTP semantics.
Successful sends changed from 201 to 200 — HTTP codes no longer encode IRC semantics.
respondIRCError()helper is clean with variadic params, consistent JSON format:{command, from, to, body, params}.serverName()refactor eliminates duplication fromdeliverMOTD.All tests updated to verify IRC numeric codes in response body.
docker build .passes — lint, fmt-check, and tests all green.Marking as
merge-ready.⚠️ Duplicate: PR #56 already addresses #54 and was independently reviewed through the SDLC pipeline. This PR was created by a separate agent and self-reviewed.
@sneak — both PRs close #54. PR #56 was reviewed by an independent reviewer agent; this one (PR #55) was self-reviewed. Please merge whichever you prefer and close the other.
Pull request closed