| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>BlackTools v2.5.5 — Documentation</title>
- <style>
- :root{
- --bg:#0b0e13;
- --bg2:#10141b;
- --panel:#151a23;
- --panel2:#1a2029;
- --border:#242c38;
- --border2:#2e3947;
- --text:#d7dee8;
- --muted:#8b98a9;
- --faint:#5c6a7d;
- --accent:#e8433f; /* maple red */
- --accent-soft:#ff6b57;
- --gold:#e5b567;
- --green:#4ec98a;
- --blue:#58a6ff;
- --purple:#bc8cff;
- --orange:#f0883e;
- --pink:#ff7eb6;
- --cyan:#39c5cf;
- --code-bg:#0d1117;
- --radius:10px;
- --sidebar-w:275px;
- --mono:'Cascadia Code','JetBrains Mono',Consolas,'Fira Code',monospace;
- }
- *{margin:0;padding:0;box-sizing:border-box}
- html{scroll-behavior:smooth;scroll-padding-top:24px}
- body{
- background:var(--bg);
- color:var(--text);
- font:15px/1.65 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
- }
- ::selection{background:rgba(232,67,63,.35)}
- a{color:var(--blue);text-decoration:none}
- a:hover{text-decoration:underline}
- code{font-family:var(--mono);font-size:.88em;background:var(--panel2);border:1px solid var(--border);padding:1px 6px;border-radius:5px;color:var(--gold)}
- kbd{font-family:var(--mono);font-size:.8em;background:var(--panel2);border:1px solid var(--border2);border-bottom-width:2px;padding:1px 6px;border-radius:5px;color:var(--muted)}
- /* ---------- layout ---------- */
- .layout{display:flex;min-height:100vh}
- .sidebar{
- width:var(--sidebar-w);flex-shrink:0;
- background:var(--bg2);border-right:1px solid var(--border);
- position:sticky;top:0;height:100vh;overflow-y:auto;
- padding:22px 16px 40px;
- scrollbar-width:thin;scrollbar-color:var(--border2) transparent;
- }
- .main{flex:1;min-width:0;padding:0 42px 90px}
- .wrap{max-width:900px;margin:0 auto}
- /* ---------- sidebar ---------- */
- .logo{display:flex;align-items:center;gap:10px;padding:2px 8px 14px;border-bottom:1px solid var(--border);margin-bottom:14px}
- .logo .leaf{font-size:24px;filter:drop-shadow(0 0 8px rgba(232,67,63,.6))}
- .logo b{font-size:17px;letter-spacing:.4px}
- .logo b span{color:var(--accent)}
- .logo small{display:block;color:var(--faint);font-size:11px;letter-spacing:.5px}
- #search{
- width:100%;background:var(--panel);border:1px solid var(--border2);border-radius:8px;
- color:var(--text);padding:8px 12px;font-size:13px;margin-bottom:6px;outline:none;
- }
- #search:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(232,67,63,.15)}
- .search-hint{font-size:11px;color:var(--faint);padding:0 4px 10px}
- #search-count{color:var(--accent-soft);font-weight:600;display:none}
- .nav h5{
- font-size:10.5px;text-transform:uppercase;letter-spacing:1.4px;color:var(--faint);
- margin:16px 8px 6px;
- }
- .nav a{
- display:block;padding:4px 10px;border-radius:6px;color:var(--muted);
- font-size:13.5px;border-left:2px solid transparent;
- }
- .nav a:hover{color:var(--text);background:var(--panel);text-decoration:none}
- .nav a.active{color:var(--accent-soft);background:rgba(232,67,63,.08);border-left-color:var(--accent)}
- /* ---------- hero ---------- */
- .hero{
- padding:56px 0 34px;border-bottom:1px solid var(--border);margin-bottom:38px;
- background:
- radial-gradient(ellipse 60% 120% at 70% -20%, rgba(232,67,63,.13), transparent),
- radial-gradient(ellipse 40% 90% at 20% -10%, rgba(229,181,103,.07), transparent);
- }
- .hero h1{font-size:40px;letter-spacing:-.5px;line-height:1.1}
- .hero h1 span{color:var(--accent)}
- .hero .tagline{color:var(--muted);font-size:17px;margin-top:8px}
- .hero .tagline em{color:var(--gold);font-style:normal}
- .badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px}
- .badge{
- font-size:12px;font-weight:600;padding:4px 12px;border-radius:99px;
- background:var(--panel);border:1px solid var(--border2);color:var(--muted);
- }
- .badge.hot{background:rgba(232,67,63,.12);border-color:rgba(232,67,63,.4);color:var(--accent-soft)}
- .badge.gold{background:rgba(229,181,103,.1);border-color:rgba(229,181,103,.35);color:var(--gold)}
- /* ---------- sections ---------- */
- section{margin-bottom:58px}
- section>h2{
- font-size:26px;letter-spacing:-.3px;padding-bottom:10px;margin-bottom:8px;
- border-bottom:1px solid var(--border);
- }
- section>h2 .hash{color:var(--accent);margin-right:6px}
- .sec-intro{color:var(--muted);margin-bottom:22px;max-width:72ch}
- h3.sub{font-size:18px;margin:34px 0 14px;color:var(--gold)}
- /* ---------- callouts ---------- */
- .note{
- background:rgba(88,166,255,.06);border:1px solid rgba(88,166,255,.25);
- border-left:3px solid var(--blue);border-radius:8px;padding:12px 16px;margin:16px 0;
- font-size:14px;color:var(--text);
- }
- .warn{
- background:rgba(240,136,62,.06);border:1px solid rgba(240,136,62,.3);
- border-left:3px solid var(--orange);border-radius:8px;padding:12px 16px;margin:16px 0;
- font-size:14px;
- }
- .tip{
- background:rgba(78,201,138,.05);border:1px solid rgba(78,201,138,.25);
- border-left:3px solid var(--green);border-radius:8px;padding:12px 16px;margin:16px 0;
- font-size:14px;
- }
- .note b,.warn b,.tip b{color:inherit}
- /* ---------- command cards ---------- */
- .cmd{
- background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);
- padding:18px 20px 16px;margin:14px 0;
- transition:border-color .15s;
- }
- .cmd:hover{border-color:var(--border2)}
- .cmd.hidden{display:none}
- .cmd-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
- .cmd-head h4{font-size:16.5px;font-family:var(--mono);color:#fff;font-weight:600}
- .cmd-head h4 .amp{color:var(--accent)}
- .cmd p{color:var(--muted);font-size:14px;margin-bottom:10px;max-width:78ch}
- .cmd p strong{color:var(--text)}
- .opt{font-size:13px;color:var(--faint);margin-top:10px}
- .opt code{font-size:.92em}
- /* level badges */
- .lvl{
- font-size:10.5px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;
- padding:2.5px 9px;border-radius:99px;border:1px solid;
- }
- .lvl.voice {color:var(--green); border-color:rgba(78,201,138,.45); background:rgba(78,201,138,.08)}
- .lvl.op {color:var(--blue); border-color:rgba(88,166,255,.45); background:rgba(88,166,255,.08)}
- .lvl.admin {color:var(--purple);border-color:rgba(188,140,255,.45);background:rgba(188,140,255,.08)}
- .lvl.manager{color:var(--orange);border-color:rgba(240,136,62,.45); background:rgba(240,136,62,.08)}
- .lvl.owner {color:var(--accent-soft);border-color:rgba(232,67,63,.5);background:rgba(232,67,63,.08)}
- .lvl.master {color:var(--pink); border-color:rgba(255,126,182,.45);background:rgba(255,126,182,.08)}
- .lvl.boss {color:var(--gold); border-color:rgba(229,181,103,.5); background:rgba(229,181,103,.08)}
- .lvl.all {color:var(--cyan); border-color:rgba(57,197,207,.45); background:rgba(57,197,207,.08)}
- /* ---------- code blocks ---------- */
- .code{position:relative;margin:10px 0}
- .code pre{
- background:var(--code-bg);border:1px solid var(--border);border-radius:8px;
- padding:12px 90px 12px 15px;overflow-x:auto;
- font-family:var(--mono);font-size:13px;line-height:1.75;color:#c9d1d9;
- scrollbar-width:thin;
- }
- .code.syntax pre{border-left:3px solid var(--accent)}
- .code.example pre{border-left:3px solid var(--green)}
- .code .tag{
- position:absolute;top:9px;right:44px;font-size:9.5px;font-weight:700;
- letter-spacing:1px;text-transform:uppercase;color:var(--faint);user-select:none;
- }
- .copy{
- position:absolute;top:6px;right:8px;cursor:pointer;
- background:var(--panel2);border:1px solid var(--border2);border-radius:6px;
- color:var(--muted);width:26px;height:24px;font-size:12px;line-height:1;
- }
- .copy:hover{color:var(--text);border-color:var(--faint)}
- .copy.ok{color:var(--green);border-color:var(--green)}
- /* syntax highlight-ish helpers inside pre */
- pre .c{color:#586e81;font-style:italic} /* comment */
- pre .t{color:var(--accent-soft);font-weight:600} /* trigger/cmd */
- pre .a{color:#79c0ff} /* argument */
- pre .o{color:#8b98a9} /* optional */
- /* ---------- tables ---------- */
- table{width:100%;border-collapse:collapse;margin:14px 0;font-size:13.5px}
- th{
- text-align:left;padding:9px 13px;background:var(--panel2);color:var(--muted);
- font-size:11px;text-transform:uppercase;letter-spacing:1px;border:1px solid var(--border);
- }
- td{padding:8px 13px;border:1px solid var(--border);color:var(--text);vertical-align:top}
- tr:nth-child(even) td{background:rgba(255,255,255,.014)}
- td code{white-space:nowrap}
- .table-scroll{overflow-x:auto}
- /* ---------- misc ---------- */
- .pill-row{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0}
- .pill{font-family:var(--mono);font-size:12px;background:var(--panel2);border:1px solid var(--border);padding:3px 10px;border-radius:6px;color:var(--muted)}
- #top-btn{
- position:fixed;bottom:26px;right:26px;width:42px;height:42px;border-radius:50%;
- background:var(--panel2);border:1px solid var(--border2);color:var(--muted);
- cursor:pointer;font-size:17px;display:none;z-index:50;
- }
- #top-btn:hover{color:var(--accent-soft);border-color:var(--accent)}
- footer{
- border-top:1px solid var(--border);margin-top:70px;padding-top:24px;
- color:var(--faint);font-size:13px;
- }
- footer a{color:var(--muted)}
- @media(max-width:900px){
- .sidebar{display:none}
- .main{padding:0 18px 60px}
- .hero h1{font-size:30px}
- }
- </style>
- </head>
- <body>
- <div class="layout">
- <!-- ======================= SIDEBAR ======================= -->
- <nav class="sidebar">
- <div class="logo">
- <span class="leaf">🛠️</span>
- <div><b>Black<span>Tools</span></b><small>v2.5.5 · DOCUMENTATION</small></div>
- </div>
- <input id="search" type="text" placeholder="Filter commands… ( / )" autocomplete="off">
- <div class="search-hint"><span id="search-count"></span> </div>
- <div class="nav" id="nav">
- <h5>Start here</h5>
- <a href="#overview">Overview</a>
- <a href="#whatsnew">What's new in 2.5.5</a>
- <a href="#install">Installation</a>
- <a href="#using">Using the bot</a>
- <a href="#levels">Access levels</a>
- <h5>Commands</h5>
- <a href="#cmd-general">General commands</a>
- <a href="#cmd-chanops">Channel op commands</a>
- <a href="#cmd-bans">Kick & ban commands</a>
- <a href="#cmd-users">User management</a>
- <a href="#cmd-chan">Channel management</a>
- <a href="#cmd-owner">Bot owner commands</a>
- <h5>Features</h5>
- <a href="#protections">Protections</a>
- <a href="#modules">Modules</a>
- <a href="#myset">Personal settings</a>
- <h5>Reference</h5>
- <a href="#egg">Eggdrop.conf via IRC</a>
- <a href="#native">Native eggdrop settings</a>
- <a href="#reference">Ban methods & masks</a>
- </div>
- </nav>
- <!-- ======================= MAIN ======================= -->
- <div class="main"><div class="wrap">
- <div class="hero">
- <h1>Black<span>Tools</span> Documentation</h1>
- <p class="tagline">The Ultimate Channel Control Script — <em>One TCL. One smart Eggdrop.</em><br>
- A complete reference for every command, protection and module.</p>
- <div class="badges">
- <span class="badge hot">v2.5.5</span>
- <span class="badge">Eggdrop ≥ 1.8</span>
- <span class="badge">Tcl ≥ 8.5</span>
- <span class="badge gold">Undernet · X service</span>
- <span class="badge">EN · RO · ES · FR</span>
- <span class="badge">by BLaCkShaDoW · tclscripts.net</span>
- </div>
- </div>
- <!-- ================= OVERVIEW ================= -->
- <section id="overview">
- <h2><span class="hash">#</span>Overview</h2>
- <p class="sec-intro">
- BlackTools is a complete channel-management script for Eggdrop bots. It bundles
- <strong>~70 commands</strong>, <strong>25+ protections</strong> (flood, spam, advert, badword, clone
- detection…) and <strong>25+ modules</strong> (seen, quotes, notes, greets, topic control, X
- integration…) into one package. Every channel can be configured independently — each
- owner/manager toggles the protections, modules and commands they want.
- </p>
- <table>
- <tr><th style="width:170px">Script</th><td>BlackTools v2.5.5 (GitHub master, 2021)</td></tr>
- <tr><th>Author</th><td>Daniel Voipan (BLaCkShaDoW) — <a href="http://www.tclscripts.net">www.tclscripts.net</a></td></tr>
- <tr><th>Requirements</th><td>Eggdrop 1.8.x or newer · Tcl 8.5 or newer</td></tr>
- <tr><th>Languages</th><td>English · Romanian · Spanish · French (lang files auto-loaded from <code>lang/</code>)</td></tr>
- <tr><th>Home channel</th><td>Set via <code>black(homechan)</code> in <code>BlackTools.tcl</code> (default: none)</td></tr>
- <tr><th>Network services</th><td>Undernet <code>X</code> (x@channels.undernet.org) — auto-login supported</td></tr>
- <tr><th>Online help</th><td><code>#TCL-HELP</code> on Undernet · <a href="https://github.com/tclscripts/BlackToolS-TCL">GitHub</a></td></tr>
- </table>
- <div class="tip"><b>The two most important commands:</b> <code>!h</code> shows every command available
- <em>to you</em> at your access level, and <code>!man <command></code> shows the built-in manual page for any
- command, protection or module. When in doubt — <code>!man</code> it.</div>
- </section>
- <!-- ================= WHAT'S NEW ================= -->
- <section id="whatsnew">
- <h2><span class="hash">#</span>What's new in 2.5.5</h2>
- <p class="sec-intro">Summary of the changes between v2.5.3 (2018) and v2.5.5 (GitHub master, 2021),
- compiled from the shipped <code>ChangeLog</code> and a comparison of the sources.</p>
- <h3 class="sub">New modules & protections</h3>
- <div class="table-scroll"><table>
- <tr><th style="width:160px">Feature</th><th>Description</th></tr>
- <tr><td><code>AutoUpdate</code></td><td>The bot updates itself from GitHub when a new BT version or bugfix is released — on a timer or by command (<code>!update</code>). All BT files and your <code>BlackTools.tcl</code> settings are backed up and restored. Powered by the new <code>Addons/</code> folder (http, json, github helper libraries) — no external TLS package needed. Can auto-restart the bot when an update requires it.</td></tr>
- <tr><td><code>Alias</code></td><td>Users can build their own personalized commands on top of BT commands, with <code>%1%</code>/<code>%2%</code> argument placeholders.</td></tr>
- <tr><td><code>Vote</code></td><td>Full channel voting system: open votings with multiple options, expiry times, access-only or everyone participation, and result listings.</td></tr>
- <tr><td><code>NoProxy</code></td><td>New protection that bans users joining from IPs identified as proxies. The ban reason supports an <code>%isp%</code> placeholder.</td></tr>
- <tr><td><code>AntiBotIdle</code></td><td>New egg setting that keeps the eggdrop itself from idling on the server.</td></tr>
- <tr><td>ChanServ mass-ban detector</td><td>The bot detects mass-bans done through X and suspends the abuser (configurable coverage percent, suspend level and time).</td></tr>
- </table></div>
- <h3 class="sub">Regex ban system</h3>
- <p class="sec-intro">The ban engine (rewritten in the new <code>BT.Ban.tcl</code>, faster) now supports
- <strong>regular-expression bans</strong>: <code>!b -regex</code>,
- <code>!ub -regex</code>, <code>!sb -regex</code> and <code>!banlist regex</code>. Regexes match against
- <code>nick!ident@host/[realname]/[banmask type]</code>. The BadChan module also accepts regex badchans
- (<code>!badchan regex <#regex></code>) and got a faster, safer scanning mode.</p>
- <h3 class="sub">Other changes</h3>
- <div class="table-scroll"><table>
- <tr><th>Change</th><th>Detail</th></tr>
- <tr><td>DCC party-line support</td><td>All commands now work through DCC chat: <code>.bt <command> [#channel] [arguments]</code> (with <code>!myset mychan</code> set, the channel can be omitted).</td></tr>
- <tr><td>Languages</td><td>Spanish translation added; French language files are also shipped.</td></tr>
- <tr><td><b>GuestNick removed</b></td><td>The GuestNick module was removed in the 2021-03-15 update.</td></tr>
- <tr><td>Quote access control</td><td>New <code>quote:usage</code> setting: choose whether only users with access, or everyone, may add/list/remove quotes.</td></tr>
- <tr><td>AntiColor tuning</td><td>New option to punish only specific colour codes (<code>anticolor:specific_colors</code>).</td></tr>
- <tr><td>DNS on-join toggle</td><td><code>black(dns_onjoin)</code> lets you disable DNS lookups on join (faster on big channels).</td></tr>
- <tr><td>Flood action change</td><td>The private-message antiflood action changed from server SILENCE to IGNORE.</td></tr>
- <tr><td>Fixes</td><td>Gag durations for all access levels, TopWords now counts all users, NickServ login, clonescan bans, Idle module vs. SecureMode <code>+mD</code> interaction, alias/notes/suspends cleaned up when users expire, and assorted minor bugs.</td></tr>
- </table></div>
- </section>
- <!-- ================= INSTALL ================= -->
- <section id="install">
- <h2><span class="hash">#</span>Installation</h2>
- <p class="sec-intro">From the <code>INSTALL</code> file — how to get BlackTools running on a fresh eggdrop.</p>
- <div class="code example"><span class="tag">shell</span><button class="copy" title="Copy">⧉</button><pre><span class="c"># 1. get the latest version (or unpack the release archive)</span>
- git clone https://github.com/tclscripts/BlackToolS-TCL
- <span class="c"># 2. edit BlackTools.tcl to your liking (homechan, cmdchar, X login, defaults…)</span>
- <span class="c"># 3. copy everything into your eggdrop's scripts/ directory (case sensitive!)</span>
- cp -r BlackTools/ /home/of/your_eggdrop/scripts/
- cp BlackTools.tcl /home/of/your_eggdrop/scripts/
- <span class="c"># 4. add this line at the END of your eggdrop config file</span>
- source scripts/BlackTools.tcl
- <span class="c"># 5. restart the eggdrop, then in any channel type:</span>
- .h</pre></div>
- <div class="warn"><b>Warning:</b> running BlackTools together with the <b>A&A</b> script "works in
- theory" only — the author explicitly does not support that combination.</div>
- <p class="sec-intro" style="margin-top:16px">The directory layout that must live under <code>scripts/</code>:</p>
- <div class="pill-row">
- <span class="pill">BlackTools.tcl — main config</span>
- <span class="pill">BlackTools/BT.Core.tcl</span>
- <span class="pill">BlackTools/BT.Ban.tcl — ban engine</span>
- <span class="pill">BlackTools/BT.Loader.tcl</span>
- <span class="pill">BlackTools/BT.Binds.tcl</span>
- <span class="pill">BlackTools/BT.Timers.tcl</span>
- <span class="pill">BlackTools/Addons/ — http, json, github</span>
- <span class="pill">BlackTools/Commands/ — 10 files</span>
- <span class="pill">BlackTools/Modules/ — 26 files</span>
- <span class="pill">BlackTools/Protections/ — 19 files</span>
- <span class="pill">BlackTools/lang/ — EN · RO · ES · FR</span>
- </div>
- </section>
- <!-- ================= USING ================= -->
- <section id="using">
- <h2><span class="hash">#</span>Using the bot</h2>
- <p class="sec-intro">Every BlackTools command can be triggered <strong>four ways</strong>. All examples in
- this documentation use <code>!</code>, but the bot answers to any of the configured trigger characters
- (stock: <code>!</code> <code>.</code> <code>`</code> <code>^</code> — change them with
- <code>set cmdchar</code>) — plus the botnick prefix, private message, and (new in 2.5.5) DCC chat.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!command</span> <span class="a"><args></span> <span class="c"># trigger char, in the channel</span>
- <span class="t">BotNick command</span> <span class="a"><args></span> <span class="c"># address the bot by nick, in the channel</span>
- <span class="t">/msg BotNick command</span> <span class="a">#channel <args></span> <span class="c"># private message — add the #channel</span>
- <span class="t">.bt command</span> <span class="a">[#channel] <args></span> <span class="c"># DCC party-line (channel optional with myset mychan)</span></pre></div>
- <div class="note"><b>Convention used below:</b> <code><required></code> arguments are mandatory,
- <code>[optional]</code> arguments may be omitted. <code>[#chan]</code> is only needed when messaging the bot
- privately or acting on another channel. Durations are written <code>10m</code> (minutes), <code>3h</code>
- (hours), <code>2d</code> (days) — and <code>0</code> means <em>permanent</em>.</div>
- <h3 class="sub">The help menu</h3>
- <div class="cmd" data-k="h help menu categories">
- <div class="cmd-head"><h4><span class="amp">!</span>h</h4><span class="lvl all">Any access</span></div>
- <p>The most important command. Shows all commands available at <strong>your</strong> access level,
- plus category submenus. Disabled commands are hidden or greyed out.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!h</span> <span class="o">[category]</span> <span class="c"># categories: cmds · ban · add · manager · master · owner</span>
- <span class="c"># btinfo · chaninfo · module · egg</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!h</span> <span class="c"># your main menu</span>
- <span class="t">!h</span> ban <span class="c"># every kick/ban command you can use</span>
- <span class="t">!h</span> module <span class="c"># which modules are ON (+) or OFF (-) on #channel</span>
- <span class="t">!h</span> chaninfo <span class="c"># channel flags & eggdrop flood settings</span>
- /msg BotNick h #channel ban</pre></div>
- </div>
- <div class="cmd" data-k="man manual help">
- <div class="cmd-head"><h4><span class="amp">!</span>man</h4><span class="lvl all">Any access</span></div>
- <p>The built-in user manual. Displays usage information for every command, protection and module —
- the same content as this page, live on IRC.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!man</span> <span class="a"><command></span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!man</span> b <span class="c"># manual for the ban command</span>
- <span class="t">!man</span> antipub <span class="c"># manual for the anti-advertising protection</span>
- <span class="t">!man</span> banmethod <span class="c"># explains the 7 punishment methods</span></pre></div>
- </div>
- </section>
- <!-- ================= LEVELS ================= -->
- <section id="levels">
- <h2><span class="hash">#</span>Access levels</h2>
- <p class="sec-intro">BlackTools layers its own named levels on top of eggdrop flags. Channel levels apply
- per-channel; global levels apply bot-wide. Each level inherits everything below it.</p>
- <div class="table-scroll"><table>
- <tr><th>Level</th><th>Scope</th><th>Eggdrop flag</th><th>Typical powers</th></tr>
- <tr><td><span class="lvl voice">Voice</span></td><td>channel</td><td><code>|V</code></td><td>voice self, seen, invite, kick/warn, myset, h/man</td></tr>
- <tr><td><span class="lvl op">Op</span></td><td>channel</td><td><code>|O</code></td><td>+ op/deop, modes, topic, cycle, most ban commands</td></tr>
- <tr><td><span class="lvl admin">Admin</span></td><td>channel</td><td><code>|A</code></td><td>+ say/act, add users, suspend, black/stick bans, stats</td></tr>
- <tr><td><span class="lvl manager">Manager</span></td><td>channel</td><td><code>|M</code></td><td>+ set/unset channel settings, enable/disable commands, exempt, purge, del/chuser</td></tr>
- <tr><td><span class="lvl master">Master</span></td><td>global</td><td><code>o</code></td><td>manager powers on every channel + addchan/delchan, suspend chans, status</td></tr>
- <tr><td><span class="lvl owner">Owner</span></td><td>global</td><td><code>m</code></td><td>+ global bans, broadcast, die/restart/jump, cp, TCL loading</td></tr>
- <tr><td><span class="lvl boss">Boss owner</span></td><td>global</td><td><code>n</code></td><td>everything, incl. editing eggdrop.conf settings from IRC (<code>egg</code>)</td></tr>
- </table></div>
- <div class="note">Two auxiliary levels exist for the userlist: <b>PROTECT</b> (never punished by
- protections) and <b>BAN</b> (auto-banned on sight). Ops and voices can additionally be shielded per-channel
- with <code>!set +oprotect</code> / <code>+vprotect</code> / <code>+hoprotect</code>.</div>
- </section>
- <!-- ================= GENERAL COMMANDS ================= -->
- <section id="cmd-general">
- <h2><span class="hash">#</span>General commands</h2>
- <p class="sec-intro">Everyday commands available from the lowest access level upward.</p>
- <div class="cmd" data-k="version info script">
- <div class="cmd-head"><h4><span class="amp">!</span>version</h4><span class="lvl all">Any access</span></div>
- <p>Displays the BlackTools version the eggdrop is running.</p>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!version</span></pre></div>
- </div>
- <div class="cmd" data-k="i invite user channel">
- <div class="cmd-head"><h4><span class="amp">!</span>i / <span class="amp">!</span>invite</h4><span class="lvl voice">Voice+</span></div>
- <p>Invites a user to the channel. The bot must be opped (@) for the invite to work.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!i</span> <span class="a"><nick></span> <span class="c"># in channel</span>
- <span class="t">/msg BotNick i</span> <span class="a">#channel <nick></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!i</span> JohnDoe <span class="c"># invite JohnDoe to #channel</span></pre></div>
- </div>
- <div class="cmd" data-k="seen last seen nick host ip database">
- <div class="cmd-head"><h4><span class="amp">!</span>seen</h4><span class="lvl voice">Voice+</span></div>
- <p>Searches the per-channel seen database for a nick, IP or host (wildcards supported). Shows when the
- person was last seen and what they did. Owners+ can search <code>global</code> across all channels.
- Flood-protected (2 searches / 20s by default).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!seen</span> <span class="a"><nick|ip|host></span>
- <span class="t">!seen</span> global <span class="a"><nick|ip|host></span> <span class="c"># owners+ — all channels</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!seen</span> JohnDoe
- <span class="t">!seen</span> *!*@*.videotron.ca</pre></div>
- <p class="opt">Related: <code>+seen</code> module toggle · <code>+seenlastmsg</code> (show last message) ·
- <code>+seenreply</code> (notify people they were searched for)</p>
- </div>
- <div class="cmd" data-k="activ activity last action user">
- <div class="cmd-head"><h4><span class="amp">!</span>activ</h4><span class="lvl voice">Voice+</span></div>
- <p>Shows the last recorded channel activity of a user (last join, part, kick, ban, text…), pulled from
- the bot's action tracker.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!activ</span> <span class="a"><nick></span></pre></div>
- </div>
- <div class="cmd" data-k="for multiple bots simultaneous command">
- <div class="cmd-head"><h4><span class="amp">!</span>for</h4><span class="lvl voice">Voice+</span></div>
- <p>Makes multiple eggdrops (all running BlackTools) execute the same command simultaneously —
- handy when several bots guard the channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">for</span> <span class="a"><botnick1>,<botnick2>..</span> <span class="a"><command></span> <span class="o">[option]</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">for</span> Bot1,Bot2 say Good morning everyone!</pre></div>
- </div>
- <div class="cmd" data-k="info user channel details access greet automode">
- <div class="cmd-head"><h4><span class="amp">!</span>info</h4><span class="lvl admin">Admin+</span></div>
- <p>Displays database information about a user or a channel: access level, added hostmasks, automode,
- greet line, last-seen info, channel topic/URL/manager, and more.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!info</span> <span class="a"><handle|#chan></span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!info</span> JohnDoe
- <span class="t">!info</span> #channel</pre></div>
- </div>
- <div class="cmd" data-k="addinfo greeting personal join message">
- <div class="cmd-head"><h4><span class="amp">!</span>addinfo</h4><span class="lvl voice">Voice+</span></div>
- <p>Sets a personalised greeting line for yourself, shown in <code>!info</code> and announced by the bot
- when you join (requires <code>+greet</code> on the channel). Same as <code>!myset greet</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addinfo</span> <span class="a"><text|reset></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addinfo</span> Hello everyone, glad to be here!</pre></div>
- </div>
- </section>
- <!-- ================= CHANNEL OP COMMANDS ================= -->
- <section id="cmd-chanops">
- <h2><span class="hash">#</span>Channel op commands</h2>
- <p class="sec-intro">Op/voice management, modes, topic and channel messages.</p>
- <div class="cmd" data-k="v voice devoice mass">
- <div class="cmd-head"><h4><span class="amp">!</span>v</h4><span class="lvl voice">Voice+</span></div>
- <p>Gives or removes voice <strong>(+v)</strong> for one or more users. With no nick, voices
- <em>you</em> (if you aren't voiced already).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!v</span> <span class="o">[nick1] [nick2]..</span>
- <span class="t">!v +</span> <span class="c"># mass voice everyone</span>
- <span class="t">!v -</span> <span class="c"># mass devoice</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!v</span> JohnDoe JaneDoe</pre></div>
- </div>
- <div class="cmd" data-k="o op deop mass operator">
- <div class="cmd-head"><h4><span class="amp">!</span>o</h4><span class="lvl op">Op+</span></div>
- <p>Gives or removes op <strong>(@)</strong> for one or more users. With no nick, ops <em>you</em>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!o</span> <span class="o">[nick1] [nick2]..</span>
- <span class="t">!o +</span> <span class="c"># mass op</span>
- <span class="t">!o -</span> <span class="c"># mass deop</span></pre></div>
- </div>
- <div class="cmd" data-k="ho halfop dehalfop mass">
- <div class="cmd-head"><h4><span class="amp">!</span>ho</h4><span class="lvl op">Op+</span></div>
- <p>Gives or removes halfop <strong>(+h %)</strong> for the specified users. <code>!ho +</code> /
- <code>!ho -</code> perform a mass halfop / dehalfop.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ho</span> <span class="o">[nick1] [nick2]..</span></pre></div>
- </div>
- <div class="cmd" data-k="mode channel modes lock key moderate">
- <div class="cmd-head"><h4><span class="amp">!</span>mode</h4><span class="lvl op">Op+</span></div>
- <p>Applies or removes channel modes.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mode</span> <span class="a"><+/-modes></span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mode</span> +m <span class="c"># moderate the channel</span>
- <span class="t">!mode</span> -m+ntr</pre></div>
- </div>
- <div class="cmd" data-k="t topic set text">
- <div class="cmd-head"><h4><span class="amp">!</span>t</h4><span class="lvl op">Op+</span></div>
- <p>Sets the channel topic. With <code>!set +showhandle</code>, the bot appends the handle of whoever
- changed it.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!t</span> <span class="a"><text></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!t</span> Welcome to #Channel — read the rules and have fun!</pre></div>
- </div>
- <div class="cmd" data-k="r refresh topic reload">
- <div class="cmd-head"><h4><span class="amp">!</span>r</h4><span class="lvl op">Op+</span></div>
- <p>Manually refreshes/re-applies the stored channel topic (see also the <code>+refresh</code> and
- <code>+autotopic</code> settings).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!r</span> <span class="o">[#chan]</span></pre></div>
- </div>
- <div class="cmd" data-k="cycle hop part rejoin">
- <div class="cmd-head"><h4><span class="amp">!</span>cycle</h4><span class="lvl op">Op+</span></div>
- <p>Makes the bot cycle (part and re-join) the channel, optionally waiting a given duration.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cycle</span> <span class="o">[duration|reason]</span></pre></div>
- </div>
- <div class="cmd" data-k="omsg operators message notice ops">
- <div class="cmd-head"><h4><span class="amp">!</span>omsg</h4><span class="lvl op">Op+</span></div>
- <p>Sends a message to all users with op (@) on the channel — or on every channel with
- <code>all</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!omsg</span> <span class="a"><#chan|all></span> <span class="a"><text></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!omsg</span> #channel Watch for the spambot wave, set +m if it gets bad</pre></div>
- </div>
- <div class="cmd" data-k="say message channel speak">
- <div class="cmd-head"><h4><span class="amp">!</span>say</h4><span class="lvl admin">Admin+</span></div>
- <p>Makes the bot say a message to the channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!say</span> <span class="o">[#chan]</span> <span class="a"><message></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!say</span> Quiz night starts in 10 minutes!</pre></div>
- </div>
- <div class="cmd" data-k="act action me emote">
- <div class="cmd-head"><h4><span class="amp">!</span>act</h4><span class="lvl admin">Admin+</span></div>
- <p>Makes the bot send an action (<code>/me</code>) to the channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!act</span> <span class="o">[#chan]</span> <span class="a"><message></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!act</span> waves at everyone</pre></div>
- </div>
- <div class="cmd" data-k="msg private message target query">
- <div class="cmd-head"><h4><span class="amp">!</span>msg</h4><span class="lvl owner">Owner+</span></div>
- <p>Sends a message to any target — a channel, a nick (query) or a chat window.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!msg</span> <span class="o">[target]</span> <span class="a"><message></span></pre></div>
- </div>
- <div class="cmd" data-k="broadcast all channels message">
- <div class="cmd-head"><h4><span class="amp">!</span>broadcast</h4><span class="lvl owner">Owner+</span></div>
- <p>Sends a message to <strong>all</strong> channels the bot is in.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!broadcast</span> <span class="a"><message></span></pre></div>
- </div>
- <div class="cmd" data-k="check verify user virus advertise private">
- <div class="cmd-head"><h4><span class="amp">!</span>check</h4><span class="lvl op">Op+</span></div>
- <p>Sends a private verification message to a user — used to test whether they are infected/advertising
- (drones often auto-reply). The message text is configurable.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!check</span> <span class="a"><nick></span></pre></div>
- <p class="opt">Optional settings: <code>check-message</code> (default check text)</p>
- </div>
- </section>
- <!-- ================= KICK & BAN COMMANDS ================= -->
- <section id="cmd-bans">
- <h2><span class="hash">#</span>Kick & ban commands</h2>
- <p class="sec-intro">The heart of BlackTools: a full ban system with per-ban levels, durations, sticky
- bans, global bans, comments and searchable banlists. Durations: <code>m</code>inutes /
- <code>h</code>ours / <code>d</code>ays, <code>0</code> = permanent. Most commands accept a nick
- <em>or</em> a mask — if the nick isn't on the channel, the bot will <code>WHOIS</code> it.</p>
- <div class="cmd" data-k="k kick user reason">
- <div class="cmd-head"><h4><span class="amp">!</span>k</h4><span class="lvl voice">Voice+</span></div>
- <p>Kicks a user (or everyone matching a mask) from the channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!k</span> <span class="a"><nick|mask></span> <span class="o">[reason]</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!k</span> Troublemaker
- <span class="t">!k</span> Troublemaker Please keep it civil</pre></div>
- <p class="opt">Optional settings: <code>k-reason</code> (default kick reason)</p>
- </div>
- <div class="cmd" data-k="w warn warning kick">
- <div class="cmd-head"><h4><span class="amp">!</span>w</h4><span class="lvl voice">Voice+</span></div>
- <p>Delivers a <strong>warning kick</strong> — a kick with a configurable warning reason and message.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!w</span> <span class="a"><nick></span></pre></div>
- <p class="opt">Optional settings: <code>w-reason</code> · <code>w-message</code></p>
- </div>
- <div class="cmd" data-k="b ban duration level global link comment permanent">
- <div class="cmd-head"><h4><span class="amp">!</span>b</h4><span class="lvl op">Op+</span></div>
- <p>The main ban command. Bans a nick or mask for a duration (stock default: <strong>2 days</strong>).
- A duration of <code>0</code> makes the ban permanent (blacklisted). <code>-level</code> protects the
- ban from removal by lower access. Owners+ can add <code>global</code> (all channels) or
- <code>link</code> (linked channels). <code>-c comment</code> attaches a note visible on the ban entry.
- Supports CIDR masks like <code>*!*@192.168.0.1/17</code> — and, new in 2.5.5,
- <strong>regex bans</strong> with <code>-regex</code>, matched against
- <code>nick!ident@host/[realname]/[banmask type]</code> (bracketed fields optional).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!b</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|regex></span> <span class="o">[-level] [duration] [reason] [-c comment]</span>
- <span class="t">!b</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|regex></span> <span class="o">[-level] [duration] [global|link] [reason]</span> <span class="c"># owner+</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!b</span> SpamGuy 2d advertising
- <span class="t">!b</span> *!*@198.51.100.* 12h botnet range
- <span class="t">!b</span> Griefer -400 0 permanent, level 400 protection
- <span class="t">!b</span> Flooder 3d flooding -c third offence this week
- <span class="t">!b</span> -regex [a-z]+[0-9][0-9]!*@* 1d drone pattern</pre></div>
- <p class="opt">Optional settings: <code>b-reason</code> · <code>b-bantime</code> (default 2d) ·
- <code>b-banmask</code> (default <code>*!*@host</code>)</p>
- </div>
- <div class="cmd" data-k="ub unban remove ban wildcards global">
- <div class="cmd-head"><h4><span class="amp">!</span>ub</h4><span class="lvl op">Op+</span></div>
- <p>Removes a ban by nick, mask or ban ID (wildcards supported). If the nick isn't on channel the bot
- WHOISes and unbans by ident/host/nick — matching regex bans are removed too. Use <code>-regex</code>
- to remove a stored regex ban directly. <strong>Careful:</strong> <code>!ub *</code> removes
- <em>all</em> channel bans.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ub</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|id|regex></span> <span class="o">[global|link]</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ub</span> SpamGuy
- <span class="t">!ub</span> 1234 <span class="c"># by ban ID (see +showid / !sb)</span></pre></div>
- </div>
- <div class="cmd" data-k="sb search ban details wildcards id">
- <div class="cmd-head"><h4><span class="amp">!</span>sb</h4><span class="lvl op">Op+</span></div>
- <p>Searches the banlist and shows full details of a ban — who set it, when, why, expiry, comment.
- Also matches and inspects regex bans (<code>-regex</code>).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!sb</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|id|regex></span> <span class="o">[global]</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!sb</span> *!*@*.example.net</pre></div>
- </div>
- <div class="cmd" data-k="banlist list bans active">
- <div class="cmd-head"><h4><span class="amp">!</span>banlist</h4><span class="lvl op">Op+</span></div>
- <p>Shows the active bans on the channel — all of them, only yours, other people's, regex bans only,
- gags only, or (owners+) the global list. Paged output; follow with <code>-next</code> for more
- entries.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!banlist</span> <span class="a"><all|handle|regex|gag|other></span>
- <span class="t">!banlist</span> global <span class="c"># owner+</span></pre></div>
- </div>
- <div class="cmd" data-k="black permanent blacklist ban unlimited">
- <div class="cmd-head"><h4><span class="amp">!</span>black</h4><span class="lvl admin">Admin+</span></div>
- <p>Bans a user <strong>permanently</strong> (blacklist). Equivalent to <code>!b ... 0</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!black</span> <span class="a"><nick|mask></span> <span class="o">[reason] [-c comment]</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!black</span> KnownTroll repeat offender -c do not remove</pre></div>
- <p class="opt">Optional settings: <code>black-reason</code> · <code>black-banmask</code></p>
- </div>
- <div class="cmd" data-k="stick sticky ban reactivate">
- <div class="cmd-head"><h4><span class="amp">!</span>stick</h4><span class="lvl admin">Admin+</span></div>
- <p>Sets a <strong>sticky</strong> ban: if anyone removes it from the channel banlist, the bot puts it
- right back. Stock default duration: 2 days.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!stick</span> <span class="a"><nick|mask></span> <span class="o">[duration] [reason] [-c comment]</span></pre></div>
- <p class="opt">Optional settings: <code>stick-reason</code> · <code>stick-bantime</code> · <code>stick-banmask</code></p>
- </div>
- <div class="cmd" data-k="n nickname ban nick">
- <div class="cmd-head"><h4><span class="amp">!</span>n</h4><span class="lvl op">Op+</span></div>
- <p>Bans on the user's <strong>nickname</strong> (mask <code>nick!*@*</code>). Default: 2h.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!n</span> <span class="a"><nick></span></pre></div>
- <p class="opt">Optional settings: <code>n-reason</code> · <code>n-bantime</code> · <code>n-banmask</code></p>
- </div>
- <div class="cmd" data-k="id ident ban">
- <div class="cmd-head"><h4><span class="amp">!</span>id</h4><span class="lvl op">Op+</span></div>
- <p>Bans on the user's <strong>ident</strong> (mask <code>*!user@*</code>). Given a nick, the bot grabs
- the ident automatically. Default: 2h.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!id</span> <span class="a"><nick|ident></span></pre></div>
- <p class="opt">Optional settings: <code>id-reason</code> · <code>id-bantime</code> · <code>id-banmask</code></p>
- </div>
- <div class="cmd" data-k="mb ident ban reason auto">
- <div class="cmd-head"><h4><span class="amp">!</span>mb</h4><span class="lvl op">Op+</span></div>
- <p>Bans a nickname automatically on <strong>ident</strong>, with an optional reason. Default: 2d.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mb</span> <span class="a"><nick></span> <span class="o">[reason]</span></pre></div>
- <p class="opt">Optional settings: <code>mb-reason</code> · <code>mb-bantime</code></p>
- </div>
- <div class="cmd" data-k="dr drone ban">
- <div class="cmd-head"><h4><span class="amp">!</span>dr</h4><span class="lvl op">Op+</span></div>
- <p>Bans with a default <strong>DRONE</strong> reason — for compromised clients/drones. Default: 15d.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!dr</span> <span class="a"><nick|mask></span></pre></div>
- <p class="opt">Optional settings: <code>dr-reason</code> · <code>dr-bantime</code> · <code>dr-banmask</code></p>
- </div>
- <div class="cmd" data-k="vr virus trojan ban">
- <div class="cmd-head"><h4><span class="amp">!</span>vr</h4><span class="lvl op">Op+</span></div>
- <p>Bans with a default <strong>VIRUS/TROJAN</strong> reason. Default: 3d.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!vr</span> <span class="a"><nick|mask></span></pre></div>
- <p class="opt">Optional settings: <code>vr-reason</code> · <code>vr-bantime</code> · <code>vr-banmask</code></p>
- </div>
- <div class="cmd" data-k="bot ban clone bot reason">
- <div class="cmd-head"><h4><span class="amp">!</span>bot</h4><span class="lvl op">Op+</span></div>
- <p>Bans with a default <strong>BOT</strong> reason — for unauthorised bots. Default: 7d.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bot</span> <span class="a"><nick|mask></span></pre></div>
- <p class="opt">Optional settings: <code>bot-reason</code> · <code>bot-bantime</code> · <code>bot-banmask</code></p>
- </div>
- <div class="cmd" data-k="spam ban spammer reason">
- <div class="cmd-head"><h4><span class="amp">!</span>spam</h4><span class="lvl op">Op+</span></div>
- <p>Bans with a default <strong>SPAM</strong> reason. Default: 7d.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!spam</span> <span class="a"><nick|mask></span></pre></div>
- <p class="opt">Optional settings: <code>spam-reason</code> · <code>spam-bantime</code> · <code>spam-banmask</code></p>
- </div>
- <div class="cmd" data-k="bw badword ban">
- <div class="cmd-head"><h4><span class="amp">!</span>bw</h4><span class="lvl op">Op+</span></div>
- <p>Bans with a default <strong>bad word</strong> reason. Default: 1d.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bw</span> <span class="a"><nick|mask></span></pre></div>
- <p class="opt">Optional settings: <code>bw-reason</code> · <code>bw-bantime</code> · <code>bw-banmask</code></p>
- </div>
- <div class="cmd" data-k="troll ban troll showtroll">
- <div class="cmd-head"><h4><span class="amp">!</span>troll</h4><span class="lvl op">Op+</span></div>
- <p>Bans with a default <strong>TROLL</strong> reason. With <code>+showtroll</code> enabled, the bot
- notices a "trolls of the day" list to access-holders when they join (reset at midnight).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!troll</span> <span class="a"><nick></span></pre></div>
- <p class="opt">Optional settings: <code>troll-reason</code> · <code>+showtroll</code></p>
- </div>
- <div class="cmd" data-k="gag ungag mute silence">
- <div class="cmd-head"><h4><span class="amp">!</span>gag / <span class="amp">!</span>ungag</h4><span class="lvl op">Op+</span></div>
- <p>Silences a user — they can't write on the channel — for a period (default: 10m). The bot re-bans
- (+b with mute) if the gag is removed early. <code>!ungag</code> lifts it.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!gag</span> <span class="a"><nick></span> <span class="o">[duration] [reason]</span>
- <span class="t">!ungag</span> <span class="a"><nick|mask></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!gag</span> LoudGuy 30m take a breather</pre></div>
- <p class="opt">Optional settings: <code>gag-reason</code> · <code>gag-bantime</code> · <code>gag-banmask</code></p>
- </div>
- <div class="cmd" data-k="exempt ban exception whitelist">
- <div class="cmd-head"><h4><span class="amp">!</span>exempt</h4><span class="lvl manager">Manager+</span></div>
- <p>Manages the ban-exempt list: hosts on it are never banned by the bot. Owners+ can make an exempt
- <code>global</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!exempt</span> add <span class="a"><ip|host></span> <span class="o">[period] [global] [reason]</span>
- <span class="t">!exempt</span> list <span class="o">[global]</span>
- <span class="t">!exempt</span> del <span class="a"><ip|host></span> <span class="o">[global]</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!exempt</span> add *!*@trusted.users.undernet.org 0 our regular helper</pre></div>
- </div>
- <div class="cmd" data-k="stats statistics bans kicks user">
- <div class="cmd-head"><h4><span class="amp">!</span>stats</h4><span class="lvl admin">Admin+</span></div>
- <p>Shows ban/command statistics for a user. Managers+ can <code>reset</code>. Requires the
- <code>+banstats</code> setting to collect data (see also <code>!banstats total|reset</code>).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!stats</span> <span class="a"><handle></span> <span class="o">[total|reset]</span></pre></div>
- </div>
- <div class="cmd" data-k="report reportnick advert spam nickname regular users">
- <div class="cmd-head"><h4><span class="amp">!</span>report</h4><span class="lvl all">Everyone</span></div>
- <p>Lets <em>regular users</em> (and voice/protect) report a nickname for adverts or spam. The bot
- relays the report to channel ops via @notice. Needs <code>+reportnick</code> and the bot opped.
- Flood-limited (2 reports / 60s).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!report</span> <span class="a"><nick></span> <span class="a"><comment></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!report</span> LinkSpammer keeps pasting shady links in PM</pre></div>
- </div>
- </section>
- <!-- ================= USER MANAGEMENT ================= -->
- <section id="cmd-users">
- <h2><span class="hash">#</span>User management</h2>
- <p class="sec-intro">Adding people to the bot, hostmasks, automodes and suspensions. You can only act on
- users with access <em>lower</em> than your own.</p>
- <div class="cmd" data-k="add user access level chanserv username">
- <div class="cmd-head"><h4><span class="amp">!</span>add</h4><span class="lvl admin">Admin+</span></div>
- <p>Adds a user to the channel's userlist at a given level (<code>voice</code>, <code>op</code>,
- <code>admin</code>, <code>manager</code>…). If the user is on channel, their current hostmask is added
- (default style: <code>*!*@host</code>). If not, the Undernet default is used:
- <code>*!*@<user>.users.undernet.org</code> — so you can add people by X username.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!add</span> <span class="a"><level></span> <span class="a"><nick|Xusername></span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!add</span> op JohnDoe <span class="c"># JohnDoe is on channel → current host added</span>
- <span class="t">!add</span> voice SomeUserX <span class="c"># not on channel → *!*@SomeUserX.users.undernet.org</span></pre></div>
- </div>
- <div class="cmd" data-k="userlist access list level all">
- <div class="cmd-head"><h4><span class="amp">!</span>userlist</h4><span class="lvl admin">Admin+</span></div>
- <p>Shows the channel's access list, filtered by level or all of it.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!userlist</span> <span class="a"><level|all></span> <span class="c"># levels: voice · op · admin · manager · owner · master</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!userlist</span> op</pre></div>
- </div>
- <div class="cmd" data-k="delacc remove access delete user channel">
- <div class="cmd-head"><h4><span class="amp">!</span>delacc</h4><span class="lvl admin">Admin+</span></div>
- <p>Removes a user's access from the channel (their record stays in the bot). Must target someone with
- lower access than you. Owners can strip global <code>owner|master</code> access too.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!delacc</span> <span class="a"><handle></span>
- <span class="t">!delacc</span> <span class="a"><owner|master></span> <span class="a"><handle></span> <span class="c"># remove a global level</span></pre></div>
- </div>
- <div class="cmd" data-k="del delete user database totally">
- <div class="cmd-head"><h4><span class="amp">!</span>del</h4><span class="lvl manager">Manager+</span></div>
- <p>Deletes a user <strong>entirely</strong> from the bot's database — all channels, all hosts.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!del</span> <span class="a"><handle></span></pre></div>
- </div>
- <div class="cmd" data-k="auto automode autoop autovoice global">
- <div class="cmd-head"><h4><span class="amp">!</span>auto</h4><span class="lvl admin">Admin+</span></div>
- <p>Sets a user's automode — the bot automatically ops or voices them on join. The user must already
- have access on the channel. Owners+ can apply it <code>-global</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!auto</span> <span class="a"><+/-o></span> <span class="a"><nick|handle></span> <span class="o">[-global]</span> <span class="c"># auto-op</span>
- <span class="t">!auto</span> <span class="a"><+/-v></span> <span class="a"><nick|handle></span> <span class="o">[-global]</span> <span class="c"># auto-voice</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!auto</span> +v JohnDoe</pre></div>
- </div>
- <div class="cmd" data-k="s suspend access user duration">
- <div class="cmd-head"><h4><span class="amp">!</span>s / <span class="amp">!</span>us</h4><span class="lvl admin">Admin+</span></div>
- <p><code>!s</code> suspends a user's access on the channel for a period (default: 2d);
- <code>!us</code> lifts the suspension. Only works downward in the hierarchy.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!s</span> <span class="a"><handle></span> <span class="o">[duration] [reason]</span>
- <span class="t">!us</span> <span class="a"><handle></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!s</span> RogueOp 3d abusing kick command</pre></div>
- </div>
- <div class="cmd" data-k="addhost delhost hostmask user">
- <div class="cmd-head"><h4><span class="amp">!</span>addhost / <span class="amp">!</span>delhost</h4><span class="lvl admin">Admin+</span></div>
- <p>Adds or removes a hostmask on a user's record.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addhost</span> <span class="a"><handle></span> <span class="a"><mask></span>
- <span class="t">!delhost</span> <span class="a"><handle></span> <span class="a"><mask></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addhost</span> JohnDoe *!*@JohnDoe.users.undernet.org</pre></div>
- </div>
- <div class="cmd" data-k="chuser rename handle user">
- <div class="cmd-head"><h4><span class="amp">!</span>chuser</h4><span class="lvl manager">Manager+</span></div>
- <p>Renames a user's handle in the bot's database.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!chuser</span> <span class="a"><handle></span> <span class="a"><newhandle></span></pre></div>
- </div>
- </section>
- <!-- ================= CHANNEL MANAGEMENT ================= -->
- <section id="cmd-chan">
- <h2><span class="hash">#</span>Channel management</h2>
- <p class="sec-intro">Settings, toggles and channel administration — the manager's toolbox.</p>
- <div class="cmd" data-k="set flag option setting toggle chanmode key">
- <div class="cmd-head"><h4><span class="amp">!</span>set</h4><span class="lvl manager">Manager+</span></div>
- <p>The universal switchboard. Turns protections/modules on or off (<code>+flag</code> /
- <code>-flag</code>) and assigns values to string options. Owners+ can use <code>global</code> to apply a
- setting to every channel. See the <a href="#protections">Protections</a> and
- <a href="#modules">Modules</a> sections for every flag.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> <span class="a"><+/-flag></span> <span class="c"># toggle</span>
- <span class="t">!set</span> <span class="a"><option></span> <span class="a"><value></span> <span class="c"># assign</span>
- <span class="t">!set</span> global <span class="a"><option></span> <span class="a"><value></span> <span class="c"># owner+ — all channels</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antipub <span class="c"># enable anti-advertising</span>
- <span class="t">!set</span> chanmode +ntk s3cret <span class="c"># enforce modes incl. a key</span>
- <span class="t">!set</span> b-bantime 4h <span class="c"># default !b duration → 4 hours</span>
- <span class="t">!set</span> url https://www.example.com</pre></div>
- </div>
- <div class="cmd" data-k="unset reset option flag remove">
- <div class="cmd-head"><h4><span class="amp">!</span>unset</h4><span class="lvl manager">Manager+</span></div>
- <p>Resets a setting/option back to default. Owners+ can <code>unset global</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!unset</span> <span class="a"><flag|option></span>
- <span class="t">!unset</span> global <span class="a"><flag|option></span></pre></div>
- </div>
- <div class="cmd" data-k="show setting value view">
- <div class="cmd-head"><h4><span class="amp">!</span>show</h4><span class="lvl manager">Manager+</span></div>
- <p>Shows the current value of any setting.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!show</span> <span class="a"><setting></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!show</span> antipub-bantime</pre></div>
- </div>
- <div class="cmd" data-k="enable disable command user global">
- <div class="cmd-head"><h4><span class="amp">!</span>enable / <span class="amp">!</span>disable</h4><span class="lvl manager">Manager+</span></div>
- <p>Enables/disables a command on the channel — for everyone or for a specific user. Masters+ can apply
- it <code>global</code>ly (commands only, not users). Disabled commands show greyed-out in
- <code>!h</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!disable</span> <span class="a"><command|all></span> <span class="o">[user] [global]</span>
- <span class="t">!enable</span> <span class="a"><command|all></span> <span class="o">[user] [global]</span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!disable</span> k TriggerHappyOp <span class="c"># take !k away from one user</span>
- <span class="t">!enable</span> all</pre></div>
- </div>
- <div class="cmd" data-k="ignore host bot ignore list">
- <div class="cmd-head"><h4><span class="amp">!</span>ignore</h4><span class="lvl manager">Manager+</span></div>
- <p>Adds, lists or removes bot-level ignores (default duration: 6h).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ignore</span> add <span class="a"><ip|mask></span> <span class="o">[duration] [reason]</span>
- <span class="t">!ignore</span> list
- <span class="t">!ignore</span> del <span class="a"><ip|host></span></pre></div>
- </div>
- <div class="cmd" data-k="purge delete channel data manager">
- <div class="cmd-head"><h4><span class="amp">!</span>purge</h4><span class="lvl manager">Manager+</span></div>
- <p>Deletes the channel from the bot's channel database (manager-only variant of
- <code>delchan</code>).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!purge</span> <span class="a"><#chan></span> <span class="a"><reason></span></pre></div>
- </div>
- <div class="cmd" data-k="addchan delchan add channel remove join key">
- <div class="cmd-head"><h4><span class="amp">!</span>addchan / <span class="amp">!</span>delchan</h4><span class="lvl master">Master+</span></div>
- <p>Adds a channel to the bot (it joins immediately; an optional key is used to get in) or removes
- one.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addchan</span> <span class="a"><#chan></span> <span class="o">[key]</span>
- <span class="t">!delchan</span> <span class="a"><#chan></span> <span class="a"><reason></span></pre></div>
- </div>
- <div class="cmd" data-k="suspend unsuspend channel">
- <div class="cmd-head"><h4><span class="amp">!</span>suspend / <span class="amp">!</span>unsuspend</h4><span class="lvl master">Master+</span></div>
- <p>Suspends a channel — the bot leaves and won't join or act in it — or reverses that.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!suspend</span> <span class="a"><#chan></span> <span class="a"><reason></span>
- <span class="t">!unsuspend</span> <span class="a"><#chan></span></pre></div>
- </div>
- <div class="cmd" data-k="channels list joined">
- <div class="cmd-head"><h4><span class="amp">!</span>channels</h4><span class="lvl master">Master+</span></div>
- <p>Lists all channels the bot is joined to (channels flagged <code>+invisible</code> are hidden from
- non-boss users).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!channels</span></pre></div>
- </div>
- <div class="cmd" data-k="cp copy settings userlist banlist badchans channel">
- <div class="cmd-head"><h4><span class="amp">!</span>cp</h4><span class="lvl owner">Owner+</span></div>
- <p>Copies configuration from one channel to another.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cp</span> <span class="a"><userlist|banlist|settings|badchans></span> <span class="a"><#chan1></span> <span class="a"><#chan2></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cp</span> settings #channel #channel-ops</pre></div>
- </div>
- <div class="cmd" data-k="link chanlink synchronize bans channels">
- <div class="cmd-head"><h4><span class="amp">!</span>link</h4><span class="lvl owner">Owner+</span></div>
- <p>ChanLink module — synchronises bans across two or more channels: a ban added on one linked channel
- is mirrored to the others (and removed everywhere on unban).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!link</span> <span class="a"><#chan1></span> <span class="a"><#chan2></span> | all
- <span class="t">!link</span> del <span class="a"><#chan></span>
- <span class="t">!link</span> <span class="a"><list|reset></span>
- <span class="c"># then, ad hoc:</span>
- <span class="t">!b</span> <span class="a"><nick|mask></span> <span class="o">[duration]</span> link <span class="o">[reason]</span>
- <span class="t">!ub</span> <span class="a"><nick|mask></span> link</pre></div>
- </div>
- </section>
- <!-- ================= BOT OWNER COMMANDS ================= -->
- <section id="cmd-owner">
- <h2><span class="hash">#</span>Bot owner commands</h2>
- <p class="sec-intro">Bot lifecycle and shell-free administration. Boss owners can even edit
- <code>eggdrop.conf</code> values straight from IRC — see <a href="#egg">Eggdrop.conf via IRC</a>.</p>
- <div class="cmd" data-k="uptime status server connected">
- <div class="cmd-head"><h4><span class="amp">!</span>uptime / <span class="amp">!</span>status</h4><span class="lvl master">Master+</span></div>
- <p><code>!uptime</code> shows how long the bot has been up, when it connected and to which server.
- <code>!status</code> shows monitored channels, total users, version and bot owner.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!uptime</span>
- <span class="t">!status</span></pre></div>
- </div>
- <div class="cmd" data-k="die restart rehash save shutdown reload">
- <div class="cmd-head"><h4><span class="amp">!</span>die · <span class="amp">!</span>restart · <span class="amp">!</span>rehash · <span class="amp">!</span>save</h4><span class="lvl boss">Boss owner</span></div>
- <p><code>die</code> shuts the bot down. <code>restart</code> restarts it as a background process
- (use when lagged/malfunctioning). <code>rehash</code> reloads all files after user/channel record
- changes. <code>save</code> writes the user/channel files to disk.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!die</span> <span class="o">[reason]</span> · <span class="t">!restart</span> · <span class="t">!rehash</span> · <span class="t">!save</span></pre></div>
- </div>
- <div class="cmd" data-k="jump server change connect">
- <div class="cmd-head"><h4><span class="amp">!</span>jump</h4><span class="lvl boss">Boss owner</span></div>
- <p>Makes the bot connect to a different IRC server.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!jump</span> <span class="o">[irc server]</span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!jump</span> Ashburn.Va.Us.UnderNet.org</pre></div>
- </div>
- <div class="cmd" data-k="nick change botnick">
- <div class="cmd-head"><h4><span class="amp">!</span>nick</h4><span class="lvl boss">Boss owner</span></div>
- <p>Changes the bot's nickname. <code>!set nick <newnick></code> makes it permanent (written to
- the config).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!nick</span> <span class="a"><newnick></span></pre></div>
- </div>
- <div class="cmd" data-k="login chanserv x authentication">
- <div class="cmd-head"><h4><span class="amp">!</span>login</h4><span class="lvl boss">Boss owner</span></div>
- <p>Manually logs the bot in to ChanServ (<code>X</code> on Undernet) using the configured
- username/password. Auto-login is controlled by <code>black(autologin)</code> in
- <code>BlackTools.tcl</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!login</span></pre></div>
- </div>
- <div class="cmd" data-k="chat botnet dcc partyline">
- <div class="cmd-head"><h4><span class="amp">!</span>chat</h4><span class="lvl boss">Boss owner</span></div>
- <p>Connects you to the bot's botnet/partyline — same as <code>/CTCP BotNick CHAT</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!chat</span></pre></div>
- </div>
- <div class="cmd" data-k="tcl load unload wget script upload">
- <div class="cmd-head"><h4><span class="amp">!</span>tcl</h4><span class="lvl boss">Boss owner</span></div>
- <p>Manages Tcl scripts live: list, download from a URL (restricted to <code>*.tcl</code>), load,
- unload, or inspect.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!tcl</span> list
- <span class="t">!tcl</span> wget <span class="a"><link/name.tcl></span>
- <span class="t">!tcl</span> load <span class="a"><name.tcl></span>
- <span class="t">!tcl</span> unload <span class="a"><name.tcl></span>
- <span class="t">!tcl</span> info <span class="a"><name.tcl></span></pre></div>
- </div>
- <div class="cmd" data-k="timer start kill list processes pro">
- <div class="cmd-head"><h4><span class="amp">!</span>timer</h4><span class="lvl boss">Boss owner</span></div>
- <p>PRO module — start/stop internal process timers or list active ones.
- <strong>Do not touch unless you know exactly what you're doing.</strong></p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!timer</span> start <span class="a"><timer:setting></span>
- <span class="t">!timer</span> kill <span class="a"><pid></span>
- <span class="t">!timer</span> list</pre></div>
- </div>
- </section>
- <!-- ================= PROTECTIONS ================= -->
- <section id="protections">
- <h2><span class="hash">#</span>Protections</h2>
- <p class="sec-intro">Each protection is toggled per channel with <code>!set +name</code> /
- <code>!set -name</code> and tuned via optional settings (<code>name-reason</code>,
- <code>name-bantime</code>, <code>name-banmethod</code>, <code>name-banmask</code>…). Punishments follow
- the <a href="#reference">ban-method scale</a> (warn → kick → ban). The "defaults" line on each card shows
- the stock values shipped in <code>BlackTools.tcl</code>. Users with
- <code>PROTECT</code> level — and ops/voices when <code>+oprotect</code>/<code>+vprotect</code> is on —
- are exempt.</p>
- <div class="cmd" data-k="antipub advertising links spam channel protection">
- <div class="cmd-head"><h4>AntiPub</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans users advertising channels/links (<code>*#*</code>, <code>*www.*</code>,
- <code>*http://*</code>…). Wildcard word list with exceptions — YouTube links are excepted by
- default.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antipub
- <span class="t">!antipub</span> add <span class="a"><link|#chan></span> <span class="c"># add pattern</span>
- <span class="t">!antipub</span> add <span class="a">+word</span> <span class="c"># add exception</span>
- <span class="t">!antipub</span> list · <span class="t">!antipub</span> del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 2d · method 6 (kick→ban) · mask <code>*!*@host</code> ·
- settings: <code>antipub-reason/-bantime/-warn/-banmethod/-banmask</code></p>
- </div>
- <div class="cmd" data-k="antinotice notice protection">
- <div class="cmd-head"><h4>AntiNotice</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes users who send NOTICEs to the channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antinotice</pre></div>
- <p class="opt">Stock defaults: ban 2d · method 3 (ban) · mask <code>*!*@host</code> · sets channel mode
- <code>+mr</code> for 45s during an attack</p>
- </div>
- <div class="cmd" data-k="antictcp ctcp protection">
- <div class="cmd-head"><h4>AntiCTCP</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes users who send CTCPs to the channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antictcp</pre></div>
- <p class="opt">Stock defaults: ban 3d · method 3 (ban) · mask <code>*!*@host</code> · mode
- <code>+mC</code> for 45s</p>
- </div>
- <div class="cmd" data-k="antibadword badword swear words protection">
- <div class="cmd-head"><h4>AntiBadWord</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes use of forbidden words/phrases (wildcards). Words can carry their own punishment method:
- <code>word:6</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antibadword
- <span class="t">!badword</span> add <span class="a"><word|phrase></span> · <span class="t">!badword</span> add <span class="a"><word:method></span>
- <span class="t">!badword</span> add <span class="a">+word</span> <span class="c"># exception</span> · <span class="t">!badword</span> list · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 6h · method 6 (kick→ban) · mask <code>*!*@host</code></p>
- </div>
- <div class="cmd" data-k="antilongtext long text lines protection">
- <div class="cmd-head"><h4>AntiLongText</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes messages that are too long (stock limit: 215 characters).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antilongtext</pre></div>
- <p class="opt">Stock defaults: ban 30m · method 6 · mask <code>*!*@host</code> · setting
- <code>antilongtextmax</code></p>
- </div>
- <div class="cmd" data-k="badquitpart quit part message protection quitpartcolor quitpartmsgflood">
- <div class="cmd-head"><h4>AntiBadQuitPart</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes forbidden words in part/quit messages. Extras: <code>+quitpartcolor</code> (colours in
- quit/part) and <code>+quitpartmsgflood</code> (overlong quit/part messages, default 120 chars).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badquitpart
- <span class="t">!badquitpart</span> add <span class="a"><word></span> · add <span class="a">+word</span> · list · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 1h · mask <code>*!user@host</code></p>
- </div>
- <div class="cmd" data-k="antispam spam private message join protection spamjoinmessage">
- <div class="cmd-head"><h4>AntiSpam</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans users who private-spam channel members (patterns with <code>#</code> or <code>*www.*</code>).
- The optional <code>+spamjoinmessage</code> extra sends a bait verification PM to every joiner —
- spambots that reply get caught. Scan cycle: 60m.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antispam
- <span class="t">!antispam</span> add <span class="a"><*text*></span> · add <span class="a">+word</span> · list · del <span class="a"><no.></span>
- <span class="t">!set</span> +spamjoinmessage · <span class="t">!set</span> antispam-message <span class="a"><text></span></pre></div>
- <p class="opt">Stock defaults: ban 6d · mask <code>*!*@host</code> · settings:
- <code>antispam-scantime</code></p>
- </div>
- <div class="cmd" data-k="antirepeat repeat flood text protection">
- <div class="cmd-head"><h4>AntiRepeat</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes repeating the same text (stock default: 3 repeats within 5s).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antirepeat</pre></div>
- <p class="opt">Stock defaults: ban 10m · method 7 (warn→ban) · mask <code>*!*@host</code> · setting
- <code>antirepeat-setting</code> (repeats:seconds)</p>
- </div>
- <div class="cmd" data-k="anticolor antibold antiunderline anticaps formatting colours caps protection">
- <div class="cmd-head"><h4>AntiColor · AntiBold · AntiUnderline · AntiCaps</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>The formatting police: punishes colours, bold, underline, or CAPS abuse (stock caps limit:
- 50 chars). Since 2.5.5, AntiColor can be limited to specific colour codes via
- <code>black(anticolor:specific_colors)</code> in the config.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +anticolor · <span class="t">!set</span> +antibold · <span class="t">!set</span> +antiunderline · <span class="t">!set</span> +anticaps</pre></div>
- <p class="opt">Stock defaults: ban 10m · method 7 (warn→ban) · mask <code>*!*@host</code> each</p>
- </div>
- <div class="cmd" data-k="repetitivechars repeated characters protection">
- <div class="cmd-head"><h4>RepetitiveChars</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes consecutive repeated characters (stock default: 10 in a line — "aaaaaaaaaa").</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +repetitivechars</pre></div>
- <p class="opt">Stock defaults: ban 10m · method 7 · mask <code>*!user@host</code> · setting
- <code>repetitivechars-char</code></p>
- </div>
- <div class="cmd" data-k="badnick nickname forbidden protection">
- <div class="cmd-head"><h4>BadNick</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans nicknames containing forbidden words (checked on join and nick change). Method 1 warns first
- and gives 30s to change nick before banning.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badnick
- <span class="t">!badnick</span> add <span class="a"><word></span> · add <span class="a">+word</span> · list · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 1h · mask <code>nick!*@*</code> · settings:
- <code>badnick-bmethod</code> (1 = warn→ban, 2 = ban) · <code>badnick-banwait</code> (30s)</p>
- </div>
- <div class="cmd" data-k="badident ident forbidden protection">
- <div class="cmd-head"><h4>BadIdent</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans idents containing forbidden words (checked on join).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badident
- <span class="t">!badident</span> add <span class="a"><word></span> · add <span class="a">+word</span> · list · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 1h · mask <code>*!user@*</code></p>
- </div>
- <div class="cmd" data-k="badrealname realname forbidden protection">
- <div class="cmd-head"><h4>BadRealname</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans realnames containing forbidden words/links (checked on join).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badrealname
- <span class="t">!badrealname</span> add <span class="a"><word></span> · add <span class="a">+word</span> · list · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 2h · mask <code>*!*@host</code> · default patterns include
- <code>*www.*</code>, <code>*#*</code>, <code>*http://*</code></p>
- </div>
- <div class="cmd" data-k="badhost host vhost ip forbidden protection">
- <div class="cmd-head"><h4>BadHost</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans users whose IP/vhost contains forbidden words.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badhost
- <span class="t">!badhost</span> add <span class="a"><ip|mask></span> · add <span class="a">+word</span> · list · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 3h · mask <code>*!*@host</code></p>
- </div>
- <div class="cmd" data-k="antijoinflood massjoin join flood protection">
- <div class="cmd-head"><h4>AntiJoinFlood</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Counters mass-join floods: locks the channel (<code>+mr</code> here, 45s) and bans flooders. Also
- catches join/part-quit cycling. Per-user limit here: 3 joins / 15s.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antijoinflood
- <span class="t">!set</span> joinflood <span class="a"><joins:seconds></span></pre></div>
- <p class="opt">Stock defaults: ban 1h · mask <code>*!*@host</code> · see also
- <code>+antijoinpart</code></p>
- </div>
- <div class="cmd" data-k="antichanflood channel text flood protection">
- <div class="cmd-head"><h4>AntiChanFlood</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes text flooding (stock default: 4 lines / 5s). Locks the channel <code>+mr</code> for 45s
- while it cleans up.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antichanflood
- <span class="t">!set</span> chanflood <span class="a"><lines:seconds></span></pre></div>
- <p class="opt">Stock defaults: ban 10m · method 6 (kick→ban) · mask <code>*!*@host</code></p>
- </div>
- <div class="cmd" data-k="nickflood nick change flood protection">
- <div class="cmd-head"><h4>NickFlood</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Punishes rapid nick-changing (stock default: 3 changes / 120s).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +nickflood</pre></div>
- <p class="opt">Stock defaults: ban 10m · method 7 (warn→ban) · mask <code>nick!user@host</code> ·
- setting <code>nickflood-repeat</code></p>
- </div>
- <div class="cmd" data-k="noproxy proxy ip ban isp protection new">
- <div class="cmd-head"><h4>NoProxy <span style="font-size:10px;color:var(--green)">NEW in 2.5.5</span></h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans users joining from IPs identified as <strong>proxies</strong>. The ban reason supports the
- <code>%isp%</code> placeholder, replaced with the IP's ISP name. An except-hosts list lives in the
- config (<code>black(noproxy:excepts)</code>).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +noproxy</pre></div>
- <p class="opt">Stock defaults: ban 1h · settings: <code>noproxy-reason</code> ·
- <code>noproxy-bantime</code></p>
- </div>
- <div class="cmd" data-k="inviteban invite bot unauthorized protection">
- <div class="cmd-head"><h4>InviteBan</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans users who try to invite the bot into unauthorised channels.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +inviteban</pre></div>
- <p class="opt">Stock defaults: ban 3h · mask <code>*!*@host</code></p>
- </div>
- <div class="cmd" data-k="antitake dontop dontdeop op protection takeover">
- <div class="cmd-head"><h4>AntiTake (dontop / dontdeop)</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Anti-takeover. <code>+dontdeop</code>: unauthorised users who deop others get deopped, victims get
- re-opped. <code>+dontop</code>: unauthorised users who op someone get both parties deopped.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +dontdeop
- <span class="t">!set</span> +dontop</pre></div>
- </div>
- <div class="cmd" data-k="securemode botnet join flood undernet +Dm strictsecured code">
- <div class="cmd-head"><h4>SecureMode</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Undernet-specific botnet shield. Works with channel modes <code>+Dm</code>: each first-time joiner
- receives a unique code to confirm before being let in. <code>+strictsecured</code> requires the code on
- <em>every</em> join. Known-good hosts can be whitelisted.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +securemode
- <span class="t">!securemode</span> add <span class="a"><ip|mask></span> · del <span class="a"><no.></span> · list
- <span class="t">!set</span> +strictsecured</pre></div>
- </div>
- <div class="cmd" data-k="clonescan clones scan ban protection">
- <div class="cmd-head"><h4>CloneScan</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Periodically scans for clones (multiple connections from one host) and bans them. Stock defaults:
- max 3 clones, scan every 45m, ban 180m.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +clonescan
- <span class="t">!clonescan</span> add <span class="a"><ip|mask></span> <span class="c"># whitelist</span> · del <span class="a"><no.></span> · list</pre></div>
- <p class="opt">Settings: <code>clonescan-maxclone</code> · <code>clonescan-bantime</code> ·
- <code>clonescan-reason</code> · <code>clonescan-scantime</code></p>
- </div>
- <div class="cmd" data-k="badchan bad channels forbidden co-channel scan">
- <div class="cmd-head"><h4>BadChan</h4><span class="lvl manager">Manager+ to configure</span></div>
- <p>Bans users who sit in forbidden channels (wardriving hack/warez/adult channels — a default list
- ships in the config). Scans every 10m; method 1 warns and gives 30s to leave the bad channel first.
- <code>+showbadchan</code> tells the ops which bad channel triggered it. Rewritten in 2.5.5 — faster
- and safer — and now accepts <strong>regex badchans</strong>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!badchan</span> <span class="a"><ON|OFF></span>
- <span class="t">!badchan</span> add <span class="a"><#badchan></span> <span class="o">[global] [reason]</span>
- <span class="t">!badchan</span> regex <span class="a"><#regex></span> <span class="o">[reason]</span> <span class="c"># e.g. #[a-z]+[0-9][0-9]</span>
- <span class="t">!badchan</span> add <span class="a">+#chan</span> <span class="c"># exception</span> · list <span class="o">[-global]</span> · del <span class="a"><no.></span></pre></div>
- <p class="opt">Stock defaults: ban 6h · mask <code>*!*@host</code> · settings:
- <code>badchan-scantime</code> · <code>badchan-bmethod</code> · <code>badchan-banwait</code> ·
- <code>badchan-floodcontrol</code> (join-flood pause, 5:5)</p>
- </div>
- </section>
- <!-- ================= MODULES ================= -->
- <section id="modules">
- <h2><span class="hash">#</span>Modules</h2>
- <p class="sec-intro">Feature modules, toggled per channel. Check what's enabled with
- <code>!h module</code> — green [+] is on, red [−] is off.</p>
- <div class="cmd" data-k="xtools x op voice invite unban undernet module">
- <div class="cmd-head"><h4>XTools</h4><span class="lvl manager">Manager+</span></div>
- <p>Lets the bot ask Undernet's <code>X</code> for op, voice, invite, or to unban itself when it needs
- help.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +xtools</pre></div>
- </div>
- <div class="cmd" data-k="xonly x administration undernet module ban through x">
- <div class="cmd-head"><h4>XOnly</h4><span class="lvl manager">Manager+</span></div>
- <p>Full channel administration <em>through X</em>: the bot performs all BlackTools commands via
- <code>X</code> even when it isn't opped. X bans use their own level and duration.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +xonly
- <span class="t">!set</span> xbantime <span class="a"><time></span> · <span class="t">!set</span> xbanlevel <span class="a"><level></span></pre></div>
- <p class="opt">Stock defaults: X ban time 1 · X ban level 100</p>
- </div>
- <div class="cmd" data-k="seen module database channel">
- <div class="cmd-head"><h4>Seen</h4><span class="lvl manager">Manager+</span></div>
- <p>Per-channel seen database powering the <code>!seen</code> command. Extras:
- <code>+seenlastmsg</code> (include the person's last message) and <code>+seenreply</code> (tell users
- who searched for them). Entries expire after 730 days.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +seen · <span class="t">!set</span> +seenlastmsg · <span class="t">!set</span> +seenreply</pre></div>
- </div>
- <div class="cmd" data-k="greet leave welcome part message count module">
- <div class="cmd-head"><h4>Greet & Leave</h4><span class="lvl manager">Manager+</span></div>
- <p>Channel welcome and goodbye messages. Greet supports the <strong>Count</strong> variables:
- <code>%nick%</code>, <code>%countchan%</code>, <code>%count%</code> (join number),
- <code>%time%</code>. Use <code>~</code> to split into multiple sentences.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!greet</span> <span class="a"><ON|OFF></span> · <span class="t">!greet</span> set <span class="a"><message></span>
- <span class="t">!leave</span> <span class="a"><ON|OFF></span> · <span class="t">!leave</span> set <span class="a"><message></span>
- <span class="t">!set</span> greet-method <span class="a"><NOTICE|PRIVMSG></span> · <span class="t">!set</span> leave-method <span class="a"><NOTICE|PRIVMSG></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!greet</span> set Welcome to %countchan%, %nick%!~You are visitor number %count% since %time%</pre></div>
- </div>
- <div class="cmd" data-k="anunt advert announcement ads module">
- <div class="cmd-head"><h4>Anunt (Advert)</h4><span class="lvl manager">Manager+</span></div>
- <p>Rotates announcements/ads on the channel — but only while the channel is active (no activity =
- no ads). Supports <code>%chan%</code> and <code>%botnick%</code>, multi-sentence with
- <code>~</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!anunt</span> <span class="a"><ON|OFF></span>
- <span class="t">!anunt</span> add <span class="a"><text></span> · list · del <span class="a"><no.></span>
- <span class="t">!set</span> anunt-showtime <span class="a"><period></span></pre></div>
- <p class="opt">Stock interval: 52m</p>
- </div>
- <div class="cmd" data-k="autobroadcast bt broadcast all channels module silent">
- <div class="cmd-head"><h4>AutoBroadcast (bt)</h4><span class="lvl owner">Owner+</span></div>
- <p>Broadcasts stored messages, one at a time, across <em>all</em> channels. Channels flagged
- <code>+silent</code> are skipped.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bt</span> <span class="a"><ON|OFF></span>
- <span class="t">!bt</span> add <span class="a"><message></span> · list · del <span class="a"><no.></span>
- <span class="t">!set</span> +silent <span class="c"># opt this channel out</span></pre></div>
- <p class="opt">Stock interval: 55m, sent as ACTION</p>
- </div>
- <div class="cmd" data-k="limit channel limit handling module">
- <div class="cmd-head"><h4>Limit</h4><span class="lvl manager">Manager+</span></div>
- <p>Keeps the channel limit (+l) floating a few places above the current user count — an old-school
- anti-massjoin trick. Stock margin: 6.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!limit</span> <span class="a"><ON|OFF></span>
- <span class="t">!limit</span> set <span class="a"><number></span></pre></div>
- </div>
- <div class="cmd" data-k="topic autotopic refresh url module">
- <div class="cmd-head"><h4>Topic · AutoTopic · Url</h4><span class="lvl manager">Manager+</span></div>
- <p>Stores the official channel topic and URL. <code>+autotopic</code> re-applies them whenever someone
- changes the topic; <code>+refresh</code> re-applies on an interval; <code>!r</code> does it manually.
- <code>+showurl</code> appends the URL to ban reasons.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!topic</span> set <span class="a"><text></span> · <span class="t">!topic</span> unset
- <span class="t">!set</span> url <span class="a"><url></span>
- <span class="t">!set</span> +autotopic · <span class="t">!set</span> +refresh · <span class="t">!set</span> +showurl</pre></div>
- </div>
- <div class="cmd" data-k="idle antiidle op voice halfop deop module">
- <div class="cmd-head"><h4>Idle (Anti-Idle)</h4><span class="lvl manager">Manager+</span></div>
- <p>De-ops/-voices/-halfops users who idle too long. Stock defaults: ops 10m, voices 30m, halfops 30m,
- scanned every 5m. An exception list is available. Since 2.5.5 the module waits while the channel is
- <code>+mD</code> under SecureMode.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!idle</span> <span class="a"><+/-o | +/-v | +/-ho></span>
- <span class="t">!idle</span> add <span class="a"><nick></span> · list · del <span class="a"><nick></span>
- <span class="t">!set</span> idleopmax <span class="a"><period></span> · idlevoicemax · idlehalfopmax · idle-scantime</pre></div>
- </div>
- <div class="cmd" data-k="voiceme voice x logged module nologged onlyonmode">
- <div class="cmd-head"><h4>VoiceMe</h4><span class="lvl manager">Manager+</span></div>
- <p>Lets X-logged users voice themselves with <code>/msg BotNick voiceme #channel</code>. Extras:
- <code>+onlyonmode</code> restricts it to when the channel is <code>+m</code> (with a periodic channel
- hint, default 25m); <code>+nologged</code> allows users without an X username too.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +voiceme
- <span class="t">!set</span> +onlyonmode · <span class="t">!set</span> +nologged · <span class="t">!set</span> voiceme-showtime <span class="a"><period></span>
- <span class="c"># users then do:</span>
- /msg BotNick voiceme #channel</pre></div>
- </div>
- <div class="cmd" data-k="voiceonmsg voice active chatters lines idle module">
- <div class="cmd-head"><h4>VoiceOnMsg</h4><span class="lvl manager">Manager+</span></div>
- <p>Auto-voices active chatters (stock default: after 3 lines) and devoices them after idling too long
- (default: 2h). Users with access are ignored.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +voiceonmsg
- <span class="t">!set</span> voiceonmsg-linenum <span class="a"><lines></span> · <span class="t">!set</span> voiceonmsg-idletime <span class="a"><duration></span></pre></div>
- </div>
- <div class="cmd" data-k="private access only channel ban module">
- <div class="cmd-head"><h4>Private</h4><span class="lvl manager">Manager+</span></div>
- <p>Makes the channel access-only: anyone without bot access (or an exception) is banned on join.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +private
- <span class="t">!private</span> add <span class="a"><nick> <ip|mask></span> · list · del <span class="a"><nick></span></pre></div>
- <p class="opt">Stock defaults: ban 60m · mask <code>*!*@host</code></p>
- </div>
- <div class="cmd" data-k="autoupdate update github self-update module new">
- <div class="cmd-head"><h4>AutoUpdate <span style="font-size:10px;color:var(--green)">NEW in 2.5.5</span></h4><span class="lvl boss">Boss owner</span></div>
- <p>Lets the script <strong>update itself from GitHub</strong> when a new version or bugfix is
- released — automatically on a timer, or by command. All BT files and the settings from
- <code>BlackTools.tcl</code> are backed up and restored; the bot can auto-restart when an update
- requires it. Config: <code>update_on</code> (kill switch), <code>update_type</code>
- (0 = timer + command, 1 = command only), <code>update_time_check</code> (stock: 60m).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!update</span> <span class="a"><on|off></span> <span class="c"># enable/disable autoupdate</span>
- <span class="t">!update</span> check <span class="c"># check for new versions</span>
- <span class="t">!update</span> start <span class="c"># run the update now</span>
- <span class="t">!update</span> time <span class="o">[period]</span> <span class="c"># get/set the check interval (Xm/Xh/Xd)</span></pre></div>
- </div>
- <div class="cmd" data-k="alias custom command personalized module new">
- <div class="cmd-head"><h4>Alias <span style="font-size:10px;color:var(--green)">NEW in 2.5.5</span></h4><span class="lvl voice">Voice+</span></div>
- <p>Lets users create their <strong>own personalized commands</strong> on top of any BT command, with
- <code>%1%</code>, <code>%2%</code>… as argument placeholders. Aliases follow the user (renamed with
- <code>chuser</code>, removed when the user is deleted or expires).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!alias</span> add <span class="a"><command></span> <span class="a"><BT command></span> <span class="o">[arguments]</span>
- <span class="t">!alias</span> del <span class="a"><command></span></pre></div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!alias</span> add lamer b %1% 0 You are a lamer !! <span class="c"># then: !lamer BadGuy</span>
- <span class="t">!alias</span> add beer cycle %1% %2% Gone for a beer, back soon</pre></div>
- </div>
- <div class="cmd" data-k="vote voting poll options module new votegreet">
- <div class="cmd-head"><h4>Vote <span style="font-size:10px;color:var(--green)">NEW in 2.5.5</span></h4><span class="lvl manager">Manager+ to toggle</span></div>
- <p>Channel <strong>voting system</strong>: open a voting with multiple options, an optional expiry
- time, and choose whether only users with access or everyone may vote. Users answer with the option
- letter. <code>+votegreet</code> tells joiners when votings are open.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +vote
- <span class="t">!vote</span> add <span class="a"><vote_name></span> -option <span class="a"><opt1></span> -option <span class="a"><opt2></span>.. <span class="o">[-time DD/MM/YY HH:MM] [-type 1|0]</span>
- <span class="t">!vote</span> <span class="a"><ID></span> <span class="a"><letter></span> <span class="c"># cast your vote</span>
- <span class="t">!vote</span> list <span class="o">[ID]</span> · <span class="t">!vote</span> time <span class="a"><ID></span> <span class="a"><DD/MM/YY HH:MM></span> · <span class="t">!vote</span> end <span class="a"><ID></span> · <span class="t">!vote</span> del <span class="a"><ID></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!vote</span> add NewTopic -option Keep it -option Change it -time 31/12/25 20:00 -type 0</pre></div>
- <p class="opt">Optional settings: <code>vote-mask</code> (voter identity mask, stock
- <code>*!*@host</code>) · <code>-type</code> default: all users</p>
- </div>
- <div class="cmd" data-k="next helped noidle skip queue help channel module nextshortcmd">
- <div class="cmd-head"><h4>Next</h4><span class="lvl manager">Manager+</span></div>
- <p>Help-queue system (built for support channels like #TCL-HELP): users wait in line, helpers voice
- the next one in order. <code>+nextshortcmd</code> enables the short aliases.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +next
- <span class="t">!next</span> <span class="c"># voice the next user in the queue</span>
- <span class="t">!next</span> list · <span class="t">!helped</span> <span class="a"><nick></span> · <span class="t">!noidle</span> <span class="a"><nick></span> · <span class="t">!skip</span> <span class="a"><nick></span></pre></div>
- <p class="opt">Settings: <code>next-reason</code> · <code>next-bantime</code> (noidle ban, default 1m)</p>
- </div>
- <div class="cmd" data-k="topwords statistics words lines activity module accessonly">
- <div class="cmd-head"><h4>TopWords</h4><span class="lvl manager">Manager+</span></div>
- <p>Records chat statistics per user (words, lines, letters — daily and total).
- <code>+accessonly</code> restricts counting to users with bot access.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +topwords
- <span class="t">!topwords</span> <span class="a"><nick></span> <span class="o">[total|reset]</span>
- <span class="t">!set</span> +accessonly</pre></div>
- </div>
- <div class="cmd" data-k="quote quoteofday quotes module q">
- <div class="cmd-head"><h4>Quote · QuoteOfDay</h4><span class="lvl manager">Manager+</span></div>
- <p>Channel quote database with add/search/list/delete — plus an optional "Quote of the Day" that posts
- a random stored quote on an interval (stock default: every 3h). Since 2.5.5 the
- <code>quote:usage</code> config setting chooses who may add/list/remove quotes: users with access
- only (stock) or everyone.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +quote
- <span class="t">!q</span> <span class="a"><text></span> <span class="c"># add (use ~ for multi-sentence)</span>
- <span class="t">!q</span> <span class="a"><word></span> <span class="c"># search</span>
- <span class="t">!q</span> list · <span class="t">!q</span> del <span class="a"><no.></span>
- <span class="t">!set</span> +quoteofday · <span class="t">!set</span> quoteofday-showtime <span class="a"><period></span></pre></div>
- </div>
- <div class="cmd" data-k="note notes send read inbox message module noteexpire">
- <div class="cmd-head"><h4>Note</h4><span class="lvl manager">Manager+ to toggle</span></div>
- <p>Private note system: store personal notes or send them to other handles — delivered when they next
- appear. The bot also notes global owners whenever it gets banned or locked out of a channel. Inbox
- expires after 365 days (per-user override: <code>!myset noteexpire</code>).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +note
- <span class="t">!note</span> send <span class="a"><handle></span> <span class="a"><message></span>
- <span class="t">!note</span> <span class="a"><read|list|inbox></span> · <span class="t">!note</span> del <span class="a"><no.|all></span></pre></div>
- </div>
- <div class="cmd" data-k="backchan chanreport back channel report bans module">
- <div class="cmd-head"><h4>BackChan (ChanReport)</h4><span class="lvl manager">Manager+</span></div>
- <p>Gives the channel a private "back-channel" where the bot reports every ban it sets on the main
- channel — and where you can issue ban commands that apply to the main channel. One backchan per
- channel.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> backchan <span class="a"><#backchan></span></pre></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> backchan #channel-ops</pre></div>
- </div>
- <div class="cmd" data-k="banstats statistics kicks bans module">
- <div class="cmd-head"><h4>BanStats</h4><span class="lvl manager">Manager+</span></div>
- <p>Keeps statistics of every kick and ban on the channel (feeds the <code>!stats</code> command).
- Daily counters reset at midnight.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +banstats
- <span class="t">!banstats</span> <span class="a"><total|reset></span></pre></div>
- </div>
- <div class="cmd" data-k="language lang romanian english module">
- <div class="cmd-head"><h4>Language</h4><span class="lvl manager">Manager+</span></div>
- <p>Sets the channel's reply language and the language used in kick/ban reasons. Available:
- <code>EN</code> (english) · <code>RO</code> (romanian). Each user can override with
- <code>!myset lang</code>.</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> lang <span class="a"><EN|RO></span></pre></div>
- </div>
- <div class="cmd" data-k="forward invisible misc flags module">
- <div class="cmd-head"><h4>Misc flags: Forward · Invisible · ExpireBans</h4><span class="lvl boss">Boss owner</span></div>
- <p><code>+forward</code> forwards PMs the bot receives (from strangers) to a channel.
- <code>+invisible</code> hides the channel from the bot's channel list. <code>expirebans</code> sets
- how long channel bans live before auto-removal (stock default: 120m; <code>0</code> = never remove).</p>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +forward · <span class="t">!set</span> +invisible · <span class="t">!set</span> expirebans <span class="a"><period></span></pre></div>
- </div>
- </section>
- <!-- ================= MYSET ================= -->
- <section id="myset">
- <h2><span class="hash">#</span>Personal settings — <code style="font-size:.75em">!myset</code></h2>
- <p class="sec-intro">Every user with access carries their own preferences, applied wherever they use the
- bot. Append <code>show</code> to view a value or <code>reset</code> to clear it.</p>
- <div class="cmd" data-k="myset personal lang output mychar colors noteexpire autoinvite greet mychan handle">
- <div class="cmd-head"><h4><span class="amp">!</span>myset</h4><span class="lvl voice">Voice+</span></div>
- <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!myset</span> <span class="a"><option></span> <span class="o">[value] [show|reset]</span></pre></div>
- <div class="table-scroll"><table>
- <tr><th>Option</th><th>What it does</th><th>Example</th></tr>
- <tr><td><code>lang</code></td><td>Your reply language (EN/RO)</td><td><code>!myset lang EN</code></td></tr>
- <tr><td><code>output</code></td><td>How the bot answers you: NOTICE or CHAN</td><td><code>!myset output chan</code></td></tr>
- <tr><td><code>mychar</code></td><td>Your personal trigger character</td><td><code>!myset mychar .</code></td></tr>
- <tr><td><code>colors</code></td><td>4 personal reply colours (bold, red, grey, green…)</td><td><code>!myset colors bold red grey green</code></td></tr>
- <tr><td><code>greet</code></td><td>Your join greet/info line (see <code>!addinfo</code>)</td><td><code>!myset greet Hello there!</code></td></tr>
- <tr><td><code>mychan</code></td><td>Base channel for PRIVMSG commands — skip typing <code>#channel</code></td><td><code>!myset mychan #channel</code></td></tr>
- <tr><td><code>auto</code></td><td>Your own automode (+/-o, +/-v; owners may add <code>-global</code>)</td><td><code>!myset auto +v</code></td></tr>
- <tr><td><code>autoinvite</code></td><td>Bot invites you automatically if you get banned out</td><td><code>!myset autoinvite #channel ON</code></td></tr>
- <tr><td><code>noteexpire</code></td><td>Auto-expiry period for your note inbox</td><td><code>!myset noteexpire 90d</code></td></tr>
- <tr><td><code>addhost / delhost</code></td><td>Manage your own hostmasks</td><td><code>!myset addhost *!*@me.users.undernet.org</code></td></tr>
- <tr><td><code>handle</code></td><td>Change your own handle</td><td><code>!myset handle NewName</code></td></tr>
- <tr><td><code>notes</code></td><td>Accept notes ON/OFF</td><td><code>!myset notes ON</code></td></tr>
- </table></div>
- </div>
- </section>
- <!-- ================= EGG ================= -->
- <section id="egg">
- <h2><span class="hash">#</span>Eggdrop.conf via IRC — the <code style="font-size:.75em">egg</code> settings</h2>
- <p class="sec-intro"><span class="lvl boss">Boss owner</span> Boss owners can edit the bot's config
- files straight from IRC — no shell needed. View current values with <code>!h egg</code>; change them with
- <code>!set <option> <value></code>.</p>
- <div class="table-scroll"><table>
- <tr><th>Option</th><th>Controls</th><th>Current / default</th></tr>
- <tr><td><code>nick</code></td><td>Bot nickname (permanent)</td><td>—</td></tr>
- <tr><td><code>realname</code></td><td>IRC real-name field (needs restart)</td><td>—</td></tr>
- <tr><td><code>away</code></td><td>Away message on connect (empty = none)</td><td>""</td></tr>
- <tr><td><code>homechan</code></td><td>Home channel — joined first, receives abuse/ban reports, never purged</td><td><code>#no_home_chan</code> (unset)</td></tr>
- <tr><td><code>chanserv</code> / <code>hostchanserv</code></td><td>Service nick & host</td><td><code>X</code> / <code>x@channels.undernet.org</code></td></tr>
- <tr><td><code>userlogin</code> / <code>userpass</code></td><td>X username & password (password displays masked)</td><td>—</td></tr>
- <tr><td><code>cmdchar</code></td><td>Trigger characters (several allowed)</td><td><code>! . ` ^</code></td></tr>
- <tr><td><code>defaultlang</code></td><td>Script default language</td><td><code>EN</code></td></tr>
- <tr><td><code>defaultoutput</code></td><td>Reply method: 0 NOTICE · 1 CHAN · 2 PRIVMSG</td><td><code>0</code> (NOTICE)</td></tr>
- <tr><td><code>add-mask</code></td><td>Hostmask style for <code>!add</code> (1–5, see <a href="#reference">masks</a>)</td><td><code>1</code></td></tr>
- <tr><td><code>add-defaultmask</code></td><td>Mask used when the added user is offline</td><td><code>*!*@%user%.users.undernet.org</code></td></tr>
- <tr><td><code>floodmenuprot</code></td><td>Command flood limit (cmds:sec)</td><td><code>3:5</code></td></tr>
- <tr><td><code>floodmsgprot</code></td><td>PRIVMSG flood limit</td><td><code>10:10</code></td></tr>
- <tr><td><code>floodnotcprot</code></td><td>NOTICE flood limit</td><td><code>2:2</code></td></tr>
- <tr><td><code>massfloodmsgprot</code> / <code>massfloodsilencetime</code></td><td>Botnet mass-flood shield (since 2.5.5 the PM antiflood action uses IGNORE)</td><td><code>0:0</code> / 60s</td></tr>
- <tr><td><code>chanremove-setting</code></td><td>Wipe all channel data on channel removal (1/0)</td><td><code>0</code></td></tr>
- <tr><td><code>user-expire</code></td><td>Remove inactive users after N days</td><td><code>1500</code></td></tr>
- <tr><td><code>banmethod-expire</code></td><td>How long warn/kick escalation counters live</td><td><code>60m</code></td></tr>
- <tr><td><code>broadcast-showtime</code></td><td>AutoBroadcast interval</td><td><code>55m</code></td></tr>
- <tr><td><code>pagelimit</code></td><td>Entries per page in <code>list</code> outputs</td><td><code>7</code></td></tr>
- <tr><td><code>antibotidle</code></td><td>Keep the eggdrop itself from idling (1 = no idle, 0 = idle) — new in 2.5.5</td><td><code>0</code></td></tr>
- </table></div>
- <div class="note"><b>Also new in the 2.5.5 config file</b> (edited in <code>BlackTools.tcl</code>
- directly): <code>dns_onjoin</code> (DNS lookups on join, off by stock — faster on busy channels),
- the AutoUpdate block (<code>update_on</code>, <code>update_type</code>,
- <code>update_time_check</code>), and the ChanServ mass-ban detector
- (<code>chanserv:percent_ban</code> 50%, <code>chanserv:suspend_level</code> 400,
- <code>chanserv:suspend_time</code> 1d) which suspends anyone who mass-bans through X.</div>
- <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> cmdchar ! .
- <span class="t">!set</span> homechan #channel
- <span class="t">!set</span> defaultoutput 0</pre></div>
- </section>
- <!-- ================= NATIVE ================= -->
- <section id="native">
- <h2><span class="hash">#</span>Native eggdrop settings</h2>
- <p class="sec-intro">These are standard eggdrop channel flags — not BlackTools features — but
- <code>!set</code> manages them too, so they're documented here. View them with
- <code>!h chaninfo</code>.</p>
- <div class="table-scroll"><table>
- <tr><th>Setting</th><th>What it does</th></tr>
- <tr><td><code>+enforcebans</code></td><td>Kick users matching a freshly-set ban</td></tr>
- <tr><td><code>+dynamicbans</code></td><td>Only place bans on the channel when someone matching joins (keeps +b list short)</td></tr>
- <tr><td><code>+userbans</code> / <code>+userexempts</code> / <code>+userinvites</code></td><td>Allow bans/exempts/invites to be set directly on IRC</td></tr>
- <tr><td><code>+dynamicexempts</code> / <code>+dynamicinvites</code></td><td>Only activate +e/+I entries when needed</td></tr>
- <tr><td><code>+autoop</code> / <code>+autovoice</code> / <code>+autohalfop</code></td><td>Auto-op/voice/halfop users carrying the +o/+v/+l flag on join</td></tr>
- <tr><td><code>+bitch</code></td><td>Only +o-flagged users may hold @ (insecure, not recommended)</td></tr>
- <tr><td><code>+greet</code></td><td>Say users' greet lines on join (enables the Greet/Count module output)</td></tr>
- <tr><td><code>+protectops</code> / <code>+protectfriends</code> / <code>+protecthalfops</code></td><td>Re-op/halfop protected users if they lose status</td></tr>
- <tr><td><code>+dontkickops</code></td><td>Never kick users with +o flag</td></tr>
- <tr><td><code>+revenge</code> / <code>+revengebot</code></td><td>Punish whoever deops/kicks/bans the bot (or valid ops)</td></tr>
- <tr><td><code>+inactive</code></td><td>Leave the channel without losing its settings</td></tr>
- <tr><td><code>+secret</code></td><td>Hide the channel from the botnet</td></tr>
- <tr><td><code>+shared</code></td><td>Share channel user records across the botnet</td></tr>
- <tr><td><code>+cycle</code></td><td>Cycle the channel when it has no ops</td></tr>
- <tr><td><code>+nodesynch</code></td><td>Tolerate mode changes from non-ops (plays nice with services)</td></tr>
- <tr><td><code>+statuslog</code></td><td>Log the channel status line every 5 minutes</td></tr>
- <tr><td><code>+static</code></td><td>Only permanent owners may remove the channel</td></tr>
- <tr><td><code>chanmode</code></td><td>Enforced channel modes, e.g. <code>!set chanmode +ntk key</code></td></tr>
- <tr><td><code>ban-time</code></td><td>Eggdrop-internal temp-ban lifetime (BlackTools uses its own <code>expirebans</code> instead)</td></tr>
- <tr><td><code>flood-chan / -join / -kick / -ctcp / -nick / -deop</code></td><td>Native flood limits as <code>events:seconds</code>; <code>0:0</code> disables</td></tr>
- </table></div>
- <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> flood-chan 15:60 <span class="c"># 15 lines in 60s from one host = flood</span></pre></div>
- </section>
- <!-- ================= REFERENCE ================= -->
- <section id="reference">
- <h2><span class="hash">#</span>Ban methods, masks & durations</h2>
- <h3 class="sub">The 7 ban methods</h3>
- <p class="sec-intro">Every protection has a <code>-banmethod</code> setting choosing how offenders are
- escalated. Counters expire after <code>banmethod-expire</code> (60m here). Set with
- <code>!set <protection>-banmethod <n></code>.</p>
- <div class="table-scroll"><table>
- <tr><th>#</th><th>Escalation</th><th></th></tr>
- <tr><td><code>1</code></td><td>warn</td><td>just a warning kick/notice</td></tr>
- <tr><td><code>2</code></td><td>kick</td><td></td></tr>
- <tr><td><code>3</code></td><td>ban</td><td>straight to ban</td></tr>
- <tr><td><code>4</code></td><td>warn → kick</td><td>second offence gets the kick</td></tr>
- <tr><td><code>5</code></td><td>warn → kick → ban</td><td>the full ladder</td></tr>
- <tr><td><code>6</code></td><td>kick → ban</td><td></td></tr>
- <tr><td><code>7</code></td><td>warn → ban</td><td></td></tr>
- </table></div>
- <h3 class="sub">The 5 banmask styles</h3>
- <p class="sec-intro">Every ban command has a <code>-banmask</code> setting choosing the mask shape, built
- from <code>nick!user@host</code>:</p>
- <div class="table-scroll"><table>
- <tr><th>#</th><th>Mask</th><th>Bans on…</th></tr>
- <tr><td><code>1</code></td><td><code>*!*@host</code></td><td>host only (the usual default)</td></tr>
- <tr><td><code>2</code></td><td><code>*!user@host</code></td><td>ident + host</td></tr>
- <tr><td><code>3</code></td><td><code>nick!user@host</code></td><td>the exact triple</td></tr>
- <tr><td><code>4</code></td><td><code>nick!*@*</code></td><td>nickname only</td></tr>
- <tr><td><code>5</code></td><td><code>*!user@*</code></td><td>ident only</td></tr>
- </table></div>
- <div class="note"><b>Webchat users</b> (mibbit, kiwiirc, irccloud…) are automatically banned on
- <em>ident only</em> regardless of the mask setting — their host is shared, their ident carries the
- user's hex IP.</div>
- <h3 class="sub">Durations</h3>
- <div class="pill-row">
- <span class="pill">10m — ten minutes</span>
- <span class="pill">3h — three hours</span>
- <span class="pill">2d — two days</span>
- <span class="pill">0 — permanent</span>
- </div>
- <h3 class="sub">Good to know</h3>
- <div class="tip"><b>CIDR bans work:</b> <code>!b *!*@192.0.2.1/24</code> bans the whole range.</div>
- <div class="tip"><b>Ban comments:</b> nearly every ban command accepts <code>-c <comment></code> —
- other ops see it when they inspect the ban with <code>!sb</code>.</div>
- <div class="tip"><b>Full banlist handling:</b> when the channel +b list fills up (Undernet numeric 478),
- the bot auto-removes the 10 oldest bans, holding <code>+m</code> for 10 seconds while it cleans.</div>
- <div class="tip"><b>Multi-sentence texts:</b> greets, quotes, ads and notes split on <code>~</code> —
- <code>text1~text2</code> is delivered as two lines.</div>
- </section>
- <footer>
- <p><b>BlackTools v2.5.5</b> — © 2008–2021 Daniel Voipan (BLaCkShaDoW) ·
- <a href="http://www.tclscripts.net">tclscripts.net</a> ·
- <a href="https://github.com/tclscripts/BlackToolS-TCL">GitHub</a> ·
- help: <code>#TCL-HELP</code> @ Undernet</p>
- <p style="margin-top:6px">This documentation page was generated from the script sources
- (<code>BT.man-en.lang.tcl</code>, <code>BT.en.lang.tcl</code>, <code>BlackTools.tcl</code>,
- <code>ChangeLog</code>). Press <kbd>/</kbd> to search.</p>
- </footer>
- </div></div></div>
- <button id="top-btn" title="Back to top">↑</button>
- <script>
- /* copy buttons */
- document.addEventListener('click',function(e){
- if(!e.target.classList.contains('copy'))return;
- var pre=e.target.parentElement.querySelector('pre');
- var txt=pre.innerText.replace(/^\s*#.*$/gm,'').replace(/\s+#.*$/gm,'').replace(/\n{2,}/g,'\n').trim();
- (navigator.clipboard?navigator.clipboard.writeText(txt):Promise.reject()).then(function(){
- e.target.classList.add('ok');e.target.textContent='✓';
- setTimeout(function(){e.target.classList.remove('ok');e.target.textContent='⧉';},1200);
- }).catch(function(){});
- });
- /* search filter */
- var search=document.getElementById('search'),count=document.getElementById('search-count');
- var cards=[];window.addEventListener('DOMContentLoaded',function(){cards=[].slice.call(document.querySelectorAll('.cmd'));});
- search.addEventListener('input',function(){
- var q=search.value.trim().toLowerCase(),n=0;
- cards.forEach(function(c){
- var hit=!q||(c.getAttribute('data-k')||'').toLowerCase().indexOf(q)>-1||c.innerText.toLowerCase().indexOf(q)>-1;
- c.classList.toggle('hidden',!hit);if(hit)n++;
- });
- if(q){count.style.display='inline';count.textContent=n+' match'+(n==1?'':'es');}
- else{count.style.display='none';}
- });
- document.addEventListener('keydown',function(e){
- if(e.key==='/'&&document.activeElement!==search){e.preventDefault();search.focus();}
- if(e.key==='Escape'&&document.activeElement===search){search.value='';search.dispatchEvent(new Event('input'));search.blur();}
- });
- /* scrollspy */
- var navLinks=[].slice.call(document.querySelectorAll('.nav a'));
- var secs=navLinks.map(function(a){return document.getElementById(a.getAttribute('href').slice(1));});
- function spy(){
- var y=window.scrollY+120,cur=null;
- secs.forEach(function(s){if(s&&s.offsetTop<=y)cur=s.id;});
- navLinks.forEach(function(a){a.classList.toggle('active',a.getAttribute('href')==='#'+cur);});
- document.getElementById('top-btn').style.display=window.scrollY>600?'block':'none';
- }
- window.addEventListener('scroll',spy);spy();
- document.getElementById('top-btn').onclick=function(){window.scrollTo({top:0,behavior:'smooth'});};
- </script>
- </body>
- </html>
|