From 2f67651003e48fe731b89ad5e4b2379b8dc4270c Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 15:34:40 +1000 Subject: [PATCH 01/10] Move away from github-pages to let us use custom plugins --- .gitignore | 6 +- Gemfile | 10 +- Gemfile.lock | 257 +++++++++++++++------------------------------------ _config.yml | 5 +- 4 files changed, 89 insertions(+), 189 deletions(-) diff --git a/.gitignore b/.gitignore index 80785ac..6db8b30 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,8 @@ $RECYCLE.BIN/ .LSOverride # Icon must end with two \r -Icon +Icon + # Thumbnails ._* @@ -63,4 +64,5 @@ Temporary Items _site/ .sass-cache/ .jekyll-metadata - +.jekyll-cache +.vscode diff --git a/Gemfile b/Gemfile index 3515512..bd9e827 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,11 @@ source "https://rubygems.org" -gem 'github-pages', '115', group: :jekyll_plugins +gem 'jekyll', '~> 4.2' + +gem "jekyll-sitemap", "~> 1.4" + +gem "jekyll-redirect-from", "~> 0.16.0" +gem "jekyll-sass-converter", "~> 2.1" +gem "jekyll-commonmark-ghpages", "~> 0.1.6" + +gem "webrick", "~> 1.7" diff --git a/Gemfile.lock b/Gemfile.lock index 67e7b8c..811d2a4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,201 +1,88 @@ GEM remote: https://rubygems.org/ specs: - activesupport (4.2.7) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.0) - public_suffix (~> 2.0, >= 2.0.2) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) - ethon (0.10.1) - ffi (>= 1.3.0) - execjs (2.7.0) - faraday (0.11.0) - multipart-post (>= 1.2, < 3) - ffi (1.15.3) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.1.9) + em-websocket (0.5.2) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7-x64-mingw32) + ffi (1.15.3-x64-mingw32) forwardable-extended (2.6.0) - gemoji (2.1.0) - github-pages (115) - activesupport (= 4.2.7) - github-pages-health-check (= 1.3.0) - jekyll (= 3.3.1) - jekyll-avatar (= 0.4.2) - jekyll-coffeescript (= 1.0.1) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.8.0) - jekyll-gist (= 1.4.0) - jekyll-github-metadata (= 2.3.0) - jekyll-mentions (= 1.2.0) - jekyll-optional-front-matter (= 0.1.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.0.3) - jekyll-redirect-from (= 0.11.0) - jekyll-relative-links (= 0.2.1) - jekyll-sass-converter (= 1.3.0) - jekyll-seo-tag (= 2.1.0) - jekyll-sitemap (= 0.12.0) - jekyll-swiss (= 0.4.0) - jekyll-theme-architect (= 0.0.3) - jekyll-theme-cayman (= 0.0.3) - jekyll-theme-dinky (= 0.0.3) - jekyll-theme-hacker (= 0.0.3) - jekyll-theme-leap-day (= 0.0.3) - jekyll-theme-merlot (= 0.0.3) - jekyll-theme-midnight (= 0.0.3) - jekyll-theme-minimal (= 0.0.3) - jekyll-theme-modernist (= 0.0.3) - jekyll-theme-primer (= 0.1.7) - jekyll-theme-slate (= 0.0.3) - jekyll-theme-tactile (= 0.0.3) - jekyll-theme-time-machine (= 0.0.3) - jekyll-titles-from-headings (= 0.1.4) - jemoji (= 0.7.0) - kramdown (= 1.11.1) - liquid (= 3.0.6) - listen (= 3.0.6) - mercenary (~> 0.3) - minima (= 2.0.0) - nokogiri (= 1.6.8.1) - rouge (= 1.11.1) - terminal-table (~> 1.4) - github-pages-health-check (1.3.0) - addressable (~> 2.3) - net-dns (~> 0.8) - octokit (~> 4.0) - public_suffix (~> 2.0) - typhoeus (~> 0.7) - html-pipeline (2.5.0) - activesupport (>= 2) - nokogiri (>= 1.4) - i18n (0.7.0) - jekyll (3.3.1) + http_parser.rb (0.6.0) + i18n (1.8.10) + concurrent-ruby (~> 1.0) + jekyll (4.2.0) addressable (~> 2.4) colorator (~> 1.0) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 1.1) - kramdown (~> 1.3) - liquid (~> 3.0) - mercenary (~> 0.3.3) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (~> 2.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.4.0) pathutil (~> 0.9) - rouge (~> 1.7) + rouge (~> 3.0) safe_yaml (~> 1.0) - jekyll-avatar (0.4.2) - jekyll (~> 3.0) - jekyll-coffeescript (1.0.1) - coffee-script (~> 2.2) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.8.0) - jekyll (~> 3.3) - jekyll-gist (1.4.0) - octokit (~> 4.2) - jekyll-github-metadata (2.3.0) - jekyll (~> 3.1) - octokit (~> 4.0, != 4.4.0) - jekyll-mentions (1.2.0) - activesupport (~> 4.0) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.1.2) - jekyll (~> 3.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.0.3) - jekyll (~> 3.0) - jekyll-redirect-from (0.11.0) - jekyll (>= 2.0) - jekyll-relative-links (0.2.1) - jekyll (~> 3.3) - jekyll-sass-converter (1.3.0) - sass (~> 3.2) - jekyll-seo-tag (2.1.0) - jekyll (~> 3.3) - jekyll-sitemap (0.12.0) - jekyll (~> 3.3) - jekyll-swiss (0.4.0) - jekyll-theme-architect (0.0.3) - jekyll (~> 3.3) - jekyll-theme-cayman (0.0.3) - jekyll (~> 3.3) - jekyll-theme-dinky (0.0.3) - jekyll (~> 3.3) - jekyll-theme-hacker (0.0.3) - jekyll (~> 3.3) - jekyll-theme-leap-day (0.0.3) - jekyll (~> 3.3) - jekyll-theme-merlot (0.0.3) - jekyll (~> 3.3) - jekyll-theme-midnight (0.0.3) - jekyll (~> 3.3) - jekyll-theme-minimal (0.0.3) - jekyll (~> 3.3) - jekyll-theme-modernist (0.0.3) - jekyll (~> 3.3) - jekyll-theme-primer (0.1.7) - jekyll (~> 3.3) - jekyll-theme-slate (0.0.3) - jekyll (~> 3.3) - jekyll-theme-tactile (0.0.3) - jekyll (~> 3.3) - jekyll-theme-time-machine (0.0.3) - jekyll (~> 3.3) - jekyll-titles-from-headings (0.1.4) - jekyll (~> 3.3) - jekyll-watch (1.5.0) - listen (~> 3.0, < 3.1) - jemoji (0.7.0) - activesupport (~> 4.0) - gemoji (~> 2.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0) - json (1.8.6) - kramdown (1.11.1) - liquid (3.0.6) - listen (3.0.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9.7) - mercenary (0.3.6) - mini_portile2 (2.1.0) - minima (2.0.0) - minitest (5.10.1) - multipart-post (2.0.0) - net-dns (0.8.0) - nokogiri (1.6.8.1) - mini_portile2 (~> 2.1.0) - octokit (4.6.2) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.14.0) + terminal-table (~> 2.0) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.6) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1.2) + rouge (>= 2.0, < 4.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-sass-converter (2.1.0) + sassc (> 2.0.1, < 3.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.7.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (2.0.5) - rb-fsevent (0.9.8) - rb-inotify (0.9.7) - ffi (>= 0.5.0) - rouge (1.11.1) - safe_yaml (1.0.4) - sass (3.4.23) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) - terminal-table (1.7.3) - unicode-display_width (~> 1.1.1) - thread_safe (0.3.5) - typhoeus (0.8.0) - ethon (>= 0.8.0) - tzinfo (1.2.2) - thread_safe (~> 0.1) - unicode-display_width (1.1.3) + public_suffix (4.0.6) + rb-fsevent (0.11.0) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.26.0) + ruby-enum (0.9.0) + i18n + safe_yaml (1.0.5) + sassc (2.4.0-x64-mingw32) + ffi (~> 1.9) + terminal-table (2.0.0) + unicode-display_width (~> 1.1, >= 1.1.1) + unicode-display_width (1.7.0) + webrick (1.7.0) PLATFORMS - ruby + x64-mingw32 DEPENDENCIES - github-pages (= 115) + jekyll (~> 4.2) + jekyll-commonmark-ghpages (~> 0.1.6) + jekyll-redirect-from (~> 0.16.0) + jekyll-sass-converter (~> 2.1) + jekyll-sitemap (~> 1.4) + webrick (~> 1.7) BUNDLED WITH - 1.13.7 + 2.2.26 diff --git a/_config.yml b/_config.yml index f7875a1..96cb4aa 100644 --- a/_config.yml +++ b/_config.yml @@ -3,5 +3,8 @@ exclude: - CNAME - Gemfile - Gemfile.lock -gems: +plugins: - jekyll-sitemap + - jekyll-redirect-from + - jekyll-sass-converter + - jekyll-commonmark-ghpages From 57afce7ae4aa0a4644cfad83680dc5211203baaa Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 15:35:14 +1000 Subject: [PATCH 02/10] initial easy-ids plugin --- _includes/modern-appendix.md | 4 ++-- _plugins/easy-ids.rb | 42 ++++++++++++++++++++++++++++++++++++ index.md | 6 +++--- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 _plugins/easy-ids.rb diff --git a/_includes/modern-appendix.md b/_includes/modern-appendix.md index fee9001..947bef1 100644 --- a/_includes/modern-appendix.md +++ b/_includes/modern-appendix.md @@ -266,7 +266,7 @@ The server MAY negate parameters which have not been previously advertised; in t A single `RPL_ISUPPORT` reply MUST NOT contain the same parameter multiple times nor advertise and negate the same parameter. However, the server is free to advertise or negate the same parameter in separate replies. -See the [Feature Advertisement](#feature-advertisement) section for more details on this numeric. A list of parameters is available in the [`RPL_ISUPPORT` Parameters](#rplisupport-parameters) section. +See the [Feature Advertisement](#feature-advertisement) section for more details on this numeric. A list of parameters is available in the [`RPL_ISUPPORT` Parameters](#RPL_ISUPPORT-parameters) section. ### `RPL_BOUNCE (010)` @@ -908,7 +908,7 @@ The text used in the last param of this message varies wildly. --- -# `RPL_ISUPPORT` Parameters +{% h1 RPL_ISUPPORT-parameters %}`RPL_ISUPPORT` Parameters{% endh1 %} Used to [advertise features](#feature-advertisement) to clients, the [`RPL_ISUPPORT`](#rplisupport-005) numeric lists parameters that let the client know which features are active and their value, if any. diff --git a/_plugins/easy-ids.rb b/_plugins/easy-ids.rb new file mode 100644 index 0000000..bb29268 --- /dev/null +++ b/_plugins/easy-ids.rb @@ -0,0 +1,42 @@ +# written by daniel oaks +# released under cc0 public domain + +# this lets you easily insert headers with custom IDs. +# +# e.g. +# tag: +# {% h3 message-VERSION %}_VERSION_ message{% endh3 %} +# makes: +#

VERSION message

+ +def slug(input) + input.strip.gsub(/\s+/, " ") +end + +module Jekyll + class HeadingTagBlock < Liquid::Block + def initialize(name, params, tokens) + super + @name = name + @id = params + end + + def render(context) + text = super + + # markdowify text, then remove

tag. + # see also https://talk.jekyllrb.com/t/markdown-parsing-order-in-custom-liquid-tags/4397/3 + text = context.registers[:site].find_converter_instance( + Jekyll::Converters::Markdown + ).convert(text).gsub(/<\/?p[^>]*>/, "").strip + + "<#{@name} id=\"#{slug(@id)}\">#{text}" + end + end +end + +Liquid::Template.register_tag('h1', Jekyll::HeadingTagBlock) +Liquid::Template.register_tag('h2', Jekyll::HeadingTagBlock) +Liquid::Template.register_tag('h3', Jekyll::HeadingTagBlock) +Liquid::Template.register_tag('h4', Jekyll::HeadingTagBlock) +Liquid::Template.register_tag('h5', Jekyll::HeadingTagBlock) diff --git a/index.md b/index.md index cd3605f..c9e0f4e 100644 --- a/index.md +++ b/index.md @@ -584,7 +584,7 @@ Clients SHOULD NOT assume a server supports a feature unless it has been adverti For more information and specific details on tokens, see the [`RPL_ISUPPORT`](#rplisupport-005) reply. -A list of `RPL_ISUPPORT` parameters is available in the [`RPL_ISUPPORT` Parameters](#rplisupport-parameters) section. +A list of `RPL_ISUPPORT` parameters is available in the [`RPL_ISUPPORT` Parameters](#RPL_ISUPPORT-parameters) section. --- @@ -1077,12 +1077,12 @@ Numeric Replies: * [`RPL_MOTD`](#rplmotd-372) `(372)` * [`RPL_ENDOFMOTD`](#rplendofmotd-376) `(376)` -### VERSION message +{% h3 message-VERSION %}_VERSION_ message{% endh3 %} Command: VERSION Parameters: [] -The `VERSION` command is used to query the version of the software and the [`RPL_ISUPPORT`](#rplisupport-parameters) parameters of the given server. If `` is not given, the information for the server the client is connected to should be returned. +The `VERSION` command is used to query the version of the software and the [`RPL_ISUPPORT` parameters](#RPL_ISUPPORT-parameters) of the given server. If `` is not given, the information for the server the client is connected to should be returned. If `` is a server, the information for that server is requested. If `` is a client, the information for the server that client is connected to is requested. If `` is given and a matching server cannot be found, the server will respond with the `ERR_NOSUCHSERVER` numeric and the command will fail. From 61c980fa07b8d651a9873dc9408fff4be77166fb Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 15:36:21 +1000 Subject: [PATCH 03/10] Don't italicise version, that was just for an example --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index c9e0f4e..89e37c4 100644 --- a/index.md +++ b/index.md @@ -1077,7 +1077,7 @@ Numeric Replies: * [`RPL_MOTD`](#rplmotd-372) `(372)` * [`RPL_ENDOFMOTD`](#rplendofmotd-376) `(376)` -{% h3 message-VERSION %}_VERSION_ message{% endh3 %} +{% h3 message-VERSION %}VERSION message{% endh3 %} Command: VERSION Parameters: [] From 73470cd3ab6bf1c916fef9d09c54acd266fb17db Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 17:26:43 +1000 Subject: [PATCH 04/10] Initial command/message and associated header tags --- _plugins/modern-ircdocs.rb | 47 ++++++++++++++++++++++++++++++++++++++ index.md | 24 +++++++++---------- 2 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 _plugins/modern-ircdocs.rb diff --git a/_plugins/modern-ircdocs.rb b/_plugins/modern-ircdocs.rb new file mode 100644 index 0000000..f7f4291 --- /dev/null +++ b/_plugins/modern-ircdocs.rb @@ -0,0 +1,47 @@ +# written by daniel oaks +# released under cc0 public domain + +# this lets you easily insert headers for numerics/commands/isupport and link to them +# +# {% commandheader WHO %} and {% messageheader WHO %} +# - create the WHO message header, with an appropriate ID +# +# {% command WHO %} and {% message WHO %} +# - link to the WHO message. + +def slug(input) + input.strip.gsub(/\s+/, " ") +end + +module Jekyll + class MessageHeaderTag < Liquid::Tag + def initialize(name, params, tokens) + super + @id = slug(params) + end + + def render(context) + super + + "

#{@id} Message

" + end + end + + class MessageTag < Liquid::Tag + def initialize(name, params, tokens) + super + @id = slug(params) + end + + def render(context) + super + + "#{@id}" + end + end +end + +Liquid::Template.register_tag('messageheader', Jekyll::MessageHeaderTag) +Liquid::Template.register_tag('commandheader', Jekyll::MessageHeaderTag) +Liquid::Template.register_tag('message', Jekyll::MessageTag) +Liquid::Template.register_tag('command', Jekyll::MessageTag) diff --git a/index.md b/index.md index 89e37c4..2026d67 100644 --- a/index.md +++ b/index.md @@ -127,7 +127,7 @@ There are several types of channels used in the IRC protocol. The first standard Along with various channel types, there are also channel modes that can alter the characteristics and behaviour of individual channels. See the [Channel Modes](#channel-modes) section for more information on these. -To create a new channel or become part of an existing channel, a user is required to join the channel using the [`JOIN`](#join-message) command. If the channel doesn't exist prior to joining, the channel is created and the creating user becomes a channel operator. If the channel already exists, whether or not the client successfully joins that channel depends on the modes currently set on the channel. For example, if the channel is set to `invite-only` mode (`+i`), the client only joins the channel if they have been invited by another user or they have been exempted from requiring an invite by the channel operators. +To create a new channel or become part of an existing channel, a user is required to join the channel using the {% message JOIN %} command. If the channel doesn't exist prior to joining, the channel is created and the creating user becomes a channel operator. If the channel already exists, whether or not the client successfully joins that channel depends on the modes currently set on the channel. For example, if the channel is set to `invite-only` mode (`+i`), the client only joins the channel if they have been invited by another user or they have been exempted from requiring an invite by the channel operators. Channels also contain a [topic](#topic-message). The topic is a line shown to all users when they join the channel, and all users in the channel are notified when the topic of a channel is changed. Channel topics commonly state channel rules, links, quotes from channel members, a general description of the channel, or whatever the [channel operators](#channel-operators) want to share with the clients in their channel. @@ -145,12 +145,12 @@ IRC servers may also define other levels of channel moderation. These can includ The commands which may only be used by channel moderators include: -- [`KICK`](#kick-message): Eject a client from the channel -- [`MODE`](#mode-message): Change the channel's modes -- [`INVITE`](#invite-message): Invite a client to an invite-only channel (mode +i) -- [`TOPIC`](#topic-message): Change the channel topic in a mode +t channel +- {% command KICK %}: Eject a client from the channel +- {% command MODE %}: Change the channel's modes +- {% command INVITE %}: Invite a client to an invite-only channel (mode +i) +- {% command TOPIC %}: Change the channel topic in a mode +t channel -Channel moderators are identified by the channel member prefix (`'@'` for standard channel operators, `'%'` for halfops) next to their nickname whenever it is associated with a channel (ie: replies to the `NAMES`, `WHO`, and `WHOIS` commands). +Channel moderators are identified by the channel member prefix (`'@'` for standard channel operators, `'%'` for halfops) next to their nickname whenever it is associated with a channel (e.g. replies to the {% command NAMES %}, {% command WHO %}, and {% command WHOIS %} commands). Specific prefixes and moderation levels are covered in the [Channel Membership Prefixes](#channel-membership-prefixes) section. @@ -539,7 +539,7 @@ Examples: Immediately upon establishing a connection the client must attempt registration, without waiting for any banner message from the server. -Until registration is complete, only a limited subset of commands SHOULD be accepted by the server. This is because it makes sense to require a registered (fully connected) client connection before allowing commands such as [`JOIN`](#join-message), [`PRIVMSG`](#privmsg-message) and others. +Until registration is complete, only a limited subset of commands SHOULD be accepted by the server. This is because it makes sense to require a registered (fully connected) client connection before allowing commands such as {% command JOIN %}, {% command PRIVMSG %} and others. The recommended order of commands during registration is as follows: @@ -552,11 +552,11 @@ The recommended order of commands during registration is as follows: The commands specified in steps 1-3 should be sent on connection. If the server supports [capability negotiation](#capability-negotiation) then registration will be suspended and the client can negotiate client capabilities (steps 4-6). If the server does not support capability negotiation then registration will continue immediately without steps 4-6. -1. If the server supports capability negotiation, the [`CAP`](#cap-message) command suspends the registration process and immediately starts the [capability negotiation](#capability-negotiation) process. `CAP LS 302` means that the client supports [version `302`](http://ircv3.net/specs/core/capability-negotiation-3.2.html) of client capability negotiation. The registration process is resumed when the client sends `CAP END` to the server. +1. If the server supports capability negotiation, the {% command CAP %} command suspends the registration process and immediately starts the [capability negotiation](#capability-negotiation) process. `CAP LS 302` means that the client supports [version `302`](http://ircv3.net/specs/core/capability-negotiation-3.2.html) of client capability negotiation. The registration process is resumed when the client sends `CAP END` to the server. -2. The [`PASS`](#pass-message) command is not required for the connection to be registered, but if included it MUST precede the latter of the NICK and USER commands. +2. The {% command PASS %} command is not required for the connection to be registered, but if included it MUST precede the latter of the NICK and USER commands. -3. The [`NICK`](#nick-message) and [`USER`](#user-message) commands are used to set the user's nickname, username and "real name". Unless the registration is suspended by a `CAP` negotiation, these commands will end the registration process. +3. The {% command NICK %} and {% command USER %} commands are used to set the user's nickname, username and "real name". Unless the registration is suspended by a {% command CAP %} negotiation, these commands will end the registration process. 4. The client should request advertised capabilities it wishes to enable here. @@ -566,7 +566,7 @@ The commands specified in steps 1-3 should be sent on connection. If the server If the server is waiting to complete a lookup of client information (such as hostname or ident for a username), there may be an arbitrary wait at some point during registration. Servers SHOULD set a reasonable timeout for these lookups. -Additionally, some servers also send a [`PING`](#ping-message) and require a matching [`PONG`](#pong-message) from the client before continuing. This exchange may happen immediately on connection and at any time during connection registration, so clients MUST respond correctly to it. +Additionally, some servers also send a {% message PING %} and require a matching {% command PONG %} from the client before continuing. This exchange may happen immediately on connection and at any time during connection registration, so clients MUST respond correctly to it. Upon successful completion of the registration process, the server MUST send, in this order, the [`RPL_WELCOME`](#rplwelcome-001) `(001)`, [`RPL_YOURHOST`](#rplyourhost-002) `(002)`, [`RPL_CREATED`](#rplcreated-003) `(003)`, [`RPL_MYINFO`](#rplmyinfo-004) `(004)`, and at least one [`RPL_ISUPPORT`](#rplisupport-005) `(005)` numeric to the client. The server SHOULD then respond as though the client sent the [`LUSERS`](#lusers-message) command and return the appropriate numerics. If the user has client modes set on them automatically upon joining the network, the server SHOULD send the client the [`RPL_UMODEIS`](#rplumodeis-221) `(221)` reply. The server MAY send other numerics and messages. The server MUST then respond as though the client sent it the [`MOTD`](#motd-message) command, i.e. it must send either the successful [Message of the Day](#motd-message) numerics or the [`ERR_NOMOTD`](#errnomotd-422) numeric. @@ -1077,7 +1077,7 @@ Numeric Replies: * [`RPL_MOTD`](#rplmotd-372) `(372)` * [`RPL_ENDOFMOTD`](#rplendofmotd-376) `(376)` -{% h3 message-VERSION %}VERSION message{% endh3 %} +{% messageheader VERSION %} Command: VERSION Parameters: [] From e94fb849123c1cf00733480de0590b97e1bc08c5 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 20:31:30 +1000 Subject: [PATCH 05/10] Initial numeric/numericheader tags --- _data/modern.yml | 3 ++ _plugins/modern-ircdocs.rb | 62 +++++++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 _data/modern.yml diff --git a/_data/modern.yml b/_data/modern.yml new file mode 100644 index 0000000..2853ba5 --- /dev/null +++ b/_data/modern.yml @@ -0,0 +1,3 @@ +numerics: + RPL_WELCOME: + numeric: '001' \ No newline at end of file diff --git a/_plugins/modern-ircdocs.rb b/_plugins/modern-ircdocs.rb index f7f4291..4388a03 100644 --- a/_plugins/modern-ircdocs.rb +++ b/_plugins/modern-ircdocs.rb @@ -7,13 +7,23 @@ # - create the WHO message header, with an appropriate ID # # {% command WHO %} and {% message WHO %} -# - link to the WHO message. +# - link to the WHO message +# +# {% numericheader RPL_WELCOME %} +# - create the RPL_WELCOME numeric header +# +# {% numeric RPL_WELCOME %} +# - link to the RPL_WELCOME numeric def slug(input) - input.strip.gsub(/\s+/, " ") + input.strip.gsub(/\s+/, ' ') +end + +def numericAnchor(name, numeric) + "#{name.gsub(/_/, '').downcase}-#{numeric}" end -module Jekyll +module IRCdocsPlugin class MessageHeaderTag < Liquid::Tag def initialize(name, params, tokens) super @@ -39,9 +49,47 @@ def render(context) "#{@id}" end end + + class NumericHeaderTag < Liquid::Tag + def initialize(name, params, tokens) + super + @id = slug(params) + end + + def render(context) + super + + info = context.registers[:site].data['modern']['numerics'][@id] + if info == nil + raise "Numeric [#{@id}] is not defined in modern.yml" + end + + "

