docs.html 127 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>BlackTools v2.5.5 — Documentation</title>
  7. <style>
  8. :root{
  9. --bg:#0b0e13;
  10. --bg2:#10141b;
  11. --panel:#151a23;
  12. --panel2:#1a2029;
  13. --border:#242c38;
  14. --border2:#2e3947;
  15. --text:#d7dee8;
  16. --muted:#8b98a9;
  17. --faint:#5c6a7d;
  18. --accent:#e8433f; /* maple red */
  19. --accent-soft:#ff6b57;
  20. --gold:#e5b567;
  21. --green:#4ec98a;
  22. --blue:#58a6ff;
  23. --purple:#bc8cff;
  24. --orange:#f0883e;
  25. --pink:#ff7eb6;
  26. --cyan:#39c5cf;
  27. --code-bg:#0d1117;
  28. --radius:10px;
  29. --sidebar-w:275px;
  30. --mono:'Cascadia Code','JetBrains Mono',Consolas,'Fira Code',monospace;
  31. }
  32. *{margin:0;padding:0;box-sizing:border-box}
  33. html{scroll-behavior:smooth;scroll-padding-top:24px}
  34. body{
  35. background:var(--bg);
  36. color:var(--text);
  37. font:15px/1.65 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  38. }
  39. ::selection{background:rgba(232,67,63,.35)}
  40. a{color:var(--blue);text-decoration:none}
  41. a:hover{text-decoration:underline}
  42. 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)}
  43. 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)}
  44. /* ---------- layout ---------- */
  45. .layout{display:flex;min-height:100vh}
  46. .sidebar{
  47. width:var(--sidebar-w);flex-shrink:0;
  48. background:var(--bg2);border-right:1px solid var(--border);
  49. position:sticky;top:0;height:100vh;overflow-y:auto;
  50. padding:22px 16px 40px;
  51. scrollbar-width:thin;scrollbar-color:var(--border2) transparent;
  52. }
  53. .main{flex:1;min-width:0;padding:0 42px 90px}
  54. .wrap{max-width:900px;margin:0 auto}
  55. /* ---------- sidebar ---------- */
  56. .logo{display:flex;align-items:center;gap:10px;padding:2px 8px 14px;border-bottom:1px solid var(--border);margin-bottom:14px}
  57. .logo .leaf{font-size:24px;filter:drop-shadow(0 0 8px rgba(232,67,63,.6))}
  58. .logo b{font-size:17px;letter-spacing:.4px}
  59. .logo b span{color:var(--accent)}
  60. .logo small{display:block;color:var(--faint);font-size:11px;letter-spacing:.5px}
  61. #search{
  62. width:100%;background:var(--panel);border:1px solid var(--border2);border-radius:8px;
  63. color:var(--text);padding:8px 12px;font-size:13px;margin-bottom:6px;outline:none;
  64. }
  65. #search:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(232,67,63,.15)}
  66. .search-hint{font-size:11px;color:var(--faint);padding:0 4px 10px}
  67. #search-count{color:var(--accent-soft);font-weight:600;display:none}
  68. .nav h5{
  69. font-size:10.5px;text-transform:uppercase;letter-spacing:1.4px;color:var(--faint);
  70. margin:16px 8px 6px;
  71. }
  72. .nav a{
  73. display:block;padding:4px 10px;border-radius:6px;color:var(--muted);
  74. font-size:13.5px;border-left:2px solid transparent;
  75. }
  76. .nav a:hover{color:var(--text);background:var(--panel);text-decoration:none}
  77. .nav a.active{color:var(--accent-soft);background:rgba(232,67,63,.08);border-left-color:var(--accent)}
  78. /* ---------- hero ---------- */
  79. .hero{
  80. padding:56px 0 34px;border-bottom:1px solid var(--border);margin-bottom:38px;
  81. background:
  82. radial-gradient(ellipse 60% 120% at 70% -20%, rgba(232,67,63,.13), transparent),
  83. radial-gradient(ellipse 40% 90% at 20% -10%, rgba(229,181,103,.07), transparent);
  84. }
  85. .hero h1{font-size:40px;letter-spacing:-.5px;line-height:1.1}
  86. .hero h1 span{color:var(--accent)}
  87. .hero .tagline{color:var(--muted);font-size:17px;margin-top:8px}
  88. .hero .tagline em{color:var(--gold);font-style:normal}
  89. .badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px}
  90. .badge{
  91. font-size:12px;font-weight:600;padding:4px 12px;border-radius:99px;
  92. background:var(--panel);border:1px solid var(--border2);color:var(--muted);
  93. }
  94. .badge.hot{background:rgba(232,67,63,.12);border-color:rgba(232,67,63,.4);color:var(--accent-soft)}
  95. .badge.gold{background:rgba(229,181,103,.1);border-color:rgba(229,181,103,.35);color:var(--gold)}
  96. /* ---------- sections ---------- */
  97. section{margin-bottom:58px}
  98. section>h2{
  99. font-size:26px;letter-spacing:-.3px;padding-bottom:10px;margin-bottom:8px;
  100. border-bottom:1px solid var(--border);
  101. }
  102. section>h2 .hash{color:var(--accent);margin-right:6px}
  103. .sec-intro{color:var(--muted);margin-bottom:22px;max-width:72ch}
  104. h3.sub{font-size:18px;margin:34px 0 14px;color:var(--gold)}
  105. /* ---------- callouts ---------- */
  106. .note{
  107. background:rgba(88,166,255,.06);border:1px solid rgba(88,166,255,.25);
  108. border-left:3px solid var(--blue);border-radius:8px;padding:12px 16px;margin:16px 0;
  109. font-size:14px;color:var(--text);
  110. }
  111. .warn{
  112. background:rgba(240,136,62,.06);border:1px solid rgba(240,136,62,.3);
  113. border-left:3px solid var(--orange);border-radius:8px;padding:12px 16px;margin:16px 0;
  114. font-size:14px;
  115. }
  116. .tip{
  117. background:rgba(78,201,138,.05);border:1px solid rgba(78,201,138,.25);
  118. border-left:3px solid var(--green);border-radius:8px;padding:12px 16px;margin:16px 0;
  119. font-size:14px;
  120. }
  121. .note b,.warn b,.tip b{color:inherit}
  122. /* ---------- command cards ---------- */
  123. .cmd{
  124. background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);
  125. padding:18px 20px 16px;margin:14px 0;
  126. transition:border-color .15s;
  127. }
  128. .cmd:hover{border-color:var(--border2)}
  129. .cmd.hidden{display:none}
  130. .cmd-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
  131. .cmd-head h4{font-size:16.5px;font-family:var(--mono);color:#fff;font-weight:600}
  132. .cmd-head h4 .amp{color:var(--accent)}
  133. .cmd p{color:var(--muted);font-size:14px;margin-bottom:10px;max-width:78ch}
  134. .cmd p strong{color:var(--text)}
  135. .opt{font-size:13px;color:var(--faint);margin-top:10px}
  136. .opt code{font-size:.92em}
  137. /* level badges */
  138. .lvl{
  139. font-size:10.5px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;
  140. padding:2.5px 9px;border-radius:99px;border:1px solid;
  141. }
  142. .lvl.voice {color:var(--green); border-color:rgba(78,201,138,.45); background:rgba(78,201,138,.08)}
  143. .lvl.op {color:var(--blue); border-color:rgba(88,166,255,.45); background:rgba(88,166,255,.08)}
  144. .lvl.admin {color:var(--purple);border-color:rgba(188,140,255,.45);background:rgba(188,140,255,.08)}
  145. .lvl.manager{color:var(--orange);border-color:rgba(240,136,62,.45); background:rgba(240,136,62,.08)}
  146. .lvl.owner {color:var(--accent-soft);border-color:rgba(232,67,63,.5);background:rgba(232,67,63,.08)}
  147. .lvl.master {color:var(--pink); border-color:rgba(255,126,182,.45);background:rgba(255,126,182,.08)}
  148. .lvl.boss {color:var(--gold); border-color:rgba(229,181,103,.5); background:rgba(229,181,103,.08)}
  149. .lvl.all {color:var(--cyan); border-color:rgba(57,197,207,.45); background:rgba(57,197,207,.08)}
  150. /* ---------- code blocks ---------- */
  151. .code{position:relative;margin:10px 0}
  152. .code pre{
  153. background:var(--code-bg);border:1px solid var(--border);border-radius:8px;
  154. padding:12px 90px 12px 15px;overflow-x:auto;
  155. font-family:var(--mono);font-size:13px;line-height:1.75;color:#c9d1d9;
  156. scrollbar-width:thin;
  157. }
  158. .code.syntax pre{border-left:3px solid var(--accent)}
  159. .code.example pre{border-left:3px solid var(--green)}
  160. .code .tag{
  161. position:absolute;top:9px;right:44px;font-size:9.5px;font-weight:700;
  162. letter-spacing:1px;text-transform:uppercase;color:var(--faint);user-select:none;
  163. }
  164. .copy{
  165. position:absolute;top:6px;right:8px;cursor:pointer;
  166. background:var(--panel2);border:1px solid var(--border2);border-radius:6px;
  167. color:var(--muted);width:26px;height:24px;font-size:12px;line-height:1;
  168. }
  169. .copy:hover{color:var(--text);border-color:var(--faint)}
  170. .copy.ok{color:var(--green);border-color:var(--green)}
  171. /* syntax highlight-ish helpers inside pre */
  172. pre .c{color:#586e81;font-style:italic} /* comment */
  173. pre .t{color:var(--accent-soft);font-weight:600} /* trigger/cmd */
  174. pre .a{color:#79c0ff} /* argument */
  175. pre .o{color:#8b98a9} /* optional */
  176. /* ---------- tables ---------- */
  177. table{width:100%;border-collapse:collapse;margin:14px 0;font-size:13.5px}
  178. th{
  179. text-align:left;padding:9px 13px;background:var(--panel2);color:var(--muted);
  180. font-size:11px;text-transform:uppercase;letter-spacing:1px;border:1px solid var(--border);
  181. }
  182. td{padding:8px 13px;border:1px solid var(--border);color:var(--text);vertical-align:top}
  183. tr:nth-child(even) td{background:rgba(255,255,255,.014)}
  184. td code{white-space:nowrap}
  185. .table-scroll{overflow-x:auto}
  186. /* ---------- misc ---------- */
  187. .pill-row{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0}
  188. .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)}
  189. #top-btn{
  190. position:fixed;bottom:26px;right:26px;width:42px;height:42px;border-radius:50%;
  191. background:var(--panel2);border:1px solid var(--border2);color:var(--muted);
  192. cursor:pointer;font-size:17px;display:none;z-index:50;
  193. }
  194. #top-btn:hover{color:var(--accent-soft);border-color:var(--accent)}
  195. footer{
  196. border-top:1px solid var(--border);margin-top:70px;padding-top:24px;
  197. color:var(--faint);font-size:13px;
  198. }
  199. footer a{color:var(--muted)}
  200. @media(max-width:900px){
  201. .sidebar{display:none}
  202. .main{padding:0 18px 60px}
  203. .hero h1{font-size:30px}
  204. }
  205. </style>
  206. </head>
  207. <body>
  208. <div class="layout">
  209. <!-- ======================= SIDEBAR ======================= -->
  210. <nav class="sidebar">
  211. <div class="logo">
  212. <span class="leaf">🛠️</span>
  213. <div><b>Black<span>Tools</span></b><small>v2.5.5 · DOCUMENTATION</small></div>
  214. </div>
  215. <input id="search" type="text" placeholder="Filter commands… ( / )" autocomplete="off">
  216. <div class="search-hint"><span id="search-count"></span>&nbsp;</div>
  217. <div class="nav" id="nav">
  218. <h5>Start here</h5>
  219. <a href="#overview">Overview</a>
  220. <a href="#whatsnew">What's new in 2.5.5</a>
  221. <a href="#install">Installation</a>
  222. <a href="#using">Using the bot</a>
  223. <a href="#levels">Access levels</a>
  224. <h5>Commands</h5>
  225. <a href="#cmd-general">General commands</a>
  226. <a href="#cmd-chanops">Channel op commands</a>
  227. <a href="#cmd-bans">Kick &amp; ban commands</a>
  228. <a href="#cmd-users">User management</a>
  229. <a href="#cmd-chan">Channel management</a>
  230. <a href="#cmd-owner">Bot owner commands</a>
  231. <h5>Features</h5>
  232. <a href="#protections">Protections</a>
  233. <a href="#modules">Modules</a>
  234. <a href="#myset">Personal settings</a>
  235. <h5>Reference</h5>
  236. <a href="#egg">Eggdrop.conf via IRC</a>
  237. <a href="#native">Native eggdrop settings</a>
  238. <a href="#reference">Ban methods &amp; masks</a>
  239. </div>
  240. </nav>
  241. <!-- ======================= MAIN ======================= -->
  242. <div class="main"><div class="wrap">
  243. <div class="hero">
  244. <h1>Black<span>Tools</span> Documentation</h1>
  245. <p class="tagline">The Ultimate Channel Control Script — <em>One TCL. One smart Eggdrop.</em><br>
  246. A complete reference for every command, protection and module.</p>
  247. <div class="badges">
  248. <span class="badge hot">v2.5.5</span>
  249. <span class="badge">Eggdrop ≥ 1.8</span>
  250. <span class="badge">Tcl ≥ 8.5</span>
  251. <span class="badge gold">Undernet · X service</span>
  252. <span class="badge">EN · RO · ES · FR</span>
  253. <span class="badge">by BLaCkShaDoW · tclscripts.net</span>
  254. </div>
  255. </div>
  256. <!-- ================= OVERVIEW ================= -->
  257. <section id="overview">
  258. <h2><span class="hash">#</span>Overview</h2>
  259. <p class="sec-intro">
  260. BlackTools is a complete channel-management script for Eggdrop bots. It bundles
  261. <strong>~70 commands</strong>, <strong>25+ protections</strong> (flood, spam, advert, badword, clone
  262. detection…) and <strong>25+ modules</strong> (seen, quotes, notes, greets, topic control, X
  263. integration…) into one package. Every channel can be configured independently — each
  264. owner/manager toggles the protections, modules and commands they want.
  265. </p>
  266. <table>
  267. <tr><th style="width:170px">Script</th><td>BlackTools v2.5.5 (GitHub master, 2021)</td></tr>
  268. <tr><th>Author</th><td>Daniel Voipan (BLaCkShaDoW) — <a href="http://www.tclscripts.net">www.tclscripts.net</a></td></tr>
  269. <tr><th>Requirements</th><td>Eggdrop 1.8.x or newer · Tcl 8.5 or newer</td></tr>
  270. <tr><th>Languages</th><td>English · Romanian · Spanish · French (lang files auto-loaded from <code>lang/</code>)</td></tr>
  271. <tr><th>Home channel</th><td>Set via <code>black(homechan)</code> in <code>BlackTools.tcl</code> (default: none)</td></tr>
  272. <tr><th>Network services</th><td>Undernet <code>X</code> (x@channels.undernet.org) — auto-login supported</td></tr>
  273. <tr><th>Online help</th><td><code>#TCL-HELP</code> on Undernet · <a href="https://github.com/tclscripts/BlackToolS-TCL">GitHub</a></td></tr>
  274. </table>
  275. <div class="tip"><b>The two most important commands:</b> <code>!h</code> shows every command available
  276. <em>to you</em> at your access level, and <code>!man &lt;command&gt;</code> shows the built-in manual page for any
  277. command, protection or module. When in doubt — <code>!man</code> it.</div>
  278. </section>
  279. <!-- ================= WHAT'S NEW ================= -->
  280. <section id="whatsnew">
  281. <h2><span class="hash">#</span>What's new in 2.5.5</h2>
  282. <p class="sec-intro">Summary of the changes between v2.5.3 (2018) and v2.5.5 (GitHub master, 2021),
  283. compiled from the shipped <code>ChangeLog</code> and a comparison of the sources.</p>
  284. <h3 class="sub">New modules &amp; protections</h3>
  285. <div class="table-scroll"><table>
  286. <tr><th style="width:160px">Feature</th><th>Description</th></tr>
  287. <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>
  288. <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>
  289. <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>
  290. <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>
  291. <tr><td><code>AntiBotIdle</code></td><td>New egg setting that keeps the eggdrop itself from idling on the server.</td></tr>
  292. <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>
  293. </table></div>
  294. <h3 class="sub">Regex ban system</h3>
  295. <p class="sec-intro">The ban engine (rewritten in the new <code>BT.Ban.tcl</code>, faster) now supports
  296. <strong>regular-expression bans</strong>: <code>!b -regex</code>,
  297. <code>!ub -regex</code>, <code>!sb -regex</code> and <code>!banlist regex</code>. Regexes match against
  298. <code>nick!ident@host/[realname]/[banmask type]</code>. The BadChan module also accepts regex badchans
  299. (<code>!badchan regex &lt;#regex&gt;</code>) and got a faster, safer scanning mode.</p>
  300. <h3 class="sub">Other changes</h3>
  301. <div class="table-scroll"><table>
  302. <tr><th>Change</th><th>Detail</th></tr>
  303. <tr><td>DCC party-line support</td><td>All commands now work through DCC chat: <code>.bt &lt;command&gt; [#channel] [arguments]</code> (with <code>!myset mychan</code> set, the channel can be omitted).</td></tr>
  304. <tr><td>Languages</td><td>Spanish translation added; French language files are also shipped.</td></tr>
  305. <tr><td><b>GuestNick removed</b></td><td>The GuestNick module was removed in the 2021-03-15 update.</td></tr>
  306. <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>
  307. <tr><td>AntiColor tuning</td><td>New option to punish only specific colour codes (<code>anticolor:specific_colors</code>).</td></tr>
  308. <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>
  309. <tr><td>Flood action change</td><td>The private-message antiflood action changed from server SILENCE to IGNORE.</td></tr>
  310. <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>
  311. </table></div>
  312. </section>
  313. <!-- ================= INSTALL ================= -->
  314. <section id="install">
  315. <h2><span class="hash">#</span>Installation</h2>
  316. <p class="sec-intro">From the <code>INSTALL</code> file — how to get BlackTools running on a fresh eggdrop.</p>
  317. <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>
  318. git clone https://github.com/tclscripts/BlackToolS-TCL
  319. <span class="c"># 2. edit BlackTools.tcl to your liking (homechan, cmdchar, X login, defaults…)</span>
  320. <span class="c"># 3. copy everything into your eggdrop's scripts/ directory (case sensitive!)</span>
  321. cp -r BlackTools/ /home/of/your_eggdrop/scripts/
  322. cp BlackTools.tcl /home/of/your_eggdrop/scripts/
  323. <span class="c"># 4. add this line at the END of your eggdrop config file</span>
  324. source scripts/BlackTools.tcl
  325. <span class="c"># 5. restart the eggdrop, then in any channel type:</span>
  326. .h</pre></div>
  327. <div class="warn"><b>Warning:</b> running BlackTools together with the <b>A&amp;A</b> script "works in
  328. theory" only — the author explicitly does not support that combination.</div>
  329. <p class="sec-intro" style="margin-top:16px">The directory layout that must live under <code>scripts/</code>:</p>
  330. <div class="pill-row">
  331. <span class="pill">BlackTools.tcl — main config</span>
  332. <span class="pill">BlackTools/BT.Core.tcl</span>
  333. <span class="pill">BlackTools/BT.Ban.tcl — ban engine</span>
  334. <span class="pill">BlackTools/BT.Loader.tcl</span>
  335. <span class="pill">BlackTools/BT.Binds.tcl</span>
  336. <span class="pill">BlackTools/BT.Timers.tcl</span>
  337. <span class="pill">BlackTools/Addons/ — http, json, github</span>
  338. <span class="pill">BlackTools/Commands/ — 10 files</span>
  339. <span class="pill">BlackTools/Modules/ — 26 files</span>
  340. <span class="pill">BlackTools/Protections/ — 19 files</span>
  341. <span class="pill">BlackTools/lang/ — EN · RO · ES · FR</span>
  342. </div>
  343. </section>
  344. <!-- ================= USING ================= -->
  345. <section id="using">
  346. <h2><span class="hash">#</span>Using the bot</h2>
  347. <p class="sec-intro">Every BlackTools command can be triggered <strong>four ways</strong>. All examples in
  348. this documentation use <code>!</code>, but the bot answers to any of the configured trigger characters
  349. (stock: <code>!</code> <code>.</code> <code>`</code> <code>^</code> — change them with
  350. <code>set cmdchar</code>) — plus the botnick prefix, private message, and (new in 2.5.5) DCC chat.</p>
  351. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!command</span> <span class="a">&lt;args&gt;</span> <span class="c"># trigger char, in the channel</span>
  352. <span class="t">BotNick command</span> <span class="a">&lt;args&gt;</span> <span class="c"># address the bot by nick, in the channel</span>
  353. <span class="t">/msg BotNick command</span> <span class="a">#channel &lt;args&gt;</span> <span class="c"># private message — add the #channel</span>
  354. <span class="t">.bt command</span> <span class="a">[#channel] &lt;args&gt;</span> <span class="c"># DCC party-line (channel optional with myset mychan)</span></pre></div>
  355. <div class="note"><b>Convention used below:</b> <code>&lt;required&gt;</code> arguments are mandatory,
  356. <code>[optional]</code> arguments may be omitted. <code>[#chan]</code> is only needed when messaging the bot
  357. privately or acting on another channel. Durations are written <code>10m</code> (minutes), <code>3h</code>
  358. (hours), <code>2d</code> (days) — and <code>0</code> means <em>permanent</em>.</div>
  359. <h3 class="sub">The help menu</h3>
  360. <div class="cmd" data-k="h help menu categories">
  361. <div class="cmd-head"><h4><span class="amp">!</span>h</h4><span class="lvl all">Any access</span></div>
  362. <p>The most important command. Shows all commands available at <strong>your</strong> access level,
  363. plus category submenus. Disabled commands are hidden or greyed out.</p>
  364. <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>
  365. <span class="c"># btinfo · chaninfo · module · egg</span></pre></div>
  366. <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>
  367. <span class="t">!h</span> ban <span class="c"># every kick/ban command you can use</span>
  368. <span class="t">!h</span> module <span class="c"># which modules are ON (+) or OFF (-) on #channel</span>
  369. <span class="t">!h</span> chaninfo <span class="c"># channel flags &amp; eggdrop flood settings</span>
  370. /msg BotNick h #channel ban</pre></div>
  371. </div>
  372. <div class="cmd" data-k="man manual help">
  373. <div class="cmd-head"><h4><span class="amp">!</span>man</h4><span class="lvl all">Any access</span></div>
  374. <p>The built-in user manual. Displays usage information for every command, protection and module —
  375. the same content as this page, live on IRC.</p>
  376. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!man</span> <span class="a">&lt;command&gt;</span></pre></div>
  377. <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>
  378. <span class="t">!man</span> antipub <span class="c"># manual for the anti-advertising protection</span>
  379. <span class="t">!man</span> banmethod <span class="c"># explains the 7 punishment methods</span></pre></div>
  380. </div>
  381. </section>
  382. <!-- ================= LEVELS ================= -->
  383. <section id="levels">
  384. <h2><span class="hash">#</span>Access levels</h2>
  385. <p class="sec-intro">BlackTools layers its own named levels on top of eggdrop flags. Channel levels apply
  386. per-channel; global levels apply bot-wide. Each level inherits everything below it.</p>
  387. <div class="table-scroll"><table>
  388. <tr><th>Level</th><th>Scope</th><th>Eggdrop flag</th><th>Typical powers</th></tr>
  389. <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>
  390. <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>
  391. <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>
  392. <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>
  393. <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>
  394. <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>
  395. <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>
  396. </table></div>
  397. <div class="note">Two auxiliary levels exist for the userlist: <b>PROTECT</b> (never punished by
  398. protections) and <b>BAN</b> (auto-banned on sight). Ops and voices can additionally be shielded per-channel
  399. with <code>!set +oprotect</code> / <code>+vprotect</code> / <code>+hoprotect</code>.</div>
  400. </section>
  401. <!-- ================= GENERAL COMMANDS ================= -->
  402. <section id="cmd-general">
  403. <h2><span class="hash">#</span>General commands</h2>
  404. <p class="sec-intro">Everyday commands available from the lowest access level upward.</p>
  405. <div class="cmd" data-k="version info script">
  406. <div class="cmd-head"><h4><span class="amp">!</span>version</h4><span class="lvl all">Any access</span></div>
  407. <p>Displays the BlackTools version the eggdrop is running.</p>
  408. <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!version</span></pre></div>
  409. </div>
  410. <div class="cmd" data-k="i invite user channel">
  411. <div class="cmd-head"><h4><span class="amp">!</span>i &nbsp;/&nbsp; <span class="amp">!</span>invite</h4><span class="lvl voice">Voice+</span></div>
  412. <p>Invites a user to the channel. The bot must be opped (@) for the invite to work.</p>
  413. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!i</span> <span class="a">&lt;nick&gt;</span> <span class="c"># in channel</span>
  414. <span class="t">/msg BotNick i</span> <span class="a">#channel &lt;nick&gt;</span></pre></div>
  415. <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>
  416. </div>
  417. <div class="cmd" data-k="seen last seen nick host ip database">
  418. <div class="cmd-head"><h4><span class="amp">!</span>seen</h4><span class="lvl voice">Voice+</span></div>
  419. <p>Searches the per-channel seen database for a nick, IP or host (wildcards supported). Shows when the
  420. person was last seen and what they did. Owners+ can search <code>global</code> across all channels.
  421. Flood-protected (2 searches / 20s by default).</p>
  422. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!seen</span> <span class="a">&lt;nick|ip|host&gt;</span>
  423. <span class="t">!seen</span> global <span class="a">&lt;nick|ip|host&gt;</span> <span class="c"># owners+ — all channels</span></pre></div>
  424. <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!seen</span> JohnDoe
  425. <span class="t">!seen</span> *!*@*.videotron.ca</pre></div>
  426. <p class="opt">Related: <code>+seen</code> module toggle · <code>+seenlastmsg</code> (show last message) ·
  427. <code>+seenreply</code> (notify people they were searched for)</p>
  428. </div>
  429. <div class="cmd" data-k="activ activity last action user">
  430. <div class="cmd-head"><h4><span class="amp">!</span>activ</h4><span class="lvl voice">Voice+</span></div>
  431. <p>Shows the last recorded channel activity of a user (last join, part, kick, ban, text…), pulled from
  432. the bot's action tracker.</p>
  433. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!activ</span> <span class="a">&lt;nick&gt;</span></pre></div>
  434. </div>
  435. <div class="cmd" data-k="for multiple bots simultaneous command">
  436. <div class="cmd-head"><h4><span class="amp">!</span>for</h4><span class="lvl voice">Voice+</span></div>
  437. <p>Makes multiple eggdrops (all running BlackTools) execute the same command simultaneously —
  438. handy when several bots guard the channel.</p>
  439. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">for</span> <span class="a">&lt;botnick1&gt;,&lt;botnick2&gt;..</span> <span class="a">&lt;command&gt;</span> <span class="o">[option]</span></pre></div>
  440. <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>
  441. </div>
  442. <div class="cmd" data-k="info user channel details access greet automode">
  443. <div class="cmd-head"><h4><span class="amp">!</span>info</h4><span class="lvl admin">Admin+</span></div>
  444. <p>Displays database information about a user or a channel: access level, added hostmasks, automode,
  445. greet line, last-seen info, channel topic/URL/manager, and more.</p>
  446. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!info</span> <span class="a">&lt;handle|#chan&gt;</span></pre></div>
  447. <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!info</span> JohnDoe
  448. <span class="t">!info</span> #channel</pre></div>
  449. </div>
  450. <div class="cmd" data-k="addinfo greeting personal join message">
  451. <div class="cmd-head"><h4><span class="amp">!</span>addinfo</h4><span class="lvl voice">Voice+</span></div>
  452. <p>Sets a personalised greeting line for yourself, shown in <code>!info</code> and announced by the bot
  453. when you join (requires <code>+greet</code> on the channel). Same as <code>!myset greet</code>.</p>
  454. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addinfo</span> <span class="a">&lt;text|reset&gt;</span></pre></div>
  455. <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>
  456. </div>
  457. </section>
  458. <!-- ================= CHANNEL OP COMMANDS ================= -->
  459. <section id="cmd-chanops">
  460. <h2><span class="hash">#</span>Channel op commands</h2>
  461. <p class="sec-intro">Op/voice management, modes, topic and channel messages.</p>
  462. <div class="cmd" data-k="v voice devoice mass">
  463. <div class="cmd-head"><h4><span class="amp">!</span>v</h4><span class="lvl voice">Voice+</span></div>
  464. <p>Gives or removes voice <strong>(+v)</strong> for one or more users. With no nick, voices
  465. <em>you</em> (if you aren't voiced already).</p>
  466. <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>
  467. <span class="t">!v +</span> <span class="c"># mass voice everyone</span>
  468. <span class="t">!v -</span> <span class="c"># mass devoice</span></pre></div>
  469. <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>
  470. </div>
  471. <div class="cmd" data-k="o op deop mass operator">
  472. <div class="cmd-head"><h4><span class="amp">!</span>o</h4><span class="lvl op">Op+</span></div>
  473. <p>Gives or removes op <strong>(@)</strong> for one or more users. With no nick, ops <em>you</em>.</p>
  474. <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>
  475. <span class="t">!o +</span> <span class="c"># mass op</span>
  476. <span class="t">!o -</span> <span class="c"># mass deop</span></pre></div>
  477. </div>
  478. <div class="cmd" data-k="ho halfop dehalfop mass">
  479. <div class="cmd-head"><h4><span class="amp">!</span>ho</h4><span class="lvl op">Op+</span></div>
  480. <p>Gives or removes halfop <strong>(+h %)</strong> for the specified users. <code>!ho +</code> /
  481. <code>!ho -</code> perform a mass halfop / dehalfop.</p>
  482. <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>
  483. </div>
  484. <div class="cmd" data-k="mode channel modes lock key moderate">
  485. <div class="cmd-head"><h4><span class="amp">!</span>mode</h4><span class="lvl op">Op+</span></div>
  486. <p>Applies or removes channel modes.</p>
  487. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mode</span> <span class="a">&lt;+/-modes&gt;</span></pre></div>
  488. <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>
  489. <span class="t">!mode</span> -m+ntr</pre></div>
  490. </div>
  491. <div class="cmd" data-k="t topic set text">
  492. <div class="cmd-head"><h4><span class="amp">!</span>t</h4><span class="lvl op">Op+</span></div>
  493. <p>Sets the channel topic. With <code>!set +showhandle</code>, the bot appends the handle of whoever
  494. changed it.</p>
  495. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!t</span> <span class="a">&lt;text&gt;</span></pre></div>
  496. <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>
  497. </div>
  498. <div class="cmd" data-k="r refresh topic reload">
  499. <div class="cmd-head"><h4><span class="amp">!</span>r</h4><span class="lvl op">Op+</span></div>
  500. <p>Manually refreshes/re-applies the stored channel topic (see also the <code>+refresh</code> and
  501. <code>+autotopic</code> settings).</p>
  502. <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>
  503. </div>
  504. <div class="cmd" data-k="cycle hop part rejoin">
  505. <div class="cmd-head"><h4><span class="amp">!</span>cycle</h4><span class="lvl op">Op+</span></div>
  506. <p>Makes the bot cycle (part and re-join) the channel, optionally waiting a given duration.</p>
  507. <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>
  508. </div>
  509. <div class="cmd" data-k="omsg operators message notice ops">
  510. <div class="cmd-head"><h4><span class="amp">!</span>omsg</h4><span class="lvl op">Op+</span></div>
  511. <p>Sends a message to all users with op (@) on the channel — or on every channel with
  512. <code>all</code>.</p>
  513. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!omsg</span> <span class="a">&lt;#chan|all&gt;</span> <span class="a">&lt;text&gt;</span></pre></div>
  514. <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>
  515. </div>
  516. <div class="cmd" data-k="say message channel speak">
  517. <div class="cmd-head"><h4><span class="amp">!</span>say</h4><span class="lvl admin">Admin+</span></div>
  518. <p>Makes the bot say a message to the channel.</p>
  519. <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">&lt;message&gt;</span></pre></div>
  520. <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>
  521. </div>
  522. <div class="cmd" data-k="act action me emote">
  523. <div class="cmd-head"><h4><span class="amp">!</span>act</h4><span class="lvl admin">Admin+</span></div>
  524. <p>Makes the bot send an action (<code>/me</code>) to the channel.</p>
  525. <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">&lt;message&gt;</span></pre></div>
  526. <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>
  527. </div>
  528. <div class="cmd" data-k="msg private message target query">
  529. <div class="cmd-head"><h4><span class="amp">!</span>msg</h4><span class="lvl owner">Owner+</span></div>
  530. <p>Sends a message to any target — a channel, a nick (query) or a chat window.</p>
  531. <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">&lt;message&gt;</span></pre></div>
  532. </div>
  533. <div class="cmd" data-k="broadcast all channels message">
  534. <div class="cmd-head"><h4><span class="amp">!</span>broadcast</h4><span class="lvl owner">Owner+</span></div>
  535. <p>Sends a message to <strong>all</strong> channels the bot is in.</p>
  536. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!broadcast</span> <span class="a">&lt;message&gt;</span></pre></div>
  537. </div>
  538. <div class="cmd" data-k="check verify user virus advertise private">
  539. <div class="cmd-head"><h4><span class="amp">!</span>check</h4><span class="lvl op">Op+</span></div>
  540. <p>Sends a private verification message to a user — used to test whether they are infected/advertising
  541. (drones often auto-reply). The message text is configurable.</p>
  542. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!check</span> <span class="a">&lt;nick&gt;</span></pre></div>
  543. <p class="opt">Optional settings: <code>check-message</code> (default check text)</p>
  544. </div>
  545. </section>
  546. <!-- ================= KICK & BAN COMMANDS ================= -->
  547. <section id="cmd-bans">
  548. <h2><span class="hash">#</span>Kick &amp; ban commands</h2>
  549. <p class="sec-intro">The heart of BlackTools: a full ban system with per-ban levels, durations, sticky
  550. bans, global bans, comments and searchable banlists. Durations: <code>m</code>inutes /
  551. <code>h</code>ours / <code>d</code>ays, <code>0</code> = permanent. Most commands accept a nick
  552. <em>or</em> a mask — if the nick isn't on the channel, the bot will <code>WHOIS</code> it.</p>
  553. <div class="cmd" data-k="k kick user reason">
  554. <div class="cmd-head"><h4><span class="amp">!</span>k</h4><span class="lvl voice">Voice+</span></div>
  555. <p>Kicks a user (or everyone matching a mask) from the channel.</p>
  556. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!k</span> <span class="a">&lt;nick|mask&gt;</span> <span class="o">[reason]</span></pre></div>
  557. <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!k</span> Troublemaker
  558. <span class="t">!k</span> Troublemaker Please keep it civil</pre></div>
  559. <p class="opt">Optional settings: <code>k-reason</code> (default kick reason)</p>
  560. </div>
  561. <div class="cmd" data-k="w warn warning kick">
  562. <div class="cmd-head"><h4><span class="amp">!</span>w</h4><span class="lvl voice">Voice+</span></div>
  563. <p>Delivers a <strong>warning kick</strong> — a kick with a configurable warning reason and message.</p>
  564. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!w</span> <span class="a">&lt;nick&gt;</span></pre></div>
  565. <p class="opt">Optional settings: <code>w-reason</code> · <code>w-message</code></p>
  566. </div>
  567. <div class="cmd" data-k="b ban duration level global link comment permanent">
  568. <div class="cmd-head"><h4><span class="amp">!</span>b</h4><span class="lvl op">Op+</span></div>
  569. <p>The main ban command. Bans a nick or mask for a duration (stock default: <strong>2 days</strong>).
  570. A duration of <code>0</code> makes the ban permanent (blacklisted). <code>-level</code> protects the
  571. ban from removal by lower access. Owners+ can add <code>global</code> (all channels) or
  572. <code>link</code> (linked channels). <code>-c comment</code> attaches a note visible on the ban entry.
  573. Supports CIDR masks like <code>*!*@192.168.0.1/17</code> — and, new in 2.5.5,
  574. <strong>regex bans</strong> with <code>-regex</code>, matched against
  575. <code>nick!ident@host/[realname]/[banmask type]</code> (bracketed fields optional).</p>
  576. <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">&lt;nick|mask|regex&gt;</span> <span class="o">[-level] [duration] [reason] [-c comment]</span>
  577. <span class="t">!b</span> <span class="o">[-regex]</span> <span class="a">&lt;nick|mask|regex&gt;</span> <span class="o">[-level] [duration] [global|link] [reason]</span> <span class="c"># owner+</span></pre></div>
  578. <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!b</span> SpamGuy 2d advertising
  579. <span class="t">!b</span> *!*@198.51.100.* 12h botnet range
  580. <span class="t">!b</span> Griefer -400 0 permanent, level 400 protection
  581. <span class="t">!b</span> Flooder 3d flooding -c third offence this week
  582. <span class="t">!b</span> -regex [a-z]+[0-9][0-9]!*@* 1d drone pattern</pre></div>
  583. <p class="opt">Optional settings: <code>b-reason</code> · <code>b-bantime</code> (default 2d) ·
  584. <code>b-banmask</code> (default <code>*!*@host</code>)</p>
  585. </div>
  586. <div class="cmd" data-k="ub unban remove ban wildcards global">
  587. <div class="cmd-head"><h4><span class="amp">!</span>ub</h4><span class="lvl op">Op+</span></div>
  588. <p>Removes a ban by nick, mask or ban ID (wildcards supported). If the nick isn't on channel the bot
  589. WHOISes and unbans by ident/host/nick — matching regex bans are removed too. Use <code>-regex</code>
  590. to remove a stored regex ban directly. <strong>Careful:</strong> <code>!ub *</code> removes
  591. <em>all</em> channel bans.</p>
  592. <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">&lt;nick|mask|id|regex&gt;</span> <span class="o">[global|link]</span></pre></div>
  593. <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ub</span> SpamGuy
  594. <span class="t">!ub</span> 1234 <span class="c"># by ban ID (see +showid / !sb)</span></pre></div>
  595. </div>
  596. <div class="cmd" data-k="sb search ban details wildcards id">
  597. <div class="cmd-head"><h4><span class="amp">!</span>sb</h4><span class="lvl op">Op+</span></div>
  598. <p>Searches the banlist and shows full details of a ban — who set it, when, why, expiry, comment.
  599. Also matches and inspects regex bans (<code>-regex</code>).</p>
  600. <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">&lt;nick|mask|id|regex&gt;</span> <span class="o">[global]</span></pre></div>
  601. <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>
  602. </div>
  603. <div class="cmd" data-k="banlist list bans active">
  604. <div class="cmd-head"><h4><span class="amp">!</span>banlist</h4><span class="lvl op">Op+</span></div>
  605. <p>Shows the active bans on the channel — all of them, only yours, other people's, regex bans only,
  606. gags only, or (owners+) the global list. Paged output; follow with <code>-next</code> for more
  607. entries.</p>
  608. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!banlist</span> <span class="a">&lt;all|handle|regex|gag|other&gt;</span>
  609. <span class="t">!banlist</span> global <span class="c"># owner+</span></pre></div>
  610. </div>
  611. <div class="cmd" data-k="black permanent blacklist ban unlimited">
  612. <div class="cmd-head"><h4><span class="amp">!</span>black</h4><span class="lvl admin">Admin+</span></div>
  613. <p>Bans a user <strong>permanently</strong> (blacklist). Equivalent to <code>!b ... 0</code>.</p>
  614. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!black</span> <span class="a">&lt;nick|mask&gt;</span> <span class="o">[reason] [-c comment]</span></pre></div>
  615. <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>
  616. <p class="opt">Optional settings: <code>black-reason</code> · <code>black-banmask</code></p>
  617. </div>
  618. <div class="cmd" data-k="stick sticky ban reactivate">
  619. <div class="cmd-head"><h4><span class="amp">!</span>stick</h4><span class="lvl admin">Admin+</span></div>
  620. <p>Sets a <strong>sticky</strong> ban: if anyone removes it from the channel banlist, the bot puts it
  621. right back. Stock default duration: 2 days.</p>
  622. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!stick</span> <span class="a">&lt;nick|mask&gt;</span> <span class="o">[duration] [reason] [-c comment]</span></pre></div>
  623. <p class="opt">Optional settings: <code>stick-reason</code> · <code>stick-bantime</code> · <code>stick-banmask</code></p>
  624. </div>
  625. <div class="cmd" data-k="n nickname ban nick">
  626. <div class="cmd-head"><h4><span class="amp">!</span>n</h4><span class="lvl op">Op+</span></div>
  627. <p>Bans on the user's <strong>nickname</strong> (mask <code>nick!*@*</code>). Default: 2h.</p>
  628. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!n</span> <span class="a">&lt;nick&gt;</span></pre></div>
  629. <p class="opt">Optional settings: <code>n-reason</code> · <code>n-bantime</code> · <code>n-banmask</code></p>
  630. </div>
  631. <div class="cmd" data-k="id ident ban">
  632. <div class="cmd-head"><h4><span class="amp">!</span>id</h4><span class="lvl op">Op+</span></div>
  633. <p>Bans on the user's <strong>ident</strong> (mask <code>*!user@*</code>). Given a nick, the bot grabs
  634. the ident automatically. Default: 2h.</p>
  635. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!id</span> <span class="a">&lt;nick|ident&gt;</span></pre></div>
  636. <p class="opt">Optional settings: <code>id-reason</code> · <code>id-bantime</code> · <code>id-banmask</code></p>
  637. </div>
  638. <div class="cmd" data-k="mb ident ban reason auto">
  639. <div class="cmd-head"><h4><span class="amp">!</span>mb</h4><span class="lvl op">Op+</span></div>
  640. <p>Bans a nickname automatically on <strong>ident</strong>, with an optional reason. Default: 2d.</p>
  641. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mb</span> <span class="a">&lt;nick&gt;</span> <span class="o">[reason]</span></pre></div>
  642. <p class="opt">Optional settings: <code>mb-reason</code> · <code>mb-bantime</code></p>
  643. </div>
  644. <div class="cmd" data-k="dr drone ban">
  645. <div class="cmd-head"><h4><span class="amp">!</span>dr</h4><span class="lvl op">Op+</span></div>
  646. <p>Bans with a default <strong>DRONE</strong> reason — for compromised clients/drones. Default: 15d.</p>
  647. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!dr</span> <span class="a">&lt;nick|mask&gt;</span></pre></div>
  648. <p class="opt">Optional settings: <code>dr-reason</code> · <code>dr-bantime</code> · <code>dr-banmask</code></p>
  649. </div>
  650. <div class="cmd" data-k="vr virus trojan ban">
  651. <div class="cmd-head"><h4><span class="amp">!</span>vr</h4><span class="lvl op">Op+</span></div>
  652. <p>Bans with a default <strong>VIRUS/TROJAN</strong> reason. Default: 3d.</p>
  653. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!vr</span> <span class="a">&lt;nick|mask&gt;</span></pre></div>
  654. <p class="opt">Optional settings: <code>vr-reason</code> · <code>vr-bantime</code> · <code>vr-banmask</code></p>
  655. </div>
  656. <div class="cmd" data-k="bot ban clone bot reason">
  657. <div class="cmd-head"><h4><span class="amp">!</span>bot</h4><span class="lvl op">Op+</span></div>
  658. <p>Bans with a default <strong>BOT</strong> reason — for unauthorised bots. Default: 7d.</p>
  659. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bot</span> <span class="a">&lt;nick|mask&gt;</span></pre></div>
  660. <p class="opt">Optional settings: <code>bot-reason</code> · <code>bot-bantime</code> · <code>bot-banmask</code></p>
  661. </div>
  662. <div class="cmd" data-k="spam ban spammer reason">
  663. <div class="cmd-head"><h4><span class="amp">!</span>spam</h4><span class="lvl op">Op+</span></div>
  664. <p>Bans with a default <strong>SPAM</strong> reason. Default: 7d.</p>
  665. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!spam</span> <span class="a">&lt;nick|mask&gt;</span></pre></div>
  666. <p class="opt">Optional settings: <code>spam-reason</code> · <code>spam-bantime</code> · <code>spam-banmask</code></p>
  667. </div>
  668. <div class="cmd" data-k="bw badword ban">
  669. <div class="cmd-head"><h4><span class="amp">!</span>bw</h4><span class="lvl op">Op+</span></div>
  670. <p>Bans with a default <strong>bad word</strong> reason. Default: 1d.</p>
  671. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bw</span> <span class="a">&lt;nick|mask&gt;</span></pre></div>
  672. <p class="opt">Optional settings: <code>bw-reason</code> · <code>bw-bantime</code> · <code>bw-banmask</code></p>
  673. </div>
  674. <div class="cmd" data-k="troll ban troll showtroll">
  675. <div class="cmd-head"><h4><span class="amp">!</span>troll</h4><span class="lvl op">Op+</span></div>
  676. <p>Bans with a default <strong>TROLL</strong> reason. With <code>+showtroll</code> enabled, the bot
  677. notices a "trolls of the day" list to access-holders when they join (reset at midnight).</p>
  678. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!troll</span> <span class="a">&lt;nick&gt;</span></pre></div>
  679. <p class="opt">Optional settings: <code>troll-reason</code> · <code>+showtroll</code></p>
  680. </div>
  681. <div class="cmd" data-k="gag ungag mute silence">
  682. <div class="cmd-head"><h4><span class="amp">!</span>gag &nbsp;/&nbsp; <span class="amp">!</span>ungag</h4><span class="lvl op">Op+</span></div>
  683. <p>Silences a user — they can't write on the channel — for a period (default: 10m). The bot re-bans
  684. (+b with mute) if the gag is removed early. <code>!ungag</code> lifts it.</p>
  685. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!gag</span> <span class="a">&lt;nick&gt;</span> <span class="o">[duration] [reason]</span>
  686. <span class="t">!ungag</span> <span class="a">&lt;nick|mask&gt;</span></pre></div>
  687. <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>
  688. <p class="opt">Optional settings: <code>gag-reason</code> · <code>gag-bantime</code> · <code>gag-banmask</code></p>
  689. </div>
  690. <div class="cmd" data-k="exempt ban exception whitelist">
  691. <div class="cmd-head"><h4><span class="amp">!</span>exempt</h4><span class="lvl manager">Manager+</span></div>
  692. <p>Manages the ban-exempt list: hosts on it are never banned by the bot. Owners+ can make an exempt
  693. <code>global</code>.</p>
  694. <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">&lt;ip|host&gt;</span> <span class="o">[period] [global] [reason]</span>
  695. <span class="t">!exempt</span> list <span class="o">[global]</span>
  696. <span class="t">!exempt</span> del <span class="a">&lt;ip|host&gt;</span> <span class="o">[global]</span></pre></div>
  697. <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>
  698. </div>
  699. <div class="cmd" data-k="stats statistics bans kicks user">
  700. <div class="cmd-head"><h4><span class="amp">!</span>stats</h4><span class="lvl admin">Admin+</span></div>
  701. <p>Shows ban/command statistics for a user. Managers+ can <code>reset</code>. Requires the
  702. <code>+banstats</code> setting to collect data (see also <code>!banstats total|reset</code>).</p>
  703. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!stats</span> <span class="a">&lt;handle&gt;</span> <span class="o">[total|reset]</span></pre></div>
  704. </div>
  705. <div class="cmd" data-k="report reportnick advert spam nickname regular users">
  706. <div class="cmd-head"><h4><span class="amp">!</span>report</h4><span class="lvl all">Everyone</span></div>
  707. <p>Lets <em>regular users</em> (and voice/protect) report a nickname for adverts or spam. The bot
  708. relays the report to channel ops via @notice. Needs <code>+reportnick</code> and the bot opped.
  709. Flood-limited (2 reports / 60s).</p>
  710. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!report</span> <span class="a">&lt;nick&gt;</span> <span class="a">&lt;comment&gt;</span></pre></div>
  711. <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>
  712. </div>
  713. </section>
  714. <!-- ================= USER MANAGEMENT ================= -->
  715. <section id="cmd-users">
  716. <h2><span class="hash">#</span>User management</h2>
  717. <p class="sec-intro">Adding people to the bot, hostmasks, automodes and suspensions. You can only act on
  718. users with access <em>lower</em> than your own.</p>
  719. <div class="cmd" data-k="add user access level chanserv username">
  720. <div class="cmd-head"><h4><span class="amp">!</span>add</h4><span class="lvl admin">Admin+</span></div>
  721. <p>Adds a user to the channel's userlist at a given level (<code>voice</code>, <code>op</code>,
  722. <code>admin</code>, <code>manager</code>…). If the user is on channel, their current hostmask is added
  723. (default style: <code>*!*@host</code>). If not, the Undernet default is used:
  724. <code>*!*@&lt;user&gt;.users.undernet.org</code> — so you can add people by X username.</p>
  725. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!add</span> <span class="a">&lt;level&gt;</span> <span class="a">&lt;nick|Xusername&gt;</span></pre></div>
  726. <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>
  727. <span class="t">!add</span> voice SomeUserX <span class="c"># not on channel → *!*@SomeUserX.users.undernet.org</span></pre></div>
  728. </div>
  729. <div class="cmd" data-k="userlist access list level all">
  730. <div class="cmd-head"><h4><span class="amp">!</span>userlist</h4><span class="lvl admin">Admin+</span></div>
  731. <p>Shows the channel's access list, filtered by level or all of it.</p>
  732. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!userlist</span> <span class="a">&lt;level|all&gt;</span> <span class="c"># levels: voice · op · admin · manager · owner · master</span></pre></div>
  733. <div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!userlist</span> op</pre></div>
  734. </div>
  735. <div class="cmd" data-k="delacc remove access delete user channel">
  736. <div class="cmd-head"><h4><span class="amp">!</span>delacc</h4><span class="lvl admin">Admin+</span></div>
  737. <p>Removes a user's access from the channel (their record stays in the bot). Must target someone with
  738. lower access than you. Owners can strip global <code>owner|master</code> access too.</p>
  739. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!delacc</span> <span class="a">&lt;handle&gt;</span>
  740. <span class="t">!delacc</span> <span class="a">&lt;owner|master&gt;</span> <span class="a">&lt;handle&gt;</span> <span class="c"># remove a global level</span></pre></div>
  741. </div>
  742. <div class="cmd" data-k="del delete user database totally">
  743. <div class="cmd-head"><h4><span class="amp">!</span>del</h4><span class="lvl manager">Manager+</span></div>
  744. <p>Deletes a user <strong>entirely</strong> from the bot's database — all channels, all hosts.</p>
  745. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!del</span> <span class="a">&lt;handle&gt;</span></pre></div>
  746. </div>
  747. <div class="cmd" data-k="auto automode autoop autovoice global">
  748. <div class="cmd-head"><h4><span class="amp">!</span>auto</h4><span class="lvl admin">Admin+</span></div>
  749. <p>Sets a user's automode — the bot automatically ops or voices them on join. The user must already
  750. have access on the channel. Owners+ can apply it <code>-global</code>.</p>
  751. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!auto</span> <span class="a">&lt;+/-o&gt;</span> <span class="a">&lt;nick|handle&gt;</span> <span class="o">[-global]</span> <span class="c"># auto-op</span>
  752. <span class="t">!auto</span> <span class="a">&lt;+/-v&gt;</span> <span class="a">&lt;nick|handle&gt;</span> <span class="o">[-global]</span> <span class="c"># auto-voice</span></pre></div>
  753. <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>
  754. </div>
  755. <div class="cmd" data-k="s suspend access user duration">
  756. <div class="cmd-head"><h4><span class="amp">!</span>s &nbsp;/&nbsp; <span class="amp">!</span>us</h4><span class="lvl admin">Admin+</span></div>
  757. <p><code>!s</code> suspends a user's access on the channel for a period (default: 2d);
  758. <code>!us</code> lifts the suspension. Only works downward in the hierarchy.</p>
  759. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!s</span> <span class="a">&lt;handle&gt;</span> <span class="o">[duration] [reason]</span>
  760. <span class="t">!us</span> <span class="a">&lt;handle&gt;</span></pre></div>
  761. <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>
  762. </div>
  763. <div class="cmd" data-k="addhost delhost hostmask user">
  764. <div class="cmd-head"><h4><span class="amp">!</span>addhost &nbsp;/&nbsp; <span class="amp">!</span>delhost</h4><span class="lvl admin">Admin+</span></div>
  765. <p>Adds or removes a hostmask on a user's record.</p>
  766. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addhost</span> <span class="a">&lt;handle&gt;</span> <span class="a">&lt;mask&gt;</span>
  767. <span class="t">!delhost</span> <span class="a">&lt;handle&gt;</span> <span class="a">&lt;mask&gt;</span></pre></div>
  768. <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>
  769. </div>
  770. <div class="cmd" data-k="chuser rename handle user">
  771. <div class="cmd-head"><h4><span class="amp">!</span>chuser</h4><span class="lvl manager">Manager+</span></div>
  772. <p>Renames a user's handle in the bot's database.</p>
  773. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!chuser</span> <span class="a">&lt;handle&gt;</span> <span class="a">&lt;newhandle&gt;</span></pre></div>
  774. </div>
  775. </section>
  776. <!-- ================= CHANNEL MANAGEMENT ================= -->
  777. <section id="cmd-chan">
  778. <h2><span class="hash">#</span>Channel management</h2>
  779. <p class="sec-intro">Settings, toggles and channel administration — the manager's toolbox.</p>
  780. <div class="cmd" data-k="set flag option setting toggle chanmode key">
  781. <div class="cmd-head"><h4><span class="amp">!</span>set</h4><span class="lvl manager">Manager+</span></div>
  782. <p>The universal switchboard. Turns protections/modules on or off (<code>+flag</code> /
  783. <code>-flag</code>) and assigns values to string options. Owners+ can use <code>global</code> to apply a
  784. setting to every channel. See the <a href="#protections">Protections</a> and
  785. <a href="#modules">Modules</a> sections for every flag.</p>
  786. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> <span class="a">&lt;+/-flag&gt;</span> <span class="c"># toggle</span>
  787. <span class="t">!set</span> <span class="a">&lt;option&gt;</span> <span class="a">&lt;value&gt;</span> <span class="c"># assign</span>
  788. <span class="t">!set</span> global <span class="a">&lt;option&gt;</span> <span class="a">&lt;value&gt;</span> <span class="c"># owner+ — all channels</span></pre></div>
  789. <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>
  790. <span class="t">!set</span> chanmode +ntk s3cret <span class="c"># enforce modes incl. a key</span>
  791. <span class="t">!set</span> b-bantime 4h <span class="c"># default !b duration → 4 hours</span>
  792. <span class="t">!set</span> url https://www.example.com</pre></div>
  793. </div>
  794. <div class="cmd" data-k="unset reset option flag remove">
  795. <div class="cmd-head"><h4><span class="amp">!</span>unset</h4><span class="lvl manager">Manager+</span></div>
  796. <p>Resets a setting/option back to default. Owners+ can <code>unset global</code>.</p>
  797. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!unset</span> <span class="a">&lt;flag|option&gt;</span>
  798. <span class="t">!unset</span> global <span class="a">&lt;flag|option&gt;</span></pre></div>
  799. </div>
  800. <div class="cmd" data-k="show setting value view">
  801. <div class="cmd-head"><h4><span class="amp">!</span>show</h4><span class="lvl manager">Manager+</span></div>
  802. <p>Shows the current value of any setting.</p>
  803. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!show</span> <span class="a">&lt;setting&gt;</span></pre></div>
  804. <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>
  805. </div>
  806. <div class="cmd" data-k="enable disable command user global">
  807. <div class="cmd-head"><h4><span class="amp">!</span>enable &nbsp;/&nbsp; <span class="amp">!</span>disable</h4><span class="lvl manager">Manager+</span></div>
  808. <p>Enables/disables a command on the channel — for everyone or for a specific user. Masters+ can apply
  809. it <code>global</code>ly (commands only, not users). Disabled commands show greyed-out in
  810. <code>!h</code>.</p>
  811. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!disable</span> <span class="a">&lt;command|all&gt;</span> <span class="o">[user] [global]</span>
  812. <span class="t">!enable</span> <span class="a">&lt;command|all&gt;</span> <span class="o">[user] [global]</span></pre></div>
  813. <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>
  814. <span class="t">!enable</span> all</pre></div>
  815. </div>
  816. <div class="cmd" data-k="ignore host bot ignore list">
  817. <div class="cmd-head"><h4><span class="amp">!</span>ignore</h4><span class="lvl manager">Manager+</span></div>
  818. <p>Adds, lists or removes bot-level ignores (default duration: 6h).</p>
  819. <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">&lt;ip|mask&gt;</span> <span class="o">[duration] [reason]</span>
  820. <span class="t">!ignore</span> list
  821. <span class="t">!ignore</span> del <span class="a">&lt;ip|host&gt;</span></pre></div>
  822. </div>
  823. <div class="cmd" data-k="purge delete channel data manager">
  824. <div class="cmd-head"><h4><span class="amp">!</span>purge</h4><span class="lvl manager">Manager+</span></div>
  825. <p>Deletes the channel from the bot's channel database (manager-only variant of
  826. <code>delchan</code>).</p>
  827. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!purge</span> <span class="a">&lt;#chan&gt;</span> <span class="a">&lt;reason&gt;</span></pre></div>
  828. </div>
  829. <div class="cmd" data-k="addchan delchan add channel remove join key">
  830. <div class="cmd-head"><h4><span class="amp">!</span>addchan &nbsp;/&nbsp; <span class="amp">!</span>delchan</h4><span class="lvl master">Master+</span></div>
  831. <p>Adds a channel to the bot (it joins immediately; an optional key is used to get in) or removes
  832. one.</p>
  833. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addchan</span> <span class="a">&lt;#chan&gt;</span> <span class="o">[key]</span>
  834. <span class="t">!delchan</span> <span class="a">&lt;#chan&gt;</span> <span class="a">&lt;reason&gt;</span></pre></div>
  835. </div>
  836. <div class="cmd" data-k="suspend unsuspend channel">
  837. <div class="cmd-head"><h4><span class="amp">!</span>suspend &nbsp;/&nbsp; <span class="amp">!</span>unsuspend</h4><span class="lvl master">Master+</span></div>
  838. <p>Suspends a channel — the bot leaves and won't join or act in it — or reverses that.</p>
  839. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!suspend</span> <span class="a">&lt;#chan&gt;</span> <span class="a">&lt;reason&gt;</span>
  840. <span class="t">!unsuspend</span> <span class="a">&lt;#chan&gt;</span></pre></div>
  841. </div>
  842. <div class="cmd" data-k="channels list joined">
  843. <div class="cmd-head"><h4><span class="amp">!</span>channels</h4><span class="lvl master">Master+</span></div>
  844. <p>Lists all channels the bot is joined to (channels flagged <code>+invisible</code> are hidden from
  845. non-boss users).</p>
  846. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!channels</span></pre></div>
  847. </div>
  848. <div class="cmd" data-k="cp copy settings userlist banlist badchans channel">
  849. <div class="cmd-head"><h4><span class="amp">!</span>cp</h4><span class="lvl owner">Owner+</span></div>
  850. <p>Copies configuration from one channel to another.</p>
  851. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cp</span> <span class="a">&lt;userlist|banlist|settings|badchans&gt;</span> <span class="a">&lt;#chan1&gt;</span> <span class="a">&lt;#chan2&gt;</span></pre></div>
  852. <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>
  853. </div>
  854. <div class="cmd" data-k="link chanlink synchronize bans channels">
  855. <div class="cmd-head"><h4><span class="amp">!</span>link</h4><span class="lvl owner">Owner+</span></div>
  856. <p>ChanLink module — synchronises bans across two or more channels: a ban added on one linked channel
  857. is mirrored to the others (and removed everywhere on unban).</p>
  858. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!link</span> <span class="a">&lt;#chan1&gt;</span> <span class="a">&lt;#chan2&gt;</span> | all
  859. <span class="t">!link</span> del <span class="a">&lt;#chan&gt;</span>
  860. <span class="t">!link</span> <span class="a">&lt;list|reset&gt;</span>
  861. <span class="c"># then, ad hoc:</span>
  862. <span class="t">!b</span> <span class="a">&lt;nick|mask&gt;</span> <span class="o">[duration]</span> link <span class="o">[reason]</span>
  863. <span class="t">!ub</span> <span class="a">&lt;nick|mask&gt;</span> link</pre></div>
  864. </div>
  865. </section>
  866. <!-- ================= BOT OWNER COMMANDS ================= -->
  867. <section id="cmd-owner">
  868. <h2><span class="hash">#</span>Bot owner commands</h2>
  869. <p class="sec-intro">Bot lifecycle and shell-free administration. Boss owners can even edit
  870. <code>eggdrop.conf</code> values straight from IRC — see <a href="#egg">Eggdrop.conf via IRC</a>.</p>
  871. <div class="cmd" data-k="uptime status server connected">
  872. <div class="cmd-head"><h4><span class="amp">!</span>uptime &nbsp;/&nbsp; <span class="amp">!</span>status</h4><span class="lvl master">Master+</span></div>
  873. <p><code>!uptime</code> shows how long the bot has been up, when it connected and to which server.
  874. <code>!status</code> shows monitored channels, total users, version and bot owner.</p>
  875. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!uptime</span>
  876. <span class="t">!status</span></pre></div>
  877. </div>
  878. <div class="cmd" data-k="die restart rehash save shutdown reload">
  879. <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>
  880. <p><code>die</code> shuts the bot down. <code>restart</code> restarts it as a background process
  881. (use when lagged/malfunctioning). <code>rehash</code> reloads all files after user/channel record
  882. changes. <code>save</code> writes the user/channel files to disk.</p>
  883. <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>
  884. </div>
  885. <div class="cmd" data-k="jump server change connect">
  886. <div class="cmd-head"><h4><span class="amp">!</span>jump</h4><span class="lvl boss">Boss owner</span></div>
  887. <p>Makes the bot connect to a different IRC server.</p>
  888. <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>
  889. <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>
  890. </div>
  891. <div class="cmd" data-k="nick change botnick">
  892. <div class="cmd-head"><h4><span class="amp">!</span>nick</h4><span class="lvl boss">Boss owner</span></div>
  893. <p>Changes the bot's nickname. <code>!set nick &lt;newnick&gt;</code> makes it permanent (written to
  894. the config).</p>
  895. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!nick</span> <span class="a">&lt;newnick&gt;</span></pre></div>
  896. </div>
  897. <div class="cmd" data-k="login chanserv x authentication">
  898. <div class="cmd-head"><h4><span class="amp">!</span>login</h4><span class="lvl boss">Boss owner</span></div>
  899. <p>Manually logs the bot in to ChanServ (<code>X</code> on Undernet) using the configured
  900. username/password. Auto-login is controlled by <code>black(autologin)</code> in
  901. <code>BlackTools.tcl</code>.</p>
  902. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!login</span></pre></div>
  903. </div>
  904. <div class="cmd" data-k="chat botnet dcc partyline">
  905. <div class="cmd-head"><h4><span class="amp">!</span>chat</h4><span class="lvl boss">Boss owner</span></div>
  906. <p>Connects you to the bot's botnet/partyline — same as <code>/CTCP BotNick CHAT</code>.</p>
  907. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!chat</span></pre></div>
  908. </div>
  909. <div class="cmd" data-k="tcl load unload wget script upload">
  910. <div class="cmd-head"><h4><span class="amp">!</span>tcl</h4><span class="lvl boss">Boss owner</span></div>
  911. <p>Manages Tcl scripts live: list, download from a URL (restricted to <code>*.tcl</code>), load,
  912. unload, or inspect.</p>
  913. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!tcl</span> list
  914. <span class="t">!tcl</span> wget <span class="a">&lt;link/name.tcl&gt;</span>
  915. <span class="t">!tcl</span> load <span class="a">&lt;name.tcl&gt;</span>
  916. <span class="t">!tcl</span> unload <span class="a">&lt;name.tcl&gt;</span>
  917. <span class="t">!tcl</span> info <span class="a">&lt;name.tcl&gt;</span></pre></div>
  918. </div>
  919. <div class="cmd" data-k="timer start kill list processes pro">
  920. <div class="cmd-head"><h4><span class="amp">!</span>timer</h4><span class="lvl boss">Boss owner</span></div>
  921. <p>PRO module — start/stop internal process timers or list active ones.
  922. <strong>Do not touch unless you know exactly what you're doing.</strong></p>
  923. <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">&lt;timer:setting&gt;</span>
  924. <span class="t">!timer</span> kill <span class="a">&lt;pid&gt;</span>
  925. <span class="t">!timer</span> list</pre></div>
  926. </div>
  927. </section>
  928. <!-- ================= PROTECTIONS ================= -->
  929. <section id="protections">
  930. <h2><span class="hash">#</span>Protections</h2>
  931. <p class="sec-intro">Each protection is toggled per channel with <code>!set +name</code> /
  932. <code>!set -name</code> and tuned via optional settings (<code>name-reason</code>,
  933. <code>name-bantime</code>, <code>name-banmethod</code>, <code>name-banmask</code>…). Punishments follow
  934. the <a href="#reference">ban-method scale</a> (warn → kick → ban). The "defaults" line on each card shows
  935. the stock values shipped in <code>BlackTools.tcl</code>. Users with
  936. <code>PROTECT</code> level — and ops/voices when <code>+oprotect</code>/<code>+vprotect</code> is on —
  937. are exempt.</p>
  938. <div class="cmd" data-k="antipub advertising links spam channel protection">
  939. <div class="cmd-head"><h4>AntiPub</h4><span class="lvl manager">Manager+ to configure</span></div>
  940. <p>Bans users advertising channels/links (<code>*#*</code>, <code>*www.*</code>,
  941. <code>*http://*</code>…). Wildcard word list with exceptions — YouTube links are excepted by
  942. default.</p>
  943. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antipub
  944. <span class="t">!antipub</span> add <span class="a">&lt;link|#chan&gt;</span> <span class="c"># add pattern</span>
  945. <span class="t">!antipub</span> add <span class="a">+word</span> <span class="c"># add exception</span>
  946. <span class="t">!antipub</span> list · <span class="t">!antipub</span> del <span class="a">&lt;no.&gt;</span></pre></div>
  947. <p class="opt">Stock defaults: ban 2d · method 6 (kick→ban) · mask <code>*!*@host</code> ·
  948. settings: <code>antipub-reason/-bantime/-warn/-banmethod/-banmask</code></p>
  949. </div>
  950. <div class="cmd" data-k="antinotice notice protection">
  951. <div class="cmd-head"><h4>AntiNotice</h4><span class="lvl manager">Manager+ to configure</span></div>
  952. <p>Punishes users who send NOTICEs to the channel.</p>
  953. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antinotice</pre></div>
  954. <p class="opt">Stock defaults: ban 2d · method 3 (ban) · mask <code>*!*@host</code> · sets channel mode
  955. <code>+mr</code> for 45s during an attack</p>
  956. </div>
  957. <div class="cmd" data-k="antictcp ctcp protection">
  958. <div class="cmd-head"><h4>AntiCTCP</h4><span class="lvl manager">Manager+ to configure</span></div>
  959. <p>Punishes users who send CTCPs to the channel.</p>
  960. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antictcp</pre></div>
  961. <p class="opt">Stock defaults: ban 3d · method 3 (ban) · mask <code>*!*@host</code> · mode
  962. <code>+mC</code> for 45s</p>
  963. </div>
  964. <div class="cmd" data-k="antibadword badword swear words protection">
  965. <div class="cmd-head"><h4>AntiBadWord</h4><span class="lvl manager">Manager+ to configure</span></div>
  966. <p>Punishes use of forbidden words/phrases (wildcards). Words can carry their own punishment method:
  967. <code>word:6</code>.</p>
  968. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antibadword
  969. <span class="t">!badword</span> add <span class="a">&lt;word|phrase&gt;</span> · <span class="t">!badword</span> add <span class="a">&lt;word:method&gt;</span>
  970. <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">&lt;no.&gt;</span></pre></div>
  971. <p class="opt">Stock defaults: ban 6h · method 6 (kick→ban) · mask <code>*!*@host</code></p>
  972. </div>
  973. <div class="cmd" data-k="antilongtext long text lines protection">
  974. <div class="cmd-head"><h4>AntiLongText</h4><span class="lvl manager">Manager+ to configure</span></div>
  975. <p>Punishes messages that are too long (stock limit: 215 characters).</p>
  976. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antilongtext</pre></div>
  977. <p class="opt">Stock defaults: ban 30m · method 6 · mask <code>*!*@host</code> · setting
  978. <code>antilongtextmax</code></p>
  979. </div>
  980. <div class="cmd" data-k="badquitpart quit part message protection quitpartcolor quitpartmsgflood">
  981. <div class="cmd-head"><h4>AntiBadQuitPart</h4><span class="lvl manager">Manager+ to configure</span></div>
  982. <p>Punishes forbidden words in part/quit messages. Extras: <code>+quitpartcolor</code> (colours in
  983. quit/part) and <code>+quitpartmsgflood</code> (overlong quit/part messages, default 120 chars).</p>
  984. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badquitpart
  985. <span class="t">!badquitpart</span> add <span class="a">&lt;word&gt;</span> · add <span class="a">+word</span> · list · del <span class="a">&lt;no.&gt;</span></pre></div>
  986. <p class="opt">Stock defaults: ban 1h · mask <code>*!user@host</code></p>
  987. </div>
  988. <div class="cmd" data-k="antispam spam private message join protection spamjoinmessage">
  989. <div class="cmd-head"><h4>AntiSpam</h4><span class="lvl manager">Manager+ to configure</span></div>
  990. <p>Bans users who private-spam channel members (patterns with <code>#</code> or <code>*www.*</code>).
  991. The optional <code>+spamjoinmessage</code> extra sends a bait verification PM to every joiner —
  992. spambots that reply get caught. Scan cycle: 60m.</p>
  993. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antispam
  994. <span class="t">!antispam</span> add <span class="a">&lt;*text*&gt;</span> · add <span class="a">+word</span> · list · del <span class="a">&lt;no.&gt;</span>
  995. <span class="t">!set</span> +spamjoinmessage · <span class="t">!set</span> antispam-message <span class="a">&lt;text&gt;</span></pre></div>
  996. <p class="opt">Stock defaults: ban 6d · mask <code>*!*@host</code> · settings:
  997. <code>antispam-scantime</code></p>
  998. </div>
  999. <div class="cmd" data-k="antirepeat repeat flood text protection">
  1000. <div class="cmd-head"><h4>AntiRepeat</h4><span class="lvl manager">Manager+ to configure</span></div>
  1001. <p>Punishes repeating the same text (stock default: 3 repeats within 5s).</p>
  1002. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antirepeat</pre></div>
  1003. <p class="opt">Stock defaults: ban 10m · method 7 (warn→ban) · mask <code>*!*@host</code> · setting
  1004. <code>antirepeat-setting</code> (repeats:seconds)</p>
  1005. </div>
  1006. <div class="cmd" data-k="anticolor antibold antiunderline anticaps formatting colours caps protection">
  1007. <div class="cmd-head"><h4>AntiColor · AntiBold · AntiUnderline · AntiCaps</h4><span class="lvl manager">Manager+ to configure</span></div>
  1008. <p>The formatting police: punishes colours, bold, underline, or CAPS abuse (stock caps limit:
  1009. 50 chars). Since 2.5.5, AntiColor can be limited to specific colour codes via
  1010. <code>black(anticolor:specific_colors)</code> in the config.</p>
  1011. <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>
  1012. <p class="opt">Stock defaults: ban 10m · method 7 (warn→ban) · mask <code>*!*@host</code> each</p>
  1013. </div>
  1014. <div class="cmd" data-k="repetitivechars repeated characters protection">
  1015. <div class="cmd-head"><h4>RepetitiveChars</h4><span class="lvl manager">Manager+ to configure</span></div>
  1016. <p>Punishes consecutive repeated characters (stock default: 10 in a line — "aaaaaaaaaa").</p>
  1017. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +repetitivechars</pre></div>
  1018. <p class="opt">Stock defaults: ban 10m · method 7 · mask <code>*!user@host</code> · setting
  1019. <code>repetitivechars-char</code></p>
  1020. </div>
  1021. <div class="cmd" data-k="badnick nickname forbidden protection">
  1022. <div class="cmd-head"><h4>BadNick</h4><span class="lvl manager">Manager+ to configure</span></div>
  1023. <p>Bans nicknames containing forbidden words (checked on join and nick change). Method 1 warns first
  1024. and gives 30s to change nick before banning.</p>
  1025. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badnick
  1026. <span class="t">!badnick</span> add <span class="a">&lt;word&gt;</span> · add <span class="a">+word</span> · list · del <span class="a">&lt;no.&gt;</span></pre></div>
  1027. <p class="opt">Stock defaults: ban 1h · mask <code>nick!*@*</code> · settings:
  1028. <code>badnick-bmethod</code> (1 = warn→ban, 2 = ban) · <code>badnick-banwait</code> (30s)</p>
  1029. </div>
  1030. <div class="cmd" data-k="badident ident forbidden protection">
  1031. <div class="cmd-head"><h4>BadIdent</h4><span class="lvl manager">Manager+ to configure</span></div>
  1032. <p>Bans idents containing forbidden words (checked on join).</p>
  1033. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badident
  1034. <span class="t">!badident</span> add <span class="a">&lt;word&gt;</span> · add <span class="a">+word</span> · list · del <span class="a">&lt;no.&gt;</span></pre></div>
  1035. <p class="opt">Stock defaults: ban 1h · mask <code>*!user@*</code></p>
  1036. </div>
  1037. <div class="cmd" data-k="badrealname realname forbidden protection">
  1038. <div class="cmd-head"><h4>BadRealname</h4><span class="lvl manager">Manager+ to configure</span></div>
  1039. <p>Bans realnames containing forbidden words/links (checked on join).</p>
  1040. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badrealname
  1041. <span class="t">!badrealname</span> add <span class="a">&lt;word&gt;</span> · add <span class="a">+word</span> · list · del <span class="a">&lt;no.&gt;</span></pre></div>
  1042. <p class="opt">Stock defaults: ban 2h · mask <code>*!*@host</code> · default patterns include
  1043. <code>*www.*</code>, <code>*#*</code>, <code>*http://*</code></p>
  1044. </div>
  1045. <div class="cmd" data-k="badhost host vhost ip forbidden protection">
  1046. <div class="cmd-head"><h4>BadHost</h4><span class="lvl manager">Manager+ to configure</span></div>
  1047. <p>Bans users whose IP/vhost contains forbidden words.</p>
  1048. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +badhost
  1049. <span class="t">!badhost</span> add <span class="a">&lt;ip|mask&gt;</span> · add <span class="a">+word</span> · list · del <span class="a">&lt;no.&gt;</span></pre></div>
  1050. <p class="opt">Stock defaults: ban 3h · mask <code>*!*@host</code></p>
  1051. </div>
  1052. <div class="cmd" data-k="antijoinflood massjoin join flood protection">
  1053. <div class="cmd-head"><h4>AntiJoinFlood</h4><span class="lvl manager">Manager+ to configure</span></div>
  1054. <p>Counters mass-join floods: locks the channel (<code>+mr</code> here, 45s) and bans flooders. Also
  1055. catches join/part-quit cycling. Per-user limit here: 3 joins / 15s.</p>
  1056. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antijoinflood
  1057. <span class="t">!set</span> joinflood <span class="a">&lt;joins:seconds&gt;</span></pre></div>
  1058. <p class="opt">Stock defaults: ban 1h · mask <code>*!*@host</code> · see also
  1059. <code>+antijoinpart</code></p>
  1060. </div>
  1061. <div class="cmd" data-k="antichanflood channel text flood protection">
  1062. <div class="cmd-head"><h4>AntiChanFlood</h4><span class="lvl manager">Manager+ to configure</span></div>
  1063. <p>Punishes text flooding (stock default: 4 lines / 5s). Locks the channel <code>+mr</code> for 45s
  1064. while it cleans up.</p>
  1065. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antichanflood
  1066. <span class="t">!set</span> chanflood <span class="a">&lt;lines:seconds&gt;</span></pre></div>
  1067. <p class="opt">Stock defaults: ban 10m · method 6 (kick→ban) · mask <code>*!*@host</code></p>
  1068. </div>
  1069. <div class="cmd" data-k="nickflood nick change flood protection">
  1070. <div class="cmd-head"><h4>NickFlood</h4><span class="lvl manager">Manager+ to configure</span></div>
  1071. <p>Punishes rapid nick-changing (stock default: 3 changes / 120s).</p>
  1072. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +nickflood</pre></div>
  1073. <p class="opt">Stock defaults: ban 10m · method 7 (warn→ban) · mask <code>nick!user@host</code> ·
  1074. setting <code>nickflood-repeat</code></p>
  1075. </div>
  1076. <div class="cmd" data-k="noproxy proxy ip ban isp protection new">
  1077. <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>
  1078. <p>Bans users joining from IPs identified as <strong>proxies</strong>. The ban reason supports the
  1079. <code>%isp%</code> placeholder, replaced with the IP's ISP name. An except-hosts list lives in the
  1080. config (<code>black(noproxy:excepts)</code>).</p>
  1081. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +noproxy</pre></div>
  1082. <p class="opt">Stock defaults: ban 1h · settings: <code>noproxy-reason</code> ·
  1083. <code>noproxy-bantime</code></p>
  1084. </div>
  1085. <div class="cmd" data-k="inviteban invite bot unauthorized protection">
  1086. <div class="cmd-head"><h4>InviteBan</h4><span class="lvl manager">Manager+ to configure</span></div>
  1087. <p>Bans users who try to invite the bot into unauthorised channels.</p>
  1088. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +inviteban</pre></div>
  1089. <p class="opt">Stock defaults: ban 3h · mask <code>*!*@host</code></p>
  1090. </div>
  1091. <div class="cmd" data-k="antitake dontop dontdeop op protection takeover">
  1092. <div class="cmd-head"><h4>AntiTake (dontop / dontdeop)</h4><span class="lvl manager">Manager+ to configure</span></div>
  1093. <p>Anti-takeover. <code>+dontdeop</code>: unauthorised users who deop others get deopped, victims get
  1094. re-opped. <code>+dontop</code>: unauthorised users who op someone get both parties deopped.</p>
  1095. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +dontdeop
  1096. <span class="t">!set</span> +dontop</pre></div>
  1097. </div>
  1098. <div class="cmd" data-k="securemode botnet join flood undernet +Dm strictsecured code">
  1099. <div class="cmd-head"><h4>SecureMode</h4><span class="lvl manager">Manager+ to configure</span></div>
  1100. <p>Undernet-specific botnet shield. Works with channel modes <code>+Dm</code>: each first-time joiner
  1101. receives a unique code to confirm before being let in. <code>+strictsecured</code> requires the code on
  1102. <em>every</em> join. Known-good hosts can be whitelisted.</p>
  1103. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +securemode
  1104. <span class="t">!securemode</span> add <span class="a">&lt;ip|mask&gt;</span> · del <span class="a">&lt;no.&gt;</span> · list
  1105. <span class="t">!set</span> +strictsecured</pre></div>
  1106. </div>
  1107. <div class="cmd" data-k="clonescan clones scan ban protection">
  1108. <div class="cmd-head"><h4>CloneScan</h4><span class="lvl manager">Manager+ to configure</span></div>
  1109. <p>Periodically scans for clones (multiple connections from one host) and bans them. Stock defaults:
  1110. max 3 clones, scan every 45m, ban 180m.</p>
  1111. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +clonescan
  1112. <span class="t">!clonescan</span> add <span class="a">&lt;ip|mask&gt;</span> <span class="c"># whitelist</span> · del <span class="a">&lt;no.&gt;</span> · list</pre></div>
  1113. <p class="opt">Settings: <code>clonescan-maxclone</code> · <code>clonescan-bantime</code> ·
  1114. <code>clonescan-reason</code> · <code>clonescan-scantime</code></p>
  1115. </div>
  1116. <div class="cmd" data-k="badchan bad channels forbidden co-channel scan">
  1117. <div class="cmd-head"><h4>BadChan</h4><span class="lvl manager">Manager+ to configure</span></div>
  1118. <p>Bans users who sit in forbidden channels (wardriving hack/warez/adult channels — a default list
  1119. ships in the config). Scans every 10m; method 1 warns and gives 30s to leave the bad channel first.
  1120. <code>+showbadchan</code> tells the ops which bad channel triggered it. Rewritten in 2.5.5 — faster
  1121. and safer — and now accepts <strong>regex badchans</strong>.</p>
  1122. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!badchan</span> <span class="a">&lt;ON|OFF&gt;</span>
  1123. <span class="t">!badchan</span> add <span class="a">&lt;#badchan&gt;</span> <span class="o">[global] [reason]</span>
  1124. <span class="t">!badchan</span> regex <span class="a">&lt;#regex&gt;</span> <span class="o">[reason]</span> <span class="c"># e.g. #[a-z]+[0-9][0-9]</span>
  1125. <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">&lt;no.&gt;</span></pre></div>
  1126. <p class="opt">Stock defaults: ban 6h · mask <code>*!*@host</code> · settings:
  1127. <code>badchan-scantime</code> · <code>badchan-bmethod</code> · <code>badchan-banwait</code> ·
  1128. <code>badchan-floodcontrol</code> (join-flood pause, 5:5)</p>
  1129. </div>
  1130. </section>
  1131. <!-- ================= MODULES ================= -->
  1132. <section id="modules">
  1133. <h2><span class="hash">#</span>Modules</h2>
  1134. <p class="sec-intro">Feature modules, toggled per channel. Check what's enabled with
  1135. <code>!h module</code> — green [+] is on, red [−] is off.</p>
  1136. <div class="cmd" data-k="xtools x op voice invite unban undernet module">
  1137. <div class="cmd-head"><h4>XTools</h4><span class="lvl manager">Manager+</span></div>
  1138. <p>Lets the bot ask Undernet's <code>X</code> for op, voice, invite, or to unban itself when it needs
  1139. help.</p>
  1140. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +xtools</pre></div>
  1141. </div>
  1142. <div class="cmd" data-k="xonly x administration undernet module ban through x">
  1143. <div class="cmd-head"><h4>XOnly</h4><span class="lvl manager">Manager+</span></div>
  1144. <p>Full channel administration <em>through X</em>: the bot performs all BlackTools commands via
  1145. <code>X</code> even when it isn't opped. X bans use their own level and duration.</p>
  1146. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +xonly
  1147. <span class="t">!set</span> xbantime <span class="a">&lt;time&gt;</span> · <span class="t">!set</span> xbanlevel <span class="a">&lt;level&gt;</span></pre></div>
  1148. <p class="opt">Stock defaults: X ban time 1 · X ban level 100</p>
  1149. </div>
  1150. <div class="cmd" data-k="seen module database channel">
  1151. <div class="cmd-head"><h4>Seen</h4><span class="lvl manager">Manager+</span></div>
  1152. <p>Per-channel seen database powering the <code>!seen</code> command. Extras:
  1153. <code>+seenlastmsg</code> (include the person's last message) and <code>+seenreply</code> (tell users
  1154. who searched for them). Entries expire after 730 days.</p>
  1155. <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>
  1156. </div>
  1157. <div class="cmd" data-k="greet leave welcome part message count module">
  1158. <div class="cmd-head"><h4>Greet &amp; Leave</h4><span class="lvl manager">Manager+</span></div>
  1159. <p>Channel welcome and goodbye messages. Greet supports the <strong>Count</strong> variables:
  1160. <code>%nick%</code>, <code>%countchan%</code>, <code>%count%</code> (join number),
  1161. <code>%time%</code>. Use <code>~</code> to split into multiple sentences.</p>
  1162. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!greet</span> <span class="a">&lt;ON|OFF&gt;</span> · <span class="t">!greet</span> set <span class="a">&lt;message&gt;</span>
  1163. <span class="t">!leave</span> <span class="a">&lt;ON|OFF&gt;</span> · <span class="t">!leave</span> set <span class="a">&lt;message&gt;</span>
  1164. <span class="t">!set</span> greet-method <span class="a">&lt;NOTICE|PRIVMSG&gt;</span> · <span class="t">!set</span> leave-method <span class="a">&lt;NOTICE|PRIVMSG&gt;</span></pre></div>
  1165. <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>
  1166. </div>
  1167. <div class="cmd" data-k="anunt advert announcement ads module">
  1168. <div class="cmd-head"><h4>Anunt (Advert)</h4><span class="lvl manager">Manager+</span></div>
  1169. <p>Rotates announcements/ads on the channel — but only while the channel is active (no activity =
  1170. no ads). Supports <code>%chan%</code> and <code>%botnick%</code>, multi-sentence with
  1171. <code>~</code>.</p>
  1172. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!anunt</span> <span class="a">&lt;ON|OFF&gt;</span>
  1173. <span class="t">!anunt</span> add <span class="a">&lt;text&gt;</span> · list · del <span class="a">&lt;no.&gt;</span>
  1174. <span class="t">!set</span> anunt-showtime <span class="a">&lt;period&gt;</span></pre></div>
  1175. <p class="opt">Stock interval: 52m</p>
  1176. </div>
  1177. <div class="cmd" data-k="autobroadcast bt broadcast all channels module silent">
  1178. <div class="cmd-head"><h4>AutoBroadcast (bt)</h4><span class="lvl owner">Owner+</span></div>
  1179. <p>Broadcasts stored messages, one at a time, across <em>all</em> channels. Channels flagged
  1180. <code>+silent</code> are skipped.</p>
  1181. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bt</span> <span class="a">&lt;ON|OFF&gt;</span>
  1182. <span class="t">!bt</span> add <span class="a">&lt;message&gt;</span> · list · del <span class="a">&lt;no.&gt;</span>
  1183. <span class="t">!set</span> +silent <span class="c"># opt this channel out</span></pre></div>
  1184. <p class="opt">Stock interval: 55m, sent as ACTION</p>
  1185. </div>
  1186. <div class="cmd" data-k="limit channel limit handling module">
  1187. <div class="cmd-head"><h4>Limit</h4><span class="lvl manager">Manager+</span></div>
  1188. <p>Keeps the channel limit (+l) floating a few places above the current user count — an old-school
  1189. anti-massjoin trick. Stock margin: 6.</p>
  1190. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!limit</span> <span class="a">&lt;ON|OFF&gt;</span>
  1191. <span class="t">!limit</span> set <span class="a">&lt;number&gt;</span></pre></div>
  1192. </div>
  1193. <div class="cmd" data-k="topic autotopic refresh url module">
  1194. <div class="cmd-head"><h4>Topic · AutoTopic · Url</h4><span class="lvl manager">Manager+</span></div>
  1195. <p>Stores the official channel topic and URL. <code>+autotopic</code> re-applies them whenever someone
  1196. changes the topic; <code>+refresh</code> re-applies on an interval; <code>!r</code> does it manually.
  1197. <code>+showurl</code> appends the URL to ban reasons.</p>
  1198. <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">&lt;text&gt;</span> · <span class="t">!topic</span> unset
  1199. <span class="t">!set</span> url <span class="a">&lt;url&gt;</span>
  1200. <span class="t">!set</span> +autotopic · <span class="t">!set</span> +refresh · <span class="t">!set</span> +showurl</pre></div>
  1201. </div>
  1202. <div class="cmd" data-k="idle antiidle op voice halfop deop module">
  1203. <div class="cmd-head"><h4>Idle (Anti-Idle)</h4><span class="lvl manager">Manager+</span></div>
  1204. <p>De-ops/-voices/-halfops users who idle too long. Stock defaults: ops 10m, voices 30m, halfops 30m,
  1205. scanned every 5m. An exception list is available. Since 2.5.5 the module waits while the channel is
  1206. <code>+mD</code> under SecureMode.</p>
  1207. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!idle</span> <span class="a">&lt;+/-o | +/-v | +/-ho&gt;</span>
  1208. <span class="t">!idle</span> add <span class="a">&lt;nick&gt;</span> · list · del <span class="a">&lt;nick&gt;</span>
  1209. <span class="t">!set</span> idleopmax <span class="a">&lt;period&gt;</span> · idlevoicemax · idlehalfopmax · idle-scantime</pre></div>
  1210. </div>
  1211. <div class="cmd" data-k="voiceme voice x logged module nologged onlyonmode">
  1212. <div class="cmd-head"><h4>VoiceMe</h4><span class="lvl manager">Manager+</span></div>
  1213. <p>Lets X-logged users voice themselves with <code>/msg BotNick voiceme #channel</code>. Extras:
  1214. <code>+onlyonmode</code> restricts it to when the channel is <code>+m</code> (with a periodic channel
  1215. hint, default 25m); <code>+nologged</code> allows users without an X username too.</p>
  1216. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +voiceme
  1217. <span class="t">!set</span> +onlyonmode · <span class="t">!set</span> +nologged · <span class="t">!set</span> voiceme-showtime <span class="a">&lt;period&gt;</span>
  1218. <span class="c"># users then do:</span>
  1219. /msg BotNick voiceme #channel</pre></div>
  1220. </div>
  1221. <div class="cmd" data-k="voiceonmsg voice active chatters lines idle module">
  1222. <div class="cmd-head"><h4>VoiceOnMsg</h4><span class="lvl manager">Manager+</span></div>
  1223. <p>Auto-voices active chatters (stock default: after 3 lines) and devoices them after idling too long
  1224. (default: 2h). Users with access are ignored.</p>
  1225. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +voiceonmsg
  1226. <span class="t">!set</span> voiceonmsg-linenum <span class="a">&lt;lines&gt;</span> · <span class="t">!set</span> voiceonmsg-idletime <span class="a">&lt;duration&gt;</span></pre></div>
  1227. </div>
  1228. <div class="cmd" data-k="private access only channel ban module">
  1229. <div class="cmd-head"><h4>Private</h4><span class="lvl manager">Manager+</span></div>
  1230. <p>Makes the channel access-only: anyone without bot access (or an exception) is banned on join.</p>
  1231. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +private
  1232. <span class="t">!private</span> add <span class="a">&lt;nick&gt; &lt;ip|mask&gt;</span> · list · del <span class="a">&lt;nick&gt;</span></pre></div>
  1233. <p class="opt">Stock defaults: ban 60m · mask <code>*!*@host</code></p>
  1234. </div>
  1235. <div class="cmd" data-k="autoupdate update github self-update module new">
  1236. <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>
  1237. <p>Lets the script <strong>update itself from GitHub</strong> when a new version or bugfix is
  1238. released — automatically on a timer, or by command. All BT files and the settings from
  1239. <code>BlackTools.tcl</code> are backed up and restored; the bot can auto-restart when an update
  1240. requires it. Config: <code>update_on</code> (kill switch), <code>update_type</code>
  1241. (0 = timer + command, 1 = command only), <code>update_time_check</code> (stock: 60m).</p>
  1242. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!update</span> <span class="a">&lt;on|off&gt;</span> <span class="c"># enable/disable autoupdate</span>
  1243. <span class="t">!update</span> check <span class="c"># check for new versions</span>
  1244. <span class="t">!update</span> start <span class="c"># run the update now</span>
  1245. <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>
  1246. </div>
  1247. <div class="cmd" data-k="alias custom command personalized module new">
  1248. <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>
  1249. <p>Lets users create their <strong>own personalized commands</strong> on top of any BT command, with
  1250. <code>%1%</code>, <code>%2%</code>… as argument placeholders. Aliases follow the user (renamed with
  1251. <code>chuser</code>, removed when the user is deleted or expires).</p>
  1252. <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">&lt;command&gt;</span> <span class="a">&lt;BT command&gt;</span> <span class="o">[arguments]</span>
  1253. <span class="t">!alias</span> del <span class="a">&lt;command&gt;</span></pre></div>
  1254. <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>
  1255. <span class="t">!alias</span> add beer cycle %1% %2% Gone for a beer, back soon</pre></div>
  1256. </div>
  1257. <div class="cmd" data-k="vote voting poll options module new votegreet">
  1258. <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>
  1259. <p>Channel <strong>voting system</strong>: open a voting with multiple options, an optional expiry
  1260. time, and choose whether only users with access or everyone may vote. Users answer with the option
  1261. letter. <code>+votegreet</code> tells joiners when votings are open.</p>
  1262. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +vote
  1263. <span class="t">!vote</span> add <span class="a">&lt;vote_name&gt;</span> -option <span class="a">&lt;opt1&gt;</span> -option <span class="a">&lt;opt2&gt;</span>.. <span class="o">[-time DD/MM/YY HH:MM] [-type 1|0]</span>
  1264. <span class="t">!vote</span> <span class="a">&lt;ID&gt;</span> <span class="a">&lt;letter&gt;</span> <span class="c"># cast your vote</span>
  1265. <span class="t">!vote</span> list <span class="o">[ID]</span> · <span class="t">!vote</span> time <span class="a">&lt;ID&gt;</span> <span class="a">&lt;DD/MM/YY HH:MM&gt;</span> · <span class="t">!vote</span> end <span class="a">&lt;ID&gt;</span> · <span class="t">!vote</span> del <span class="a">&lt;ID&gt;</span></pre></div>
  1266. <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>
  1267. <p class="opt">Optional settings: <code>vote-mask</code> (voter identity mask, stock
  1268. <code>*!*@host</code>) · <code>-type</code> default: all users</p>
  1269. </div>
  1270. <div class="cmd" data-k="next helped noidle skip queue help channel module nextshortcmd">
  1271. <div class="cmd-head"><h4>Next</h4><span class="lvl manager">Manager+</span></div>
  1272. <p>Help-queue system (built for support channels like #TCL-HELP): users wait in line, helpers voice
  1273. the next one in order. <code>+nextshortcmd</code> enables the short aliases.</p>
  1274. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +next
  1275. <span class="t">!next</span> <span class="c"># voice the next user in the queue</span>
  1276. <span class="t">!next</span> list · <span class="t">!helped</span> <span class="a">&lt;nick&gt;</span> · <span class="t">!noidle</span> <span class="a">&lt;nick&gt;</span> · <span class="t">!skip</span> <span class="a">&lt;nick&gt;</span></pre></div>
  1277. <p class="opt">Settings: <code>next-reason</code> · <code>next-bantime</code> (noidle ban, default 1m)</p>
  1278. </div>
  1279. <div class="cmd" data-k="topwords statistics words lines activity module accessonly">
  1280. <div class="cmd-head"><h4>TopWords</h4><span class="lvl manager">Manager+</span></div>
  1281. <p>Records chat statistics per user (words, lines, letters — daily and total).
  1282. <code>+accessonly</code> restricts counting to users with bot access.</p>
  1283. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +topwords
  1284. <span class="t">!topwords</span> <span class="a">&lt;nick&gt;</span> <span class="o">[total|reset]</span>
  1285. <span class="t">!set</span> +accessonly</pre></div>
  1286. </div>
  1287. <div class="cmd" data-k="quote quoteofday quotes module q">
  1288. <div class="cmd-head"><h4>Quote · QuoteOfDay</h4><span class="lvl manager">Manager+</span></div>
  1289. <p>Channel quote database with add/search/list/delete — plus an optional "Quote of the Day" that posts
  1290. a random stored quote on an interval (stock default: every 3h). Since 2.5.5 the
  1291. <code>quote:usage</code> config setting chooses who may add/list/remove quotes: users with access
  1292. only (stock) or everyone.</p>
  1293. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +quote
  1294. <span class="t">!q</span> <span class="a">&lt;text&gt;</span> <span class="c"># add (use ~ for multi-sentence)</span>
  1295. <span class="t">!q</span> <span class="a">&lt;word&gt;</span> <span class="c"># search</span>
  1296. <span class="t">!q</span> list · <span class="t">!q</span> del <span class="a">&lt;no.&gt;</span>
  1297. <span class="t">!set</span> +quoteofday · <span class="t">!set</span> quoteofday-showtime <span class="a">&lt;period&gt;</span></pre></div>
  1298. </div>
  1299. <div class="cmd" data-k="note notes send read inbox message module noteexpire">
  1300. <div class="cmd-head"><h4>Note</h4><span class="lvl manager">Manager+ to toggle</span></div>
  1301. <p>Private note system: store personal notes or send them to other handles — delivered when they next
  1302. appear. The bot also notes global owners whenever it gets banned or locked out of a channel. Inbox
  1303. expires after 365 days (per-user override: <code>!myset noteexpire</code>).</p>
  1304. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +note
  1305. <span class="t">!note</span> send <span class="a">&lt;handle&gt;</span> <span class="a">&lt;message&gt;</span>
  1306. <span class="t">!note</span> <span class="a">&lt;read|list|inbox&gt;</span> · <span class="t">!note</span> del <span class="a">&lt;no.|all&gt;</span></pre></div>
  1307. </div>
  1308. <div class="cmd" data-k="backchan chanreport back channel report bans module">
  1309. <div class="cmd-head"><h4>BackChan (ChanReport)</h4><span class="lvl manager">Manager+</span></div>
  1310. <p>Gives the channel a private "back-channel" where the bot reports every ban it sets on the main
  1311. channel — and where you can issue ban commands that apply to the main channel. One backchan per
  1312. channel.</p>
  1313. <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">&lt;#backchan&gt;</span></pre></div>
  1314. <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>
  1315. </div>
  1316. <div class="cmd" data-k="banstats statistics kicks bans module">
  1317. <div class="cmd-head"><h4>BanStats</h4><span class="lvl manager">Manager+</span></div>
  1318. <p>Keeps statistics of every kick and ban on the channel (feeds the <code>!stats</code> command).
  1319. Daily counters reset at midnight.</p>
  1320. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +banstats
  1321. <span class="t">!banstats</span> <span class="a">&lt;total|reset&gt;</span></pre></div>
  1322. </div>
  1323. <div class="cmd" data-k="language lang romanian english module">
  1324. <div class="cmd-head"><h4>Language</h4><span class="lvl manager">Manager+</span></div>
  1325. <p>Sets the channel's reply language and the language used in kick/ban reasons. Available:
  1326. <code>EN</code> (english) · <code>RO</code> (romanian). Each user can override with
  1327. <code>!myset lang</code>.</p>
  1328. <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">&lt;EN|RO&gt;</span></pre></div>
  1329. </div>
  1330. <div class="cmd" data-k="forward invisible misc flags module">
  1331. <div class="cmd-head"><h4>Misc flags: Forward · Invisible · ExpireBans</h4><span class="lvl boss">Boss owner</span></div>
  1332. <p><code>+forward</code> forwards PMs the bot receives (from strangers) to a channel.
  1333. <code>+invisible</code> hides the channel from the bot's channel list. <code>expirebans</code> sets
  1334. how long channel bans live before auto-removal (stock default: 120m; <code>0</code> = never remove).</p>
  1335. <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">&lt;period&gt;</span></pre></div>
  1336. </div>
  1337. </section>
  1338. <!-- ================= MYSET ================= -->
  1339. <section id="myset">
  1340. <h2><span class="hash">#</span>Personal settings — <code style="font-size:.75em">!myset</code></h2>
  1341. <p class="sec-intro">Every user with access carries their own preferences, applied wherever they use the
  1342. bot. Append <code>show</code> to view a value or <code>reset</code> to clear it.</p>
  1343. <div class="cmd" data-k="myset personal lang output mychar colors noteexpire autoinvite greet mychan handle">
  1344. <div class="cmd-head"><h4><span class="amp">!</span>myset</h4><span class="lvl voice">Voice+</span></div>
  1345. <div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!myset</span> <span class="a">&lt;option&gt;</span> <span class="o">[value] [show|reset]</span></pre></div>
  1346. <div class="table-scroll"><table>
  1347. <tr><th>Option</th><th>What it does</th><th>Example</th></tr>
  1348. <tr><td><code>lang</code></td><td>Your reply language (EN/RO)</td><td><code>!myset lang EN</code></td></tr>
  1349. <tr><td><code>output</code></td><td>How the bot answers you: NOTICE or CHAN</td><td><code>!myset output chan</code></td></tr>
  1350. <tr><td><code>mychar</code></td><td>Your personal trigger character</td><td><code>!myset mychar .</code></td></tr>
  1351. <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>
  1352. <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>
  1353. <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>
  1354. <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>
  1355. <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>
  1356. <tr><td><code>noteexpire</code></td><td>Auto-expiry period for your note inbox</td><td><code>!myset noteexpire 90d</code></td></tr>
  1357. <tr><td><code>addhost / delhost</code></td><td>Manage your own hostmasks</td><td><code>!myset addhost *!*@me.users.undernet.org</code></td></tr>
  1358. <tr><td><code>handle</code></td><td>Change your own handle</td><td><code>!myset handle NewName</code></td></tr>
  1359. <tr><td><code>notes</code></td><td>Accept notes ON/OFF</td><td><code>!myset notes ON</code></td></tr>
  1360. </table></div>
  1361. </div>
  1362. </section>
  1363. <!-- ================= EGG ================= -->
  1364. <section id="egg">
  1365. <h2><span class="hash">#</span>Eggdrop.conf via IRC — the <code style="font-size:.75em">egg</code> settings</h2>
  1366. <p class="sec-intro"><span class="lvl boss">Boss owner</span>&nbsp; Boss owners can edit the bot's config
  1367. files straight from IRC — no shell needed. View current values with <code>!h egg</code>; change them with
  1368. <code>!set &lt;option&gt; &lt;value&gt;</code>.</p>
  1369. <div class="table-scroll"><table>
  1370. <tr><th>Option</th><th>Controls</th><th>Current / default</th></tr>
  1371. <tr><td><code>nick</code></td><td>Bot nickname (permanent)</td><td>—</td></tr>
  1372. <tr><td><code>realname</code></td><td>IRC real-name field (needs restart)</td><td>—</td></tr>
  1373. <tr><td><code>away</code></td><td>Away message on connect (empty = none)</td><td>""</td></tr>
  1374. <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>
  1375. <tr><td><code>chanserv</code> / <code>hostchanserv</code></td><td>Service nick &amp; host</td><td><code>X</code> / <code>x@channels.undernet.org</code></td></tr>
  1376. <tr><td><code>userlogin</code> / <code>userpass</code></td><td>X username &amp; password (password displays masked)</td><td>—</td></tr>
  1377. <tr><td><code>cmdchar</code></td><td>Trigger characters (several allowed)</td><td><code>! . ` ^</code></td></tr>
  1378. <tr><td><code>defaultlang</code></td><td>Script default language</td><td><code>EN</code></td></tr>
  1379. <tr><td><code>defaultoutput</code></td><td>Reply method: 0 NOTICE · 1 CHAN · 2 PRIVMSG</td><td><code>0</code> (NOTICE)</td></tr>
  1380. <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>
  1381. <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>
  1382. <tr><td><code>floodmenuprot</code></td><td>Command flood limit (cmds:sec)</td><td><code>3:5</code></td></tr>
  1383. <tr><td><code>floodmsgprot</code></td><td>PRIVMSG flood limit</td><td><code>10:10</code></td></tr>
  1384. <tr><td><code>floodnotcprot</code></td><td>NOTICE flood limit</td><td><code>2:2</code></td></tr>
  1385. <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>
  1386. <tr><td><code>chanremove-setting</code></td><td>Wipe all channel data on channel removal (1/0)</td><td><code>0</code></td></tr>
  1387. <tr><td><code>user-expire</code></td><td>Remove inactive users after N days</td><td><code>1500</code></td></tr>
  1388. <tr><td><code>banmethod-expire</code></td><td>How long warn/kick escalation counters live</td><td><code>60m</code></td></tr>
  1389. <tr><td><code>broadcast-showtime</code></td><td>AutoBroadcast interval</td><td><code>55m</code></td></tr>
  1390. <tr><td><code>pagelimit</code></td><td>Entries per page in <code>list</code> outputs</td><td><code>7</code></td></tr>
  1391. <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>
  1392. </table></div>
  1393. <div class="note"><b>Also new in the 2.5.5 config file</b> (edited in <code>BlackTools.tcl</code>
  1394. directly): <code>dns_onjoin</code> (DNS lookups on join, off by stock — faster on busy channels),
  1395. the AutoUpdate block (<code>update_on</code>, <code>update_type</code>,
  1396. <code>update_time_check</code>), and the ChanServ mass-ban detector
  1397. (<code>chanserv:percent_ban</code> 50%, <code>chanserv:suspend_level</code> 400,
  1398. <code>chanserv:suspend_time</code> 1d) which suspends anyone who mass-bans through X.</div>
  1399. <div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> cmdchar ! .
  1400. <span class="t">!set</span> homechan #channel
  1401. <span class="t">!set</span> defaultoutput 0</pre></div>
  1402. </section>
  1403. <!-- ================= NATIVE ================= -->
  1404. <section id="native">
  1405. <h2><span class="hash">#</span>Native eggdrop settings</h2>
  1406. <p class="sec-intro">These are standard eggdrop channel flags — not BlackTools features — but
  1407. <code>!set</code> manages them too, so they're documented here. View them with
  1408. <code>!h chaninfo</code>.</p>
  1409. <div class="table-scroll"><table>
  1410. <tr><th>Setting</th><th>What it does</th></tr>
  1411. <tr><td><code>+enforcebans</code></td><td>Kick users matching a freshly-set ban</td></tr>
  1412. <tr><td><code>+dynamicbans</code></td><td>Only place bans on the channel when someone matching joins (keeps +b list short)</td></tr>
  1413. <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>
  1414. <tr><td><code>+dynamicexempts</code> / <code>+dynamicinvites</code></td><td>Only activate +e/+I entries when needed</td></tr>
  1415. <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>
  1416. <tr><td><code>+bitch</code></td><td>Only +o-flagged users may hold @ (insecure, not recommended)</td></tr>
  1417. <tr><td><code>+greet</code></td><td>Say users' greet lines on join (enables the Greet/Count module output)</td></tr>
  1418. <tr><td><code>+protectops</code> / <code>+protectfriends</code> / <code>+protecthalfops</code></td><td>Re-op/halfop protected users if they lose status</td></tr>
  1419. <tr><td><code>+dontkickops</code></td><td>Never kick users with +o flag</td></tr>
  1420. <tr><td><code>+revenge</code> / <code>+revengebot</code></td><td>Punish whoever deops/kicks/bans the bot (or valid ops)</td></tr>
  1421. <tr><td><code>+inactive</code></td><td>Leave the channel without losing its settings</td></tr>
  1422. <tr><td><code>+secret</code></td><td>Hide the channel from the botnet</td></tr>
  1423. <tr><td><code>+shared</code></td><td>Share channel user records across the botnet</td></tr>
  1424. <tr><td><code>+cycle</code></td><td>Cycle the channel when it has no ops</td></tr>
  1425. <tr><td><code>+nodesynch</code></td><td>Tolerate mode changes from non-ops (plays nice with services)</td></tr>
  1426. <tr><td><code>+statuslog</code></td><td>Log the channel status line every 5 minutes</td></tr>
  1427. <tr><td><code>+static</code></td><td>Only permanent owners may remove the channel</td></tr>
  1428. <tr><td><code>chanmode</code></td><td>Enforced channel modes, e.g. <code>!set chanmode +ntk key</code></td></tr>
  1429. <tr><td><code>ban-time</code></td><td>Eggdrop-internal temp-ban lifetime (BlackTools uses its own <code>expirebans</code> instead)</td></tr>
  1430. <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>
  1431. </table></div>
  1432. <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>
  1433. </section>
  1434. <!-- ================= REFERENCE ================= -->
  1435. <section id="reference">
  1436. <h2><span class="hash">#</span>Ban methods, masks &amp; durations</h2>
  1437. <h3 class="sub">The 7 ban methods</h3>
  1438. <p class="sec-intro">Every protection has a <code>-banmethod</code> setting choosing how offenders are
  1439. escalated. Counters expire after <code>banmethod-expire</code> (60m here). Set with
  1440. <code>!set &lt;protection&gt;-banmethod &lt;n&gt;</code>.</p>
  1441. <div class="table-scroll"><table>
  1442. <tr><th>#</th><th>Escalation</th><th></th></tr>
  1443. <tr><td><code>1</code></td><td>warn</td><td>just a warning kick/notice</td></tr>
  1444. <tr><td><code>2</code></td><td>kick</td><td></td></tr>
  1445. <tr><td><code>3</code></td><td>ban</td><td>straight to ban</td></tr>
  1446. <tr><td><code>4</code></td><td>warn → kick</td><td>second offence gets the kick</td></tr>
  1447. <tr><td><code>5</code></td><td>warn → kick → ban</td><td>the full ladder</td></tr>
  1448. <tr><td><code>6</code></td><td>kick → ban</td><td></td></tr>
  1449. <tr><td><code>7</code></td><td>warn → ban</td><td></td></tr>
  1450. </table></div>
  1451. <h3 class="sub">The 5 banmask styles</h3>
  1452. <p class="sec-intro">Every ban command has a <code>-banmask</code> setting choosing the mask shape, built
  1453. from <code>nick!user@host</code>:</p>
  1454. <div class="table-scroll"><table>
  1455. <tr><th>#</th><th>Mask</th><th>Bans on…</th></tr>
  1456. <tr><td><code>1</code></td><td><code>*!*@host</code></td><td>host only (the usual default)</td></tr>
  1457. <tr><td><code>2</code></td><td><code>*!user@host</code></td><td>ident + host</td></tr>
  1458. <tr><td><code>3</code></td><td><code>nick!user@host</code></td><td>the exact triple</td></tr>
  1459. <tr><td><code>4</code></td><td><code>nick!*@*</code></td><td>nickname only</td></tr>
  1460. <tr><td><code>5</code></td><td><code>*!user@*</code></td><td>ident only</td></tr>
  1461. </table></div>
  1462. <div class="note"><b>Webchat users</b> (mibbit, kiwiirc, irccloud…) are automatically banned on
  1463. <em>ident only</em> regardless of the mask setting — their host is shared, their ident carries the
  1464. user's hex IP.</div>
  1465. <h3 class="sub">Durations</h3>
  1466. <div class="pill-row">
  1467. <span class="pill">10m — ten minutes</span>
  1468. <span class="pill">3h — three hours</span>
  1469. <span class="pill">2d — two days</span>
  1470. <span class="pill">0 — permanent</span>
  1471. </div>
  1472. <h3 class="sub">Good to know</h3>
  1473. <div class="tip"><b>CIDR bans work:</b> <code>!b *!*@192.0.2.1/24</code> bans the whole range.</div>
  1474. <div class="tip"><b>Ban comments:</b> nearly every ban command accepts <code>-c &lt;comment&gt;</code> —
  1475. other ops see it when they inspect the ban with <code>!sb</code>.</div>
  1476. <div class="tip"><b>Full banlist handling:</b> when the channel +b list fills up (Undernet numeric 478),
  1477. the bot auto-removes the 10 oldest bans, holding <code>+m</code> for 10 seconds while it cleans.</div>
  1478. <div class="tip"><b>Multi-sentence texts:</b> greets, quotes, ads and notes split on <code>~</code> —
  1479. <code>text1~text2</code> is delivered as two lines.</div>
  1480. </section>
  1481. <footer>
  1482. <p><b>BlackTools v2.5.5</b> — © 2008–2021 Daniel Voipan (BLaCkShaDoW) ·
  1483. <a href="http://www.tclscripts.net">tclscripts.net</a> ·
  1484. <a href="https://github.com/tclscripts/BlackToolS-TCL">GitHub</a> ·
  1485. help: <code>#TCL-HELP</code> @ Undernet</p>
  1486. <p style="margin-top:6px">This documentation page was generated from the script sources
  1487. (<code>BT.man-en.lang.tcl</code>, <code>BT.en.lang.tcl</code>, <code>BlackTools.tcl</code>,
  1488. <code>ChangeLog</code>). Press <kbd>/</kbd> to search.</p>
  1489. </footer>
  1490. </div></div></div>
  1491. <button id="top-btn" title="Back to top">↑</button>
  1492. <script>
  1493. /* copy buttons */
  1494. document.addEventListener('click',function(e){
  1495. if(!e.target.classList.contains('copy'))return;
  1496. var pre=e.target.parentElement.querySelector('pre');
  1497. var txt=pre.innerText.replace(/^\s*#.*$/gm,'').replace(/\s+#.*$/gm,'').replace(/\n{2,}/g,'\n').trim();
  1498. (navigator.clipboard?navigator.clipboard.writeText(txt):Promise.reject()).then(function(){
  1499. e.target.classList.add('ok');e.target.textContent='✓';
  1500. setTimeout(function(){e.target.classList.remove('ok');e.target.textContent='⧉';},1200);
  1501. }).catch(function(){});
  1502. });
  1503. /* search filter */
  1504. var search=document.getElementById('search'),count=document.getElementById('search-count');
  1505. var cards=[];window.addEventListener('DOMContentLoaded',function(){cards=[].slice.call(document.querySelectorAll('.cmd'));});
  1506. search.addEventListener('input',function(){
  1507. var q=search.value.trim().toLowerCase(),n=0;
  1508. cards.forEach(function(c){
  1509. var hit=!q||(c.getAttribute('data-k')||'').toLowerCase().indexOf(q)>-1||c.innerText.toLowerCase().indexOf(q)>-1;
  1510. c.classList.toggle('hidden',!hit);if(hit)n++;
  1511. });
  1512. if(q){count.style.display='inline';count.textContent=n+' match'+(n==1?'':'es');}
  1513. else{count.style.display='none';}
  1514. });
  1515. document.addEventListener('keydown',function(e){
  1516. if(e.key==='/'&&document.activeElement!==search){e.preventDefault();search.focus();}
  1517. if(e.key==='Escape'&&document.activeElement===search){search.value='';search.dispatchEvent(new Event('input'));search.blur();}
  1518. });
  1519. /* scrollspy */
  1520. var navLinks=[].slice.call(document.querySelectorAll('.nav a'));
  1521. var secs=navLinks.map(function(a){return document.getElementById(a.getAttribute('href').slice(1));});
  1522. function spy(){
  1523. var y=window.scrollY+120,cur=null;
  1524. secs.forEach(function(s){if(s&&s.offsetTop<=y)cur=s.id;});
  1525. navLinks.forEach(function(a){a.classList.toggle('active',a.getAttribute('href')==='#'+cur);});
  1526. document.getElementById('top-btn').style.display=window.scrollY>600?'block':'none';
  1527. }
  1528. window.addEventListener('scroll',spy);spy();
  1529. document.getElementById('top-btn').onclick=function(){window.scrollTo({top:0,behavior:'smooth'});};
  1530. </script>
  1531. </body>
  1532. </html>