Replace c2s/s2c/s2s taxonomy with IRC-native structure: - schema/commands/ — IRC command schemas (PRIVMSG, NOTICE, JOIN, PART, QUIT, NICK, TOPIC, MODE, KICK, PING, PONG) - schema/numerics/ — IRC numeric reply codes (001-004, 322-323, 332, 353, 366, 372-376, 401, 403, 433, 442, 482) - schema/message.json — base envelope mapping IRC wire format to JSON Messages use 'command' field with IRC command names or 3-digit numeric codes. 'body' is a string (IRC trailing parameter), not object/array. 'from'/'to' map to IRC prefix and first parameter. Federation uses the same IRC commands (no custom RELAY/LINK/SYNC). Update README message format, command tables, and examples to match.
88 lines
4.8 KiB
Markdown
88 lines
4.8 KiB
Markdown
# Message Schemas
|
||
|
||
JSON Schema definitions (draft 2020-12) for the chat protocol. Messages use
|
||
**IRC command names and numeric reply codes** (RFC 1459/2812) encoded as JSON
|
||
over HTTP.
|
||
|
||
## Envelope
|
||
|
||
Every message is a JSON object with a `command` field. The format maps directly
|
||
to IRC wire format:
|
||
|
||
```
|
||
IRC: :nick PRIVMSG #channel :hello world
|
||
JSON: {"command": "PRIVMSG", "from": "nick", "to": "#channel", "body": "hello world"}
|
||
|
||
IRC: :server 353 nick = #channel :user1 @op1 +voice1
|
||
JSON: {"command": "353", "to": "nick", "params": ["=", "#channel"], "body": "user1 @op1 +voice1"}
|
||
```
|
||
|
||
Common fields (see `message.json` for full schema):
|
||
|
||
| Field | Type | Description |
|
||
|-----------|----------|-------------------------------------------------------|
|
||
| `id` | integer | Server-assigned ID (monotonically increasing) |
|
||
| `command` | string | IRC command or 3-digit numeric code |
|
||
| `from` | string | Source nick or server name (IRC prefix) |
|
||
| `to` | string | Target: #channel or nick |
|
||
| `params` | string[] | Middle parameters (mainly for numerics) |
|
||
| `body` | string | Trailing parameter (message text) |
|
||
| `ts` | string | ISO 8601 timestamp (server-assigned, not in raw IRC) |
|
||
| `meta` | object | Extensible metadata (not in raw IRC) |
|
||
|
||
## Commands
|
||
|
||
IRC commands used for client↔server and server↔server communication.
|
||
|
||
| Command | File | RFC | Description |
|
||
|-----------|---------------------------|-----------|--------------------------------|
|
||
| `PRIVMSG` | `commands/PRIVMSG.json` | 1459 §4.4.1 | Message to channel or user |
|
||
| `NOTICE` | `commands/NOTICE.json` | 1459 §4.4.2 | Notice (no auto-reply) |
|
||
| `JOIN` | `commands/JOIN.json` | 1459 §4.2.1 | Join a channel |
|
||
| `PART` | `commands/PART.json` | 1459 §4.2.2 | Leave a channel |
|
||
| `QUIT` | `commands/QUIT.json` | 1459 §4.1.6 | User disconnected |
|
||
| `NICK` | `commands/NICK.json` | 1459 §4.1.2 | Change nickname |
|
||
| `TOPIC` | `commands/TOPIC.json` | 1459 §4.2.4 | Get/set channel topic |
|
||
| `MODE` | `commands/MODE.json` | 1459 §4.2.3 | Set channel/user modes |
|
||
| `KICK` | `commands/KICK.json` | 1459 §4.2.8 | Kick user from channel |
|
||
| `PING` | `commands/PING.json` | 1459 §4.6.2 | Keepalive |
|
||
| `PONG` | `commands/PONG.json` | 1459 §4.6.3 | Keepalive response |
|
||
|
||
## Numeric Replies
|
||
|
||
Three-digit codes for server responses, per IRC convention.
|
||
|
||
### Success / Informational (0xx–3xx)
|
||
|
||
| Code | Name | File | Description |
|
||
|-------|-------------------|-----------------------|--------------------------------|
|
||
| `001` | RPL_WELCOME | `numerics/001.json` | Welcome after session creation |
|
||
| `002` | RPL_YOURHOST | `numerics/002.json` | Server host info |
|
||
| `003` | RPL_CREATED | `numerics/003.json` | Server creation date |
|
||
| `004` | RPL_MYINFO | `numerics/004.json` | Server info and modes |
|
||
| `322` | RPL_LIST | `numerics/322.json` | Channel list entry |
|
||
| `323` | RPL_LISTEND | `numerics/323.json` | End of channel list |
|
||
| `332` | RPL_TOPIC | `numerics/332.json` | Channel topic |
|
||
| `353` | RPL_NAMREPLY | `numerics/353.json` | Channel member list |
|
||
| `366` | RPL_ENDOFNAMES | `numerics/366.json` | End of NAMES list |
|
||
| `372` | RPL_MOTD | `numerics/372.json` | MOTD line |
|
||
| `375` | RPL_MOTDSTART | `numerics/375.json` | Start of MOTD |
|
||
| `376` | RPL_ENDOFMOTD | `numerics/376.json` | End of MOTD |
|
||
|
||
### Errors (4xx)
|
||
|
||
| Code | Name | File | Description |
|
||
|-------|----------------------|-----------------------|--------------------------------|
|
||
| `401` | ERR_NOSUCHNICK | `numerics/401.json` | No such nick/channel |
|
||
| `403` | ERR_NOSUCHCHANNEL | `numerics/403.json` | No such channel |
|
||
| `433` | ERR_NICKNAMEINUSE | `numerics/433.json` | Nickname already in use |
|
||
| `442` | ERR_NOTONCHANNEL | `numerics/442.json` | Not on that channel |
|
||
| `482` | ERR_CHANOPRIVSNEEDED | `numerics/482.json` | Not channel operator |
|
||
|
||
## Federation (S2S)
|
||
|
||
Server-to-server messages use the same command format. Federated servers relay
|
||
messages with an additional `origin` field in `meta` to track the source server.
|
||
The PING/PONG commands serve as inter-server keepalives. State sync after link
|
||
establishment uses a burst of JOIN, NICK, TOPIC, and MODE commands.
|