#{@id} (#{info['numeric']})" + end + end + + class NumericTag < Liquid::Tag + def initialize(name, params, tokens) + super + @id = slug(params) + end + + def render(context) + super + + info = context.registers[:site].data['modern']['numerics'][@id] + if info == nil + raise "Numeric [#{@id}] is not defined in modern.yml" + end + + "#{@id} (#{info['numeric']})" + end + end end -Liquid::Template.register_tag('messageheader', Jekyll::MessageHeaderTag) -Liquid::Template.register_tag('commandheader', Jekyll::MessageHeaderTag) -Liquid::Template.register_tag('message', Jekyll::MessageTag) -Liquid::Template.register_tag('command', Jekyll::MessageTag) +Liquid::Template.register_tag('messageheader', IRCdocsPlugin::MessageHeaderTag) +Liquid::Template.register_tag('commandheader', IRCdocsPlugin::MessageHeaderTag) +Liquid::Template.register_tag('message', IRCdocsPlugin::MessageTag) +Liquid::Template.register_tag('command', IRCdocsPlugin::MessageTag) +Liquid::Template.register_tag('numericheader', IRCdocsPlugin::NumericHeaderTag) +Liquid::Template.register_tag('numeric', IRCdocsPlugin::NumericTag) From 631491d635e29e25685dc17ababb59c194722b30 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 20:58:54 +1000 Subject: [PATCH 06/10] We're not using commonmark anyway --- _config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/_config.yml b/_config.yml index 96cb4aa..eaee760 100644 --- a/_config.yml +++ b/_config.yml @@ -7,4 +7,3 @@ plugins: - jekyll-sitemap - jekyll-redirect-from - jekyll-sass-converter - - jekyll-commonmark-ghpages From f01d55babe53445422126fcfdf3f0edb9738d6b3 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 20:59:18 +1000 Subject: [PATCH 07/10] Fix numericheader, start using numeric tag --- _data/modern.yml | 1094 +++++++++++++++++++++++++++++++++- _includes/modern-appendix.md | 2 +- _plugins/modern-ircdocs.rb | 2 +- index.md | 2 +- 4 files changed, 1096 insertions(+), 4 deletions(-) diff --git a/_data/modern.yml b/_data/modern.yml index 2853ba5..25d5fd2 100644 --- a/_data/modern.yml +++ b/_data/modern.yml @@ -1,3 +1,1095 @@ numerics: RPL_WELCOME: - numeric: '001' \ No newline at end of file + numeric: '001' + + RPL_YOURHOST: + numeric: '002' + + RPL_CREATED: + numeric: '003' + + RPL_MYINFO: + numeric: '004' + + RPL_ISUPPORT: + numeric: '005' + + RPL_SNOMASK: + numeric: '008' + + RPL_STATMEMTOT: + numeric: '009' + + RPL_BOUNCE: + numeric: '010' + + RPL_YOURCOOKIE: + numeric: '014' + + RPL_MAP: + numeric: '015' + + RPL_MAPMORE: + numeric: '016' + + RPL_MAPEND: + numeric: '017' + + RPL_MAPUSERS: + numeric: '018' + + RPL_HELLO: + numeric: '020' + + RPL_APASSWARN_SET: + numeric: '030' + + RPL_APASSWARN_SECRET: + numeric: '031' + + RPL_APASSWARN_CLEAR: + numeric: '032' + + RPL_YOURID: + numeric: '042' + + RPL_SAVENICK: + numeric: '043' + + RPL_ATTEMPTINGJUNC: + numeric: '050' + + RPL_ATTEMPTINGREROUTE: + numeric: '051' + + RPL_REMOTEISUPPORT: + numeric: '105' + + RPL_TRACELINK: + numeric: '200' + + RPL_TRACECONNECTING: + numeric: '201' + + RPL_TRACEHANDSHAKE: + numeric: '202' + + RPL_TRACEUNKNOWN: + numeric: '203' + + RPL_TRACEOPERATOR: + numeric: '204' + + RPL_TRACEUSER: + numeric: '205' + + RPL_TRACESERVER: + numeric: '206' + + RPL_TRACESERVICE: + numeric: '207' + + RPL_TRACENEWTYPE: + numeric: '208' + + RPL_TRACECLASS: + numeric: '209' + + RPL_STATSLINKINFO: + numeric: '211' + + RPL_STATSCOMMANDS: + numeric: '212' + + RPL_STATSCLINE: + numeric: '213' + + RPL_STATSILINE: + numeric: '215' + + RPL_STATSKLINE: + numeric: '216' + + RPL_STATSYLINE: + numeric: '218' + + RPL_ENDOFSTATS: + numeric: '219' + + RPL_UMODEIS: + numeric: '221' + + RPL_STATSSPAMF: + numeric: '229' + + RPL_STATSEXCEPTTKL: + numeric: '230' + + RPL_SERVLIST: + numeric: '234' + + RPL_SERVLISTEND: + numeric: '235' + + RPL_STATSVERBOSE: + numeric: '236' + + RPL_STATSENGINE: + numeric: '237' + + RPL_STATSIAUTH: + numeric: '239' + + RPL_STATSLLINE: + numeric: '241' + + RPL_STATSUPTIME: + numeric: '242' + + RPL_STATSOLINE: + numeric: '243' + + RPL_STATSHLINE: + numeric: '244' + + RPL_LUSERCLIENT: + numeric: '251' + + RPL_LUSEROP: + numeric: '252' + + RPL_LUSERUNKNOWN: + numeric: '253' + + RPL_LUSERCHANNELS: + numeric: '254' + + RPL_LUSERME: + numeric: '255' + + RPL_ADMINME: + numeric: '256' + + RPL_ADMINLOC1: + numeric: '257' + + RPL_ADMINLOC2: + numeric: '258' + + RPL_ADMINEMAIL: + numeric: '259' + + RPL_TRACELOG: + numeric: '261' + + RPL_TRYAGAIN: + numeric: '263' + + RPL_USINGSSL: + numeric: '264' + + RPL_LOCALUSERS: + numeric: '265' + + RPL_GLOBALUSERS: + numeric: '266' + + RPL_START_NETSTAT: + numeric: '267' + + RPL_NETSTAT: + numeric: '268' + + RPL_END_NETSTAT: + numeric: '269' + + RPL_PRIVS: + numeric: '270' + + RPL_SILELIST: + numeric: '271' + + RPL_ENDOFSILELIST: + numeric: '272' + + RPL_NOTIFY: + numeric: '273' + + RPL_GLIST: + numeric: '280' + + RPL_CHANINFO_KICKS: + numeric: '296' + + RPL_END_CHANINFO: + numeric: '299' + + RPL_NONE: + numeric: '300' + + RPL_AWAY: + numeric: '301' + + RPL_USERHOST: + numeric: '302' + + RPL_ISON: + numeric: '303' + + RPL_TEXT: + numeric: '304' + + RPL_UNAWAY: + numeric: '305' + + RPL_NOWAWAY: + numeric: '306' + + RPL_WHOISUSER: + numeric: '311' + + RPL_WHOISSERVER: + numeric: '312' + + RPL_WHOISOPERATOR: + numeric: '313' + + RPL_WHOWASUSER: + numeric: '314' + + RPL_ENDOFWHO: + numeric: '315' + + RPL_WHOISPRIVDEAF: + numeric: '316' + + RPL_WHOISIDLE: + numeric: '317' + + RPL_ENDOFWHOIS: + numeric: '318' + + RPL_WHOISCHANNELS: + numeric: '319' + + RPL_LIST: + numeric: '322' + + RPL_LISTEND: + numeric: '323' + + RPL_CHANNELMODEIS: + numeric: '324' + + RPL_NOCHANPASS: + numeric: '326' + + RPL_CHANNEL_URL: + numeric: '328' + + RPL_CREATIONTIME: + numeric: '329' + + RPL_NOTOPIC: + numeric: '331' + + RPL_TOPIC: + numeric: '332' + + RPL_TOPICWHOTIME: + numeric: '333' + + RPL_USERIP: + numeric: '340' + + RPL_INVITING: + numeric: '341' + + RPL_WHOISKILL: + numeric: '343' + + RPL_INVITELIST: + numeric: '346' + + RPL_ENDOFINVITELIST: + numeric: '347' + + RPL_EXCEPTLIST: + numeric: '348' + + RPL_ENDOFEXCEPTLIST: + numeric: '349' + + RPL_WHOISGATEWAY: + numeric: '350' + + RPL_VERSION: + numeric: '351' + + RPL_WHOREPLY: + numeric: '352' + + RPL_NAMREPLY: + numeric: '353' + + RPL_WHOSPCRPL: + numeric: '354' + + RPL_NAMREPLY_: + numeric: '355' + + RPL_LINKS: + numeric: '364' + + RPL_ENDOFLINKS: + numeric: '365' + + RPL_ENDOFNAMES: + numeric: '366' + + RPL_BANLIST: + numeric: '367' + + RPL_ENDOFBANLIST: + numeric: '368' + + RPL_ENDOFWHOWAS: + numeric: '369' + + RPL_INFO: + numeric: '371' + + RPL_MOTD: + numeric: '372' + + RPL_ENDOFINFO: + numeric: '374' + + RPL_MOTDSTART: + numeric: '375' + + RPL_ENDOFMOTD: + numeric: '376' + + RPL_YOUREOPER: + numeric: '381' + + RPL_REHASHING: + numeric: '382' + + RPL_YOURESERVICE: + numeric: '383' + + RPL_NOTOPERANYMORE: + numeric: '385' + + RPL_ENDOFALIST: + numeric: '389' + + RPL_TIME: + numeric: '391' + + RPL_USERSSTART: + numeric: '392' + + RPL_USERS: + numeric: '393' + + RPL_ENDOFUSERS: + numeric: '394' + + RPL_NOUSERS: + numeric: '395' + + RPL_VISIBLEHOST: + numeric: '396' + + RPL_CLONES: + numeric: '399' + + ERR_UNKNOWNERROR: + numeric: '400' + + ERR_NOSUCHNICK: + numeric: '401' + + ERR_NOSUCHSERVER: + numeric: '402' + + ERR_NOSUCHCHANNEL: + numeric: '403' + + ERR_CANNOTSENDTOCHAN: + numeric: '404' + + ERR_TOOMANYCHANNELS: + numeric: '405' + + ERR_WASNOSUCHNICK: + numeric: '406' + + ERR_TOOMANYTARGETS: + numeric: '407' + + ERR_NOSUCHSERVICE: + numeric: '408' + + ERR_NOORIGIN: + numeric: '409' + + ERR_INVALIDCAPCMD: + numeric: '410' + + ERR_NORECIPIENT: + numeric: '411' + + ERR_NOTEXTTOSEND: + numeric: '412' + + ERR_NOTOPLEVEL: + numeric: '413' + + ERR_WILDTOPLEVEL: + numeric: '414' + + ERR_BADMASK: + numeric: '415' + + ERR_TOOMANYMATCHES: + numeric: '416' + + ERR_INPUTTOOLONG: + numeric: '417' + + ERR_LENGTHTRUNCATED: + numeric: '419' + + ERR_AMBIGUOUSCOMMAND: + numeric: '420' + + ERR_UNKNOWNCOMMAND: + numeric: '421' + + ERR_NOMOTD: + numeric: '422' + + ERR_NOADMININFO: + numeric: '423' + + ERR_FILEERROR: + numeric: '424' + + ERR_NOOPERMOTD: + numeric: '425' + + ERR_TOOMANYAWAY: + numeric: '429' + + ERR_EVENTNICKCHANGE: + numeric: '430' + + ERR_NONICKNAMEGIVEN: + numeric: '431' + + ERR_ERRONEUSNICKNAME: + numeric: '432' + + ERR_NICKNAMEINUSE: + numeric: '433' + + ERR_NICKCOLLISION: + numeric: '436' + + ERR_TARGETTOOFAST: + numeric: '439' + + ERR_SERVICESDOWN: + numeric: '440' + + ERR_USERNOTINCHANNEL: + numeric: '441' + + ERR_NOTONCHANNEL: + numeric: '442' + + ERR_USERONCHANNEL: + numeric: '443' + + ERR_NOLOGIN: + numeric: '444' + + ERR_SUMMONDISABLED: + numeric: '445' + + ERR_USERSDISABLED: + numeric: '446' + + ERR_NONICKCHANGE: + numeric: '447' + + ERR_FORBIDDENCHANNEL: + numeric: '448' + + ERR_NOTIMPLEMENTED: + numeric: '449' + + ERR_NOTREGISTERED: + numeric: '451' + + ERR_IDCOLLISION: + numeric: '452' + + ERR_NICKLOST: + numeric: '453' + + ERR_HOSTILENAME: + numeric: '455' + + ERR_ACCEPTFULL: + numeric: '456' + + ERR_ACCEPTEXIST: + numeric: '457' + + ERR_ACCEPTNOT: + numeric: '458' + + ERR_NOHIDING: + numeric: '459' + + ERR_NOTFORHALFOPS: + numeric: '460' + + ERR_NEEDMOREPARAMS: + numeric: '461' + + ERR_ALREADYREGISTERED: + numeric: '462' + + ERR_NOPERMFORHOST: + numeric: '463' + + ERR_PASSWDMISMATCH: + numeric: '464' + + ERR_YOUREBANNEDCREEP: + numeric: '465' + + ERR_KEYSET: + numeric: '467' + + ERR_LINKSET: + numeric: '469' + + ERR_CHANNELISFULL: + numeric: '471' + + ERR_UNKNOWNMODE: + numeric: '472' + + ERR_INVITEONLYCHAN: + numeric: '473' + + ERR_BANNEDFROMCHAN: + numeric: '474' + + ERR_BADCHANNELKEY: + numeric: '475' + + ERR_BADCHANMASK: + numeric: '476' + + ERR_BANLISTFULL: + numeric: '478' + + ERR_NOPRIVILEGES: + numeric: '481' + + ERR_CHANOPRIVSNEEDED: + numeric: '482' + + ERR_CANTKILLSERVER: + numeric: '483' + + ERR_UNIQOPRIVSNEEDED: + numeric: '485' + + ERR_NOOPERHOST: + numeric: '491' + + ERR_BADLOGTYPE: + numeric: '495' + + ERR_BADLOGSYS: + numeric: '496' + + ERR_BADLOGVALUE: + numeric: '497' + + ERR_ISOPERLCHAN: + numeric: '498' + + ERR_CHANOWNPRIVNEEDED: + numeric: '499' + + ERR_USERSDONTMATCH: + numeric: '502' + + ERR_USERNOTONSERV: + numeric: '504' + + ERR_SILELISTFULL: + numeric: '511' + + ERR_BADPING: + numeric: '513' + + ERR_BADEXPIRE: + numeric: '515' + + ERR_DONTCHEAT: + numeric: '516' + + ERR_DISABLED: + numeric: '517' + + ERR_WHOSYNTAX: + numeric: '522' + + ERR_WHOLIMEXCEED: + numeric: '523' + + ERR_INVALIDKEY: + numeric: '525' + + ERR_CANTSENDTOUSER: + numeric: '531' + + ERR_BADHOSTMASK: + numeric: '550' + + ERR_HOSTUNAVAIL: + numeric: '551' + + ERR_USINGSLINE: + numeric: '552' + + ERR_NOTLOWEROPLEVEL: + numeric: '560' + + ERR_NOTMANAGER: + numeric: '561' + + ERR_CHANSECURED: + numeric: '562' + + ERR_UPASSSET: + numeric: '563' + + ERR_UPASSNOTSET: + numeric: '564' + + ERR_NOMANAGER: + numeric: '566' + + ERR_UPASS_SAME_APASS: + numeric: '567' + + RPL_REAWAY: + numeric: '597' + + RPL_GONEAWAY: + numeric: '598' + + RPL_NOTAWAY: + numeric: '599' + + RPL_LOGON: + numeric: '600' + + RPL_LOGOFF: + numeric: '601' + + RPL_WATCHOFF: + numeric: '602' + + RPL_WATCHSTAT: + numeric: '603' + + RPL_NOWON: + numeric: '604' + + RPL_NOWOFF: + numeric: '605' + + RPL_WATCHLIST: + numeric: '606' + + RPL_ENDOFWATCHLIST: + numeric: '607' + + RPL_WATCHCLEAR: + numeric: '608' + + RPL_NOWISAWAY: + numeric: '609' + + RPL_ISLOCOP: + numeric: '611' + + RPL_ISNOTOPER: + numeric: '612' + + RPL_ENDOFISOPER: + numeric: '613' + + RPL_DCCLIST: + numeric: '618' + + RPL_OMOTDSTART: + numeric: '624' + + RPL_OMOTD: + numeric: '625' + + RPL_ENDOFOMOTD: + numeric: '626' + + RPL_SETTINGS: + numeric: '630' + + RPL_ENDOFSETTINGS: + numeric: '631' + + RPL_SYNTAX: + numeric: '650' + + RPL_CHANNELSMSG: + numeric: '651' + + RPL_WHOWASIP: + numeric: '652' + + RPL_UNINVITED: + numeric: '653' + + RPL_SPAMCMDFWD: + numeric: '659' + + RPL_STARTTLS: + numeric: '670' + + RPL_WHOISSECURE: + numeric: '671' + + RPL_CANNOTSETMODES: + numeric: '673' + + RPL_WHOISYOURID: + numeric: '674' + + ERR_REDIRECT: + numeric: '690' + + ERR_STARTTLS: + numeric: '691' + + ERR_INVALIDMODEPARAM: + numeric: '696' + + ERR_LISTMODEALREADYSET: + numeric: '697' + + ERR_LISTMODENOTSET: + numeric: '698' + + RPL_COMMANDS: + numeric: '700' + + RPL_COMMANDSEND: + numeric: '701' + + RPL_MODLIST: + numeric: '702' + + RPL_ENDOFMODLIST: + numeric: '703' + + RPL_HELPSTART: + numeric: '704' + + RPL_HELPTXT: + numeric: '705' + + RPL_ENDOFHELP: + numeric: '706' + + ERR_TARGCHANGE: + numeric: '707' + + RPL_ETRACEFULL: + numeric: '708' + + RPL_ETRACE: + numeric: '709' + + RPL_KNOCK: + numeric: '710' + + RPL_KNOCKDLVR: + numeric: '711' + + ERR_TOOMANYKNOCK: + numeric: '712' + + ERR_CHANOPEN: + numeric: '713' + + ERR_KNOCKONCHAN: + numeric: '714' + + RPL_TARGUMODEG: + numeric: '716' + + RPL_TARGNOTIFY: + numeric: '717' + + RPL_UMODEGMSG: + numeric: '718' + + RPL_OMOTDSTART: + numeric: '720' + + RPL_OMOTD: + numeric: '721' + + RPL_ENDOFOMOTD: + numeric: '722' + + ERR_NOPRIVS: + numeric: '723' + + RPL_TESTMASK: + numeric: '724' + + RPL_TESTLINE: + numeric: '725' + + RPL_NOTESTLINE: + numeric: '726' + + RPL_TESTMASKGECOS: + numeric: '727' + + RPL_QUIETLIST: + numeric: '728' + + RPL_ENDOFQUIETLIST: + numeric: '729' + + RPL_MONONLINE: + numeric: '730' + + RPL_MONOFFLINE: + numeric: '731' + + RPL_MONLIST: + numeric: '732' + + RPL_ENDOFMONLIST: + numeric: '733' + + ERR_MONLISTFULL: + numeric: '734' + + RPL_RSACHALLENGE2: + numeric: '740' + + RPL_ENDOFRSACHALLENGE2: + numeric: '741' + + ERR_MLOCKRESTRICTED: + numeric: '742' + + ERR_INVALIDBAN: + numeric: '743' + + ERR_TOPICLOCK: + numeric: '744' + + RPL_SCANMATCHED: + numeric: '750' + + RPL_SCANUMODES: + numeric: '751' + + RPL_ETRACEEND: + numeric: '759' + + RPL_WHOISKEYVALUE: + numeric: '760' + + RPL_KEYVALUE: + numeric: '761' + + RPL_METADATAEND: + numeric: '762' + + ERR_METADATALIMIT: + numeric: '764' + + ERR_TARGETINVALID: + numeric: '765' + + ERR_NOMATCHINGKEY: + numeric: '766' + + ERR_KEYINVALID: + numeric: '767' + + ERR_KEYNOTSET: + numeric: '768' + + ERR_KEYNOPERMISSION: + numeric: '769' + + RPL_XINFO: + numeric: '771' + + RPL_XINFOSTART: + numeric: '773' + + RPL_XINFOEND: + numeric: '774' + + RPL_STATSCOUNTRY: + numeric: '801' + + RPL_CHECK: + numeric: '802' + + RPL_OTHERUMODEIS: + numeric: '803' + + RPL_OTHERSNOMASKIS: + numeric: '804' + + RPL_LOGGEDIN: + numeric: '900' + + RPL_LOGGEDOUT: + numeric: '901' + + ERR_NICKLOCKED: + numeric: '902' + + RPL_SASLSUCCESS: + numeric: '903' + + ERR_SASLFAIL: + numeric: '904' + + ERR_SASLTOOLONG: + numeric: '905' + + ERR_SASLABORTED: + numeric: '906' + + ERR_SASLALREADY: + numeric: '907' + + RPL_SASLMECHS: + numeric: '908' + + RPL_ACCESSLIST: + numeric: '910' + + RPL_ENDOFACCESSLIST: + numeric: '911' + + ERR_BADCHANNEL: + numeric: '926' + + RPL_ENDOFSPAMFILTER: + numeric: '940' + + RPL_SPAMFILTER: + numeric: '941' + + ERR_INVALIDWATCHNICK: + numeric: '942' + + RPL_IDLETIMESET: + numeric: '944' + + RPL_NICKLOCKOFF: + numeric: '945' + + ERR_NICKNOTLOCKED: + numeric: '946' + + RPL_NICKLOCKON: + numeric: '947' + + ERR_INVALIDIDLETIME: + numeric: '948' + + RPL_UNSILENCED: + numeric: '950' + + RPL_SILENCED: + numeric: '951' + + ERR_SILENCE: + numeric: '952' + + RPL_ENDOFEXEMPTIONLIST: + numeric: '953' + + RPL_EXEMPTIONLIST: + numeric: '954' + + RPL_ENDOFPROPLIST: + numeric: '960' + + RPL_PROPLIST: + numeric: '961' + + RPL_UNLOADEDMODULE: + numeric: '973' + + RPL_SERVLOCKON: + numeric: '988' + + RPL_SERVLOCKOFF: + numeric: '989' + + RPL_DCCALLOWSTART: + numeric: '990' + + RPL_DCCALLOWLIST: + numeric: '991' + + RPL_DCCALLOWEND: + numeric: '992' + + RPL_DCCALLOWTIMED: + numeric: '993' + + RPL_DCCALLOWPERMANENT: + numeric: '994' + + RPL_DCCALLOWREMOVED: + numeric: '995' + + ERR_DCCALLOWINVALID: + numeric: '996' + + RPL_DCCALLOWEXPIRED: + numeric: '997' + + ERR_UNKNOWNDCCALLOWCMD: + numeric: '998' + + ERR_NUMERIC_ERR: + numeric: '999' diff --git a/_includes/modern-appendix.md b/_includes/modern-appendix.md index 947bef1..d5a7028 100644 --- a/_includes/modern-appendix.md +++ b/_includes/modern-appendix.md @@ -208,7 +208,7 @@ Server authors that wish to extend one of the numerics listed here SHOULD make t Note that for numerics with "human-readable" informational strings for the last parameter which are not designed to be parsed, such as in `RPL_WELCOME`, servers commonly change this last-param text. Clients SHOULD NOT rely on these sort of parameters to have exactly the same human-readable string as described in this document. Clients that rely on the format of these human-readable final informational strings may fail. We do try to note numerics where this is the case with a message like *"The text used in the last param of this message varies wildly"*. -### `RPL_WELCOME (001)` +{% numericheader RPL_WELCOME %} " :Welcome to the Network, [!@]" diff --git a/_plugins/modern-ircdocs.rb b/_plugins/modern-ircdocs.rb index 4388a03..f934551 100644 --- a/_plugins/modern-ircdocs.rb +++ b/_plugins/modern-ircdocs.rb @@ -64,7 +64,7 @@ def render(context) raise "Numeric [#{@id}] is not defined in modern.yml" end - "

