1 TS6 protocol description
2 Written by Jilles Tjoelker
4 General format: much like rfc1459
5 Maximum parameters for a command: 15 (this does not include the prefix
8 SID: a server's unique ID. It is configured in each server and consists of
9 a digit and two alphanumerics. Sending SIDs with lowercase letters is
12 UID: a client's unique ID. It consists of the server's SID and six
13 alphanumerics (so it is nine characters long). The first of the alphanumerics
14 should be a letter, numbers are legal but reserved for future use.
16 hunted: a parameter type used for various remote requests. From local users,
17 nicknames and server names are accepted, possibly with wildcards; from servers,
18 UIDs/SIDs (sending names or even wildcards is deprecated). This is done with
19 the function hunt_server(). Any rate limiting should be done locally.
21 duration: a parameter type used for ban durations. It is a duration in seconds.
22 A value of 0 means a permanent ban.
24 propagation: to which other servers the command is sent
26 For all commands with a hunted parameter, the propagation is determined by
27 that, and not otherwise specified.
29 For all commands with a target server mask parameter, the propagation is
30 determined by that, and not otherwise specified. The command is sent to all
31 servers with names matching the given mask (for example '*', '*.example.com',
32 'irc.example.com'). Those servers do not have to be directly connected.
33 Targets cannot be SIDs.
35 Propagation broadcast means the command is sent to all servers.
37 Propagation one-to-one means the command is only sent to the target or the
38 server the target is on.
40 Propagation none means the command is never sent to another server if it is
43 For some other commands, the propagation depends on the parameters and is
46 services server: server mentioned in a service{} block. There are no services
49 service: client with umode +S. This implies that it is on a services server.
52 The initiator sends the PASS, CAPAB and SERVER messages. Upon receiving the
53 SERVER, the listener will check the information, and if it is valid, it will
54 send its own PASS, CAPAB and SERVER messages, followed by SVINFO and the burst.
55 Upon receiving the SERVER, the initiator will send SVINFO and the burst. If
56 ziplinks are used, SVINFO is the first compressed message.
58 The burst consists of SID and SERVER messages for all known servers, BAN
59 messages for all propagated bans, UID or EUID messages for all known users
60 (possibly followed by ENCAP REALHOST, ENCAP LOGIN and/or AWAY) and SJOIN
61 messages for all known channels (possibly followed by BMASK and/or TB).
65 +D (deaf: does not receive channel messages)
66 +S (network service) (only settable on burst from a services server)
67 +a (appears as server administrator)
68 +i (invisible, see rfc1459)
69 +o (IRC operator, see rfc1459)
70 +w (wallops, see rfc1459) (always propagated for historical reasons)
72 +Q/+R/+g/+l/+s/+z (only locally effective)
73 +Z (ssl user) (only settable on burst)
74 possibly more added by modules
83 +e (ban exception) (capab: EX)
84 +I (invite exception) (capab: IE)
86 +k (key: password required to join, <= 23 ascii chars, no : or , or whitespace)
88 +l (limit: maximum number of members before further joins are disallowed)
91 +n (no external messages)
92 +p (private: does not appear in /whois to non-members, no /knock allowed)
93 +r (only registered users may join) (only if a services server exists) (capab: SERVICES)
95 +t (only chanops may change topic)
100 +f (forward: channel name <= 30 chars)
101 +j (join throttle: N:T with integer N and T)
103 +F (free target for +f)
105 +P (permanent: does not disappear when empty)
106 +Q (ignore forwards to this)
108 +g (allow any member to /invite)
109 +z (send messages blocked by +m to chanops)
113 parameters: target, any...
115 The command name should be three decimal ASCII digits.
117 Propagates a "numeric" command reply, such as from a remote WHOIS request.
119 If the first digit is 0 (indicating a reply about the local connection), it
120 should be changed to 1 before propagation or sending to a user.
122 Numerics to the local server may be sent to opers.
124 To avoid infinite loops, servers should not send any replies to numerics.
128 propagation: one-to-one
130 propagation: all servers with -D users on the channel
132 Numerics to channels are broken in some older servers.
138 Remote ADMIN request.
142 propagation: broadcast
143 parameters: opt. away reason
145 If the away reason is empty or not present, mark the user as not away.
146 Otherwise, mark the user as away.
148 Changing away reason from one non-empty string to another non-empty string
149 may not be propagated.
155 propagation: broadcast (restricted)
156 parameters: type, user mask, host mask, creation TS, duration, lifetime, oper, reason
158 Propagates a network wide ban.
160 The type is K for K:lines, R for resvs and X for X:lines; other types are
161 reserved. The user mask field is only used for K:lines; for resvs and X:lines
162 the field is ignored in input and sent as an asterisk.
164 The creation TS indicates when this ban was last modified. An incoming ban MUST
165 be ignored and not propagated if the creation TS is older than the creation TS
166 of the current ban. If the ban is identical, it SHOULD NOT be propagated to
167 avoid unnecessary network traffic. (Two changes to bans that set the TS to the
168 same value may cause desynchronization.)
170 The duration is 0 for an unban and relative to the creation TS for a ban.
171 When the duration has passed, the ban is no longer active but it may still
172 be necessary to remember it.
174 The lifetime is relative to the creation TS and indicates for how long this
175 ban needs to be remembered and propagated. This MUST be at least the duration.
176 Initially, it is usually set the same as the duration but when the ban is
177 modified later, it SHOULD be set such that the modified ban is remembered at
178 least as long as the original ban. This ensures that the original ban does not
179 revive via split servers. This requirement is only a SHOULD to allow for
180 implementations that only inject bans and do not remember any; implementations
181 that remember and propagate bans MUST set the lifetime appropriately.
183 The oper field indicates the oper that originally set the ban. If this message
184 is the initial propagation of a change, it SHOULD be sent as * (an asterisk).
186 The reason field indicates the reason for the ban. Any part after a | (vertical
187 bar) MUST NOT be shown to normal users. The rest of the field and the creation
188 TS and duration MAY be shown to normal users.
192 propagation: broadcast
193 parameters: channelTS, channel, type, space separated masks
195 If the channelTS in the message is greater (newer) than the current TS of
196 the channel, drop the message and do not propagate it.
198 Type is the mode letter of a ban-like mode. In efnet TS6 this is 'b', 'e' or
199 'I'. In charybdis TS6 additionally 'q' is possible.
201 Add all the masks to the given list of the channel.
203 All ban-like modes must be bursted using this command, not using MODE or TMODE.
206 source: unregistered server
208 parameters: space separated capability list
210 Sends capabilities of the server. This must include QS and ENCAP. It is also
211 strongly recommended to include EX, CHW, IE and KNOCK, and for charybdis TS6
212 also SAVE and EUID. For use with services, SERVICES and RSFNC are strongly
215 The capabilities may depend on the configuration for the server they are sent
221 propagation: broadcast
222 parameters: client, new hostname
224 Changes the visible hostname of a client.
226 Opers are notified unless the source is a server or a service.
230 parameters: server to connect to, port, hunted
232 Remote connect request. A server WALLOPS should be sent by the receiving
235 The port can be 0 for the default port.
241 parameters: duration, mask, reason
243 Sets a D:line (IP ban checked directly after accepting connection).
245 The mask must be an IP address or CIDR mask.
249 parameters: target server mask, subcommand, opt. parameters...
251 Sends a command to matching servers. Propagation is independent of
252 understanding the subcommand.
254 Subcommands are listed elsewhere with "encap only".
257 source: server or unregistered server
259 parameters: error message
261 Reports a (usually fatal) error with the connection.
263 Error messages may contain IP addresses and have a negative effect on server
268 encap target: single server
272 Remote ETRACE information request.
278 parameters: nickname, hopcount, nickTS, umodes, username, visible hostname, IP address, UID, real hostname, account name, gecos
279 propagation: broadcast
281 Introduces a client. The client is on the source server of this command.
283 The account name is '0' if the user is not logged in with services.
287 EUID is similar to UID but includes the ENCAP REALHOST and ENCAP LOGIN
294 parameters: space separated capability list
296 Capability list of remote server.
302 parameters: user mask, host mask, reason
303 propagation: broadcast
305 Propagates a G:line vote. Once votes from three different opers (based on
306 user@host mask) on three different servers have arrived, trigger the G:line.
307 Pending G:lines expire after some time, usually ten minutes. Triggered G:lines
308 expire after a configured time which may differ across servers.
310 Requests from server connections must be propagated, unless they are found to
311 be syntactically invalid (e.g. '!' in user mask). Therefore, disabling glines
312 must not affect propagation, and too wide glines, double votes and glines that
313 already exist locally must still be propagated.
315 Of course, servers are free to reject gline requests from their own operators.
322 parameters: user mask, host mask, reason
323 propagation: broadcast
325 Propagates a G:line removal vote. Once three votes have arrived (as with
326 G:lines), remove the G:line. Pending G:lines removals expire after some time,
329 Pending G:line removals do not interact with pending G:lines. Triggering a
330 G:line does not affect a pending G:line removal. Triggering a G:line removal
331 does not affect a pending G:line.
341 parameters: target user, channel, opt. channelTS
342 propagation: one-to-one
344 Invites a user to a channel.
346 If the channelTS is greater (newer) than the current TS of the channel, drop
349 Not sending the channelTS parameter is deprecated.
354 parameters: '0' (one ASCII zero)
355 propagation: broadcast
357 Parts the source user from all channels.
361 parameters: channelTS, channel, '+' (a plus sign)
362 propagation: broadcast
364 Joins the source user to the given channel. If the channel does not exist yet,
365 it is created with the given channelTS and no modes. If the channel already
366 exists and has a greater (newer) TS, wipe all simple modes and statuses and
367 change the TS, notifying local users of this but not servers (note that
368 ban-like modes remain intact; invites may or may not be cleared).
370 A JOIN is propagated with the new TS of the channel.
374 parameters: channel, target user, opt. reason
375 propagation: broadcast
377 Kicks the target user from the given channel.
379 Unless the channel's TS is 0, no check is done whether the source user has ops.
381 Not sending the reason parameter is questionable.
385 parameters: target user, path
386 propagation: broadcast
388 Removes the user from the network.
390 The format of the path parameter is some sort of description of the source of
391 the kill followed by a space and a parenthesized reason. To avoid overflow,
392 it is recommended not to add anything to the path.
398 parameters: duration, user mask, host mask, reason
400 Sets a K:line (ban on user@host).
405 parameters: target server mask, duration, user mask, host mask, reason
407 As form 1, deprecated.
413 propagation: broadcast
415 Requests an invite to a channel that is locked somehow (+ikl). Notifies all
416 operators of the channel. (In charybdis, on +g channels all members are
419 This is broadcast so that each server can store when KNOCK was used last on
424 parameters: hunted, server mask
426 Remote LINKS request. The server mask limits which servers are listed.
434 Sends a message to operators (with umode +l set). This is intended to be
435 used for strict subsets of the network.
440 parameters: target server mask, text
442 As form 1, deprecated.
447 parameters: account name
449 In a burst, states that the source user is logged in as the account.
453 parameters: server mask, hunted
455 Remote LUSERS request. Most servers ignore the server mask, treating it as '*'.
459 source: services server
460 parameters: channelTS, channel, cmode changes, opt. cmode parameters...
461 propagation: broadcast (restricted)
463 Propagates a channel mode lock change.
465 If the channelTS is greater (newer) than the current TS of the channel, drop
468 On input, only the limit on parameters per line restricts how many cmode
469 parameters can be present. Apart from this, arbitrary modes shall be
470 processed. Redundant modes may be dropped. For example, +n-n may be applied and
471 propagated as +n-n, -n or (if the channel was already -n) nothing, but not as
474 The parameter for mode -k (removing a key) shall be ignored.
476 An MLOCK message with no modes disables the MLOCK, therefore the MLOCK message
477 always contains the literal MLOCK for simplicity.
482 parameters: client, umode changes
483 propagation: broadcast
485 Propagates a user mode change. The client parameter must refer to the same user
488 Not all umodes are propagated to other servers.
492 parameters: channel, cmode changes, opt. cmode parameters...
494 Propagates a channel mode change.
496 This is deprecated because the channelTS is not included. If it is received,
497 it should be propagated as TMODE.
508 parameters: new nickname, new nickTS
509 propagation: broadcast
511 Propagates a nick change.
515 parameters: nickname, hopcount, nickTS, umodes, username, hostname, server, gecos
517 Historic TS5 user introduction. The user is on the server indicated by the
518 server parameter; the source server is meaningless (local link).
524 source: services server
525 parameters: duration, nickname
527 If duration is greater than 0, makes the given nickname unavailable for that
530 If duration is 0, removes a nick delay entry for the given nickname.
532 There may or may not be a client with the given nickname; this does not affect
537 parameters: msgtarget, message
539 As PRIVMSG, except NOTICE messages are sent out, server sources are permitted
540 and most error messages are suppressed.
542 Servers may not send '$$', '$#' and opers@server notices. Older servers may
543 not allow servers to send to specific statuses on a channel.
549 parameters: command name, parameters
551 Reports operspy usage.
556 propagation: broadcast
558 Sends a message to operators (with umode +z set).
562 parameters: comma separated channel list, message
564 Parts the source user from the given channels.
567 source: unregistered server
568 parameters: password, 'TS', TS version, SID
570 Sends the server link password, TS version and SID.
574 parameters: origin, opt. destination server
576 Sends a PING to the destination server, which will reply with a PONG. If the
577 destination server parameter is not present, the server receiving the message
580 The origin field is not used in the server protocol. It is sent as the name
581 (not UID/SID) of the source.
583 Remote PINGs are used for end-of-burst detection, therefore all servers must
588 parameters: origin, destination
590 Routes a PONG back to the destination that originally sent the PING.
594 parameters: msgtarget, message
596 Sends a normal message (PRIVMSG) to the given target.
600 propagation: one-to-one
602 propagation: all servers with -D users on the channel
603 (cmode +m/+n should be checked everywhere, bans should not be checked
605 - a status character ('@'/'+') followed by a channel name, to send to users
606 with that status or higher only.
608 propagation: all servers with -D users with appropriate status
609 - '=' followed by a channel name, to send to chanops only, for cmode +z.
610 capab: CHW and EOPMOD
611 propagation: all servers with -D chanops
612 - a user@server message, to send to users on a specific server. The exact
613 meaning of the part before the '@' is not prescribed, except that "opers"
614 allows IRC operators to send to all IRC operators on the server in an
616 propagation: one-to-one
617 - a message to all users on server names matching a mask ('$$' followed by mask)
618 propagation: broadcast
619 Only allowed to IRC operators.
620 - a message to all users with hostnames matching a mask ('$#' followed by mask).
621 Note that this is often implemented poorly.
622 propagation: broadcast
623 Only allowed to IRC operators.
625 In charybdis TS6, services may send to any channel and to statuses on any
631 encap target: single server
635 Remote PRIVS information request.
641 Propagates quitting of a client. No QUIT should be sent for a client that
642 has been removed as result of a KILL message.
649 parameters: real hostname
651 In a burst, propagates the real host of a dynamically-spoofed user.
657 parameters: opt. rehash type
659 Remote REHASH request. If the rehash type is omitted, it is equivalent to
660 a regular /rehash, otherwise it is equivalent to /rehash <rehash type>.
666 parameters: duration, mask, reason
668 Sets a RESV, making a nickname mask or exact channel unavailable.
673 parameters: target server mask, duration, mask, reason
675 As form 1, deprecated.
680 encap target: single server
681 source: services server
682 parameters: target user, new nickname, old nickTS, new nickTS
684 Forces a nickname change and propagates it.
686 The command is ignored if the nick TS of the user is not equal to the old
687 nickTS parameter. If the new nickname already exists (and is not the target
688 user), it is killed first.
696 parameters: source uid, '*', 'S', sasl mechanism name
698 Requests that a SASL agent (a service) initiate the authentication process.
699 The source uid is that of an unregistered client. This is why it is not sent
703 encap target: single server
705 parameters: source uid, target uid, mode, data
707 Part of a SASL authentication exchange. The mode is 'C' to send some data
708 (base64 encoded), or 'S' to end the exchange (data indicates type of
709 termination: 'A' for abort, 'F' for authentication failure, 'S' for
710 authentication success).
715 propagation: broadcast
716 parameters: target uid, TS
718 Resolve a nick collision by changing a nickname to the UID.
720 The server should verify that the UID belongs to a registered user, the user
721 does not already have their UID as their nick and the TS matches the user's
722 nickTS. If not, drop the message.
724 SAVE should be propagated as a regular NICK change to links without SAVE capab.
729 source: unregistered server
730 parameters: server name, hopcount, server description
732 Registers the connection as a server. PASS and CAPAB must have been sent
733 before, SVINFO should be sent afterwards.
735 If there is no such server configured or authentication failed, the connection
738 This is propagated as a SID message.
742 propagation: broadcast
743 parameters: server name, hopcount, server description
745 Introduces a new TS5 server, directly connected to the source of this command.
746 This is only used for jupes as TS5 servers may do little else than existing.
750 propagation: broadcast
751 parameters: server name, hopcount, sid, server description
753 Introduces a new server, directly connected to the source of this command.
757 propagation: broadcast
758 parameters: new nickname, new username, new visible hostname, new nickTS, new login name
760 Broadcasts a change of several user parameters at once.
762 Currently only sent after an SVSLOGIN.
766 propagation: broadcast
767 parameters: channelTS, simple modes, opt. mode parameters..., nicklist
769 Broadcasts a channel creation or bursts a channel.
771 The nicklist consists of users joining the channel, with status prefixes for
772 their status ('@+', '@', '+' or ''), for example:
773 '@+1JJAAAAAB +2JJAAAA4C 1JJAAAADS'. All users must be behind the source server
774 so it is not possible to use this message to force users to join a channel.
776 The interpretation depends on the channelTS and the current TS of the channel.
777 If either is 0, set the channel's TS to 0 and accept all modes. Otherwise, if
778 the incoming channelTS is greater (newer), ignore the incoming simple modes
779 and statuses and join and propagate just the users. If the incoming channelTS
780 is lower (older), wipe all modes and change the TS, notifying local users of
781 this but not servers (invites may be cleared). In the latter case, kick on
782 split riding may happen: if the key (+k) differs or the incoming simple modes
783 include +i, kick all local users, sending KICK messages to servers.
785 An SJOIN is propagated with the new TS and modes of the channel. The statuses
786 are propagated if and only if they were accepted.
788 SJOIN must be used to propagate channel creation and in netbursts. For regular
789 users joining channels, JOIN must be used. Pseudoservers may use SJOIN to join
796 parameters: snomask letter, text
798 Sends the text as a server notice from the source server to opers with the
802 parameters: target server, comment
804 Removes the target server and all servers and users behind it from the network.
806 If the target server is the receiving server or the local link this came from,
807 this is an announcement that the link is being closed.
809 Otherwise, if the target server is locally connected, the server should send
810 a WALLOPS announcing the SQUIT.
814 parameters: stats letter, hunted
816 Remote STATS request. Privileges are checked on the server executing the
822 source: services server
823 parameters: target user, new login name (optional)
825 If the new login name is not present or empty, mark the target user as not
826 logged in, otherwise mark the target user as logged in as the given account.
831 parameters: current TS version, minimum TS version, '0', current time
833 Verifies TS protocol compatibility and clock. If anything is not in order,
836 The current TS version is the highest version supported by the source server
837 and the minimum TS version is the lowest version supported.
839 The current time is sent as a TS in the usual way.
844 encap target: single server
845 source: services server
846 parameters: target, new nick, new username, new visible hostname, new login name
848 Sent after successful SASL authentication.
850 The target is a UID, typically an unregistered one.
852 Any of the "new" parameters can be '*' to leave the corresponding field
853 unchanged. The new login name can be '0' to log the user out.
855 If the UID is registered on the network, a SIGNON with the changes will be
856 broadcast, otherwise the changes will be stored, to be used when registration
862 propagation: broadcast
863 parameters: channel, topicTS, opt. topic setter, topic
865 Propagates a channel topic as part of a burst.
867 If the channel had no topic yet or the topicTS in the message is older than
868 the topicTS of the current topic on the channel and the topics differ, set
869 the topic with topicTS and topic setter, and propagate the message. Otherwise
870 ignore the message and do not propagate it.
872 If the topic setter is not present, use a server name instead.
882 parameters: channelTS, channel, cmode changes, opt. cmode parameters...
884 Propagates a channel mode change.
886 If the channelTS is greater (newer) than the current TS of the channel, drop
889 On input, only the limit on parameters per line restricts how many cmode
890 parameters can be present. Apart from this, arbitrary modes shall be
891 processed. Redundant modes may be dropped. For example, +n-n may be applied and
892 propagated as +n-n, -n or (if the channel was already -n) nothing, but not as
895 The parameter for mode -k (removing a key) shall be ignored.
897 On output, at most ten cmode parameters should be sent; if there are more,
898 multiple TMODE messages should be sent.
902 propagation: broadcast
903 parameters: channel, topic
905 Propagates a channel topic change. The server may verify that the source has
908 The topicTS shall be set to the current time and the topic setter shall be
909 set indicating the source user. Note that this means that the topicTS of a
910 topic set with TOPIC is not necessarily consistent across the network.
917 Performs a trace to the target, sending 200 numerics from each server passing
918 the message on. The target server sends a description of the target followed
921 TRACE, STATS l and STATS L are the only commands using hunt_server that use the
922 hunted parameter for more than just determining which server the command
923 should be executed on.
926 parameters: target name, hunted
928 Executes a trace command on the target server. No 200 numerics are sent.
929 The target name is a name, not a UID, and should be on the target server.
933 propagation: broadcast
934 parameters: nickname, hopcount, nickTS, umodes, username, visible hostname, IP address, UID, gecos
935 propagation: broadcast
937 Introduces a client. The client is on the source server of this command.
947 Removes a D:line (IP ban checked directly after accepting connection).
949 The mask must be an IP address or CIDR mask.
955 parameters: user mask, host mask
957 Removes a K:line (ban on user@host).
962 parameters: target server mask, user mask, host mask
964 As form 1, deprecated.
977 parameters: target server mask, mask
979 As form 1, deprecated.
987 Removes an X:line (ban on realname).
992 parameters: target server mask, mask
994 As form 1, deprecated.
1000 Remote USERS request.
1006 Remote VERSION request.
1012 propagation: broadcast
1014 In efnet TS6, sends a message to operators (with umode +z set). This is a
1015 deprecated equivalent to OPERWALL.
1017 In charybdis TS6, sends a message to local users with umode +w set (or possibly
1018 another indication that WALLOPS messages should be sent), including non-opers.
1023 propagation: broadcast
1025 Sends a message to local users with umode +w set (or possibly another
1026 indication that WALLOPS messages should be sent).
1028 In efnet TS6 this may include non-opers, in charybdis TS6 this may only be
1033 parameters: hunted, target nick
1035 Remote WHOIS request.
1041 parameters: duration, mask, reason
1043 Sets an X:line (ban on realname).
1048 parameters: target server mask, duration, mask, reason
1050 As form 1, deprecated.
1052 Local only commands (charybdis 3.1):