emacs.d/clones/libera.chat/guides/channelmodes.html
2022-10-07 15:47:14 +02:00

1393 lines
38 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en"><head>
<link rel="preload" href="../static/fonts/comfortaa-v30-subset-regular.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="../static/fonts/ubuntu-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="../static/fonts/ubuntu-v15-subset-500.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="../static/img/libera-color.svg" as="image" type="image/svg+xml">
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1" name="viewport"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Channel Modes | Libera Chat</title>
<meta name="generator" content="Jekyll v3.9.2" />
<meta property="og:title" content="Channel Modes" />
<meta property="og:locale" content="en_GB" />
<meta name="description" content="Various modes can be set on channels. Use /mode #channel to list current channel modes and /msg chanserv info #channel to list modes set with MLOCK." />
<meta property="og:description" content="Various modes can be set on channels. Use /mode #channel to list current channel modes and /msg chanserv info #channel to list modes set with MLOCK." />
<link rel="canonical" href="channelmodes.html" />
<meta property="og:url" content="https://libera.chat/guides/channelmodes" />
<meta property="og:site_name" content="Libera Chat" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2022-10-03T18:36:48+00:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Channel Modes" />
<meta name="twitter:site" content="@liberachat" />
<meta property="article:publisher" content="liberachat" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"TechArticle","dateModified":"2022-10-03T18:36:48+00:00","datePublished":"2022-10-03T18:36:48+00:00","description":"Various modes can be set on channels. Use /mode #channel to list current channel modes and /msg chanserv info #channel to list modes set with MLOCK.","headline":"Channel Modes","url":"https://libera.chat/guides/channelmodes"}</script>
<!-- End Jekyll SEO tag -->
<link rel="icon" type="image/svg+xml" href="../static/img/libera-color.svg">
<link rel="alternate icon" href="../favicon.ico">
<!-- Stylesheets -->
<style>/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */
*,::after,::before{box-sizing:border-box}:root{-moz-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji'}hr{height:0;color:inherit}abbr[title]{text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}</style>
<style>@font-face {
/* comfortaa-regular - subset */
font-family: 'Comfortaa';
src: url('../static/fonts/comfortaa-v30-subset-regular.woff2') format('woff2'), url('../static/fonts/comfortaa-v30-subset-regular.woff') format('woff'), url('../static/fonts/comfortaa-v30-subset-regular.ttf') format('truetype');
font-style: normal;
font-weight: 400;
font-display: swap;
/* . C L a b e h i r t */
unicode-range: U+002E, U+0043, U+004C, U+0061-0062, U+0065, U+0068-0069, U+0072, U+0074;
}
@font-face {
/* ubuntu-regular - latin */
font-family: 'Ubuntu';
src: local(''), url('../static/fonts/ubuntu-v15-latin-regular.woff2') format('woff2'), url('../static/fonts/ubuntu-v15-latin-regular.woff') format('woff'), url('../static/fonts/ubuntu-v15-latin-regular.ttf') format('truetype');
font-style: normal;
font-weight: 400;
font-display: swap;
}
@font-face {
/* ubuntu-500 - subset */
font-family: 'Ubuntu';
src: local(''), url('../static/fonts/ubuntu-v15-subset-500.woff2') format('woff2'), url('../static/fonts/ubuntu-v15-subset-500.woff') format('woff'), url('../static/fonts/ubuntu-v15-subset-500.ttf') format('truetype');
font-style: normal;
font-weight: 500;
font-display: swap;
/* C c e n o t */
unicode-range: U+0043 U+0063 U+0065 U+006E U+006F U+0074;
}
:root {
--header-height: 4rem;
--content-inline-padding: 1.3rem;
--content-max-width: 80ch;
/* define our palette for all themes */
--white: #fff;
--gray-100: #f3f4f6;
--gray-200: #e5e7eb;
--gray-300: #d1d5db;
--gray-400: #9ca3af;
--gray-800: #1f2937;
--gray-900: #111827;
--brand-purple: #5555ff;
--brand-pink: #ff55dd;
/* light-theme vars */
--c-bg: var(--gray-100);
--c-bg-secondary: var(--white);
--c-text: var(--gray-800);
--c-border: var(--gray-300);
--c-hl: var(--brand-pink);
--c-hl-secondary: var(--brand-purple);
--c-text-on-hl: var(--gray-800);
--c-text-on-hl-secondary: var(--white);
}
@media (prefers-color-scheme: dark) {
:root {
--c-bg: var(--gray-800);
--c-bg-secondary: var(--gray-900);
--c-text: var(--gray-200);
--c-border: var(--gray-400);
}
}
* {
color: var(--c-text);
box-sizing: border-box;
font-family: Ubuntu, sans-serif;
letter-spacing: .1ch;
}
main *, .hero * {
line-height: 1.5;
}
body {
background-color: var(--c-bg);
min-height: 100vh;
display: grid;
grid-template-rows: var(--header-height) min-content auto auto min-content;
grid-template-columns: 1fr;
grid-template-areas: "header" "hero" "main" "aside" "footer";
}
a {
text-decoration: underline;
text-underline-offset: .05rem;
}
a:hover {
text-underline-offset: .25rem;
color: var(--c-hl);
}
h1, h2, h3, h4, h5, h6, p {
word-break: break-word;
scroll-margin-block-start: 4.5rem;
}
h1, h2, h3, h4, h5, h6, strong {
font-weight: 500;
}
em {
font-style: italic;
}
h1, h2, h3, h4, h5, h6 {
margin-block-end: 0;
}
h1+*, h2+*, h3+*, h4+*, h5+*, h6+* {
margin-block-start: 0;
}
main h1 {
font-size: 2.25rem;
}
main h2 {
font-size: 1.5rem;
}
main h3 {
font-size: 1.25rem;
}
main :is(h2, h3, h4, h5, h6) a {
text-decoration: none;
position: relative;
}
main :is(h2, h3, h4, h5, h6) a:hover::before {
content: '#';
position: absolute;
left: -1.5ch;
bottom: 0;
font-weight: normal;
font-size: 1rem;
}
@media screen and (min-width: 800px) {
body {
grid-template-columns: min-content 8fr;
grid-template-rows: 4rem min-content auto min-content;
grid-template-areas: "header header" "hero hero" "aside main" "footer footer";
}
}
.skiplink {
z-index: 9999;
transform: translateY(calc(-100% - 1rem));
display: block;
position: absolute;
height: 4rem;
padding: var(--content-inline-padding);
background-color: var(--c-bg);
border-inline-end: 1px solid var(--c-border);
border-block-end: 1px solid var(--c-border);
}
.skiplink:focus {
z-index: 9999;
transform: translateY(0);
}
header {
grid-area: header;
height: var(--header-height);
border-block-end: 1px solid var(--c-border);
background-color: var(--c-bg-secondary);
position: sticky;
top: 0;
z-index: 1000;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-between;
}
header a {
text-decoration: none;
}
header .logo {
display: flex;
flex-wrap: nowrap;
align-items: center;
height: 100%;
padding-inline-start: var(--content-inline-padding);
}
header .logo img {
padding-block-end: .3rem;
}
header .logo h1 {
margin: 0;
margin-bottom: -.4rem;
font-size: 1.7rem;
line-height: 1;
font-family: Comfortaa, Ubuntu, sans-serif;
font-weight: bold;
}
header .nav-toggle {
display: block;
border-inline-start: 1px solid var(--c-border);
padding: 0 1rem;
display: flex;
align-items: center;
cursor: pointer;
}
header nav details summary, header nav a {
border-block-end: 1px solid var(--c-border);
padding: 1rem;
display: flex;
align-items: center;
cursor: pointer;
white-space: nowrap;
}
header nav details summary::before {
content: "►";
padding-inline-end: .3rem;
}
header nav details[open] summary::before {
content: "▼";
}
header nav .nav-close {
display: none;
}
header nav.show .nav-close {
display: flex;
}
header nav {
transform: translateY(calc(-100% - 1rem));
display: flex;
flex-direction: column;
justify-content: flex-start;
position: fixed;
right: 0;
top: 0;
bottom: 0;
background-color: var(--c-bg-secondary);
min-width: 20rem;
max-width: 30rem;
border-inline-start: 1px solid var(--c-border);
z-index: 10000;
}
header nav.show, header nav:focus-within {
transform: translateY(0);
}
header nav details summary.highlight, header nav a.highlight {
background-color: var(--c-hl);
color: var(--c-text-on-hl);
font-weight: 500;
}
header nav details summary:hover, header nav a:hover {
background-color: var(--c-bg);
}
header nav details summary.highlight:hover, header nav a.highlight:hover {
background-color: var(--c-hl-secondary);
color: var(--c-text-on-hl-secondary);
}
header nav details {
display: flex;
flex-direction: column;
position: relative;
}
header nav details a {
padding-inline-start: 2.5rem;
}
@media screen and (min-width: 950px) {
header .nav-toggle, header .nav-close, header nav.show .nav-close {
display: none;
}
header nav {
transform: initial;
display: flex;
flex-direction: row;
justify-content: flex-end;
position: initial;
background-color: initial;
min-width: unset;
max-width: unset;
border-inline-start: none;
}
header nav.show, header nav:focus-within {
transform: initial;
}
header nav details summary, header nav a {
border-block-end: none;
border-inline-start: 1px solid var(--c-border);
border-inline-end: 1px solid var(--c-border);
padding: 0 1rem;
display: flex;
margin-inline-start: -1px;
align-items: center;
height: 100%;
}
header nav details:last-of-type summary {
border-inline-end: none;
}
header nav details[open] summary {
border-block-end: 1px solid var(--c-border);
height: calc(100% + 1px);
}
header nav details div {
position: absolute;
right: 0;
}
header nav details div a {
background-color: var(--c-bg-secondary);
border-block-end: 1px solid var(--c-border);
padding: 1rem;
}
}
main {
grid-area: main;
padding: 0 var(--content-inline-padding);
max-width: var(--content-max-width);
min-width: 0;
width: 100%;
margin: 2rem auto;
}
nav.article-nav {
display: flex;
flex-direction: row;
justify-content: center;
}
nav.article-nav div {
width: 33%;
text-align: center;
}
footer {
grid-area: footer;
align-self: end;
background-color: var(--c-bg-secondary);
border-block-start: 1px solid var(--c-border);
padding: .5rem var(--content-inline-padding);
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
}
footer div {
line-height: 2;
}
footer div .mobile-hide {
display: none;
}
footer div a {
white-space: nowrap;
}
footer div a:not([rel*=license]), footer div .copyright {
display: block;
}
@media screen and (min-width: 800px) {
footer div {
line-height: 1.5;
}
footer div:last-of-type {
padding-inline-start: 1rem;
}
footer div .mobile-hide {
display: inline;
}
footer div a:not([rel*=license]), footer div .copyright {
display: initial;
}
}
</style>
<style>aside {
grid-area: aside;
background-color: var(--c-bg-secondary);
/* padding: var(--content-inline-padding); */
border-block-start: 1px solid var(--c-border);
width: 100%;
height: min-content;
align-self: end;
display: flex;
flex-direction: column;
justify-content: flex-start;
min-width: 30ch;
overflow-y: auto;
}
aside .title {
margin-block-end: 0;
margin-inline: var(--content-inline-padding);
margin-block-start: 1rem;
margin-block-end: .5rem;
font-size: 2rem;
font-weight: 500;
}
aside details:not(:last-child) {
border-block-end: 1px solid var(--c-border);
}
aside details summary, aside a {
padding: 1rem;
display: flex;
align-items: center;
cursor: pointer;
white-space: nowrap;
}
aside a {
text-decoration: none;
}
aside details summary::before {
content: "►";
padding-inline-end: .3rem;
}
aside details[open] summary::before {
content: "▼";
}
aside details summary:hover, aside a:hover, aside a.active {
background-color: var(--c-bg);
}
aside details {
display: flex;
flex-direction: column;
position: relative;
}
aside details a {
padding-inline-start: 2.5rem;
}
@media screen and (min-width: 800px) {
aside {
border-block-start: none;
border-inline-end: 1px solid var(--c-border);
width: max-content;
height: 100%;
}
}
</style>
<link rel="stylesheet" href="../static/css/additional-styles.css">
<script src="../static/js/header-links.js" defer></script>
</head>
<body><a class="skiplink" href="channelmodes.html#main">Skip to content</a>
<header>
<a class="logo" href="../index.html" aria-label="Libera Chat, back to start page">
<img alt="" src="../static/img/libera-color.svg" height="48px" data-proofer-ignore>
<h1>Libera.&ZeroWidthSpace;Chat</h1>
</a>
<a id="nav-toggle" class="nav-toggle hidden" aria-controls="main-nav"><span>Navigation</span></a>
<nav class="" id="main-nav" aria-labelledby="nav-toggle" role="menubar">
<a id="nav-close" class="nav-close hidden" aria-controls="main-nav"><span>Close</span></a>
<details>
<summary
>About</summary>
<div>
<a
role="menuitem"
href="../policies.html"
><span>Network Policies</span></a>
<a
role="menuitem"
href="../guidelines.html"
><span>Channel Guidelines</span></a>
<a
role="menuitem"
href="../news.html"
><span>Blog & News</span></a>
<a
role="menuitem"
href="../about.html"
><span>About Libera Chat</span></a>
<a
role="menuitem"
href="../bylaws.html"
><span>Bylaws</span></a>
<a
role="menuitem"
href="../minutes.html"
><span>Meeting Minutes</span></a>
<a
role="menuitem"
href="../annual-reports.html"
><span>Annual Reports</span></a>
<a
role="menuitem"
href="../sponsors.html"
><span>Sponsors</span></a>
</div>
</details>
<details>
<summary
>Contribute</summary>
<div>
<a
role="menuitem"
href="../contributing/donate.html"
><span>Donate</span></a>
<a
role="menuitem"
href="../contributing/sponsor.html"
><span>Sponsor Us</span></a>
<a
role="menuitem"
href="../contributing/development.html"
><span>Development</span></a>
</div>
</details>
<a role="menuitem" href="../chanreg.html"><span>Channel Namespaces</span></a>
<a role="menuitem" href="../guides.html"><span>Guides</span></a>
<a role="menuitem" href="faq.html"><span>FAQ</span></a>
<details>
<summary
class="highlight"
>Connect</summary>
<div>
<a
role="menuitem"
href="https://web.libera.chat"
rel="noopener noreferrer"
><span>Webchat</span></a>
<a
role="menuitem"
href="ircs://irc.libera.chat:6697"
><span>irc.libera.chat:6697 (TLS)</span></a>
<a
role="menuitem"
href="connect.html"
><span>How to Connect</span></a>
</div>
</details>
</nav>
</header>
<script async>
const navToggle = document.querySelector('#nav-toggle')
const navClose = document.querySelector('#nav-close')
const mainNav = document.querySelector('#main-nav')
// progressive enhancement!
navToggle.classList.remove('hidden')
navClose.classList.remove('hidden')
navToggle.addEventListener('click', event => {
event.preventDefault()
mainNav.classList.toggle('show')
})
navClose.addEventListener('click', event => {
event.preventDefault()
mainNav.classList.remove('show')
})
</script>
<aside role="menu">
<span class="title">Guides</span>
<details open>
<summary>About IRC</summary>
<div>
<a
role="menuitem"
href="basics.html"
><span>Basics of IRC</span></a>
<a
role="menuitem"
href="faq.html"
><span>Frequently Asked Questions</span></a>
<a
role="menuitem"
href="clients.html"
><span>Choosing an IRC client</span></a>
</div>
</details>
<details open>
<summary>Helping you connect</summary>
<div>
<a
role="menuitem"
href="connect.html"
><span>Connecting to Libera.Chat</span></a>
<a
role="menuitem"
href="webchat.html"
><span>Using Our Webchat</span></a>
<a
role="menuitem"
href="sasl.html"
><span>Using SASL</span></a>
<a
role="menuitem"
href="https://libera.chat/guides/certfp"
><span>Using CertFP</span></a>
</div>
</details>
<details open>
<summary>Using the network</summary>
<div>
<a
role="menuitem"
href="registration.html"
><span>Nickname Registration</span></a>
<a
role="menuitem"
href="sendpass.html"
><span>Resetting your Password</span></a>
<a
role="menuitem"
href="cloaks.html"
><span>Cloaks</span></a>
<a
role="menuitem"
href="findingchannels.html"
><span>Finding Channels</span></a>
<a
role="menuitem"
href="channels.html"
><span>Using Channels</span></a>
<a
role="menuitem"
href="usermodes.html"
><span>User Modes</span></a>
</div>
</details>
<details open>
<summary>Running a channel</summary>
<div>
<a
role="menuitem"
href="creatingchannels.html"
><span>Creating Channels</span></a>
<a
role="menuitem"
class="active"
href="channelmodes.html"
><span>Channel Modes</span></a>
<a
role="menuitem"
href="bots.html"
><span>Network bots</span></a>
<a
role="menuitem"
href="catalyst.html"
><span>Catalysing and De-escalation</span></a>
<a
role="menuitem"
href="helpers.html"
><span>Advice for Helpers</span></a>
</div>
</details>
</aside>
<main id="main">
<h1>Channel Modes</h1>
<p>Various modes can be set on channels. Use <code class="language-plaintext highlighter-rouge">/mode #channel</code> to list current
channel modes and <code class="language-plaintext highlighter-rouge">/msg chanserv info #channel</code> to list modes set with MLOCK.</p>
<p>All channel modes will be lost when a channel becomes empty. Enable GUARD to
preserve modes.</p>
<p>To set a mode, use <code class="language-plaintext highlighter-rouge">/mode #channel +(mode)</code> replacing <code class="language-plaintext highlighter-rouge">(mode)</code> with the letter
that corresponds to the mode. To unset a mode, use <code class="language-plaintext highlighter-rouge">/mode #channel -(mode)</code></p>
<h2 id="available-channel-modes">Available channel modes</h2>
<!-- markdownlint-disable MD013 -->
<!-- markdownlint-enable MD013 -->
<!-- markdownlint-disable MD033 MD041 -->
<p><div class="table"></p>
<table>
<thead>
<tr>
<th>Mode (name)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>b</code>
<br />
channel ban
</td>
<td><p>Takes a <a href="channelmodes.html#masks">mask</a> as a parameter. Users matching the mask are
prevented from joining or speaking. Sending <code class="language-plaintext highlighter-rouge">/mode #channel +b</code> alone will
return the current ban list. While in the channel, banned users will be
unable to send to the channel or change nick.</p>
<p>You can append <code class="language-plaintext highlighter-rouge">$#channel</code> to any ban to redirect banned users to
another channel.</p>
<p>For example:
<code class="language-plaintext highlighter-rouge">/mode #channel +b example!*@*$##fix_your_connection</code> would forward the
user with nick example to the channel <code class="language-plaintext highlighter-rouge">##fix_your_connection</code>.
<code class="language-plaintext highlighter-rouge">/mode #channel +b $~a$#channel-unreg</code> would forward unidentified users to
the channel <code class="language-plaintext highlighter-rouge">#channel-unreg</code>.</p>
</td>
</tr>
<tr>
<td>
<code>c</code>
<br />
colour filter
</td>
<td><p>Strip colour and formatting codes from channel messages.</p>
</td>
</tr>
<tr>
<td>
<code>C</code>
<br />
block CTCPs
</td>
<td><p>Blocks CTCP commands (other than <code class="language-plaintext highlighter-rouge">/me</code> actions).</p>
</td>
</tr>
<tr>
<td>
<code>e</code>
<br />
ban exemption
</td>
<td><p>Takes a <a href="channelmodes.html#masks">mask</a> as a parameter. Ban exemption matches
override <code class="language-plaintext highlighter-rouge">+b</code> and <code class="language-plaintext highlighter-rouge">+q</code> bans for all clients it matches, allowing the
exempted user to join/speak as if they were not banned or quieted.
This can be useful if it is necessary to ban an entire ISP due to
persistent abuse, but some users from that ISP should still be allowed in.</p>
<p>For example:
<code class="language-plaintext highlighter-rouge">/mode #channel +bee *!*@*.example.com *!*someuser@host3.example.com $a:JohnDoe</code>
would block all users from example.com, while still allowing someuser
from host3 and JohnDoe to join.</p>
</td>
</tr>
<tr>
<td>
<code>f</code>
<br />
forward
</td>
<td><p>Takes a channel name as a parameter. Users who cannot join the channel
(because of <code class="language-plaintext highlighter-rouge">+i</code>, <code class="language-plaintext highlighter-rouge">+j</code>, <code class="language-plaintext highlighter-rouge">+l</code>, <code class="language-plaintext highlighter-rouge">+S</code>, <code class="language-plaintext highlighter-rouge">+r</code>, see below) are instead sent to
the given channel. Clients are notified when the forward takes effect.</p>
<p>An operator can set <code class="language-plaintext highlighter-rouge">/mode +f #channel2</code> only if they are an op in
<code class="language-plaintext highlighter-rouge">#channel2</code> or if <code class="language-plaintext highlighter-rouge">#channel2</code> has mode <code class="language-plaintext highlighter-rouge">+F</code> set (see below).</p>
<p>Usually you want to set forwards with <code class="language-plaintext highlighter-rouge">MLOCK</code>, because the channel will
become empty over time and the channel modes are lost. You might also want
to set <code class="language-plaintext highlighter-rouge">GUARD</code> to prevent the channel from becoming empty. An operator can
use <code class="language-plaintext highlighter-rouge">MLOCK</code> with <code class="language-plaintext highlighter-rouge">+f</code> only if they have access flag <code class="language-plaintext highlighter-rouge">+s</code> in both channels,
or if the channel to be forwarded to is <code class="language-plaintext highlighter-rouge">+F</code> and they have <code class="language-plaintext highlighter-rouge">+s</code> in the
original channel.</p>
</td>
</tr>
<tr>
<td>
<code>F</code>
<br />
enable forwarding
</td>
<td><p>Allow operators in other channels to forward clients to this channel,
without requiring ops in the target channel.</p>
</td>
</tr>
<tr>
<td>
<code>g</code>
<br />
free invite
</td>
<td><p>Anybody in the channel may invite others (using the <code class="language-plaintext highlighter-rouge">/invite</code> command)
to the channel.</p>
</td>
</tr>
<tr>
<td>
<code>i</code>
<br />
invite only
</td>
<td><p>Users are unable to join invite-only channels unless they are invited
or match a <code class="language-plaintext highlighter-rouge">+I</code> entry.</p>
</td>
</tr>
<tr>
<td>
<code>I</code>
<br />
invite exemption
</td>
<td><p>Takes a <a href="channelmodes.html#masks">mask</a> parameter. Matching clients do not need to be invited
to join the channel when it is invite-only (<code class="language-plaintext highlighter-rouge">+i</code>). Unlike the <code class="language-plaintext highlighter-rouge">/invite</code>
command, this does not override <code class="language-plaintext highlighter-rouge">+j</code>, <code class="language-plaintext highlighter-rouge">+l</code> and <code class="language-plaintext highlighter-rouge">+r</code>. Only channel operators
can see <code class="language-plaintext highlighter-rouge">+I</code> changes or see the list with <code class="language-plaintext highlighter-rouge">/mode #channel +I</code>.</p>
<p>Commonly used with the $a extban.
<code class="language-plaintext highlighter-rouge">/mode #channel +I $a:example</code>
would allow a user identified to services as example to enter #channel.</p>
</td>
</tr>
<tr>
<td>
<code>j</code>
<br />
join throttle
</td>
<td><p>This mode takes one parameter of the form <code class="language-plaintext highlighter-rouge">n:t</code>, where <code class="language-plaintext highlighter-rouge">n</code> and <code class="language-plaintext highlighter-rouge">t</code> are
positive integers. Only <code class="language-plaintext highlighter-rouge">n</code> users may join in each period of <code class="language-plaintext highlighter-rouge">t</code> seconds,
so with e.g. <code class="language-plaintext highlighter-rouge">3:10</code> only 3 users could join within 10 seconds.
Invited users can join regardless of <code class="language-plaintext highlighter-rouge">+j</code>, but are counted as normal.
You can use this mode to prevent bot attacks. Observe the average join
rate of your channel and pick a good value for <code class="language-plaintext highlighter-rouge">+j</code>. This mode could be
combined with <code class="language-plaintext highlighter-rouge">+f</code> to forward throttled users to an overflow channel.</p>
</td>
</tr>
<tr>
<td>
<code>k</code>
<br />
password
</td>
<td><p>To enter the channel, you must specify the password on your <code class="language-plaintext highlighter-rouge">/join</code>
command. Keep in mind that modes locked with ChanServs <code class="language-plaintext highlighter-rouge">MLOCK</code> command
can be seen by anyone recreating the channel; this includes keys.
Also keep in mind that users being on the channel when <code class="language-plaintext highlighter-rouge">+k</code> is set will
see the key as well.</p>
</td>
</tr>
<tr>
<td>
<code>l</code>
<br />
join limit
</td>
<td><p>Takes a positive integer parameter. Limits the number of users who can be
in the channel at the same time.</p>
</td>
</tr>
<tr>
<td>
<code>m</code>
<br />
moderated
</td>
<td><p>Only opped and voiced users can send to the channel. This mode does not
prevent users from changing nicks.</p>
</td>
</tr>
<tr>
<td>
<code>n</code>
<br />
prevent external send
</td>
<td><p>Users outside the channel may not send messages to it.
Keep in mind that bans and quiets will not apply to external users.</p>
</td>
</tr>
<tr>
<td>
<code>p</code>
<br />
private
</td>
<td><p>The <code class="language-plaintext highlighter-rouge">KNOCK</code> command cannot be used on the channel, and users will not be
shown the channel in whois output unless they share the channel with the
requestor. The channel will still appear in channel lists and <code class="language-plaintext highlighter-rouge">WHO</code> output
(set channel mode <code class="language-plaintext highlighter-rouge">+s</code> if this is not desired).</p>
</td>
</tr>
<tr>
<td>
<code>q</code>
<br />
quiet
</td>
<td><p>Takes a <a href="channelmodes.html#masks">mask</a> parameter. Works like <code class="language-plaintext highlighter-rouge">+b</code> (channel ban), but allows
matching users to join the channel.</p>
</td>
</tr>
<tr>
<td>
<code>Q</code>
<br />
block forwarded users
</td>
<td><p>Users cannot be forwarded (see <code class="language-plaintext highlighter-rouge">+f</code> above) to a channel with <code class="language-plaintext highlighter-rouge">+Q</code>.</p>
</td>
</tr>
<tr>
<td>
<code>r</code>
<br />
block unidentified
</td>
<td><p>Prevents users who are not identified to services from joining the channel.</p>
</td>
</tr>
<tr>
<td>
<code>s</code>
<br />
secret
</td>
<td><p>This channel will not appear on channel lists or <code class="language-plaintext highlighter-rouge">WHO</code> or <code class="language-plaintext highlighter-rouge">WHOIS</code> output
unless you are on it.</p>
</td>
</tr>
<tr>
<td>
<code>S</code>
<br />
TLS-only
</td>
<td><p>Only users connected via TLS may join the channel while this mode is set.
Users already in the channel are not affected.</p>
</td>
</tr>
<tr>
<td>
<code>t</code>
<br />
ops-topic
</td>
<td><p>Only channel operators may set the channel topic.</p>
</td>
</tr>
<tr>
<td>
<code>T</code>
<br />
block notice
</td>
<td><p>Blocks channel notices (other than CTCP replies, see <code class="language-plaintext highlighter-rouge">+C</code>).</p>
</td>
</tr>
<tr>
<td>
<code>u</code>
<br />
unfiltered
</td>
<td><p>Receive messages that are filtered server side by Libera.Chat based on
content, usually spam. Set <code class="language-plaintext highlighter-rouge">+u</code> if you want the channel to receive these
messages. Also see the corresponding <a href="usermodes.html">user mode</a>.</p>
</td>
</tr>
<tr>
<td>
<code>z</code>
<br />
reduced moderation
</td>
<td><p>The effects of <code class="language-plaintext highlighter-rouge">+b</code>, <code class="language-plaintext highlighter-rouge">+q</code>, and <code class="language-plaintext highlighter-rouge">+m</code> are relaxed. For each message, if that
message would normally be blocked by one of these modes, it is instead
sent to channel operators (<code class="language-plaintext highlighter-rouge">+o</code>).</p>
</td>
</tr>
</tbody>
</table>
<p></div></p>
<h2 id="restricted-channel-modes">Restricted channel modes</h2>
<p>The following channel modes can only be added by Libera.Chat staff.</p>
<!-- markdownlint-disable MD013 -->
<!-- markdownlint-enable MD013 -->
<!-- markdownlint-disable MD033 MD041 -->
<p><div class="table"></p>
<table>
<thead>
<tr>
<th>Mode (name)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>L</code>
<br />
large ban list
</td>
<td><p>Increase maximum number of <code class="language-plaintext highlighter-rouge">+beIq</code> entries.</p>
</td>
</tr>
<tr>
<td>
<code>P</code>
<br />
permanent
</td>
<td><p>Channel does not disappear when empty.</p>
</td>
</tr>
</tbody>
</table>
<p></div></p>
<h2 id="masks">Masks</h2>
<p><code class="language-plaintext highlighter-rouge">+b</code>, <code class="language-plaintext highlighter-rouge">+e</code>, <code class="language-plaintext highlighter-rouge">+I</code>, and <code class="language-plaintext highlighter-rouge">+q</code> all take a mask to determine which users to match.</p>
<p>The common form of a mask is <code class="language-plaintext highlighter-rouge">nick!user@host</code>. The wildcards <code class="language-plaintext highlighter-rouge">*</code> and <code class="language-plaintext highlighter-rouge">?</code> are
allowed, matching zero-or-more and exactly-one characters, respectively. Bans
set on IP addresses will apply even if the affected user joins with a resolved
or cloaked hostname.
<a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation">CIDR notation</a>
is supported in bans.</p>
<p>The second form, called extbans, can be used for bans based on user data.
These entries have the general format <code class="language-plaintext highlighter-rouge">$X</code> or <code class="language-plaintext highlighter-rouge">$X:data</code>. Optionally, they can
be negated with a tilde (<code class="language-plaintext highlighter-rouge">~</code>) before the character: for example, <code class="language-plaintext highlighter-rouge">$~a</code> matches
every user that is <em>not</em> identified to services.</p>
<h2 id="available-extban-types">Available extban types<!-- markdownlint-disable MD033 MD041 --></h2>
<p><div class="table"></p>
<table>
<thead>
<tr>
<th>Type (name)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>$a</code>
<br />
account name
</td>
<td><p>Match users identified to the account specified in the parameter.
Accepts wildcards; an empty <code class="language-plaintext highlighter-rouge">$a</code> matches any logged-in user.
For example: <code class="language-plaintext highlighter-rouge">/mode #channel +q $a:example</code> would quiet a user identified
to services as example.</p>
</td>
</tr>
<tr>
<td>
<code>$j</code>
<br />
cannot join other channel
</td>
<td><p>Takes an exact channel name (no wildcards or globbing) as its parameter
and matches any user who is banned from that channel. Due to caching by
the server, a change to the target channels ban list may not immediately
affect a users ability to send to the channel using <code class="language-plaintext highlighter-rouge">$j</code>.</p>
</td>
</tr>
<tr>
<td>
<code>$r</code>
<br />
ircname
</td>
<td><p>Matches on a clients ircname, or gecos. The parameter accepts wildcards.
For example: <code class="language-plaintext highlighter-rouge">/mode #channel +b $r:Foo*</code> will ban any user whose gecos
begins with “Foo”.</p>
</td>
</tr>
<tr>
<td>
<code>$x</code>
<br />
full match
</td>
<td><p>Takes a parameter that is matched against a clients full
<code class="language-plaintext highlighter-rouge">nick!username@host#gecos</code>. The parameter accepts wildcards.
For example, <code class="language-plaintext highlighter-rouge">/mode #channel +b $x:*#Foo*</code> will ban any user whose gecos
begins with Foo, or whose gecos contains “#Foo”.</p>
</td>
</tr>
<tr>
<td>
<code>$z</code>
<br />
connected securely
</td>
<td><p>Accepts no parameters. Matches users who are connected via SSL/TLS.</p>
</td>
</tr>
</tbody>
</table>
<p></div></p>
<hr>
<p>Based on content © 2016-2021 <a href="https://github.com/freenode/web-7.0/graphs/contributors">freenode/web7.0s contributors</a>
under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons BY-NC-SA</a></p>
</main><footer>
<div>
<span class="copyright">&copy; Libera Chat's contributors 2021</span>
(<a rel="license noopener noreferrer" href="../LICENSE-content.txt">Content CC BY-NC-SA</a>,
<a rel="license noopener noreferrer" href="../LICENSE-code.txt">Code MIT</a>)
<span class="mobile-hide">/</span>
<a href="../atom.xml">Feed (atom)</a>
<span class="mobile-hide">/</span>
<a href="../privacy.html">Privacy</a>
</div>
<div>
<a rel="me noopener noreferrer" href="https://fosstodon.org/@liberachat">Mastodon</a>
<span class="mobile-hide">/</span>
<a href="https://github.com/Libera-Chat/libera-chat.github.io" rel="noopener noreferrer">GitHub</a>
<span class="mobile-hide">/</span>
<a href="https://twitter.com/liberachat" rel="noopener noreferrer">Twitter</a>
<span class="mobile-hide">/</span>
<a href="https://facebook.com/liberachat" rel="noopener noreferrer">Facebook</a>
</div>
</footer>