#{@id} (#{info['numeric']})" + "

#{@id} (#{info['numeric']})

" end end diff --git a/index.md b/index.md index 2026d67..b2ab674 100644 --- a/index.md +++ b/index.md @@ -568,7 +568,7 @@ If the server is waiting to complete a lookup of client information (such as hos Additionally, some servers also send a {% message PING %} and require a matching {% command PONG %} from the client before continuing. This exchange may happen immediately on connection and at any time during connection registration, so clients MUST respond correctly to it. -Upon successful completion of the registration process, the server MUST send, in this order, the [`RPL_WELCOME`](#rplwelcome-001) `(001)`, [`RPL_YOURHOST`](#rplyourhost-002) `(002)`, [`RPL_CREATED`](#rplcreated-003) `(003)`, [`RPL_MYINFO`](#rplmyinfo-004) `(004)`, and at least one [`RPL_ISUPPORT`](#rplisupport-005) `(005)` numeric to the client. The server SHOULD then respond as though the client sent the [`LUSERS`](#lusers-message) command and return the appropriate numerics. If the user has client modes set on them automatically upon joining the network, the server SHOULD send the client the [`RPL_UMODEIS`](#rplumodeis-221) `(221)` reply. The server MAY send other numerics and messages. The server MUST then respond as though the client sent it the [`MOTD`](#motd-message) command, i.e. it must send either the successful [Message of the Day](#motd-message) numerics or the [`ERR_NOMOTD`](#errnomotd-422) numeric. +Upon successful completion of the registration process, the server MUST send, in this order, the {% numeric RPL_WELCOME %}, {% numeric RPL_YOURHOST %}, {% numeric RPL_CREATED %}, {% numeric RPL_MYINFO %}, and at least one {% numeric RPL_ISUPPORT %} numeric to the client. The server SHOULD then respond as though the client sent the [`LUSERS`](#lusers-message) command and return the appropriate numerics. If the user has client modes set on them automatically upon joining the network, the server SHOULD send the client the {% numeric RPL_UMODEIS %} reply. The server MAY send other numerics and messages. The server MUST then respond as though the client sent it the {% message MOTD %} command, i.e. it must send either the successful [Message of the Day](#motd-message) numerics or the {% numeric ERR_NOMOTD %} numeric. --- From 29e5ebe95293582a08f9a3eb769402ea27187d18 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 21:12:33 +1000 Subject: [PATCH 08/10] Actually use the message and numeric tags and headers --- _data/modern.yml | 9 + _includes/modern-appendix.md | 356 +++++++++++++++++------------------ _plugins/modern-ircdocs.rb | 4 +- index.md | 250 ++++++++++++------------ 4 files changed, 314 insertions(+), 305 deletions(-) diff --git a/_data/modern.yml b/_data/modern.yml index 25d5fd2..4aa7a58 100644 --- a/_data/modern.yml +++ b/_data/modern.yml @@ -215,6 +215,9 @@ numerics: RPL_NOTIFY: numeric: '273' + RPL_WHOISCERTFP: + numeric: '276' + RPL_GLIST: numeric: '280' @@ -272,6 +275,9 @@ numerics: RPL_WHOISCHANNELS: numeric: '319' + RPL_LISTSTART: + numeric: '321' + RPL_LIST: numeric: '322' @@ -632,6 +638,9 @@ numerics: ERR_CHANOWNPRIVNEEDED: numeric: '499' + ERR_UMODEUNKNOWNFLAG: + numeric: '501' + ERR_USERSDONTMATCH: numeric: '502' diff --git a/_includes/modern-appendix.md b/_includes/modern-appendix.md index d5a7028..9778789 100644 --- a/_includes/modern-appendix.md +++ b/_includes/modern-appendix.md @@ -72,7 +72,7 @@ IRCv3 extensions such as [`account-notify`](http://ircv3.net/specs/extensions/ac This mode is standard, and the mode letter used for it is `"+w"`. -If a user has this mode, this indicates that they will receive [`WALLOPS`](#wallops-message) messages from the server. +If a user has this mode, this indicates that they will receive {% message WALLOPS %} messages from the server. ## Channel Modes @@ -83,7 +83,7 @@ This mode is standard, and the mode letter used for it is `"+b"`. This channel mode controls a list of client masks that are 'banned' from joining or speaking in the channel. If this mode has values, each of these values should be a client mask. -If this mode is set on a channel, and a client sends a `JOIN` request for this channel, their nickmask (the combination of `nick!user@host`) is compared with each banned client mask set with this mode. If they match one of these banned masks, they will receive an [`ERR_BANNEDFROMCHAN`](#errbannedfromchan-474) reply and the `JOIN` command will fail. See the [ban exemption](#ban-exemption-channel-mode) mode for more details. +If this mode is set on a channel, and a client sends a `JOIN` request for this channel, their nickmask (the combination of `nick!user@host`) is compared with each banned client mask set with this mode. If they match one of these banned masks, they will receive an {% numeric ERR_BANNEDFROMCHAN %} reply and the `JOIN` command will fail. See the [ban exemption](#ban-exemption-channel-mode) mode for more details. ### Exception Channel Mode @@ -99,7 +99,7 @@ This mode is standard, and the mode letter used for it is `"+l"`. This channel mode controls whether new users may join based on the number of users who already exist in the channel. If this mode is set, its value is an integer and defines the limit of how many clients may be joined to the channel. -If this mode is set on a channel, and the number of users joined to that channel matches or exceeds the value of this mode, new users cannot join that channel. If a client sends a `JOIN` request for this channel, they will receive an [`ERR_CHANNELISFULL`](#errchannelisfull-471) reply and the command will fail. +If this mode is set on a channel, and the number of users joined to that channel matches or exceeds the value of this mode, new users cannot join that channel. If a client sends a `JOIN` request for this channel, they will receive an {% numeric ERR_CHANNELISFULL %} reply and the command will fail. ### Invite-Only Channel Mode @@ -107,7 +107,7 @@ This mode is standard, and the mode letter used for it is `"+i"`. This channel mode controls whether new users need to be invited to the channel before being able to join. -If this mode is set on a channel, a user must have received an [`INVITE`](#invite-message) for this channel before being allowed to join it. If they have not received an invite, they will receive an [`ERR_INVITEONLYCHAN`](#errinviteonlychan-473) reply and the command will fail. +If this mode is set on a channel, a user must have received an {% message INVITE %} for this channel before being allowed to join it. If they have not received an invite, they will receive an {% numeric ERR_INVITEONLYCHAN %} reply and the command will fail. ### Invite-Exception Channel Mode @@ -123,7 +123,7 @@ This mode is standard, and the mode letter used for it is `"+k"`. This mode letter sets a 'key' that must be supplied in order to join this channel. If this mode is set, its' value is the key that is required. -If this mode is set on a channel, and a client sends a `JOIN` request for that channel, they must supply `` in order for the command to succeed. If they do not supply a ``, or the key they supply does not match the value of this mode, they will receive an [`ERR_BADCHANNELKEY`](#errbadchannelkey-475) reply and the command will fail. +If this mode is set on a channel, and a client sends a `JOIN` request for that channel, they must supply `` in order for the command to succeed. If they do not supply a ``, or the key they supply does not match the value of this mode, they will receive an {% numeric ERR_BADCHANNELKEY %} reply and the command will fail. ### Moderated Channel Mode @@ -139,7 +139,7 @@ This mode is standard, and the mode letter used for it is `"+s"`. This channel mode controls whether the channel is 'secret', and does not have any value. -A channel that is set to secret will not show up in responses to the [`LIST`](#list-message) or [`NAMES`](#names-message) command unless the client sending the command is joined to the channel. Likewise, secret channels will not show up in the [`RPL_WHOISCHANNELS`](#rplwhoischannels-319) numeric unless the user the numeric is being sent to is joined to that channel. +A channel that is set to secret will not show up in responses to the {% message LIST %} or {% message NAMES %} command unless the client sending the command is joined to the channel. Likewise, secret channels will not show up in the {% numeric RPL_WHOISCHANNELS %} numeric unless the user the numeric is being sent to is joined to that channel. ### Protected Topic Mode @@ -147,7 +147,7 @@ This mode is standard, and the mode letter used for it is `"+t"`. This channel mode controls whether channel privileges are required to set the topic, and does not have any value. -If this mode is enabled, users must have channel privileges such as [halfop](#halfop-prefix) or [operator](#operator-prefix) status in order to change the topic of a channel. In a channel that does not have this mode enabled, anyone may set the topic of the channel using the [`TOPIC`](#topic-message) command. +If this mode is enabled, users must have channel privileges such as [halfop](#halfop-prefix) or [operator](#operator-prefix) status in order to change the topic of a channel. In a channel that does not have this mode enabled, anyone may set the topic of the channel using the {% message TOPIC %} command. ### No External Messages Mode @@ -155,11 +155,11 @@ This mode is standard, and the mode letter used for it is `"+n"`. This channel mode controls whether users who are not joined to the channel can send messages to it, and does not have any value. -If this mode is enabled, users MUST be joined to the channel in order to send [private messages](#privmsg-message) and [notices](#notice-message) to the channel. If this mode is enabled and they try to send one of these to a channel they are not joined to, they will receive an [`ERR_CANNOTSENDTOCHAN`](#errcannotsendtochan-404) numeric and the message will not be sent to that channel. +If this mode is enabled, users MUST be joined to the channel in order to send [private messages](#privmsg-message) and [notices](#notice-message) to the channel. If this mode is enabled and they try to send one of these to a channel they are not joined to, they will receive an {% numeric ERR_CANNOTSENDTOCHAN %} numeric and the message will not be sent to that channel. ## Channel Membership Prefixes -Users joined to a channel may get certain privileges or status in that channel based on channel modes given to them. These users are given prefixes before their nickname whenever it is associated with a channel (ie, in [`NAMES`](#names-message), [`WHO`](#who-message) and [`WHOIS`](#whois-message) messages). The standard and common prefixes are listed here, and MUST be advertised by the server in the [`PREFIX`](#prefix-parameter) `RPL_ISUPPORT` parameter on connection. +Users joined to a channel may get certain privileges or status in that channel based on channel modes given to them. These users are given prefixes before their nickname whenever it is associated with a channel (ie, in {% message NAMES %}, {% message WHO %} and {% message WHOIS %} messages). The standard and common prefixes are listed here, and MUST be advertised by the server in the [`PREFIX`](#prefix-parameter) `RPL_ISUPPORT` parameter on connection. ### Founder Prefix @@ -218,26 +218,26 @@ Servers that implement spoofed hostmasks in any capacity SHOULD NOT include the Clients MUST NOT try to extract the hostname from the final parameter of this message and then attempt to resolve this hostname. This method of operation WILL BREAK and will cause issues when the server returns a spoofed hostname. -### `RPL_YOURHOST (002)` +{% numericheader RPL_YOURHOST %} " :Your host is , running version " Part of the post-registration greeting, this numeric returns the name and software/version of the server the client is currently connected to. The text used in the last param of this message varies wildly. -### `RPL_CREATED (003)` +{% numericheader RPL_CREATED %} " :This server was created " Part of the post-registration greeting, this numeric returns a human-readable date/time that the server was started or created. The text used in the last param of this message varies wildly. -### `RPL_MYINFO (004)` +{% numericheader RPL_MYINFO %} " []" Part of the post-registration greeting. Clients SHOULD discover available features using `RPL_ISUPPORT` tokens rather than the mode letters listed in this reply. -### `RPL_ISUPPORT (005)` +{% numericheader RPL_ISUPPORT %} " <1-13 tokens> :are supported by this server" @@ -252,7 +252,7 @@ The ABNF representation for an `RPL_ISUPPORT` token is: As the maximum number of message parameters to any reply is 15, the maximum number of `RPL_ISUPPORT` tokens that can be advertised is 13. To counter this, a server MAY issue multiple `RPL_ISUPPORT` numerics. A server MUST issue at least one `RPL_ISUPPORT` numeric after client registration has completed. It MUST be issued before further commands from the client are processed. -When clients send a [`VERSION`](#version-message) command to an external server (i.e. not the one they're currently connected to), they receive the appropriate information from that server. That external server's `ISUPPORT` tokens are sent to the client using the `105` (`RPL_REMOTEISUPPORT`) numeric instead of `005`, to ensure that clients don't process and start using these tokens sent by an external server. The format of the `105` message is exactly the same as `RPL_ISUPPORT` – the numeric itself is the only difference. +When clients send a {% message VERSION %} command to an external server (i.e. not the one they're currently connected to), they receive the appropriate information from that server. That external server's `ISUPPORT` tokens are sent to the client using the `105` (`RPL_REMOTEISUPPORT`) numeric instead of `005`, to ensure that clients don't process and start using these tokens sent by an external server. The format of the `105` message is exactly the same as `RPL_ISUPPORT` – the numeric itself is the only difference. A token is of the form `PARAMETER`, `PARAMETER=VALUE` or `-PARAMETER`. Servers MUST send the parameter as upper-case text. @@ -268,7 +268,7 @@ A single `RPL_ISUPPORT` reply MUST NOT contain the same parameter multiple times See the [Feature Advertisement](#feature-advertisement) section for more details on this numeric. A list of parameters is available in the [`RPL_ISUPPORT` Parameters](#RPL_ISUPPORT-parameters) section. -### `RPL_BOUNCE (010)` +{% numericheader RPL_BOUNCE %} " :" @@ -278,113 +278,113 @@ Because this numeric does not specify whether to enable SSL and is not interpret This numeric is also known as `RPL_REDIR` by some software. -### `RPL_UMODEIS (221)` +{% numericheader RPL_UMODEIS %} " " Sent to a client to inform that client of their currently-set user modes. -### `RPL_LUSERCLIENT (251)` +{% numericheader RPL_LUSERCLIENT %} " :There are users and invisible on servers" -Sent as a reply to the [`LUSERS`](#lusers-message) command. ``, ``, and `` are non-negative integers, and represent the number of total users, invisible users, and other servers connected to this server. +Sent as a reply to the {% message LUSERS %} command. ``, ``, and `` are non-negative integers, and represent the number of total users, invisible users, and other servers connected to this server. -### `RPL_LUSEROP (252)` +{% numericheader RPL_LUSEROP %} " :operator(s) online" -Sent as a reply to the [`LUSERS`](#lusers-message) command. `` is a positive integer and represents the number of [IRC operators](#operators) connected to this server. The text used in the last param of this message may vary. +Sent as a reply to the {% message LUSERS %} command. `` is a positive integer and represents the number of [IRC operators](#operators) connected to this server. The text used in the last param of this message may vary. -### `RPL_LUSERUNKNOWN (253)` +{% numericheader RPL_LUSERUNKNOWN %} " :unknown connection(s)" -Sent as a reply to the [`LUSERS`](#lusers-message) command. `` is a positive integer and represents the number of connections to this server that are currently in an unknown state. The text used in the last param of this message may vary. +Sent as a reply to the {% message LUSERS %} command. `` is a positive integer and represents the number of connections to this server that are currently in an unknown state. The text used in the last param of this message may vary. -### `RPL_LUSERCHANNELS (254)` +{% numericheader RPL_LUSERCHANNELS %} " :channels formed" -Sent as a reply to the [`LUSERS`](#lusers-message) command. `` is a positive integer and represents the number of channels that currently exist on this server. The text used in the last param of this message may vary. +Sent as a reply to the {% message LUSERS %} command. `` is a positive integer and represents the number of channels that currently exist on this server. The text used in the last param of this message may vary. -### `RPL_LUSERME (255)` +{% numericheader RPL_LUSERME %} " :I have clients and servers" -Sent as a reply to the [`LUSERS`](#lusers-message) command. `` and `` are non-negative integers and represent the number of clients and other servers connected to this server, respectively. +Sent as a reply to the {% message LUSERS %} command. `` and `` are non-negative integers and represent the number of clients and other servers connected to this server, respectively. -### `RPL_ADMINME (256)` +{% numericheader RPL_ADMINME %} " [] :Administrative info" -Sent as a reply to an [`ADMIN`](#admin-message) command, this numeric establishes the name of the server whose administrative info is being provided. The text used in the last param of this message may vary. +Sent as a reply to an {% message ADMIN %} command, this numeric establishes the name of the server whose administrative info is being provided. The text used in the last param of this message may vary. `` is optional and MAY be included in responses, the server can also be gained from the `` of this message. -### `RPL_ADMINLOC1 (257)` +{% numericheader RPL_ADMINLOC1 %} " :" -Sent as a reply to an [`ADMIN`](#admin-message) command, `` is a string intended to provide information about the location of the server (i.e. city, state and country). The text used in the last param of this message varies wildly. +Sent as a reply to an {% message ADMIN %} command, `` is a string intended to provide information about the location of the server (i.e. city, state and country). The text used in the last param of this message varies wildly. -### `RPL_ADMINLOC2 (258)` +{% numericheader RPL_ADMINLOC2 %} " :" -Sent as a reply to an [`ADMIN`](#admin-message) command, `` is a string intended to provide information about whoever runs the server (i.e. details of the institution hosting it). The text used in the last param of this message varies wildly. +Sent as a reply to an {% message ADMIN %} command, `` is a string intended to provide information about whoever runs the server (i.e. details of the institution hosting it). The text used in the last param of this message varies wildly. -### `RPL_ADMINEMAIL (259)` +{% numericheader RPL_ADMINEMAIL %} " :" -Sent as a reply to an [`ADMIN`](#admin-message) command, `` MUST contain the email address to contact the administrator(s) of the server. The text used in the last param of this message varies wildly. +Sent as a reply to an {% message ADMIN %} command, `` MUST contain the email address to contact the administrator(s) of the server. The text used in the last param of this message varies wildly. -### `RPL_TRYAGAIN (263)` +{% numericheader RPL_TRYAGAIN %} " :Please wait a while and try again." When a server drops a command without processing it, this numeric MUST be sent to inform the client. The text used in the last param of this message varies wildly, and commonly provides the client with more information about why the command could not be processed (i.e., due to rate-limiting). -### `RPL_LOCALUSERS (265)` +{% numericheader RPL_LOCALUSERS %} " [ ] :Current local users , max " -Sent as a reply to the [`LUSERS`](#lusers-message) command. `` and `` are non-negative integers and represent the number of clients currently and the maximum number of clients that have been connected directly to this server at one time, respectively. +Sent as a reply to the {% message LUSERS %} command. `` and `` are non-negative integers and represent the number of clients currently and the maximum number of clients that have been connected directly to this server at one time, respectively. The two optional parameters SHOULD be supplied to allow clients to better extract these numbers. -### `RPL_GLOBALUSERS (266)` +{% numericheader RPL_GLOBALUSERS %} " [ ] :Current global users , max " -Sent as a reply to the [`LUSERS`](#lusers-message) command. `` and `` are non-negative integers. `` represents the number of clients currently connected to this server, globally (directly and through other server links). `` represents the maximum number of clients that have been connected to this server at one time, globally. +Sent as a reply to the {% message LUSERS %} command. `` and `` are non-negative integers. `` represents the number of clients currently connected to this server, globally (directly and through other server links). `` represents the maximum number of clients that have been connected to this server at one time, globally. The two optional parameters SHOULD be supplied to allow clients to better extract these numbers. -### `RPL_WHOISCERTFP (276)` +{% numericheader RPL_WHOISCERTFP %} " :has client certificate fingerprint " -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric shows the SSL/TLS certificate fingerprint used by the client with the nickname ``. Clients MUST only be sent this numeric if they are either using the `WHOIS` command on themselves or they are an [operator](#operators). +Sent as a reply to the {% message WHOIS %} command, this numeric shows the SSL/TLS certificate fingerprint used by the client with the nickname ``. Clients MUST only be sent this numeric if they are either using the `WHOIS` command on themselves or they are an [operator](#operators). -### `RPL_NONE (300)` +{% numericheader RPL_NONE %} Undefined format `RPL_NONE` is a dummy numeric. It does not have a defined use nor format. -### `RPL_AWAY (301)` +{% numericheader RPL_AWAY %} " :" Indicates that the user with the nickname `` is currently away and sends the away message that they set. -### `RPL_USERHOST (302)` +{% numericheader RPL_USERHOST %} " :[{ }]" -Sent as a reply to the [`USERHOST`](#userhost-message) command, this numeric lists nicknames and the information associated with them. The last parameter of this numeric (if there are any results) is a list of `` values, delimited by a SPACE character `(' ', 0x20)`. +Sent as a reply to the {% message USERHOST %} command, this numeric lists nicknames and the information associated with them. The last parameter of this numeric (if there are any results) is a list of `` values, delimited by a SPACE character `(' ', 0x20)`. The ABNF representation for `` is: @@ -394,157 +394,157 @@ The ABNF representation for `` is: `` is included if the user with the nickname of `` has registered as an [operator](#operators). `` represents whether that user has set an [away] message. `"+"` represents that the user is not away, and `"-"` represents that the user is away. -### `RPL_ISON (303)` +{% numericheader RPL_ISON %} " :[{ }]" -Sent as a reply to the [`ISON`](#ison-message) command, this numeric lists the nicks that are present on the network. The last parameter of this numeric (if there are any results) is a list of nicknames, delimited by a SPACE character `(' ', 0x20)`. +Sent as a reply to the {% message ISON %} command, this numeric lists the nicks that are present on the network. The last parameter of this numeric (if there are any results) is a list of nicknames, delimited by a SPACE character `(' ', 0x20)`. -### `RPL_UNAWAY (305)` +{% numericheader RPL_UNAWAY %} " :You are no longer marked as being away" -Sent as a reply to the [`AWAY`](#away-message) command, this lets the client know that they are no longer set as being away. The text used in the last param of this message may vary. +Sent as a reply to the {% message AWAY %} command, this lets the client know that they are no longer set as being away. The text used in the last param of this message may vary. -### `RPL_NOWAWAY (306)` +{% numericheader RPL_NOWAWAY %} " :You have been marked as being away" -Sent as a reply to the [`AWAY`](#away-message) command, this lets the client know that they are set as being away. The text used in the last param of this message may vary. +Sent as a reply to the {% message AWAY %} command, this lets the client know that they are set as being away. The text used in the last param of this message may vary. -### `RPL_WHOISUSER (311)` +{% numericheader RPL_WHOISUSER %} " * :" -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric shows details about the client with the nickname ``. `` and `` represent the names set by the [`USER`](#user-message) command (though `` may be set by the server in other ways). `` represents the host used for the client in nickmasks (which may or may not be a real hostname or IP address). `` CANNOT start with a colon `(':', 0x3A)` as this would get parsed as a trailing parameter – IPv6 addresses such as `"::1"` are prefixed with a zero `('0', 0x30)` to ensure this. The second-last parameter is a literal asterisk character `('*', 0x2A)` and does not mean anything. +Sent as a reply to the {% message WHOIS %} command, this numeric shows details about the client with the nickname ``. `` and `` represent the names set by the {% message USER %} command (though `` may be set by the server in other ways). `` represents the host used for the client in nickmasks (which may or may not be a real hostname or IP address). `` CANNOT start with a colon `(':', 0x3A)` as this would get parsed as a trailing parameter – IPv6 addresses such as `"::1"` are prefixed with a zero `('0', 0x30)` to ensure this. The second-last parameter is a literal asterisk character `('*', 0x2A)` and does not mean anything. -### `RPL_WHOISSERVER (312)` +{% numericheader RPL_WHOISSERVER %} " :" -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric shows which server the client with the nickname `` is connected to. `` is the name of the server (as used in message prefixes). `` is a string containing a description of that server. +Sent as a reply to the {% message WHOIS %} command, this numeric shows which server the client with the nickname `` is connected to. `` is the name of the server (as used in message prefixes). `` is a string containing a description of that server. -### `RPL_WHOISOPERATOR (313)` +{% numericheader RPL_WHOISOPERATOR %} " :is an IRC operator" -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric indicates that the client with the nickname `` is an [operator](#operators). This command MAY also indicate what type or level of operator the client is by changing the text in the last parameter of this numeric. The text used in the last param of this message varies wildly, and SHOULD be displayed as-is by IRC clients to their users. +Sent as a reply to the {% message WHOIS %} command, this numeric indicates that the client with the nickname `` is an [operator](#operators). This command MAY also indicate what type or level of operator the client is by changing the text in the last parameter of this numeric. The text used in the last param of this message varies wildly, and SHOULD be displayed as-is by IRC clients to their users. -### `RPL_WHOWASUSER (314)` +{% numericheader RPL_WHOWASUSER %} " * :" -Sent as a reply to the [`WHOWAS`](#whowas-message) command, this numeric shows details about the last client that used the nickname ``. The purpose of each argument is the same as with the [`RPL_WHOISUSER`](#rplwhoisuser-311) numeric. +Sent as a reply to the {% message WHOWAS %} command, this numeric shows details about the last client that used the nickname ``. The purpose of each argument is the same as with the {% numeric RPL_WHOISUSER %} numeric. -### `RPL_WHOISIDLE (317)` +{% numericheader RPL_WHOISIDLE %} " [] :seconds idle, signon time -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric indicates how long the client with the nickname `` has been idle. `` is the number of seconds since the client has been active. Servers generally denote specific commands (for instance, perhaps [`JOIN`](#join-message), [`PRIVMSG`](#privmsg-message), [`NOTICE`](#notice-message), etc) as updating the 'idle time', and calculate this off when the idle time was last updated. `` is a unix timestamp representing when the user joined the network. The text used in the last param of this message may vary. +Sent as a reply to the {% message WHOIS %} command, this numeric indicates how long the client with the nickname `` has been idle. `` is the number of seconds since the client has been active. Servers generally denote specific commands (for instance, perhaps {% message JOIN %}, {% message PRIVMSG %}, {% message NOTICE %}, etc) as updating the 'idle time', and calculate this off when the idle time was last updated. `` is a unix timestamp representing when the user joined the network. The text used in the last param of this message may vary. -### `RPL_ENDOFWHOIS (318)` +{% numericheader RPL_ENDOFWHOIS %} " :End of /WHOIS list" -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric indicates the end of a `WHOIS` response for the client with the nickname ``. This numeric is sent after all other `WHOIS` response numerics have been sent to the client. +Sent as a reply to the {% message WHOIS %} command, this numeric indicates the end of a `WHOIS` response for the client with the nickname ``. This numeric is sent after all other `WHOIS` response numerics have been sent to the client. -### `RPL_WHOISCHANNELS (319)` +{% numericheader RPL_WHOISCHANNELS %} " :[prefix]{ [prefix]} -Sent as a reply to the [`WHOIS`](#whois-message) command, this numeric lists the channels that the client with the nickname `` is joined to and their status in these channels. `` is the highest [channel membership prefix](#channel-membership-prefixes) that the client has in that channel, if the client has one. `` is the name of a channel that the client is joined to. The last parameter of this numeric is a list of `[prefix]` pairs, delimited by a SPACE character `(' ', 0x20)`. +Sent as a reply to the {% message WHOIS %} command, this numeric lists the channels that the client with the nickname `` is joined to and their status in these channels. `` is the highest [channel membership prefix](#channel-membership-prefixes) that the client has in that channel, if the client has one. `` is the name of a channel that the client is joined to. The last parameter of this numeric is a list of `[prefix]` pairs, delimited by a SPACE character `(' ', 0x20)`. The channels in this response are affected by the [secret](#secret-channel-mode) channel mode and the [invisible](#invisible-user-mode) user mode, and may be affected by other modes depending on server software and configuration. -### `RPL_LISTSTART (321)` +{% numericheader RPL_LISTSTART %} " Channel :Users Name" -Sent as a reply to the [`LIST`](#list-message) command, this numeric marks the start of a channel list. As noted in the command description, this numeric MAY be skipped by the server so clients MUST NOT depend on receiving it. +Sent as a reply to the {% message LIST %} command, this numeric marks the start of a channel list. As noted in the command description, this numeric MAY be skipped by the server so clients MUST NOT depend on receiving it. -### `RPL_LIST (322)` +{% numericheader RPL_LIST %} " :" -Sent as a reply to the [`LIST`](#list-message) command, this numeric sends information about a channel to the client. `` is the name of the channel. `` is an integer indicating how many clients are joined to that channel. `` is the channel's topic (as set by the [`TOPIC`](#topic-message) command). +Sent as a reply to the {% message LIST %} command, this numeric sends information about a channel to the client. `` is the name of the channel. `` is an integer indicating how many clients are joined to that channel. `` is the channel's topic (as set by the {% message TOPIC %} command). -### `RPL_LISTEND (323)` +{% numericheader RPL_LISTEND %} " :End of /LIST" -Sent as a reply to the [`LIST`](#list-message) command, this numeric indicates the end of a `LIST` response. +Sent as a reply to the {% message LIST %} command, this numeric indicates the end of a `LIST` response. -### `RPL_CHANNELMODEIS (324)` +{% numericheader RPL_CHANNELMODEIS %} " ..." -Sent to a client to inform them of the currently-set modes of a channel. `` is the name of the channel. `` and `` are a mode string and the mode arguments (delimited as separate parameters) as defined in the [`MODE`](#mode-message) message description. +Sent to a client to inform them of the currently-set modes of a channel. `` is the name of the channel. `` and `` are a mode string and the mode arguments (delimited as separate parameters) as defined in the {% message MODE %} message description. -### `RPL_CREATIONTIME (329)` +{% numericheader RPL_CREATIONTIME %} " " Sent to a client to inform them of the creation time of a channel. `` is the name of the channel. `` is a unix timestamp representing when the channel was created on the network. -### `RPL_NOTOPIC (331)` +{% numericheader RPL_NOTOPIC %} " :No topic is set" Sent to a client when joining a channel to inform them that the channel with the name `` does not have any topic set. -### `RPL_TOPIC (332)` +{% numericheader RPL_TOPIC %} " :" Sent to a client when joining the `` to inform them of the current [topic](#topic-message) of the channel. -### `RPL_TOPICWHOTIME (333)` +{% numericheader RPL_TOPICWHOTIME %} " " -Sent to a client to let them know who set the topic (``) and when they set it (`` is a unix timestamp). Sent after [`RPL_TOPIC`](#rpltopic-332). +Sent to a client to let them know who set the topic (``) and when they set it (`` is a unix timestamp). Sent after {% numeric RPL_TOPIC %}. -### `RPL_INVITING (341)` +{% numericheader RPL_INVITING %} " " -Sent as a reply to the [`INVITE`](#invite-message) command to indicate that the attempt was successful and the client with the nickname `` has been invited to ``. +Sent as a reply to the {% message INVITE %} command to indicate that the attempt was successful and the client with the nickname `` has been invited to ``. -### `RPL_INVITELIST (346)` +{% numericheader RPL_INVITELIST %} " " -Sent as a reply to the [`MODE`](#mode-message) command, when clients are viewing the current entries on a channel's [invite-exception list](#invite-exception-channel-mode). `` is the given mask on the invite-exception list. +Sent as a reply to the {% message MODE %} command, when clients are viewing the current entries on a channel's [invite-exception list](#invite-exception-channel-mode). `` is the given mask on the invite-exception list. -### `RPL_ENDOFINVITELIST (347)` +{% numericheader RPL_ENDOFINVITELIST %} " :End of channel invite list" -Sent as a reply to the [`MODE`](#mode-message) command, this numeric indicates the end of a channel's [invite-exception list](#invite-exception-channel-mode). +Sent as a reply to the {% message MODE %} command, this numeric indicates the end of a channel's [invite-exception list](#invite-exception-channel-mode). -### `RPL_EXCEPTLIST (348)` +{% numericheader RPL_EXCEPTLIST %} " " -Sent as a reply to the [`MODE`](#mode-message) command, when clients are viewing the current entries on a channel's [exception list](#exception-channel-mode). `` is the given mask on the exception list. +Sent as a reply to the {% message MODE %} command, when clients are viewing the current entries on a channel's [exception list](#exception-channel-mode). `` is the given mask on the exception list. -### `RPL_ENDOFEXCEPTLIST (349)` +{% numericheader RPL_ENDOFEXCEPTLIST %} " :End of channel exception list" -Sent as a reply to the [`MODE`](#mode-message) command, this numeric indicates the end of a channel's [exception list](#exception-channel-mode). +Sent as a reply to the {% message MODE %} command, this numeric indicates the end of a channel's [exception list](#exception-channel-mode). -### `RPL_VERSION (351)` +{% numericheader RPL_VERSION %} " :" -Sent as a reply to the [`VERSION`](#version-message) command, this numeric indicates information about the desired server. `` is the name and version of the software being used (including any revision information). `` is the name of the server. `` may contain any further comments or details about the specific version of the server. +Sent as a reply to the {% message VERSION %} command, this numeric indicates information about the desired server. `` is the name and version of the software being used (including any revision information). `` is the name of the server. `` may contain any further comments or details about the specific version of the server. -### `RPL_NAMREPLY (353)` +{% numericheader RPL_NAMREPLY %} " :[prefix]{ [prefix]}" -Sent as a reply to the [`NAMES`](#names-message) command, this numeric lists the clients that are joined to `` and their status in that channel. +Sent as a reply to the {% message NAMES %} command, this numeric lists the clients that are joined to `` and their status in that channel. `` notes the status of the channel. It can be one of the following: @@ -554,61 +554,61 @@ Sent as a reply to the [`NAMES`](#names-message) command, this numeric lists the `` is the nickname of a client joined to that channel, and `` is the highest [channel membership prefix](#channel-membership-prefixes) that client has in the channel, if they have one. The last parameter of this numeric is a list of `[prefix]` pairs, delimited by a SPACE character `(' ', 0x20)`. -### `RPL_ENDOFNAMES (366)` +{% numericheader RPL_ENDOFNAMES %} " :End of /NAMES list" -Sent as a reply to the [`NAMES`](#names-message) command, this numeric specifies the end of a list of channel member names. +Sent as a reply to the {% message NAMES %} command, this numeric specifies the end of a list of channel member names. -### `RPL_BANLIST (367)` +{% numericheader RPL_BANLIST %} " " -Sent as a reply to the [`MODE`](#mode-message) command, when clients are viewing the current entries on a channel's [ban list](#ban-channel-mode). `` is the given mask on the ban list. +Sent as a reply to the {% message MODE %} command, when clients are viewing the current entries on a channel's [ban list](#ban-channel-mode). `` is the given mask on the ban list. -### `RPL_ENDOFBANLIST (368)` +{% numericheader RPL_ENDOFBANLIST %} " :End of channel ban list" -Sent as a reply to the [`MODE`](#mode-message) command, this numeric indicates the end of a channel's [ban list](#ban-channel-mode). +Sent as a reply to the {% message MODE %} command, this numeric indicates the end of a channel's [ban list](#ban-channel-mode). -### `RPL_ENDOFWHOWAS (369)` +{% numericheader RPL_ENDOFWHOWAS %} " :End of WHOWAS" -Sent as a reply to the [`WHOWAS`](#whowas-message) command, this numeric indicates the end of a `WHOWAS` reponse for the nickname ``. This numeric is sent after all other `WHOWAS` response numerics have been sent to the client. +Sent as a reply to the {% message WHOWAS %} command, this numeric indicates the end of a `WHOWAS` reponse for the nickname ``. This numeric is sent after all other `WHOWAS` response numerics have been sent to the client. -### `RPL_MOTDSTART (375)` +{% numericheader RPL_MOTDSTART %} " :- Message of the day - " Indicates the start of the [Message of the Day](#motd-message) to the client. The text used in the last param of this message may vary, and SHOULD be displayed as-is by IRC clients to their users. -### `RPL_MOTD (372)` +{% numericheader RPL_MOTD %} " :" -When sending the [`Message of the Day`](#motd-message) to the client, servers reply with each line of the `MOTD` as this numeric. `MOTD` lines MAY be wrapped to 80 characters by the server. +When sending the {% message Message of the Day %} to the client, servers reply with each line of the `MOTD` as this numeric. `MOTD` lines MAY be wrapped to 80 characters by the server. -### `RPL_ENDOFMOTD (376)` +{% numericheader RPL_ENDOFMOTD %} " :End of /MOTD command." Indicates the end of the [Message of the Day](#motd-message) to the client. The text used in the last param of this message may vary. -### `RPL_YOUREOPER (381)` +{% numericheader RPL_YOUREOPER %} " :You are now an IRC operator" -Sent to a client which has just successfully issued an [`OPER`](#oper-message) command and gained [operator](#operators) status. The text used in the last param of this message varies wildly. +Sent to a client which has just successfully issued an {% message OPER %} command and gained [operator](#operators) status. The text used in the last param of this message varies wildly. -### `RPL_REHASHING (382)` +{% numericheader RPL_REHASHING %} " :Rehashing" -Sent to an [operator](#operators) which has just successfully issued a [`REHASH`](#rehash-message) command. The text used in the last param of this message may vary. +Sent to an [operator](#operators) which has just successfully issued a {% message REHASH %} command. The text used in the last param of this message may vary. -### `ERR_UNKNOWNERROR (400)` +{% numericheader ERR_UNKNOWNERROR %} " { } :" @@ -624,25 +624,25 @@ For an issue with a hypothetical command `PACK` with the subcommand `BOX`, this This numeric indicates a very generalised error (which `` should further explain). If there is another more specific numeric which represents the error occuring, that should be used instead. -### `ERR_NOSUCHNICK (401)` +{% numericheader ERR_NOSUCHNICK %} " :No such nick/channel" Indicates that no client can be found for the supplied nickname. The text used in the last param of this message may vary. -### `ERR_NOSUCHSERVER (402)` +{% numericheader ERR_NOSUCHSERVER %} " :No such server" Indicates that the given server name does not exist. The text used in the last param of this message may vary. -### `ERR_NOSUCHCHANNEL (403)` +{% numericheader ERR_NOSUCHCHANNEL %} " :No such channel" Indicates that no channel can be found for the supplied channel name. The text used in the last param of this message may vary. -### `ERR_CANNOTSENDTOCHAN (404)` +{% numericheader ERR_CANNOTSENDTOCHAN %} " :Cannot send to channel" @@ -650,161 +650,161 @@ Indicates that the `PRIVMSG` / `NOTICE` could not be delivered to ``. T This is generally sent in response to channel modes, such as a channel being [moderated](#moderated-channel-mode) and the client not having permission to speak on the channel, or not being joined to a channel with the [no external messages](#no-external-messages-mode) mode set. -### `ERR_TOOMANYCHANNELS (405)` +{% numericheader ERR_TOOMANYCHANNELS %} " :You have joined too many channels" Indicates that the `JOIN` command failed because the client has joined their maximum number of channels. The text used in the last param of this message may vary. -### `ERR_UNKNOWNCOMMAND (421)` +{% numericheader ERR_UNKNOWNCOMMAND %} " :Unknown command" Sent to a registered client to indicate that the command they sent isn't known by the server. The text used in the last param of this message may vary. -### `ERR_NOMOTD (422)` +{% numericheader ERR_NOMOTD %} " :MOTD File is missing" Indicates that the [Message of the Day](#motd-message) file does not exist or could not be found. The text used in the last param of this message may vary. -### `ERR_ERRONEUSNICKNAME (432)` +{% numericheader ERR_ERRONEUSNICKNAME %} " :Erroneus nickname" -Returned when a [`NICK`](#nick-message) command cannot be successfully completed as the desired nickname contains characters that are disallowed by the server. See the [wire format](#wire-format-in-abnf) section for more information on characters which are allowed in various IRC servers. The text used in the last param of this message may vary. +Returned when a {% message NICK %} command cannot be successfully completed as the desired nickname contains characters that are disallowed by the server. See the [wire format](#wire-format-in-abnf) section for more information on characters which are allowed in various IRC servers. The text used in the last param of this message may vary. -### `ERR_NICKNAMEINUSE (433)` +{% numericheader ERR_NICKNAMEINUSE %} " :Nickname is already in use" -Returned when a [`NICK`](#nick-message) command cannot be successfully completed as the desired nickname is already in use on the network. The text used in the last param of this message may vary. +Returned when a {% message NICK %} command cannot be successfully completed as the desired nickname is already in use on the network. The text used in the last param of this message may vary. -### `ERR_USERNOTINCHANNEL (441)` +{% numericheader ERR_USERNOTINCHANNEL %} " :They aren't on that channel" Returned when a client tries to perform a channel+nick affecting command, when the nick isn't joined to the channel (for example, `MODE #channel +o nick`). -### `ERR_NOTONCHANNEL (442)` +{% numericheader ERR_NOTONCHANNEL %} " :You're not on that channel" Returned when a client tries to perform a channel-affecting command on a channel which the client isn't a part of. -### `ERR_USERONCHANNEL (443)` +{% numericheader ERR_USERONCHANNEL %} " :is already on channel" Returned when a client tries to invite `` to a channel they're already joined to. -### `ERR_NOTREGISTERED (451)` +{% numericheader ERR_NOTREGISTERED %} " :You have not registered" Returned when a client command cannot be parsed as they are not yet registered. Servers offer only a limited subset of commands until clients are properly registered to the server. The text used in the last param of this message may vary. -### `ERR_NEEDMOREPARAMS (461)` +{% numericheader ERR_NEEDMOREPARAMS %} " :Not enough parameters" Returned when a client command cannot be parsed because not enough parameters were supplied. The text used in the last param of this message may vary. -### `ERR_ALREADYREGISTERED (462)` +{% numericheader ERR_ALREADYREGISTERED %} " :You may not reregister" Returned when a client tries to change a detail that can only be set during registration (such as resending the [`PASS`](#pass-command) or [`USER`](#user-command) after registration). The text used in the last param of this message varies. -### `ERR_PASSWDMISMATCH (464)` +{% numericheader ERR_PASSWDMISMATCH %} " :Password incorrect" Returned to indicate that the connection could not be registered as the [password](#pass-message) was either incorrect or not supplied. The text used in the last param of this message may vary. -### `ERR_YOUREBANNEDCREEP (465)` +{% numericheader ERR_YOUREBANNEDCREEP %} " :You are banned from this server." Returned to indicate that the server has been configured to explicitly deny connections from this client. The text used in the last param of this message varies wildly and typically also contains the reason for the ban and/or ban details, and SHOULD be displayed as-is by IRC clients to their users. -### `ERR_CHANNELISFULL (471)` +{% numericheader ERR_CHANNELISFULL %} " :Cannot join channel (+l)" -Returned to indicate that a [`JOIN`](#join-message) command failed because the [client limit](#client-limit-channel-mode) mode has been set and the maximum number of users are already joined to the channel. The text used in the last param of this message may vary. +Returned to indicate that a {% message JOIN %} command failed because the [client limit](#client-limit-channel-mode) mode has been set and the maximum number of users are already joined to the channel. The text used in the last param of this message may vary. -### `ERR_UNKNOWNMODE (472)` +{% numericheader ERR_UNKNOWNMODE %} " :is unknown mode char to me" Indicates that a mode character used by a client is not recognized by the server. The text used in the last param of this message may vary. -### `ERR_INVITEONLYCHAN (473)` +{% numericheader ERR_INVITEONLYCHAN %} " :Cannot join channel (+i)" -Returned to indicate that a [`JOIN`](#join-message) command failed because the channel is set to [invite-only] mode and the client has not been [invited](#invite-message) to the channel or had an [invite exemption](#invite-exemption-channel-mode) set for them. The text used in the last param of this message may vary. +Returned to indicate that a {% message JOIN %} command failed because the channel is set to [invite-only] mode and the client has not been [invited](#invite-message) to the channel or had an [invite exemption](#invite-exemption-channel-mode) set for them. The text used in the last param of this message may vary. -### `ERR_BANNEDFROMCHAN (474)` +{% numericheader ERR_BANNEDFROMCHAN %} " :Cannot join channel (+b)" -Returned to indicate that a [`JOIN`](#join-message) command failed because the client has been [banned](#ban-channel-mode) from the channel and has not had a [ban exemption](#ban-exemption-channel-mode) set for them. The text used in the last param of this message may vary. +Returned to indicate that a {% message JOIN %} command failed because the client has been [banned](#ban-channel-mode) from the channel and has not had a [ban exemption](#ban-exemption-channel-mode) set for them. The text used in the last param of this message may vary. -### `ERR_BADCHANNELKEY (475)` +{% numericheader ERR_BADCHANNELKEY %} " :Cannot join channel (+k)" -Returned to indicate that a [`JOIN`](#join-message) command failed because the channel requires a [key](#key-channel-mode) and the key was either incorrect or not supplied. The text used in the last param of this message may vary. +Returned to indicate that a {% message JOIN %} command failed because the channel requires a [key](#key-channel-mode) and the key was either incorrect or not supplied. The text used in the last param of this message may vary. -### `ERR_BADCHANMASK (476)` +{% numericheader ERR_BADCHANMASK %} " :Bad Channel Mask" Indicates the supplied channel name is not a valid. -This is similar to, but stronger than, [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403), which indicates that the channel does not exist, but that it may be a valid name. +This is similar to, but stronger than, {% numeric ERR_NOSUCHCHANNEL %}, which indicates that the channel does not exist, but that it may be a valid name. The text used in the last param of this message may vary. -### `ERR_NOPRIVILEGES (481)` +{% numericheader ERR_NOPRIVILEGES %} " :Permission Denied- You're not an IRC operator" Indicates that the command failed because the user is not an [IRC operator](#operators). The text used in the last param of this message may vary. -### `ERR_CHANOPRIVSNEEDED (482)` +{% numericheader ERR_CHANOPRIVSNEEDED %} " :You're not channel operator" Indicates that a command failed because the client does not have the appropriate [channel privileges](#channel-operators). This numeric can apply for different prefixes such as [halfop](#halfop-prefix), [operator](#operator-prefix), etc. The text used in the last param of this message may vary. -### `ERR_CANTKILLSERVER (483)` +{% numericheader ERR_CANTKILLSERVER %} " :You cant kill a server!" -Indicates that a [`KILL`](#kill-message) command failed because the user tried to kill a server. The text used in the last param of this message may vary. +Indicates that a {% message KILL %} command failed because the user tried to kill a server. The text used in the last param of this message may vary. -### `ERR_NOOPERHOST (491)` +{% numericheader ERR_NOOPERHOST %} " :No O-lines for your host" -Indicates that an [`OPER`](#oper-message) command failed because the server has not been configured to allow connections from this client's host to become an operator. The text used in the last param of this message may vary. +Indicates that an {% message OPER %} command failed because the server has not been configured to allow connections from this client's host to become an operator. The text used in the last param of this message may vary. -### `ERR_UMODEUNKNOWNFLAG (501)` +{% numericheader ERR_UMODEUNKNOWNFLAG %} " :Unknown MODE flag" -Indicates that a [`MODE`](#mode-message) command affecting a user contained a `MODE` letter that was not recognized. The text used in the last param of this message may vary. +Indicates that a {% message MODE %} command affecting a user contained a `MODE` letter that was not recognized. The text used in the last param of this message may vary. -### `ERR_USERSDONTMATCH (502)` +{% numericheader ERR_USERSDONTMATCH %} " :Cant change mode for other users" -Indicates that a [`MODE`](#mode-message) command affecting a user failed because they were trying to set or view modes for other users. The text used in the last param of this message varies, for instance when trying to view modes for another user, a server may send: `"Can't view modes for other users"`. +Indicates that a {% message MODE %} command affecting a user failed because they were trying to set or view modes for other users. The text used in the last param of this message varies, for instance when trying to view modes for another user, a server may send: `"Can't view modes for other users"`. -### `RPL_STARTTLS (670)` +{% numericheader RPL_STARTTLS %} " :STARTTLS successful, proceed with TLS handshake" @@ -812,7 +812,7 @@ This numeric is used by the IRCv3 [`tls`](http://ircv3.net/specs/extensions/tls- The text used in the last param of this message varies wildly. -### `ERR_STARTTLS (691)` +{% numericheader ERR_STARTTLS %} " :STARTTLS failed (Wrong moon phase)" @@ -820,7 +820,7 @@ This numeric is used by the IRCv3 [`tls`](http://ircv3.net/specs/extensions/tls- The text used in the last param of this message varies wildly. -### `ERR_NOPRIVS (723)` +{% numericheader ERR_NOPRIVS %} " :Insufficient oper privileges." @@ -830,7 +830,7 @@ Sent by a server to alert an IRC [operator](#operators) that they they do not ha Examples of the sorts of privilege strings used by server software today include: `kline`, `dline`, `unkline`, `kill`, `kill:remote`, `die`, `remoteban`, `connect`, `connect:remote`, `rehash`. -### `RPL_LOGGEDIN (900)` +{% numericheader RPL_LOGGEDIN %} " !@ :You are now logged in as " @@ -838,7 +838,7 @@ This numeric indicates that the client was logged into the specified account (wh The text used in the last param of this message varies wildly. -### `RPL_LOGGEDOUT (901)` +{% numericheader RPL_LOGGEDOUT %} " !@ :You are now logged out" @@ -846,7 +846,7 @@ This numeric indicates that the client was logged out of their account. For more The text used in the last param of this message varies wildly. -### `ERR_NICKLOCKED (902)` +{% numericheader ERR_NICKLOCKED %} " :You must use a nick assigned to you" @@ -854,15 +854,15 @@ This numeric indicates that [SASL authentication](#authenticate-message) failed The text used in the last param of this message varies wildly. -### `RPL_SASLSUCCESS (903)` +{% numericheader RPL_SASLSUCCESS %} " :SASL authentication successful" -This numeric indicates that [SASL authentication](#authenticate-message) was completed successfully, and is normally sent along with [`RPL_LOGGEDIN`](#rplloggedin-900). For more information on this numeric, see the IRCv3 [`sasl-3.1`](http://ircv3.net/specs/extensions/sasl-3.1.html) extension. +This numeric indicates that [SASL authentication](#authenticate-message) was completed successfully, and is normally sent along with {% numeric RPL_LOGGEDIN %}. For more information on this numeric, see the IRCv3 [`sasl-3.1`](http://ircv3.net/specs/extensions/sasl-3.1.html) extension. The text used in the last param of this message varies wildly. -### `ERR_SASLFAIL (904)` +{% numericheader ERR_SASLFAIL %} " :SASL authentication failed" @@ -870,23 +870,23 @@ This numeric indicates that [SASL authentication](#authenticate-message) failed The text used in the last param of this message varies wildly. -### `ERR_SASLTOOLONG (905)` +{% numericheader ERR_SASLTOOLONG %} " :SASL message too long" -This numeric indicates that [SASL authentication](#authenticate-message) failed because the [`AUTHENTICATE`](#authenticate-message) command sent by the client was too long (i.e. the parameter was longer than 400 bytes). For more information on this numeric, see the IRCv3 [`sasl-3.1`](http://ircv3.net/specs/extensions/sasl-3.1.html) extension. +This numeric indicates that [SASL authentication](#authenticate-message) failed because the {% message AUTHENTICATE %} command sent by the client was too long (i.e. the parameter was longer than 400 bytes). For more information on this numeric, see the IRCv3 [`sasl-3.1`](http://ircv3.net/specs/extensions/sasl-3.1.html) extension. The text used in the last param of this message varies wildly. -### `ERR_SASLABORTED (906)` +{% numericheader ERR_SASLABORTED %} " :SASL authentication aborted" -This numeric indicates that [SASL authentication](#authenticate-message) failed because the client sent an [`AUTHENTICATE`](#authenticate-message) command with the parameter `('*', 0x2A)`. For more information on this numeric, see the IRCv3 [`sasl-3.1`](http://ircv3.net/specs/extensions/sasl-3.1.html) extension. +This numeric indicates that [SASL authentication](#authenticate-message) failed because the client sent an {% message AUTHENTICATE %} command with the parameter `('*', 0x2A)`. For more information on this numeric, see the IRCv3 [`sasl-3.1`](http://ircv3.net/specs/extensions/sasl-3.1.html) extension. The text used in the last param of this message varies wildly. -### `ERR_SASLALREADY (907)` +{% numericheader ERR_SASLALREADY %} " :You have already authenticated using SASL" @@ -894,7 +894,7 @@ This numeric indicates that [SASL authentication](#authenticate-message) failed The text used in the last param of this message varies wildly. -### `RPL_SASLMECHS (908)` +{% numericheader RPL_SASLMECHS %} " :are available SASL mechanisms" @@ -910,7 +910,7 @@ The text used in the last param of this message varies wildly. {% h1 RPL_ISUPPORT-parameters %}`RPL_ISUPPORT` Parameters{% endh1 %} -Used to [advertise features](#feature-advertisement) to clients, the [`RPL_ISUPPORT`](#rplisupport-005) numeric lists parameters that let the client know which features are active and their value, if any. +Used to [advertise features](#feature-advertisement) to clients, the {% numeric RPL_ISUPPORT %} numeric lists parameters that let the client know which features are active and their value, if any. The parameters listed here are standardised and/or widely-advertised by IRC servers today and do not include deprecated parameters. Servers SHOULD support at least the following parameters where appropriate, and may advertise any others. For a more extensive list of parameters advertised by this numeric, see the `irc-defs` [`RPL_ISUPPORT` list](https://defs.ircdocs.horse/defs/isupport.html). @@ -922,7 +922,7 @@ If a 'default value' is listed for a parameter, this is the assumed value of the Format: AWAYLEN= -The `AWAYLEN` parameter indicates the maximum length for the `` of an [`AWAY`](#away-message) command. If an [`AWAY`](#away-message) `` has more characters than this parameter, it may be silently truncated by the server before being passed on to other clients. Clients MAY receive an [`AWAY`](#away-message) `` that has more characters than this parameter. +The `AWAYLEN` parameter indicates the maximum length for the `` of an {% message AWAY %} command. If an {% message AWAY %} `` has more characters than this parameter, it may be silently truncated by the server before being passed on to other clients. Clients MAY receive an {% message AWAY %} `` that has more characters than this parameter. The value MUST be specified and MUST be a positive integer. @@ -980,9 +980,9 @@ Examples: Format: CHANMODES=A,B,C,D[,X,Y...] -The `CHANMODES` parameter specifies the channel modes available and which types of arguments they do or do not take when using them with the [`MODE`](#mode-message) command. +The `CHANMODES` parameter specifies the channel modes available and which types of arguments they do or do not take when using them with the {% message MODE %} command. -The value lists the channel mode letters of **Type A**, **B**, **C**, and **D**, respectively, delimited by a comma `(',', 0x2C)`. The channel mode types are defined in the the [`MODE`](#mode-message) message description. +The value lists the channel mode letters of **Type A**, **B**, **C**, and **D**, respectively, delimited by a comma `(',', 0x2C)`. The channel mode types are defined in the the {% message MODE %} message description. To allow for future extensions, a server MAY send additional types, delimited by a comma `(',', 0x2C)`. However, server authors SHOULD NOT extend this parameter without good reason, and SHOULD CONSIDER whether their mode would work as one of the existing types instead. The behaviour of any additional types is undefined. @@ -1033,7 +1033,7 @@ Examples: Format: ELIST= -The `ELIST` parameter indicates that the server supports search extensions to the [`LIST`](#list-message) command. +The `ELIST` parameter indicates that the server supports search extensions to the {% message LIST %} command. The value MUST be specified, and is a non-delimited list of letters, each of which denote an extension. The letters MUST be treated as being case-insensitive. @@ -1129,7 +1129,7 @@ Examples: Format: KICKLEN= -The `KICKLEN` parameter indicates the maximum length for the `` of a [`KICK`](#kick-message) command. If a [`KICK`](#kick-message) `` has more characters than this parameter, it may be silently truncated by the server before being passed on to other clients. Clients MAY receive a [`KICK`](#kick-message) `` that has more characters than this parameter. +The `KICKLEN` parameter indicates the maximum length for the `` of a {% message KICK %} command. If a {% message KICK %} `` has more characters than this parameter, it may be silently truncated by the server before being passed on to other clients. Clients MAY receive a {% message KICK %} `` that has more characters than this parameter. The value MUST be specified and MUST be a positive integer. @@ -1165,7 +1165,7 @@ Examples: Format: MAXTARGETS=[number] -The `MAXTARGETS` parameter specifies the maximum number of targets a [`PRIVMSG`](#privmsg-message) or [`NOTICE`](#notice-message) command may have, and may apply to other commands based on server software. +The `MAXTARGETS` parameter specifies the maximum number of targets a {% message PRIVMSG %} or {% message NOTICE %} command may have, and may apply to other commands based on server software. The value is OPTIONAL and if specified, `[number]` is a positive integer representing the maximum number of targets those commands may have. If there is no limit, then `[number]` MAY not be specified. @@ -1181,9 +1181,9 @@ Examples: Format: MODES=[number] -The `MODES` parameter specifies how many 'variable' modes may be set on a channel by a single [`MODE`](#mode-message) command from a client. A 'variable' mode is defined as being a type A, B or C mode as defined in the [`CHANMODES`](#chanmodes-parameter) parameter, or in the channel modes specified in the [`PREFIX`](#prefix-parameter) parameter. +The `MODES` parameter specifies how many 'variable' modes may be set on a channel by a single {% message MODE %} command from a client. A 'variable' mode is defined as being a type A, B or C mode as defined in the [`CHANMODES`](#chanmodes-parameter) parameter, or in the channel modes specified in the [`PREFIX`](#prefix-parameter) parameter. -A client SHOULD NOT issue more 'variable' modes than this in a single [`MODE`](#mode-message) command. A server MAY however issue more 'variable' modes than this in a single [`MODE`](#mode-message) message. The value is OPTIONAL and when not specified indicates that there is no limit to the number of 'variable' modes that may be set in a single client [`MODE`](#mode-message) command. +A client SHOULD NOT issue more 'variable' modes than this in a single {% message MODE %} command. A server MAY however issue more 'variable' modes than this in a single {% message MODE %} message. The value is OPTIONAL and when not specified indicates that there is no limit to the number of 'variable' modes that may be set in a single client {% message MODE %} command. If the value is specified, it MUST be a positive integer. @@ -1246,7 +1246,7 @@ Examples: Format: SAFELIST -If `SAFELIST` parameter is advertised, the server ensures that a client may perform the [`LIST`](#list-message) command without being disconnected due to the large volume of data the [`LIST`](#list-message) command generates. +If `SAFELIST` parameter is advertised, the server ensures that a client may perform the {% message LIST %} command without being disconnected due to the large volume of data the {% message LIST %} command generates. The `SAFELIST` parameter MUST NOT be specified with a value. @@ -1260,7 +1260,7 @@ Examples: The `SILENCE` parameter indicates the maximum number of entries a client can have in their silence list. -The value is OPTIONAL and if specified is a positive integer. If the value is not specified, the server does not support the [`SILENCE`](#silence-message) command. +The value is OPTIONAL and if specified is a positive integer. If the value is not specified, the server does not support the {% message SILENCE %} command. Most IRC clients also include client-side filter/ignore lists as an alternative to this command. @@ -1276,7 +1276,7 @@ Examples: Format: STATUSMSG= -The `STATUSMSG` parameter indicates that the server supports a method for clients to send a message via the [`PRIVMSG`](#privmsg-message) / [`NOTICE`](#notice-message) commands to those people on a channel with (one of) the specified [channel membership prefixes](#channel-membership-prefixes). +The `STATUSMSG` parameter indicates that the server supports a method for clients to send a message via the {% message PRIVMSG %} / {% message NOTICE %} commands to those people on a channel with (one of) the specified [channel membership prefixes](#channel-membership-prefixes). The value MUST be specified and MUST be a list of prefixes as specified in the [`PREFIX`](#prefix-parameter) parameter. Most servers today advertise every prefix in their [`PREFIX`](#prefix-parameter) parameter in `STATUSMSG`. @@ -1323,7 +1323,7 @@ Examples: Format: USERLEN= Status: Proposed -The `USERLEN` parameter indicates the maximum length that a username may be on the server. Networks SHOULD be consistent with this value across different servers. As noted in the [`USER`](#user-message) message, the tilde prefix (`"~"`), if it exists, contributes to the length of the username and would be included in this parameter. +The `USERLEN` parameter indicates the maximum length that a username may be on the server. Networks SHOULD be consistent with this value across different servers. As noted in the {% message USER %} message, the tilde prefix (`"~"`), if it exists, contributes to the length of the username and would be included in this parameter. The value MUST be specified and MUST be a positive integer. @@ -1462,5 +1462,5 @@ Casemapping, at least right now, is a topic where implementations differ greatly These are numerics contained in [RFC1459](https://tools.ietf.org/html/rfc1459) and [RFC2812](https://tools.ietf.org/html/rfc2812) that are not contained in this document or that should be considered obsolete. -* **`RPL_BOUNCE (005)`**: `005` is now used for [`RPL_ISUPPORT`](#rplisupport-005). `RPL_BOUNCE` was moved to [`010`](#rplbounce-010). +* **`RPL_BOUNCE (005)`**: `005` is now used for {% numeric RPL_ISUPPORT %}. {% numeric RPL_BOUNCE %} was moved to `010`. * **`RPL_SUMMONING (342)`**: No. Just, no. The `SUMMON` command isn't used, don't implement this. diff --git a/_plugins/modern-ircdocs.rb b/_plugins/modern-ircdocs.rb index f934551..d4c9af4 100644 --- a/_plugins/modern-ircdocs.rb +++ b/_plugins/modern-ircdocs.rb @@ -33,7 +33,7 @@ def initialize(name, params, tokens) def render(context) super - "

#{@id} Message

" + "

#{@id} Message

" end end @@ -46,7 +46,7 @@ def initialize(name, params, tokens) def render(context) super - "#{@id}" + "#{@id}" end end diff --git a/index.md b/index.md index b2ab674..cb9e1a3 100644 --- a/index.md +++ b/index.md @@ -576,13 +576,13 @@ Upon successful completion of the registration process, the server MUST send, in # Feature Advertisement -IRC servers and networks implement many different IRC features, limits, and protocol options that clients should be aware of. The [`RPL_ISUPPORT`](#rplisupport-005) `(005)` numeric is designed to advertise these features to clients on connection registration, providing a simple way for clients to change their behaviour based on what is implemented on the server. +IRC servers and networks implement many different IRC features, limits, and protocol options that clients should be aware of. The {% numeric RPL_ISUPPORT %} numeric is designed to advertise these features to clients on connection registration, providing a simple way for clients to change their behaviour based on what is implemented on the server. Once client registration is complete, the server MUST send at least one `RPL_ISUPPORT` numeric to the client. The server MAY send more than one `RPL_ISUPPORT` numeric and consecutive `RPL_ISUPPORT` numerics SHOULD be sent adjacent to each other. Clients SHOULD NOT assume a server supports a feature unless it has been advertised in `RPL_ISUPPORT`. For `RPL_ISUPPORT` parameters which specify a 'default' value, clients SHOULD assume the default value for these parameters until the server advertises these parameters itself. This is generally done for compatibility reasons with older versions of the IRC protocol that do not specify the `RPL_ISUPPORT` numeric and servers that do not advertise those specific tokens. -For more information and specific details on tokens, see the [`RPL_ISUPPORT`](#rplisupport-005) reply. +For more information and specific details on tokens, see the {% numeric RPL_ISUPPORT %} reply. A list of `RPL_ISUPPORT` parameters is available in the [`RPL_ISUPPORT` Parameters](#RPL_ISUPPORT-parameters) section. @@ -616,7 +616,7 @@ Clients and servers should implement capability negotiation and the `CAP` comman Messages are client-to-server only unless otherwise specified. If messages may be sent from the server to a connected client, it will be noted in the message's description. For server-to-client messages of this type, the message `` usually indicates the client the message relates to, but this will be noted in the description. -In message descriptions, 'command' refers to the message's behaviour when sent from a client to the server. Similarly, 'Command Examples' represent example messages sent from a client to the server, and 'Message Examples' represent example messages sent from the server to a client. If a command is sent from a client to a server with less parameters than the command requires to be processed, the server will reply with an [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) numeric and the command will fail. +In message descriptions, 'command' refers to the message's behaviour when sent from a client to the server. Similarly, 'Command Examples' represent example messages sent from a client to the server, and 'Message Examples' represent example messages sent from the server to a client. If a command is sent from a client to a server with less parameters than the command requires to be processed, the server will reply with an {% numeric ERR_NEEDMOREPARAMS %} numeric and the command will fail. In the `"Parameters:"` section, optional parts or parameters are noted with square brackets as such: `"[]"`. Curly braces around a part of parameter indicate that it may be repeated zero or more times, for example: `"{,}"` indicates that there must be at least one ``, and that there may be additional keys separated by the comma `(",", 0x2C)` character. @@ -657,9 +657,9 @@ Servers may also consider requiring [`SASL` Authentication](#authenticate-messag Numeric replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_ALREADYREGISTRED`](#erralreadyregistered-462) `(462)` -* [`ERR_PASSWDMISMATCH`](#errpasswdmismatch-464) `(464)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_ALREADYREGISTERED %} +* {% numeric ERR_PASSWDMISMATCH %} Command Example: @@ -682,10 +682,10 @@ The `NICK` message may be sent from the server to clients to acknowledge their ` Numeric Replies: -* [`ERR_NONICKNAMEGIVEN`](#errnonicknamegiven-431) `(431)` -* [`ERR_ERRONEUSNICKNAME`](#errerroneusnickname-432) `(432)` -* [`ERR_NICKNAMEINUSE`](#errnicknameinuse-433) `(433)` -* [`ERR_NICKCOLLISION`](#errnickcollision-436) `(436)` +* {% numeric ERR_NONICKNAMEGIVEN %} +* {% numeric ERR_ERRONEUSNICKNAME %} +* {% numeric ERR_NICKNAMEINUSE %} +* {% numeric ERR_NICKCOLLISION %} Command Example: @@ -719,8 +719,8 @@ If the client sends a `USER` command after the server has successfully received Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_ALREADYREGISTRED`](#erralreadyregistred-462) `(462)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_ALREADYREGISTERED %} Command Examples: @@ -752,10 +752,10 @@ The `` specified by this command is separate to the accounts specified by Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_PASSWDMISMATCH`](#errpasswdmismatch-464) `(464)` -* [`ERR_NOOPERHOST`](#errnooperhost-491) `(491)` -* [`RPL_YOUREOPER`](#erryoureoper-381) `(381)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_PASSWDMISMATCH %} +* {% numeric ERR_NOOPERHOST %} +* {% numeric RPL_YOUREOPER %} Command Example: @@ -810,11 +810,11 @@ The `JOIN` command indicates that the client wants to join the given channel(s), While a client is joined to a channel, they receive all relevant information about that channel including the `JOIN`, `PART`, `KICK`, and `MODE` messages affecting the channel. They receive all `PRIVMSG` and `NOTICE` messages sent to the channel, and they also receive `QUIT` messages from other clients joined to the same channel (to let them know those users have left the channel and the network). This allows them to keep track of other channel members and channel modes. -If a client's `JOIN` command to the server is successful, they receive a `JOIN` message from the server with their client as the message `` and the channel they have joined as the first parameter of the message. After this, they are sent the channel's topic (with [`RPL_TOPIC`](#rpltopic-332)), and no message if the channel does not have a topic. They are also sent a list of users currently joined to the channel (with one or more [`RPL_NAMREPLY`](#rplnamreply-353) numerics). These `RPL_NAMREPLY` messages sent by the server MUST include the requesting client that has just joined the channel. +If a client's `JOIN` command to the server is successful, they receive a `JOIN` message from the server with their client as the message `` and the channel they have joined as the first parameter of the message. After this, they are sent the channel's topic (with {% numeric RPL_TOPIC %}), and no message if the channel does not have a topic. They are also sent a list of users currently joined to the channel (with one or more {% numeric RPL_NAMREPLY %} numerics). These `RPL_NAMREPLY` messages sent by the server MUST include the requesting client that has just joined the channel. The [key](#key-channel-mode), [client limit](#client-limit-channel-mode) , [ban](#ban-channel-mode) - [exemption](#ban-exemption-channel-mode), [invite-only](#invite-only-channel-mode) - [exemption](#invite-exemption-channel-mode), and other (depending on server software) channel modes affect whether or not a given client may join a channel. More information on each of these modes and how they affect the `JOIN` command is available in their respective sections. -Servers MAY restrict the number of channels a client may be joined to at one time. This limit SHOULD be defined in the [`CHANLIMIT`](#chanlimit-parameter) `RPL_ISUPPORT` parameter. If the client cannot join this channel because they would be over their limit, they will receive an [`ERR_TOOMANYCHANNELS`](#errtoomanychannels-405) reply and the command will fail. +Servers MAY restrict the number of channels a client may be joined to at one time. This limit SHOULD be defined in the [`CHANLIMIT`](#chanlimit-parameter) `RPL_ISUPPORT` parameter. If the client cannot join this channel because they would be over their limit, they will receive an {% numeric ERR_TOOMANYCHANNELS %} reply and the command will fail. Note that this command also accepts the special argument of `("0", 0x30)` instead of any of the usual parameters, which requests that the sending client leave all channels they are currently connected to. The server will process this command as though the client had sent a [`PART`](#part-message) command for each channel they are a member of. @@ -822,15 +822,15 @@ This message may be sent from a server to a client to notify the client that som Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) `(403)` -* [`ERR_TOOMANYCHANNELS`](#errtoomanychannels-405) `(405)` -* [`ERR_BADCHANNELKEY`](#errbadchannelkey-475) `(475)` -* [`ERR_BANNEDFROMCHAN`](#errbannedfromchan-474) `(474)` -* [`ERR_CHANNELISFULL`](#errchannelisfull-471) `(471)` -* [`ERR_INVITEONLYCHAN`](#errinviteonlychan-473) `(473)` -* [`RPL_TOPIC`](#rpltopic-332) `(332)` -* [`RPL_NAMREPLY`](#rplnamreply-353) `(353)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOSUCHCHANNEL %} +* {% numeric ERR_TOOMANYCHANNELS %} +* {% numeric ERR_BADCHANNELKEY %} +* {% numeric ERR_BANNEDFROMCHAN %} +* {% numeric ERR_CHANNELISFULL %} +* {% numeric ERR_INVITEONLYCHAN %} +* {% numeric RPL_TOPIC %} +* {% numeric RPL_NAMREPLY %} Command Examples: @@ -860,15 +860,15 @@ Message Examples: The `PART` command removes the client from the given channel(s). On sending a successful `PART` command, the user will receive a `PART` message from the server for each channel they have been removed from. `` is the reason that the client has left the channel(s). -For each channel in the parameter of this command, if the channel exists and the client is not joined to it, they will receive an [`ERR_NOTONCHANNEL`](#errnotonchannel-442) reply and that channel will be ignored. If the channel does not exist, the client will receive an [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) reply and that channel will be ignored. +For each channel in the parameter of this command, if the channel exists and the client is not joined to it, they will receive an {% numeric ERR_NOTONCHANNEL %} reply and that channel will be ignored. If the channel does not exist, the client will receive an {% numeric ERR_NOSUCHCHANNEL %} reply and that channel will be ignored. This message may be sent from a server to a client to notify the client that someone has been removed from a channel. In this case, the message `` will be the client who is being removed, and `` will be the channel which that client has been removed from. Servers SHOULD NOT send multiple channels in this message to clients, and SHOULD distribute these multiple-channel `PART` messages as a series of messages with a single channel name on each. If a `PART` message is distributed in this way, `` (if it exists) should be on each of these messages. Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) `(403)` -* [`ERR_NOTONCHANNEL`](#errnotonchannel-442) `(442)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOSUCHCHANNEL %} +* {% numeric ERR_NOTONCHANNEL %} Command Examples: @@ -888,11 +888,11 @@ Message Examples: The `TOPIC` command is used to change or view the topic of the given channel. If `` is not given, either `RPL_TOPIC` or `RPL_NOTOPIC` is returned specifying the current channel topic or lack of one. If `` is an empty string, the topic for the channel will be cleared. -If the client sending this command is not joined to the given channel, and tries to view its' topic, the server MAY return the [`ERR_NOTONCHANNEL`](#errnotonchannel-442) numeric and have the command fail. +If the client sending this command is not joined to the given channel, and tries to view its' topic, the server MAY return the {% numeric ERR_NOTONCHANNEL %} numeric and have the command fail. If `RPL_TOPIC` is returned to the client sending this command, `RPL_TOPICWHOTIME` SHOULD also be sent to that client. -If the [protected topic](#protected-topic-mode) mode is set on a channel, then clients MUST have appropriate channel permissions to modify the topic of that channel. If a client does not have appropriate channel permissions and tries to change the topic, the [`ERR_CHANOPRIVSNEEDED`](#errchanoprivsneeded-482) numeric is returned and the command will fail. +If the [protected topic](#protected-topic-mode) mode is set on a channel, then clients MUST have appropriate channel permissions to modify the topic of that channel. If a client does not have appropriate channel permissions and tries to change the topic, the {% numeric ERR_CHANOPRIVSNEEDED %} numeric is returned and the command will fail. If the topic of a channel is changed or cleared, every client in that channel (including the author of the topic change) will receive a `TOPIC` command with the new topic as argument (or an empty argument if the topic was cleared) alerting them to how the topic has changed. @@ -900,13 +900,13 @@ Clients joining the channel in the future will receive a `RPL_TOPIC` numeric (or Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) `(403)` -* [`ERR_NOTONCHANNEL`](#errnotonchannel-442) `(442)` -* [`ERR_CHANOPRIVSNEEDED`](#errchanoprivsneeded-482) `(482)` -* [`RPL_NOTOPIC`](#rplnotopic-331) `(331)` -* [`RPL_TOPIC`](#rpltopic-332) `(332)` -* [`RPL_TOPICWHOTIME`](#rpltopicwhotime-333) `(333)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOSUCHCHANNEL %} +* {% numeric ERR_NOTONCHANNEL %} +* {% numeric ERR_CHANOPRIVSNEEDED %} +* {% numeric RPL_NOTOPIC %} +* {% numeric RPL_TOPIC %} +* {% numeric RPL_TOPICWHOTIME %} Command Examples: @@ -932,8 +932,8 @@ If no parameter is given for this command, servers SHOULD return one `RPL_ENDOFN Numeric Replies: -* [`RPL_NAMREPLY`](#rplnamreply-353) `(353)` -* [`RPL_ENDOFNAMES`](#rplendofnames-366) `(366)` +* {% numeric RPL_NAMREPLY %} +* {% numeric RPL_ENDOFNAMES %} Command Examples: @@ -959,9 +959,9 @@ In response to a successful `LIST` command, the server MAY send one `RPL_LISTSTA Numeric Replies: -* [`RPL_LISTSTART`](#rplliststart-321) `(321)` -* [`RPL_LIST`](#rpllist-322) `(322)` -* [`RPL_LISTEND`](#rpllistend-323) `(323)` +* {% numeric RPL_LISTSTART %} +* {% numeric RPL_LIST %} +* {% numeric RPL_LISTEND %} Command Examples: @@ -993,12 +993,12 @@ When the invite is successful, the server MUST send a `RPL_INVITING` numeric to Numeric Replies: -* [`RPL_INVITING`](#rplinviting-341) `(341)` -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) `(403)` -* [`ERR_NOTONCHANNEL`](#errnotonchannel-442) `(442)` -* [`ERR_CHANOPRIVSNEEDED`](#errchanoprivsneeded-482) `(482)` -* [`ERR_USERONCHANNEL`](#erruseronchannel-443) `(443)` +* {% numeric RPL_INVITING %} +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOSUCHCHANNEL %} +* {% numeric ERR_NOTONCHANNEL %} +* {% numeric ERR_CHANOPRIVSNEEDED %} +* {% numeric ERR_USERONCHANNEL %} Command Examples: @@ -1027,15 +1027,15 @@ Servers MAY limit the number of target users per `KICK` command via the [`TARGMA Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) `(403)` -* [`ERR_CHANOPRIVSNEEDED`](#errchanoprivsneeded-482) `(482)` -* [`ERR_USERNOTINCHANNEL`](#errusernotinchannel-441) `(441)` -* [`ERR_NOTONCHANNEL`](#errnotonchannel-442) `(442)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOSUCHCHANNEL %} +* {% numeric ERR_CHANOPRIVSNEEDED %} +* {% numeric ERR_USERNOTINCHANNEL %} +* {% numeric ERR_NOTONCHANNEL %} Deprecated Numeric Reply: -* [`ERR_BADCHANMASK`](#errbadchanmask-476) `(476)` +* {% numeric ERR_BADCHANMASK %} Examples: @@ -1071,11 +1071,11 @@ If the MOTD does not exist or could not be found, the `ERR_NOMOTD` numeric is re Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`ERR_NOMOTD`](#errnomotd-422) `(422)` -* [`RPL_MOTDSTART`](#rplmotdstart-375) `(375)` -* [`RPL_MOTD`](#rplmotd-372) `(372)` -* [`RPL_ENDOFMOTD`](#rplendofmotd-376) `(376)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric ERR_NOMOTD %} +* {% numeric RPL_MOTDSTART %} +* {% numeric RPL_MOTD %} +* {% numeric RPL_ENDOFMOTD %} {% messageheader VERSION %} @@ -1092,9 +1092,9 @@ Upon receiving a `VERSION` command, the given server SHOULD respond with one `RP Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`RPL_ISUPPORT`](#rplisupport-005) `(005)` -* [`RPL_VERSION`](#rplversion-351) `(351)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric RPL_ISUPPORT %} +* {% numeric RPL_VERSION %} Command Examples: @@ -1119,11 +1119,11 @@ Upon receiving an `ADMIN` command, the given server SHOULD respond with the `RPL Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`RPL_ADMINME`](#rpladminme-256) `(256)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric RPL_ADMINME %} * [`RPL_ADMINLOC1`](#rpladminloc1-257) `(257)` * [`RPL_ADMINLOC2`](#rpladminloc2-258) `(258)` -* [`RPL_ADMINEMAIL`](#rpladminemail-259) `(259)` +* {% numeric RPL_ADMINEMAIL %} Command Examples: @@ -1142,10 +1142,10 @@ The `CONNECT` command forces a server to try to establish a new connection to an Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOPRIVILEGES`](#errnoprivileges-481) `(481)` -* [`ERR_NOPRIVS`](#errnoprivs-723) `(723)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOPRIVILEGES %} +* {% numeric ERR_NOPRIVS %} Command Examples: @@ -1164,8 +1164,8 @@ The `TIME` command is used to query local time from the specified server. If the Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`RPL_TIME`](#rpltime-391) `(391)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric RPL_TIME %} Command Examples: @@ -1204,20 +1204,20 @@ The currently supported queries are: Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOPRIVILEGES`](#errnoprivileges-481) `(481)` -* [`ERR_NOPRIVS`](#errnoprivs-723) `(723)` -* [`RPL_STATSCLINE`](#statscline-213) `(213)` -* [`RPL_STATSHLINE`](#statshline-244) `(244)` -* [`RPL_STATSILINE`](#statsiline-215) `(215)` -* [`RPL_STATSKLINE`](#statskline-216) `(216)` -* [`RPL_STATSLLINE`](#statslline-241) `(241)` -* [`RPL_STATSOLINE`](#statsoline-243) `(243)` -* [`RPL_STATSLINKINFO`](#rplstatslinkinfo-211) `(211)` -* [`RPL_STATSUPTIME`](#rplstatsuptime-242) `(242)` -* [`RPL_STATSCOMMANDS`](#rplstatscommands-212) `(212)` -* [`RPL_ENDOFSTATS`](#rplendofstats-219) `(219)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOPRIVILEGES %} +* {% numeric ERR_NOPRIVS %} +* {% numeric RPL_STATSCLINE %} +* {% numeric RPL_STATSHLINE %} +* {% numeric RPL_STATSILINE %} +* {% numeric RPL_STATSKLINE %} +* {% numeric RPL_STATSLLINE %} +* {% numeric RPL_STATSOLINE %} +* {% numeric RPL_STATSLINKINFO %} +* {% numeric RPL_STATSUPTIME %} +* {% numeric RPL_STATSCOMMANDS %} +* {% numeric RPL_ENDOFSTATS %} Command Examples: @@ -1240,9 +1240,9 @@ Upon receiving an `INFO` command, the given server will respond with zero or mor Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`RPL_INFO`](#rplinfo-371) `(371)` -* [`RPL_ENDOFINFO`](#rplendofinfo-374) `(374)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric RPL_INFO %} +* {% numeric RPL_ENDOFINFO %} Command Examples: @@ -1264,19 +1264,19 @@ The `MODE` command is used to set or remove options (or *modes*) from a given ta #### User mode -If `` is a nickname that does not exist on the network, the [`ERR_NOSUCHNICK`](#errnosuchnick-401) numeric is returned. If `` is a different nick than the user who sent the command, the [`ERR_USERSDONTMATCH`](#errusersdontmatch-502) numeric is returned. +If `` is a nickname that does not exist on the network, the {% numeric ERR_NOSUCHNICK %} numeric is returned. If `` is a different nick than the user who sent the command, the {% numeric ERR_USERSDONTMATCH %} numeric is returned. -If `` is not given, the [`RPL_UMODEIS`](#rplumodeis-221) numeric is sent back containing the current modes of the target user. +If `` is not given, the {% numeric RPL_UMODEIS %} numeric is sent back containing the current modes of the target user. -If `` is given, the supplied modes will be applied, and a `MODE` message will be sent to the user containing the changed modes. If one or more modes sent are not implemented on the server, the server MUST apply the modes that are implemented, and then send the [`ERR_UMODEUNKNOWNFLAG`](#errumodeunknownflag-501) in reply along with the `MODE` message. +If `` is given, the supplied modes will be applied, and a `MODE` message will be sent to the user containing the changed modes. If one or more modes sent are not implemented on the server, the server MUST apply the modes that are implemented, and then send the {% numeric ERR_UMODEUNKNOWNFLAG %} in reply along with the `MODE` message. #### Channel mode -If `` is a channel that does not exist on the network, the [`ERR_NOSUCHCHANNEL`](#errnosuchchannel-403) numeric is returned. +If `` is a channel that does not exist on the network, the {% numeric ERR_NOSUCHCHANNEL %} numeric is returned. -If `` is not given, the [`RPL_CHANNELMODEIS`](#rplchannelmodeis-324) numeric is returned. Servers MAY choose to hide sensitive information such as channel keys when sending the current modes. Servers MAY also return the [`RPL_CREATIONTIME`](#rplcreationtime-329) numeric following `RPL_CHANNELMODEIS`. +If `` is not given, the {% numeric RPL_CHANNELMODEIS %} numeric is returned. Servers MAY choose to hide sensitive information such as channel keys when sending the current modes. Servers MAY also return the {% numeric RPL_CREATIONTIME %} numeric following `RPL_CHANNELMODEIS`. -If `` is given, the user sending the command MUST have appropriate channel privileges on the target channel to change the modes given. If a user does not have appropriate privileges to change modes on the target channel, the server MUST not process the message, and [`ERR_CHANOPRIVSNEEDED`](#errchanoprivsneeded-482) numeric is returned. +If `` is given, the user sending the command MUST have appropriate channel privileges on the target channel to change the modes given. If a user does not have appropriate privileges to change modes on the target channel, the server MUST not process the message, and {% numeric ERR_CHANOPRIVSNEEDED %} numeric is returned. If the user has permission to change modes on the target, the supplied modes will be applied based on the type of the mode (see below). For type A, B, and C modes, arguments will be sequentially obtained from ``. If a type B or C mode does not have a parameter when being set, the server MUST ignore that mode. If a type A mode has been sent without an argument, the contents of the list MUST be sent to the user, unless it contains sensitive information the user is not allowed to access. @@ -1313,9 +1313,9 @@ The meaning of standard (and/or well-used) channel and user mode letters can be Type A modes are lists that can be viewed. The method of viewing these lists is not standardised across modes and different numerics are used for each. The specific numerics used for these are outlined here: -* **[Ban List `"+b"`](#ban-channel-mode)**: Ban lists are returned with zero or more [`RPL_BANLIST`](#rplbanlist-367) numerics, followed by one [`RPL_ENDOFBANLIST`](#rplendofbanlist-368) numeric. -* **[Exception List `"+e"`](#exception-channel-mode)**: Exception lists are returned with zero or more [`RPL_EXCEPTLIST`](#rplexceptlist-348) numerics, followed by one [`RPL_ENDOFEXCEPTLIST`](#rplendofexceptlist-349) numeric. -* **[Invite-Exception List `"+I"`](#invite-exception-channel-mode)**: Invite-exception lists are returned with zero or more [`RPL_INVITELIST`](#rplinvitelist-346) numerics, followed by one [`RPL_ENDOFINVITELIST`](#rplendofinvitelist-347) numeric. +* **[Ban List `"+b"`](#ban-channel-mode)**: Ban lists are returned with zero or more {% numeric RPL_BANLIST %} numerics, followed by one {% numeric RPL_ENDOFBANLIST %} numeric. +* **[Exception List `"+e"`](#exception-channel-mode)**: Exception lists are returned with zero or more {% numeric RPL_EXCEPTLIST %} numerics, followed by one {% numeric RPL_ENDOFEXCEPTLIST %} numeric. +* **[Invite-Exception List `"+I"`](#invite-exception-channel-mode)**: Invite-exception lists are returned with zero or more {% numeric RPL_INVITELIST %} numerics, followed by one {% numeric RPL_ENDOFINVITELIST %} numeric. After the initial `MODE` command is sent to the server, the client receives the above numerics detailing the entries that appear on the given list. Servers MAY choose to restrict the above information to channel operators, or to only those clients who have permissions to change the given list. @@ -1352,25 +1352,25 @@ The `PRIVMSG` command is used to send private messages between users, as well as If `` is a channel name and the client is [banned](#ban-channel-mode) and not covered by a [ban exemption](#ban-exemption-channel-mode), the message will not be delivered and the command will silently fail. Channels with the [moderated](#moderated-channel-mode) mode active may block messages from certain users. Other channel modes may affect the delivery of the message or cause the message to be modified before delivery, and these modes are defined by the server software and configuration being used. -If a message cannot be delivered to a channel, the server SHOULD respond with an [`ERR_CANNOTSENDTOCHAN`](#errcannotsendtochan-404) numeric to let the user know that this message could not be delivered. +If a message cannot be delivered to a channel, the server SHOULD respond with an {% numeric ERR_CANNOTSENDTOCHAN %} numeric to let the user know that this message could not be delivered. If `` is a channel name, it may be prefixed with one or more [channel membership prefix character (`@`, `+`, etc)](#channel-membership-prefixes) and the message will be delivered only to the members of that channel with the given or higher status in the channel. Servers that support this feature will list the prefixes which this is supported for in the [`STATUSMSG`](#statusmsg-parameter) `RPL_ISUPPORT` parameter, and this SHOULD NOT be attempted by clients unless the prefix has been advertised in this token. -If `` is a user and that user has been set as away, the server may reply with an [`RPL_AWAY`](#rplaway-301) numeric and the command will continue. +If `` is a user and that user has been set as away, the server may reply with an {% numeric RPL_AWAY %} numeric and the command will continue. The `PRIVMSG` message is sent from the server to client to deliver a message to that client. The `` of the message represents the user or server that sent the message, and the `` represents the target of that `PRIVMSG` (which may be the client, a channel, etc). Numeric Replies: -* [`ERR_NOSUCHNICK`](#errnosuchnick-401) `(401)` -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`ERR_CANNOTSENDTOCHAN`](#errcannotsendtochan-404) `(404)` -* [`ERR_TOOMANYTARGETS`](#errtoomanytargets-407) `(407)` -* [`ERR_NORECIPIENT`](#errnorecipient-411) `(411)` -* [`ERR_NOTEXTTOSEND`](#errnotexttosend-412) `(412)` -* [`ERR_NOTOPLEVEL`](#errnotoplevel-413) `(413)` -* [`ERR_WILDTOPLEVEL`](#errwildtoplevel-414) `(414)` -* [`RPL_AWAY`](#rplaway-301) `(301)` +* {% numeric ERR_NOSUCHNICK %} +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric ERR_CANNOTSENDTOCHAN %} +* {% numeric ERR_TOOMANYTARGETS %} +* {% numeric ERR_NORECIPIENT %} +* {% numeric ERR_NOTEXTTOSEND %} +* {% numeric ERR_NOTOPLEVEL %} +* {% numeric ERR_WILDTOPLEVEL %} +* {% numeric RPL_AWAY %}
There are strange "X@Y" target rules and such which are noted in the examples of the original PRIVMSG RFC section. We need to check to make sure modern servers actually process them properly, and if so then specify them. @@ -1431,16 +1431,16 @@ Clients can rejoin instantly after this command is performed on them. However, i As nicknames across an IRC network MUST be unique, if duplicates are found when servers join, one or both of the clients MAY be `KILL`ed and removed from the network. Servers may also handle this case in alternate ways that don't involve removing users from the network. -Servers MAY restrict whether specific operators can remove users on other servers (remote users). If the operator tries to remove a remote user but is not privileged to, they should receive the [`ERR_NOPRIVS`](#errnoprivs-723) numeric. +Servers MAY restrict whether specific operators can remove users on other servers (remote users). If the operator tries to remove a remote user but is not privileged to, they should receive the {% numeric ERR_NOPRIVS %} numeric. `` SHOULD reflect why the `KILL` was performed. For user-generated KILLs, it is up to the user to provide an adequate reason. Numeric Replies: -* [`ERR_NOSUCHSERVER`](#errnosuchserver-402) `(402)` -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`ERR_NOPRIVILEGES`](#errnoprivileges-481) `(481)` -* [`ERR_NOPRIVS`](#errnoprivs-723) `(723)` +* {% numeric ERR_NOSUCHSERVER %} +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric ERR_NOPRIVILEGES %} +* {% numeric ERR_NOPRIVS %}

NOTE: The KILL message is weird, and I need to look at it more closely, add some examples, etc.

@@ -1448,7 +1448,7 @@ Numeric Replies: ## Optional Messages -These messages are not required for a server implementation to work, but SHOULD be implemented. If a command is not implemented, it MUST return the [`ERR_UNKNOWNCOMMAND`](#errunknowncommand-421) numeric. +These messages are not required for a server implementation to work, but SHOULD be implemented. If a command is not implemented, it MUST return the {% numeric ERR_UNKNOWNCOMMAND %} numeric. ### AWAY message @@ -1463,26 +1463,26 @@ If the [IRCv3 `away-notify` capability](https://ircv3.net/specs/extensions/away- Servers SHOULD notify clients when a user they're interacting with is away when relevant, including sending these numerics: -1. [`RPL_AWAY`](#rplaway-301), with the away message, when a PRIVMSG command is directed at the away user (not to a channel they are on). -2. [`RPL_AWAY`](#rplaway-301), with the away message, in replies to [`WHOIS`](#whois-message) messages. -3. In the [`RPL_USERHOST`](#rpluserhost-302) numeric, as the `+` or `-` character. +1. {% numeric RPL_AWAY %}, with the away message, when a PRIVMSG command is directed at the away user (not to a channel they are on). +2. {% numeric RPL_AWAY %}, with the away message, in replies to [`WHOIS`](#whois-message) messages. +3. In the {% numeric RPL_USERHOST %} numeric, as the `+` or `-` character. Numeric Replies: -* [`RPL_UNAWAY`](#rplaway-305) `(305)` -* [`RPL_NOWAWAY`](#rplaway-306) `(306)` +* {% numeric RPL_UNAWAY %} +* {% numeric RPL_NOWAWAY %} ### USERHOST message Command: USERHOST Parameters: { } -The `USERHOST` command is used to return information about users with the given nicknames. The `USERHOST` command takes up to five nicknames, each a separate parameters. The nicknames are returned in [`RPL_USERHOST`](#rpluserhost-302) numerics. +The `USERHOST` command is used to return information about users with the given nicknames. The `USERHOST` command takes up to five nicknames, each a separate parameters. The nicknames are returned in {% numeric RPL_USERHOST %} numerics. Numeric Replies: -* [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) `(461)` -* [`RPL_USERHOST`](#rpluserhost-302) `(302)` +* {% numeric ERR_NEEDMOREPARAMS %} +* {% numeric RPL_USERHOST %} Command Examples: From 8f6f7c14b2a682c9a97824035be53aa3c60e84fc Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Mon, 30 Aug 2021 21:16:12 +1000 Subject: [PATCH 09/10] Don't break RPL_ISUPPORT parameters link --- _includes/modern-appendix.md | 4 ++-- index.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_includes/modern-appendix.md b/_includes/modern-appendix.md index 9778789..d1d752c 100644 --- a/_includes/modern-appendix.md +++ b/_includes/modern-appendix.md @@ -266,7 +266,7 @@ The server MAY negate parameters which have not been previously advertised; in t A single `RPL_ISUPPORT` reply MUST NOT contain the same parameter multiple times nor advertise and negate the same parameter. However, the server is free to advertise or negate the same parameter in separate replies. -See the [Feature Advertisement](#feature-advertisement) section for more details on this numeric. A list of parameters is available in the [`RPL_ISUPPORT` Parameters](#RPL_ISUPPORT-parameters) section. +See the [Feature Advertisement](#feature-advertisement) section for more details on this numeric. A list of parameters is available in the [`RPL_ISUPPORT` Parameters](#rplisupport-parameters) section. {% numericheader RPL_BOUNCE %} @@ -908,7 +908,7 @@ The text used in the last param of this message varies wildly. --- -{% h1 RPL_ISUPPORT-parameters %}`RPL_ISUPPORT` Parameters{% endh1 %} +{% h1 rplisupport-parameters %}`RPL_ISUPPORT` Parameters{% endh1 %} Used to [advertise features](#feature-advertisement) to clients, the {% numeric RPL_ISUPPORT %} numeric lists parameters that let the client know which features are active and their value, if any. diff --git a/index.md b/index.md index cb9e1a3..3007443 100644 --- a/index.md +++ b/index.md @@ -584,7 +584,7 @@ Clients SHOULD NOT assume a server supports a feature unless it has been adverti For more information and specific details on tokens, see the {% numeric RPL_ISUPPORT %} reply. -A list of `RPL_ISUPPORT` parameters is available in the [`RPL_ISUPPORT` Parameters](#RPL_ISUPPORT-parameters) section. +A list of `RPL_ISUPPORT` parameters is available in the [`RPL_ISUPPORT` Parameters](#rplisupport-parameters) section. --- @@ -1082,7 +1082,7 @@ Numeric Replies: Command: VERSION Parameters: [] -The `VERSION` command is used to query the version of the software and the [`RPL_ISUPPORT` parameters](#RPL_ISUPPORT-parameters) of the given server. If `` is not given, the information for the server the client is connected to should be returned. +The `VERSION` command is used to query the version of the software and the [`RPL_ISUPPORT` parameters](#rplisupport-parameters) of the given server. If `` is not given, the information for the server the client is connected to should be returned. If `` is a server, the information for that server is requested. If `` is a client, the information for the server that client is connected to is requested. If `` is given and a matching server cannot be found, the server will respond with the `ERR_NOSUCHSERVER` numeric and the command will fail. From 95ec65c3a1c78a64271d84cac0214ac3ef6488b9 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Sun, 5 Sep 2021 20:04:59 +1000 Subject: [PATCH 10/10] Final cleanups --- README.md | 28 ++++++++++++++ _includes/modern-appendix.md | 74 ++++++++++++++++++------------------ _plugins/modern-ircdocs.rb | 36 ++++++++++++++++++ index.md | 14 +++---- 4 files changed, 108 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 96eaed7..51577e0 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,34 @@ If something written in these documents isn't correct for or interoperable with --- +## Custom Liquid tags + +These custom Liquid tags simplify referring to different parts of the IRC protocol, and can be used in the Modern doc: + + {% commandheader WHO %} and {% messageheader WHO %} + - create the WHO message header, with an appropriate ID + + {% command WHO %} and {% message WHO %} + - link to the WHO message + + {% numericheader RPL_WELCOME %} + - create the RPL_WELCOME numeric header + - numeric data MUST exist in the _data/modern.yml file + + {% numeric RPL_WELCOME %} + - link to the RPL_WELCOME numeric + - numeric data MUST exist in the _data/modern.yml file + + {% isupportheader TARGMAX %} + - create the ISUPPORT TARGMAX parameter header + + {% isupport TARGMAX %} + - link to the TARGMAX ISUPPORT parameter + + +--- + + ## Modern IRC Client Protocol This is an attempt to create an updated document about how the IRC client protocol works these days. diff --git a/_includes/modern-appendix.md b/_includes/modern-appendix.md index a020a67..fdb8dbd 100644 --- a/_includes/modern-appendix.md +++ b/_includes/modern-appendix.md @@ -2,7 +2,7 @@ IRC has various types of channels that act in different ways. What differentiates these channels is the character the channel name starts with. For instance, channels starting with `#` are regular channels, and channels starting with `&` are local channels. -Upon joining, clients are shown which types of channels the server supports with the [`CHANTYPES`](#chantypes-parameter) parameter. +Upon joining, clients are shown which types of channels the server supports with the {% isupport CHANTYPES %} parameter. Here, we go through the different types of channels that exist and are widely-used these days. @@ -87,7 +87,7 @@ If this mode is set on a channel, and a client sends a `JOIN` request for this c ### Exception Channel Mode -This mode is used in almost all IRC software today. The standard mode letter used for it is `"+e"`, but it SHOULD be defined in the [`EXCEPTS`](#excepts-parameter) `RPL_ISUPPORT` parameter on connection. +This mode is used in almost all IRC software today. The standard mode letter used for it is `"+e"`, but it SHOULD be defined in the {% isupport EXCEPTS %} `RPL_ISUPPORT` parameter on connection. This channel mode controls a list of client masks that are exempt from the ['ban'](#ban-channel-mode) channel mode. If this mode has values, each of these values should be a client mask. @@ -111,7 +111,7 @@ If this mode is set on a channel, a user must have received an {% message INVITE ### Invite-Exception Channel Mode -This mode is used in almost all IRC software today. The standard mode letter used for it is `"+I"`, but it SHOULD be defined in the [`INVEX`](#invex-parameter) `RPL_ISUPPORT` parameter on connection. +This mode is used in almost all IRC software today. The standard mode letter used for it is `"+I"`, but it SHOULD be defined in the {% isupport INVEX %} `RPL_ISUPPORT` parameter on connection. This channel mode controls a list of channel masks that are exempt from the [invite-only](#invite-only-channel-mode) channel mode. If this mode has values, each of these values should be a client mask. @@ -166,7 +166,7 @@ If this mode is enabled, users MUST be joined to the channel in order to send [p ## Channel Membership Prefixes -Users joined to a channel may get certain privileges or status in that channel based on channel modes given to them. These users are given prefixes before their nickname whenever it is associated with a channel (ie, in {% message NAMES %}, {% message WHO %} and {% message WHOIS %} messages). The standard and common prefixes are listed here, and MUST be advertised by the server in the [`PREFIX`](#prefix-parameter) `RPL_ISUPPORT` parameter on connection. +Users joined to a channel may get certain privileges or status in that channel based on channel modes given to them. These users are given prefixes before their nickname whenever it is associated with a channel (ie, in {% message NAMES %}, {% message WHO %} and {% message WHOIS %} messages). The standard and common prefixes are listed here, and MUST be advertised by the server in the {% isupport PREFIX %} `RPL_ISUPPORT` parameter on connection. ### Founder Prefix @@ -265,7 +265,7 @@ A token is of the form `PARAMETER`, `PARAMETER=VALUE` or `-PARAMETER`. Servers M Tokens of the form `PARAMETER` or `PARAMETER=VALUE` are used to advertise features or information to clients. A parameter MAY have a default value and value MAY be empty when sent by servers. Unless otherwise stated, when a parameter contains a value, the value MUST be treated as being case sensitive. The value MAY contain multiple fields, if this is the case the fields SHOULD be delimited with a comma character `(",", 0x2C)`. -If the value of a parameter changes, the server SHOULD re-advertise the parameter with the new value in an `RPL_ISUPPORT` reply. An example of this is a client becoming an [IRC operator](#oper-message) and their [`CHANLIMIT`](#chanlimit-parameter) changing. +If the value of a parameter changes, the server SHOULD re-advertise the parameter with the new value in an `RPL_ISUPPORT` reply. An example of this is a client becoming an [IRC operator](#oper-message) and their {% isupport CHANLIMIT %} changing. Tokens of the form `-PARAMETER` are used to negate a previously specified parameter. If the client receives a token like this, the client MUST consider that parameter to be removed and revert to the behaviour that would occur if the parameter was not specified. The client MUST act as though the paramater is no longer advertised to it. These tokens are intended to allow servers to change their features without disconnecting clients. Tokens of this form MUST NOT contain a value field. @@ -941,7 +941,7 @@ Certain parameters described here may not be standardised nor widely-advertised. If a 'default value' is listed for a parameter, this is the assumed value of the parameter until and unless it is advertised by the server. This is primarily to interoperate with servers that don't advertise particular well-known and well-used parameters. If an 'empty value' is listed for a parameter, this is the assumed value of the parameter if it is advertised without a value. -### `AWAYLEN` Parameter +{% isupportheader AWAYLEN %} Format: AWAYLEN= @@ -955,7 +955,7 @@ Examples: AWAYLEN=307 -### `CASEMAPPING` Parameter +{% isupportheader CASEMAPPING %} Format: CASEMAPPING= @@ -980,13 +980,13 @@ Examples: CASEMAPPING=rfc1459 -### `CHANLIMIT` Parameter +{% isupportheader CHANLIMIT %} Format: CHANLIMIT=:[limit]{,:[limit]} The `CHANLIMIT` parameter indicates the number of channels a client may join. -The value MUST be specified and is a list of `":"` pairs, delimited by a comma `(',', 0x2C)`. `` is a list of channel prefix characters as defined in the [`CHANTYPES`](#chantypes-parameter) parameter. `` is OPTIONAL and if specified is a positive integer indicating the maximum number of these types of channels a client may join. If there is no limit to the number of these channels a client may join, `` will not be specified. +The value MUST be specified and is a list of `":"` pairs, delimited by a comma `(',', 0x2C)`. `` is a list of channel prefix characters as defined in the {% isupport CHANTYPES %} parameter. `` is OPTIONAL and if specified is a positive integer indicating the maximum number of these types of channels a client may join. If there is no limit to the number of these channels a client may join, `` will not be specified. Clients should not assume other clients are limited to what is specified in the `CHANLIMIT` parameter. @@ -999,7 +999,7 @@ Examples: CHANLIMIT=#:70,&: ; indicates that clients may join 70 '#' channels and any number of '&' channels -### `CHANMODES` Parameter +{% isupportheader CHANMODES %} Format: CHANMODES=A,B,C,D[,X,Y...] @@ -1009,7 +1009,7 @@ The value lists the channel mode letters of **Type A**, **B**, **C**, and **D**, To allow for future extensions, a server MAY send additional types, delimited by a comma `(',', 0x2C)`. However, server authors SHOULD NOT extend this parameter without good reason, and SHOULD CONSIDER whether their mode would work as one of the existing types instead. The behaviour of any additional types is undefined. -Server MUST NOT list modes in this parameter that are also advertised in the [`PREFIX`](#prefix-parameter) parameter. However, modes within the [`PREFIX`](#prefix-parameter) parameter may be treated as type B modes. +Server MUST NOT list modes in this parameter that are also advertised in the {% isupport PREFIX %} parameter. However, modes within the {% isupport PREFIX %} parameter may be treated as type B modes. Examples: @@ -1019,7 +1019,7 @@ Examples: CHANMODES=beI,kfL,lj,psmntirRcOAQKVCuzNSMTGZ -### `CHANNELLEN` Parameter +{% isupportheader CHANNELLEN %} Format: CHANNELLEN= @@ -1035,7 +1035,7 @@ Examples: CHANNELLEN=64 -### `CHANTYPES` Parameter +{% isupportheader CHANTYPES %} Format: CHANTYPES=[string] Default: CHANTYPES=# @@ -1052,7 +1052,7 @@ Examples: CHANTYPES=#& -### `ELIST` Parameter +{% isupportheader ELIST %} Format: ELIST= @@ -1076,7 +1076,7 @@ Examples: ELIST=CMNTU -### `EXCEPTS` Parameter +{% isupportheader EXCEPTS %} Format: EXCEPTS=[character] Empty: e @@ -1091,7 +1091,7 @@ Examples: EXCEPTS=e -### `EXTBAN` Parameter +{% isupportheader EXTBAN %} Format: EXTBAN=[], @@ -1117,7 +1117,7 @@ Examples: EXTBAN=,ABCNOQRSTUcjmprsz -### `HOSTLEN` Parameter +{% isupportheader HOSTLEN %} Format: HOSTLEN= Status: Proposed @@ -1133,7 +1133,7 @@ Examples: HOSTLEN=63 HOSTLEN=64 -### `INVEX` Parameter +{% isupportheader INVEX %} Format: INVEX=[character] Empty: I @@ -1148,7 +1148,7 @@ Examples: INVEX=I -### `KICKLEN` Parameter +{% isupportheader KICKLEN %} Format: KICKLEN= @@ -1162,13 +1162,13 @@ Examples: KICKLEN=307 -### `MAXLIST` Parameter +{% isupportheader MAXLIST %} Format: MAXLIST=:{,:} -The `MAXLIST` parameter specifies how many "variable" modes of type A that have been defined in the [`CHANMODES`](#chanmodes-parameter) parameter that a client may set in total on a channel. +The `MAXLIST` parameter specifies how many "variable" modes of type A that have been defined in the {% isupport CHANMODES %} parameter that a client may set in total on a channel. -The value MUST be specified and is a list of `:` pairs, delimited by a comma `(',', 0x2C)`. `` is a list of type A modes defined in [`CHANMODES`](#chanmodes-parameter). `` is a positive integer specifying the maximum number of entries that all of the modes in ``, combined, may set on a channel. +The value MUST be specified and is a list of `:` pairs, delimited by a comma `(',', 0x2C)`. `` is a list of type A modes defined in {% isupport CHANMODES %}. `` is a positive integer specifying the maximum number of entries that all of the modes in ``, combined, may set on a channel. A client MUST NOT make any assumptions on how many mode entries may actually exist on any given channel. This limit only applies to the client setting new modes of the given types, and other clients may have different limits. @@ -1184,7 +1184,7 @@ Examples: a combination of "b", "e", and "I" modes, and that they may set up to 50 "q" modes. -### `MAXTARGETS` Parameter +{% isupportheader MAXTARGETS %} Format: MAXTARGETS=[number] @@ -1192,7 +1192,7 @@ The `MAXTARGETS` parameter specifies the maximum number of targets a {% message The value is OPTIONAL and if specified, `[number]` is a positive integer representing the maximum number of targets those commands may have. If there is no limit, then `[number]` MAY not be specified. -The [`TARGMAX`](#targmax-parameter) parameter SHOULD be advertised instead of or in addition to this parameter. [`TARGMAX`](#targmax-parameter) is intended to replace `MAXTARGETS` as that parameter is more clear about which commands limits apply to. +The {% isupport TARGMAX %} parameter SHOULD be advertised instead of or in addition to this parameter. {% isupport TARGMAX %} is intended to replace `MAXTARGETS` as that parameter is more clear about which commands limits apply to. Examples: @@ -1200,11 +1200,11 @@ Examples: MAXTARGETS=20 -### `MODES` Parameter +{% isupportheader MODES %} Format: MODES=[number] -The `MODES` parameter specifies how many 'variable' modes may be set on a channel by a single {% message MODE %} command from a client. A 'variable' mode is defined as being a type A, B or C mode as defined in the [`CHANMODES`](#chanmodes-parameter) parameter, or in the channel modes specified in the [`PREFIX`](#prefix-parameter) parameter. +The `MODES` parameter specifies how many 'variable' modes may be set on a channel by a single {% message MODE %} command from a client. A 'variable' mode is defined as being a type A, B or C mode as defined in the {% isupport CHANMODES %} parameter, or in the channel modes specified in the {% isupport PREFIX %} parameter. A client SHOULD NOT issue more 'variable' modes than this in a single {% message MODE %} command. A server MAY however issue more 'variable' modes than this in a single {% message MODE %} message. The value is OPTIONAL and when not specified indicates that there is no limit to the number of 'variable' modes that may be set in a single client {% message MODE %} command. @@ -1218,7 +1218,7 @@ Examples: MODES=20 -### `NETWORK` Parameter +{% isupportheader NETWORK %} Format: NETWORK= @@ -1230,7 +1230,7 @@ Examples: NETWORK=Rizon -### `NICKLEN` Parameter +{% isupportheader NICKLEN %} Format: NICKLEN= @@ -1246,7 +1246,7 @@ Examples: NICKLEN=31 -### `PREFIX` Parameter +{% isupportheader PREFIX %} Format: PREFIX=[(modes)prefixes] Default: PREFIX=(ov)@+ @@ -1265,7 +1265,7 @@ Examples: PREFIX=(qaohv)~&@%+ -### `SAFELIST` Parameter +{% isupportheader SAFELIST %} Format: SAFELIST @@ -1277,7 +1277,7 @@ Examples: SAFELIST -### `SILENCE` Parameter +{% isupportheader SILENCE %} Format: SILENCE[=] @@ -1295,13 +1295,13 @@ Examples: SILENCE=32 -### `STATUSMSG` Parameter +{% isupportheader STATUSMSG %} Format: STATUSMSG= The `STATUSMSG` parameter indicates that the server supports a method for clients to send a message via the {% message PRIVMSG %} / {% message NOTICE %} commands to those people on a channel with (one of) the specified [channel membership prefixes](#channel-membership-prefixes). -The value MUST be specified and MUST be a list of prefixes as specified in the [`PREFIX`](#prefix-parameter) parameter. Most servers today advertise every prefix in their [`PREFIX`](#prefix-parameter) parameter in `STATUSMSG`. +The value MUST be specified and MUST be a list of prefixes as specified in the {% isupport PREFIX %} parameter. Most servers today advertise every prefix in their {% isupport PREFIX %} parameter in `STATUSMSG`. Examples: @@ -1311,7 +1311,7 @@ Examples: STATUSMSG=~&@%+ -### `TARGMAX` Parameter +{% isupportheader TARGMAX %} Format: TARGMAX=[:[limit]{,:[limit]}] @@ -1327,7 +1327,7 @@ Examples: TARGMAX=ACCEPT:,KICK:1,LIST:1,NAMES:1,NOTICE:4,PRIVMSG:4,WHOIS:1 -### `TOPICLEN` Parameter +{% isupportheader TOPICLEN %} Format: TOPICLEN= @@ -1341,7 +1341,7 @@ Examples: TOPICLEN=390 -### `USERLEN` Parameter +{% isupportheader USERLEN %} Format: USERLEN= Status: Proposed @@ -1475,7 +1475,7 @@ Casemapping, at least right now, is a topic where implementations differ greatly ### Clients * Does your client store state using nicks/channel names as keys, and if so do you casefold those keys appropriately? -* Does your client discover the casemapping to use from the [`CASEMAPPING`](#casemapping-parameter) `RPL_ISUPPORT` parameter on connection? If so, does your client use the appropriate casemapping based on it? +* Does your client discover the casemapping to use from the {% isupport CASEMAPPING %} `RPL_ISUPPORT` parameter on connection? If so, does your client use the appropriate casemapping based on it? --- diff --git a/_plugins/modern-ircdocs.rb b/_plugins/modern-ircdocs.rb index d4c9af4..c02b262 100644 --- a/_plugins/modern-ircdocs.rb +++ b/_plugins/modern-ircdocs.rb @@ -11,9 +11,17 @@ # # {% numericheader RPL_WELCOME %} # - create the RPL_WELCOME numeric header +# - numeric data MUST exist in the _data/modern.yml file # # {% numeric RPL_WELCOME %} # - link to the RPL_WELCOME numeric +# - numeric data MUST exist in the _data/modern.yml file +# +# {% isupportheader TARGMAX %} +# - create the ISUPPORT TARGMAX parameter header +# +# {% isupport TARGMAX %} +# - link to the TARGMAX ISUPPORT parameter def slug(input) input.strip.gsub(/\s+/, ' ') @@ -85,6 +93,32 @@ def render(context) "#{@id} (#{info['numeric']})" end end + + class IsupportHeaderTag < Liquid::Tag + def initialize(name, params, tokens) + super + @id = slug(params) + end + + def render(context) + super + + "

#{@id} Parameter

" + end + end + + class IsupportTag < Liquid::Tag + def initialize(name, params, tokens) + super + @id = slug(params) + end + + def render(context) + super + + "#{@id}" + end + end end Liquid::Template.register_tag('messageheader', IRCdocsPlugin::MessageHeaderTag) @@ -93,3 +127,5 @@ def render(context) Liquid::Template.register_tag('command', IRCdocsPlugin::MessageTag) Liquid::Template.register_tag('numericheader', IRCdocsPlugin::NumericHeaderTag) Liquid::Template.register_tag('numeric', IRCdocsPlugin::NumericTag) +Liquid::Template.register_tag('isupportheader', IRCdocsPlugin::IsupportHeaderTag) +Liquid::Template.register_tag('isupport', IRCdocsPlugin::IsupportTag) diff --git a/index.md b/index.md index 82eb0e2..6e9d6af 100644 --- a/index.md +++ b/index.md @@ -131,7 +131,7 @@ To create a new channel or become part of an existing channel, a user is require Channels also contain a [topic](#topic-message). The topic is a line shown to all users when they join the channel, and all users in the channel are notified when the topic of a channel is changed. Channel topics commonly state channel rules, links, quotes from channel members, a general description of the channel, or whatever the [channel operators](#channel-operators) want to share with the clients in their channel. -A user may be joined to several channels at once, but a limit may be imposed by the server as to how many channels a client can be in at one time. This limit is specified by the [`CHANLIMIT`](#chanlimit-parameter) `RPL_ISUPPORT` parameter. See the [Feature Advertisement](#feature-advertisement) section for more details on `RPL_ISUPPORT`. +A user may be joined to several channels at once, but a limit may be imposed by the server as to how many channels a client can be in at one time. This limit is specified by the {% isupport CHANLIMIT %} `RPL_ISUPPORT` parameter. See the [Feature Advertisement](#feature-advertisement) section for more details on `RPL_ISUPPORT`. If the IRC network becomes disjoint because of a split between servers, the channel on either side is composed of only those clients which are connected to servers on the respective sides of the split, possibly ceasing to exist on one side. When the split is healed, the connecting servers ensure the network state is consistent between them. @@ -709,7 +709,7 @@ It must be noted that `` must be the last parameter because it may con Since it is easy for a client to lie about its username by relying solely on the `USER` command, the use of an "Identity Server" is recommended. This lookup can be performed by the server using the [Ident Protocol](http://tools.ietf.org/html/rfc1413). If the host which a user connects from has such an "Identity Server" enabled, the username is set to that as in the reply from that server. If the host does not have such a server enabled, the username is set to the value of the `` parameter, prefixed by a tilde `('~', 0x7E)` to show that this value is user-set. -The maximum length of `` may be specified by the [`USERLEN`](#userlen-parameter) `RPL_ISUPPORT` parameter. If this length is advertised, the username MUST be silently truncated to the given length before being used. +The maximum length of `` may be specified by the {% isupport USERLEN %} `RPL_ISUPPORT` parameter. If this length is advertised, the username MUST be silently truncated to the given length before being used. The minimum length of `` is 1, ie. it MUST not be empty. If it is empty, the server SHOULD reject the command with [`ERR_NEEDMOREPARAMS`](#errneedmoreparams-461) (even if an empty parameter is provided); otherwise it MUST use a default value instead. The second and third parameters of this command SHOULD be sent as one zero `('0', 0x30)` and one asterisk character `('*', 0x2A)` by the client, as the meaning of these two parameters varies between different versions of the IRC protocol. @@ -815,7 +815,7 @@ If a client's `JOIN` command to the server is successful, they receive a `JOIN` The [key](#key-channel-mode), [client limit](#client-limit-channel-mode) , [ban](#ban-channel-mode) - [exemption](#ban-exemption-channel-mode), [invite-only](#invite-only-channel-mode) - [exemption](#invite-exemption-channel-mode), and other (depending on server software) channel modes affect whether or not a given client may join a channel. More information on each of these modes and how they affect the `JOIN` command is available in their respective sections. -Servers MAY restrict the number of channels a client may be joined to at one time. This limit SHOULD be defined in the [`CHANLIMIT`](#chanlimit-parameter) `RPL_ISUPPORT` parameter. If the client cannot join this channel because they would be over their limit, they will receive an {% numeric ERR_TOOMANYCHANNELS %} reply and the command will fail. +Servers MAY restrict the number of channels a client may be joined to at one time. This limit SHOULD be defined in the {% isupport CHANLIMIT %} `RPL_ISUPPORT` parameter. If the client cannot join this channel because they would be over their limit, they will receive an {% numeric ERR_TOOMANYCHANNELS %} reply and the command will fail. Note that this command also accepts the special argument of `("0", 0x30)` instead of any of the usual parameters, which requests that the sending client leave all channels they are currently connected to. The server will process this command as though the client had sent a [`PART`](#part-message) command for each channel they are a member of. @@ -954,7 +954,7 @@ The `LIST` command is used to get a list of channels along with some information The first possible parameter to this command is a list of channel names, delimited by a comma `(",", 0x2C)` character. If this parameter is given, the information for only the given channels is returned. If this parameter is not given, the information about all visible channels (those not hidden by the [secret](#secret-channel-mode) channel mode rules) is returned. -The second possible parameter to this command is a list of conditions as defined in the [`ELIST`](#elist-parameter) `RPL_ISUPPORT` parameter, delimited by a comma `(",", 0x2C)` character. Clients MUST NOT submit an `ELIST` condition unless the server has explicitly defined support for that condition with the `ELIST` token. If this parameter is supplied, the server filters the returned list of channels with the given conditions as specified in the [`ELIST`](#elist-parameter) documentation. +The second possible parameter to this command is a list of conditions as defined in the {% isupport ELIST %} `RPL_ISUPPORT` parameter, delimited by a comma `(",", 0x2C)` character. Clients MUST NOT submit an `ELIST` condition unless the server has explicitly defined support for that condition with the `ELIST` token. If this parameter is supplied, the server filters the returned list of channels with the given conditions as specified in the {% isupport ELIST %} documentation. In response to a successful `LIST` command, the server MAY send one `RPL_LISTSTART` numeric, MUST send back zero or more `RPL_LIST` numerics, and MUST send back one `RPL_LISTEND` numeric. @@ -1301,12 +1301,12 @@ The ABNF representation for `` is: There are four categories of channel modes, defined as follows: -* **Type A**: Modes that add or remove an address to or from a list. These modes MUST always have a parameter when sent from the server to a client. A client MAY issue this type of mode without an argument to obtain the current contents of the list. The numerics used to retrieve contents of Type A modes depends on the specific mode. Also see the [`EXTBAN`](#extban-parameter) parameter. +* **Type A**: Modes that add or remove an address to or from a list. These modes MUST always have a parameter when sent from the server to a client. A client MAY issue this type of mode without an argument to obtain the current contents of the list. The numerics used to retrieve contents of Type A modes depends on the specific mode. Also see the {% isupport EXTBAN %} parameter. * **Type B**: Modes that change a setting on a channel. These modes MUST always have a parameter. * **Type C**: Modes that change a setting on a channel. These modes MUST have a parameter when being set, and MUST NOT have a parameter when being unset. * **Type D**: Modes that change a setting on a channel. These modes MUST NOT have a parameter. -Channel mode letters, along with their types, are defined in the [`CHANMODES`](#chanmodes-parameter) parameter. User mode letters are always **Type D** modes. +Channel mode letters, along with their types, are defined in the {% isupport CHANMODES %} parameter. User mode letters are always **Type D** modes. The meaning of standard (and/or well-used) channel and user mode letters can be found in the [Channel Modes](#channel-modes) and [User Modes](#user-modes) sections. The meaning of any mode letters not in this list are defined by the server software and configuration. @@ -1355,7 +1355,7 @@ If `` is a channel name and the client is [banned](#ban-channel-mode) an If a message cannot be delivered to a channel, the server SHOULD respond with an {% numeric ERR_CANNOTSENDTOCHAN %} numeric to let the user know that this message could not be delivered. -If `` is a channel name, it may be prefixed with one or more [channel membership prefix character (`@`, `+`, etc)](#channel-membership-prefixes) and the message will be delivered only to the members of that channel with the given or higher status in the channel. Servers that support this feature will list the prefixes which this is supported for in the [`STATUSMSG`](#statusmsg-parameter) `RPL_ISUPPORT` parameter, and this SHOULD NOT be attempted by clients unless the prefix has been advertised in this token. +If `` is a channel name, it may be prefixed with one or more [channel membership prefix character (`@`, `+`, etc)](#channel-membership-prefixes) and the message will be delivered only to the members of that channel with the given or higher status in the channel. Servers that support this feature will list the prefixes which this is supported for in the {% isupport STATUSMSG %} `RPL_ISUPPORT` parameter, and this SHOULD NOT be attempted by clients unless the prefix has been advertised in this token. If `` is a user and that user has been set as away, the server may reply with an {% numeric RPL_AWAY %} numeric and the command will continue.