-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathdocs.html
More file actions
1689 lines (1532 loc) · 127 KB
/
Copy pathdocs.html
File metadata and controls
1689 lines (1532 loc) · 127 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BlackTools v2.5.5 — Documentation</title>
<style>
:root{
--bg:#0b0e13;
--bg2:#10141b;
--panel:#151a23;
--panel2:#1a2029;
--border:#242c38;
--border2:#2e3947;
--text:#d7dee8;
--muted:#8b98a9;
--faint:#5c6a7d;
--accent:#e8433f; /* maple red */
--accent-soft:#ff6b57;
--gold:#e5b567;
--green:#4ec98a;
--blue:#58a6ff;
--purple:#bc8cff;
--orange:#f0883e;
--pink:#ff7eb6;
--cyan:#39c5cf;
--code-bg:#0d1117;
--radius:10px;
--sidebar-w:275px;
--mono:'Cascadia Code','JetBrains Mono',Consolas,'Fira Code',monospace;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:24px}
body{
background:var(--bg);
color:var(--text);
font:15px/1.65 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
}
::selection{background:rgba(232,67,63,.35)}
a{color:var(--blue);text-decoration:none}
a:hover{text-decoration:underline}
code{font-family:var(--mono);font-size:.88em;background:var(--panel2);border:1px solid var(--border);padding:1px 6px;border-radius:5px;color:var(--gold)}
kbd{font-family:var(--mono);font-size:.8em;background:var(--panel2);border:1px solid var(--border2);border-bottom-width:2px;padding:1px 6px;border-radius:5px;color:var(--muted)}
/* ---------- layout ---------- */
.layout{display:flex;min-height:100vh}
.sidebar{
width:var(--sidebar-w);flex-shrink:0;
background:var(--bg2);border-right:1px solid var(--border);
position:sticky;top:0;height:100vh;overflow-y:auto;
padding:22px 16px 40px;
scrollbar-width:thin;scrollbar-color:var(--border2) transparent;
}
.main{flex:1;min-width:0;padding:0 42px 90px}
.wrap{max-width:900px;margin:0 auto}
/* ---------- sidebar ---------- */
.logo{display:flex;align-items:center;gap:10px;padding:2px 8px 14px;border-bottom:1px solid var(--border);margin-bottom:14px}
.logo .leaf{font-size:24px;filter:drop-shadow(0 0 8px rgba(232,67,63,.6))}
.logo b{font-size:17px;letter-spacing:.4px}
.logo b span{color:var(--accent)}
.logo small{display:block;color:var(--faint);font-size:11px;letter-spacing:.5px}
#search{
width:100%;background:var(--panel);border:1px solid var(--border2);border-radius:8px;
color:var(--text);padding:8px 12px;font-size:13px;margin-bottom:6px;outline:none;
}
#search:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(232,67,63,.15)}
.search-hint{font-size:11px;color:var(--faint);padding:0 4px 10px}
#search-count{color:var(--accent-soft);font-weight:600;display:none}
.nav h5{
font-size:10.5px;text-transform:uppercase;letter-spacing:1.4px;color:var(--faint);
margin:16px 8px 6px;
}
.nav a{
display:block;padding:4px 10px;border-radius:6px;color:var(--muted);
font-size:13.5px;border-left:2px solid transparent;
}
.nav a:hover{color:var(--text);background:var(--panel);text-decoration:none}
.nav a.active{color:var(--accent-soft);background:rgba(232,67,63,.08);border-left-color:var(--accent)}
/* ---------- hero ---------- */
.hero{
padding:56px 0 34px;border-bottom:1px solid var(--border);margin-bottom:38px;
background:
radial-gradient(ellipse 60% 120% at 70% -20%, rgba(232,67,63,.13), transparent),
radial-gradient(ellipse 40% 90% at 20% -10%, rgba(229,181,103,.07), transparent);
}
.hero h1{font-size:40px;letter-spacing:-.5px;line-height:1.1}
.hero h1 span{color:var(--accent)}
.hero .tagline{color:var(--muted);font-size:17px;margin-top:8px}
.hero .tagline em{color:var(--gold);font-style:normal}
.badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px}
.badge{
font-size:12px;font-weight:600;padding:4px 12px;border-radius:99px;
background:var(--panel);border:1px solid var(--border2);color:var(--muted);
}
.badge.hot{background:rgba(232,67,63,.12);border-color:rgba(232,67,63,.4);color:var(--accent-soft)}
.badge.gold{background:rgba(229,181,103,.1);border-color:rgba(229,181,103,.35);color:var(--gold)}
/* ---------- sections ---------- */
section{margin-bottom:58px}
section>h2{
font-size:26px;letter-spacing:-.3px;padding-bottom:10px;margin-bottom:8px;
border-bottom:1px solid var(--border);
}
section>h2 .hash{color:var(--accent);margin-right:6px}
.sec-intro{color:var(--muted);margin-bottom:22px;max-width:72ch}
h3.sub{font-size:18px;margin:34px 0 14px;color:var(--gold)}
/* ---------- callouts ---------- */
.note{
background:rgba(88,166,255,.06);border:1px solid rgba(88,166,255,.25);
border-left:3px solid var(--blue);border-radius:8px;padding:12px 16px;margin:16px 0;
font-size:14px;color:var(--text);
}
.warn{
background:rgba(240,136,62,.06);border:1px solid rgba(240,136,62,.3);
border-left:3px solid var(--orange);border-radius:8px;padding:12px 16px;margin:16px 0;
font-size:14px;
}
.tip{
background:rgba(78,201,138,.05);border:1px solid rgba(78,201,138,.25);
border-left:3px solid var(--green);border-radius:8px;padding:12px 16px;margin:16px 0;
font-size:14px;
}
.note b,.warn b,.tip b{color:inherit}
/* ---------- command cards ---------- */
.cmd{
background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);
padding:18px 20px 16px;margin:14px 0;
transition:border-color .15s;
}
.cmd:hover{border-color:var(--border2)}
.cmd.hidden{display:none}
.cmd-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.cmd-head h4{font-size:16.5px;font-family:var(--mono);color:#fff;font-weight:600}
.cmd-head h4 .amp{color:var(--accent)}
.cmd p{color:var(--muted);font-size:14px;margin-bottom:10px;max-width:78ch}
.cmd p strong{color:var(--text)}
.opt{font-size:13px;color:var(--faint);margin-top:10px}
.opt code{font-size:.92em}
/* level badges */
.lvl{
font-size:10.5px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;
padding:2.5px 9px;border-radius:99px;border:1px solid;
}
.lvl.voice {color:var(--green); border-color:rgba(78,201,138,.45); background:rgba(78,201,138,.08)}
.lvl.op {color:var(--blue); border-color:rgba(88,166,255,.45); background:rgba(88,166,255,.08)}
.lvl.admin {color:var(--purple);border-color:rgba(188,140,255,.45);background:rgba(188,140,255,.08)}
.lvl.manager{color:var(--orange);border-color:rgba(240,136,62,.45); background:rgba(240,136,62,.08)}
.lvl.owner {color:var(--accent-soft);border-color:rgba(232,67,63,.5);background:rgba(232,67,63,.08)}
.lvl.master {color:var(--pink); border-color:rgba(255,126,182,.45);background:rgba(255,126,182,.08)}
.lvl.boss {color:var(--gold); border-color:rgba(229,181,103,.5); background:rgba(229,181,103,.08)}
.lvl.all {color:var(--cyan); border-color:rgba(57,197,207,.45); background:rgba(57,197,207,.08)}
/* ---------- code blocks ---------- */
.code{position:relative;margin:10px 0}
.code pre{
background:var(--code-bg);border:1px solid var(--border);border-radius:8px;
padding:12px 90px 12px 15px;overflow-x:auto;
font-family:var(--mono);font-size:13px;line-height:1.75;color:#c9d1d9;
scrollbar-width:thin;
}
.code.syntax pre{border-left:3px solid var(--accent)}
.code.example pre{border-left:3px solid var(--green)}
.code .tag{
position:absolute;top:9px;right:44px;font-size:9.5px;font-weight:700;
letter-spacing:1px;text-transform:uppercase;color:var(--faint);user-select:none;
}
.copy{
position:absolute;top:6px;right:8px;cursor:pointer;
background:var(--panel2);border:1px solid var(--border2);border-radius:6px;
color:var(--muted);width:26px;height:24px;font-size:12px;line-height:1;
}
.copy:hover{color:var(--text);border-color:var(--faint)}
.copy.ok{color:var(--green);border-color:var(--green)}
/* syntax highlight-ish helpers inside pre */
pre .c{color:#586e81;font-style:italic} /* comment */
pre .t{color:var(--accent-soft);font-weight:600} /* trigger/cmd */
pre .a{color:#79c0ff} /* argument */
pre .o{color:#8b98a9} /* optional */
/* ---------- tables ---------- */
table{width:100%;border-collapse:collapse;margin:14px 0;font-size:13.5px}
th{
text-align:left;padding:9px 13px;background:var(--panel2);color:var(--muted);
font-size:11px;text-transform:uppercase;letter-spacing:1px;border:1px solid var(--border);
}
td{padding:8px 13px;border:1px solid var(--border);color:var(--text);vertical-align:top}
tr:nth-child(even) td{background:rgba(255,255,255,.014)}
td code{white-space:nowrap}
.table-scroll{overflow-x:auto}
/* ---------- misc ---------- */
.pill-row{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0}
.pill{font-family:var(--mono);font-size:12px;background:var(--panel2);border:1px solid var(--border);padding:3px 10px;border-radius:6px;color:var(--muted)}
#top-btn{
position:fixed;bottom:26px;right:26px;width:42px;height:42px;border-radius:50%;
background:var(--panel2);border:1px solid var(--border2);color:var(--muted);
cursor:pointer;font-size:17px;display:none;z-index:50;
}
#top-btn:hover{color:var(--accent-soft);border-color:var(--accent)}
footer{
border-top:1px solid var(--border);margin-top:70px;padding-top:24px;
color:var(--faint);font-size:13px;
}
footer a{color:var(--muted)}
@media(max-width:900px){
.sidebar{display:none}
.main{padding:0 18px 60px}
.hero h1{font-size:30px}
}
</style>
</head>
<body>
<div class="layout">
<!-- ======================= SIDEBAR ======================= -->
<nav class="sidebar">
<div class="logo">
<span class="leaf">🛠️</span>
<div><b>Black<span>Tools</span></b><small>v2.5.5 · DOCUMENTATION</small></div>
</div>
<input id="search" type="text" placeholder="Filter commands… ( / )" autocomplete="off">
<div class="search-hint"><span id="search-count"></span> </div>
<div class="nav" id="nav">
<h5>Start here</h5>
<a href="#overview">Overview</a>
<a href="#whatsnew">What's new in 2.5.5</a>
<a href="#install">Installation</a>
<a href="#using">Using the bot</a>
<a href="#levels">Access levels</a>
<h5>Commands</h5>
<a href="#cmd-general">General commands</a>
<a href="#cmd-chanops">Channel op commands</a>
<a href="#cmd-bans">Kick & ban commands</a>
<a href="#cmd-users">User management</a>
<a href="#cmd-chan">Channel management</a>
<a href="#cmd-owner">Bot owner commands</a>
<h5>Features</h5>
<a href="#protections">Protections</a>
<a href="#modules">Modules</a>
<a href="#myset">Personal settings</a>
<h5>Reference</h5>
<a href="#egg">Eggdrop.conf via IRC</a>
<a href="#native">Native eggdrop settings</a>
<a href="#reference">Ban methods & masks</a>
</div>
</nav>
<!-- ======================= MAIN ======================= -->
<div class="main"><div class="wrap">
<div class="hero">
<h1>Black<span>Tools</span> Documentation</h1>
<p class="tagline">The Ultimate Channel Control Script — <em>One TCL. One smart Eggdrop.</em><br>
A complete reference for every command, protection and module.</p>
<div class="badges">
<span class="badge hot">v2.5.5</span>
<span class="badge">Eggdrop ≥ 1.8</span>
<span class="badge">Tcl ≥ 8.5</span>
<span class="badge gold">Undernet · X service</span>
<span class="badge">EN · RO · ES · FR</span>
<span class="badge">by BLaCkShaDoW · tclscripts.net</span>
</div>
</div>
<!-- ================= OVERVIEW ================= -->
<section id="overview">
<h2><span class="hash">#</span>Overview</h2>
<p class="sec-intro">
BlackTools is a complete channel-management script for Eggdrop bots. It bundles
<strong>~70 commands</strong>, <strong>25+ protections</strong> (flood, spam, advert, badword, clone
detection…) and <strong>25+ modules</strong> (seen, quotes, notes, greets, topic control, X
integration…) into one package. Every channel can be configured independently — each
owner/manager toggles the protections, modules and commands they want.
</p>
<table>
<tr><th style="width:170px">Script</th><td>BlackTools v2.5.5 (GitHub master, 2021)</td></tr>
<tr><th>Author</th><td>Daniel Voipan (BLaCkShaDoW) — <a href="http://www.tclscripts.net">www.tclscripts.net</a></td></tr>
<tr><th>Requirements</th><td>Eggdrop 1.8.x or newer · Tcl 8.5 or newer</td></tr>
<tr><th>Languages</th><td>English · Romanian · Spanish · French (lang files auto-loaded from <code>lang/</code>)</td></tr>
<tr><th>Home channel</th><td>Set via <code>black(homechan)</code> in <code>BlackTools.tcl</code> (default: none)</td></tr>
<tr><th>Network services</th><td>Undernet <code>X</code> (x@channels.undernet.org) — auto-login supported</td></tr>
<tr><th>Online help</th><td><code>#TCL-HELP</code> on Undernet · <a href="https://github.com/tclscripts/BlackToolS-TCL">GitHub</a></td></tr>
</table>
<div class="tip"><b>The two most important commands:</b> <code>!h</code> shows every command available
<em>to you</em> at your access level, and <code>!man <command></code> shows the built-in manual page for any
command, protection or module. When in doubt — <code>!man</code> it.</div>
</section>
<!-- ================= WHAT'S NEW ================= -->
<section id="whatsnew">
<h2><span class="hash">#</span>What's new in 2.5.5</h2>
<p class="sec-intro">Summary of the changes between v2.5.3 (2018) and v2.5.5 (GitHub master, 2021),
compiled from the shipped <code>ChangeLog</code> and a comparison of the sources.</p>
<h3 class="sub">New modules & protections</h3>
<div class="table-scroll"><table>
<tr><th style="width:160px">Feature</th><th>Description</th></tr>
<tr><td><code>AutoUpdate</code></td><td>The bot updates itself from GitHub when a new BT version or bugfix is released — on a timer or by command (<code>!update</code>). All BT files and your <code>BlackTools.tcl</code> settings are backed up and restored. Powered by the new <code>Addons/</code> folder (http, json, github helper libraries) — no external TLS package needed. Can auto-restart the bot when an update requires it.</td></tr>
<tr><td><code>Alias</code></td><td>Users can build their own personalized commands on top of BT commands, with <code>%1%</code>/<code>%2%</code> argument placeholders.</td></tr>
<tr><td><code>Vote</code></td><td>Full channel voting system: open votings with multiple options, expiry times, access-only or everyone participation, and result listings.</td></tr>
<tr><td><code>NoProxy</code></td><td>New protection that bans users joining from IPs identified as proxies. The ban reason supports an <code>%isp%</code> placeholder.</td></tr>
<tr><td><code>AntiBotIdle</code></td><td>New egg setting that keeps the eggdrop itself from idling on the server.</td></tr>
<tr><td>ChanServ mass-ban detector</td><td>The bot detects mass-bans done through X and suspends the abuser (configurable coverage percent, suspend level and time).</td></tr>
</table></div>
<h3 class="sub">Regex ban system</h3>
<p class="sec-intro">The ban engine (rewritten in the new <code>BT.Ban.tcl</code>, faster) now supports
<strong>regular-expression bans</strong>: <code>!b -regex</code>,
<code>!ub -regex</code>, <code>!sb -regex</code> and <code>!banlist regex</code>. Regexes match against
<code>nick!ident@host/[realname]/[banmask type]</code>. The BadChan module also accepts regex badchans
(<code>!badchan regex <#regex></code>) and got a faster, safer scanning mode.</p>
<h3 class="sub">Other changes</h3>
<div class="table-scroll"><table>
<tr><th>Change</th><th>Detail</th></tr>
<tr><td>DCC party-line support</td><td>All commands now work through DCC chat: <code>.bt <command> [#channel] [arguments]</code> (with <code>!myset mychan</code> set, the channel can be omitted).</td></tr>
<tr><td>Languages</td><td>Spanish translation added; French language files are also shipped.</td></tr>
<tr><td><b>GuestNick removed</b></td><td>The GuestNick module was removed in the 2021-03-15 update.</td></tr>
<tr><td>Quote access control</td><td>New <code>quote:usage</code> setting: choose whether only users with access, or everyone, may add/list/remove quotes.</td></tr>
<tr><td>AntiColor tuning</td><td>New option to punish only specific colour codes (<code>anticolor:specific_colors</code>).</td></tr>
<tr><td>DNS on-join toggle</td><td><code>black(dns_onjoin)</code> lets you disable DNS lookups on join (faster on big channels).</td></tr>
<tr><td>Flood action change</td><td>The private-message antiflood action changed from server SILENCE to IGNORE.</td></tr>
<tr><td>Fixes</td><td>Gag durations for all access levels, TopWords now counts all users, NickServ login, clonescan bans, Idle module vs. SecureMode <code>+mD</code> interaction, alias/notes/suspends cleaned up when users expire, and assorted minor bugs.</td></tr>
</table></div>
</section>
<!-- ================= INSTALL ================= -->
<section id="install">
<h2><span class="hash">#</span>Installation</h2>
<p class="sec-intro">From the <code>INSTALL</code> file — how to get BlackTools running on a fresh eggdrop.</p>
<div class="code example"><span class="tag">shell</span><button class="copy" title="Copy">⧉</button><pre><span class="c"># 1. get the latest version (or unpack the release archive)</span>
git clone https://github.com/tclscripts/BlackToolS-TCL
<span class="c"># 2. edit BlackTools.tcl to your liking (homechan, cmdchar, X login, defaults…)</span>
<span class="c"># 3. copy everything into your eggdrop's scripts/ directory (case sensitive!)</span>
cp -r BlackTools/ /home/of/your_eggdrop/scripts/
cp BlackTools.tcl /home/of/your_eggdrop/scripts/
<span class="c"># 4. add this line at the END of your eggdrop config file</span>
source scripts/BlackTools.tcl
<span class="c"># 5. restart the eggdrop, then in any channel type:</span>
.h</pre></div>
<div class="warn"><b>Warning:</b> running BlackTools together with the <b>A&A</b> script "works in
theory" only — the author explicitly does not support that combination.</div>
<p class="sec-intro" style="margin-top:16px">The directory layout that must live under <code>scripts/</code>:</p>
<div class="pill-row">
<span class="pill">BlackTools.tcl — main config</span>
<span class="pill">BlackTools/BT.Core.tcl</span>
<span class="pill">BlackTools/BT.Ban.tcl — ban engine</span>
<span class="pill">BlackTools/BT.Loader.tcl</span>
<span class="pill">BlackTools/BT.Binds.tcl</span>
<span class="pill">BlackTools/BT.Timers.tcl</span>
<span class="pill">BlackTools/Addons/ — http, json, github</span>
<span class="pill">BlackTools/Commands/ — 10 files</span>
<span class="pill">BlackTools/Modules/ — 26 files</span>
<span class="pill">BlackTools/Protections/ — 19 files</span>
<span class="pill">BlackTools/lang/ — EN · RO · ES · FR</span>
</div>
</section>
<!-- ================= USING ================= -->
<section id="using">
<h2><span class="hash">#</span>Using the bot</h2>
<p class="sec-intro">Every BlackTools command can be triggered <strong>four ways</strong>. All examples in
this documentation use <code>!</code>, but the bot answers to any of the configured trigger characters
(stock: <code>!</code> <code>.</code> <code>`</code> <code>^</code> — change them with
<code>set cmdchar</code>) — plus the botnick prefix, private message, and (new in 2.5.5) DCC chat.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!command</span> <span class="a"><args></span> <span class="c"># trigger char, in the channel</span>
<span class="t">BotNick command</span> <span class="a"><args></span> <span class="c"># address the bot by nick, in the channel</span>
<span class="t">/msg BotNick command</span> <span class="a">#channel <args></span> <span class="c"># private message — add the #channel</span>
<span class="t">.bt command</span> <span class="a">[#channel] <args></span> <span class="c"># DCC party-line (channel optional with myset mychan)</span></pre></div>
<div class="note"><b>Convention used below:</b> <code><required></code> arguments are mandatory,
<code>[optional]</code> arguments may be omitted. <code>[#chan]</code> is only needed when messaging the bot
privately or acting on another channel. Durations are written <code>10m</code> (minutes), <code>3h</code>
(hours), <code>2d</code> (days) — and <code>0</code> means <em>permanent</em>.</div>
<h3 class="sub">The help menu</h3>
<div class="cmd" data-k="h help menu categories">
<div class="cmd-head"><h4><span class="amp">!</span>h</h4><span class="lvl all">Any access</span></div>
<p>The most important command. Shows all commands available at <strong>your</strong> access level,
plus category submenus. Disabled commands are hidden or greyed out.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!h</span> <span class="o">[category]</span> <span class="c"># categories: cmds · ban · add · manager · master · owner</span>
<span class="c"># btinfo · chaninfo · module · egg</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!h</span> <span class="c"># your main menu</span>
<span class="t">!h</span> ban <span class="c"># every kick/ban command you can use</span>
<span class="t">!h</span> module <span class="c"># which modules are ON (+) or OFF (-) on #channel</span>
<span class="t">!h</span> chaninfo <span class="c"># channel flags & eggdrop flood settings</span>
/msg BotNick h #channel ban</pre></div>
</div>
<div class="cmd" data-k="man manual help">
<div class="cmd-head"><h4><span class="amp">!</span>man</h4><span class="lvl all">Any access</span></div>
<p>The built-in user manual. Displays usage information for every command, protection and module —
the same content as this page, live on IRC.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!man</span> <span class="a"><command></span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!man</span> b <span class="c"># manual for the ban command</span>
<span class="t">!man</span> antipub <span class="c"># manual for the anti-advertising protection</span>
<span class="t">!man</span> banmethod <span class="c"># explains the 7 punishment methods</span></pre></div>
</div>
</section>
<!-- ================= LEVELS ================= -->
<section id="levels">
<h2><span class="hash">#</span>Access levels</h2>
<p class="sec-intro">BlackTools layers its own named levels on top of eggdrop flags. Channel levels apply
per-channel; global levels apply bot-wide. Each level inherits everything below it.</p>
<div class="table-scroll"><table>
<tr><th>Level</th><th>Scope</th><th>Eggdrop flag</th><th>Typical powers</th></tr>
<tr><td><span class="lvl voice">Voice</span></td><td>channel</td><td><code>|V</code></td><td>voice self, seen, invite, kick/warn, myset, h/man</td></tr>
<tr><td><span class="lvl op">Op</span></td><td>channel</td><td><code>|O</code></td><td>+ op/deop, modes, topic, cycle, most ban commands</td></tr>
<tr><td><span class="lvl admin">Admin</span></td><td>channel</td><td><code>|A</code></td><td>+ say/act, add users, suspend, black/stick bans, stats</td></tr>
<tr><td><span class="lvl manager">Manager</span></td><td>channel</td><td><code>|M</code></td><td>+ set/unset channel settings, enable/disable commands, exempt, purge, del/chuser</td></tr>
<tr><td><span class="lvl master">Master</span></td><td>global</td><td><code>o</code></td><td>manager powers on every channel + addchan/delchan, suspend chans, status</td></tr>
<tr><td><span class="lvl owner">Owner</span></td><td>global</td><td><code>m</code></td><td>+ global bans, broadcast, die/restart/jump, cp, TCL loading</td></tr>
<tr><td><span class="lvl boss">Boss owner</span></td><td>global</td><td><code>n</code></td><td>everything, incl. editing eggdrop.conf settings from IRC (<code>egg</code>)</td></tr>
</table></div>
<div class="note">Two auxiliary levels exist for the userlist: <b>PROTECT</b> (never punished by
protections) and <b>BAN</b> (auto-banned on sight). Ops and voices can additionally be shielded per-channel
with <code>!set +oprotect</code> / <code>+vprotect</code> / <code>+hoprotect</code>.</div>
</section>
<!-- ================= GENERAL COMMANDS ================= -->
<section id="cmd-general">
<h2><span class="hash">#</span>General commands</h2>
<p class="sec-intro">Everyday commands available from the lowest access level upward.</p>
<div class="cmd" data-k="version info script">
<div class="cmd-head"><h4><span class="amp">!</span>version</h4><span class="lvl all">Any access</span></div>
<p>Displays the BlackTools version the eggdrop is running.</p>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!version</span></pre></div>
</div>
<div class="cmd" data-k="i invite user channel">
<div class="cmd-head"><h4><span class="amp">!</span>i / <span class="amp">!</span>invite</h4><span class="lvl voice">Voice+</span></div>
<p>Invites a user to the channel. The bot must be opped (@) for the invite to work.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!i</span> <span class="a"><nick></span> <span class="c"># in channel</span>
<span class="t">/msg BotNick i</span> <span class="a">#channel <nick></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!i</span> JohnDoe <span class="c"># invite JohnDoe to #channel</span></pre></div>
</div>
<div class="cmd" data-k="seen last seen nick host ip database">
<div class="cmd-head"><h4><span class="amp">!</span>seen</h4><span class="lvl voice">Voice+</span></div>
<p>Searches the per-channel seen database for a nick, IP or host (wildcards supported). Shows when the
person was last seen and what they did. Owners+ can search <code>global</code> across all channels.
Flood-protected (2 searches / 20s by default).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!seen</span> <span class="a"><nick|ip|host></span>
<span class="t">!seen</span> global <span class="a"><nick|ip|host></span> <span class="c"># owners+ — all channels</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!seen</span> JohnDoe
<span class="t">!seen</span> *!*@*.videotron.ca</pre></div>
<p class="opt">Related: <code>+seen</code> module toggle · <code>+seenlastmsg</code> (show last message) ·
<code>+seenreply</code> (notify people they were searched for)</p>
</div>
<div class="cmd" data-k="activ activity last action user">
<div class="cmd-head"><h4><span class="amp">!</span>activ</h4><span class="lvl voice">Voice+</span></div>
<p>Shows the last recorded channel activity of a user (last join, part, kick, ban, text…), pulled from
the bot's action tracker.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!activ</span> <span class="a"><nick></span></pre></div>
</div>
<div class="cmd" data-k="for multiple bots simultaneous command">
<div class="cmd-head"><h4><span class="amp">!</span>for</h4><span class="lvl voice">Voice+</span></div>
<p>Makes multiple eggdrops (all running BlackTools) execute the same command simultaneously —
handy when several bots guard the channel.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">for</span> <span class="a"><botnick1>,<botnick2>..</span> <span class="a"><command></span> <span class="o">[option]</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">for</span> Bot1,Bot2 say Good morning everyone!</pre></div>
</div>
<div class="cmd" data-k="info user channel details access greet automode">
<div class="cmd-head"><h4><span class="amp">!</span>info</h4><span class="lvl admin">Admin+</span></div>
<p>Displays database information about a user or a channel: access level, added hostmasks, automode,
greet line, last-seen info, channel topic/URL/manager, and more.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!info</span> <span class="a"><handle|#chan></span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!info</span> JohnDoe
<span class="t">!info</span> #channel</pre></div>
</div>
<div class="cmd" data-k="addinfo greeting personal join message">
<div class="cmd-head"><h4><span class="amp">!</span>addinfo</h4><span class="lvl voice">Voice+</span></div>
<p>Sets a personalised greeting line for yourself, shown in <code>!info</code> and announced by the bot
when you join (requires <code>+greet</code> on the channel). Same as <code>!myset greet</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addinfo</span> <span class="a"><text|reset></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addinfo</span> Hello everyone, glad to be here!</pre></div>
</div>
</section>
<!-- ================= CHANNEL OP COMMANDS ================= -->
<section id="cmd-chanops">
<h2><span class="hash">#</span>Channel op commands</h2>
<p class="sec-intro">Op/voice management, modes, topic and channel messages.</p>
<div class="cmd" data-k="v voice devoice mass">
<div class="cmd-head"><h4><span class="amp">!</span>v</h4><span class="lvl voice">Voice+</span></div>
<p>Gives or removes voice <strong>(+v)</strong> for one or more users. With no nick, voices
<em>you</em> (if you aren't voiced already).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!v</span> <span class="o">[nick1] [nick2]..</span>
<span class="t">!v +</span> <span class="c"># mass voice everyone</span>
<span class="t">!v -</span> <span class="c"># mass devoice</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!v</span> JohnDoe JaneDoe</pre></div>
</div>
<div class="cmd" data-k="o op deop mass operator">
<div class="cmd-head"><h4><span class="amp">!</span>o</h4><span class="lvl op">Op+</span></div>
<p>Gives or removes op <strong>(@)</strong> for one or more users. With no nick, ops <em>you</em>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!o</span> <span class="o">[nick1] [nick2]..</span>
<span class="t">!o +</span> <span class="c"># mass op</span>
<span class="t">!o -</span> <span class="c"># mass deop</span></pre></div>
</div>
<div class="cmd" data-k="ho halfop dehalfop mass">
<div class="cmd-head"><h4><span class="amp">!</span>ho</h4><span class="lvl op">Op+</span></div>
<p>Gives or removes halfop <strong>(+h %)</strong> for the specified users. <code>!ho +</code> /
<code>!ho -</code> perform a mass halfop / dehalfop.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ho</span> <span class="o">[nick1] [nick2]..</span></pre></div>
</div>
<div class="cmd" data-k="mode channel modes lock key moderate">
<div class="cmd-head"><h4><span class="amp">!</span>mode</h4><span class="lvl op">Op+</span></div>
<p>Applies or removes channel modes.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mode</span> <span class="a"><+/-modes></span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mode</span> +m <span class="c"># moderate the channel</span>
<span class="t">!mode</span> -m+ntr</pre></div>
</div>
<div class="cmd" data-k="t topic set text">
<div class="cmd-head"><h4><span class="amp">!</span>t</h4><span class="lvl op">Op+</span></div>
<p>Sets the channel topic. With <code>!set +showhandle</code>, the bot appends the handle of whoever
changed it.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!t</span> <span class="a"><text></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!t</span> Welcome to #Channel — read the rules and have fun!</pre></div>
</div>
<div class="cmd" data-k="r refresh topic reload">
<div class="cmd-head"><h4><span class="amp">!</span>r</h4><span class="lvl op">Op+</span></div>
<p>Manually refreshes/re-applies the stored channel topic (see also the <code>+refresh</code> and
<code>+autotopic</code> settings).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!r</span> <span class="o">[#chan]</span></pre></div>
</div>
<div class="cmd" data-k="cycle hop part rejoin">
<div class="cmd-head"><h4><span class="amp">!</span>cycle</h4><span class="lvl op">Op+</span></div>
<p>Makes the bot cycle (part and re-join) the channel, optionally waiting a given duration.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cycle</span> <span class="o">[duration|reason]</span></pre></div>
</div>
<div class="cmd" data-k="omsg operators message notice ops">
<div class="cmd-head"><h4><span class="amp">!</span>omsg</h4><span class="lvl op">Op+</span></div>
<p>Sends a message to all users with op (@) on the channel — or on every channel with
<code>all</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!omsg</span> <span class="a"><#chan|all></span> <span class="a"><text></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!omsg</span> #channel Watch for the spambot wave, set +m if it gets bad</pre></div>
</div>
<div class="cmd" data-k="say message channel speak">
<div class="cmd-head"><h4><span class="amp">!</span>say</h4><span class="lvl admin">Admin+</span></div>
<p>Makes the bot say a message to the channel.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!say</span> <span class="o">[#chan]</span> <span class="a"><message></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!say</span> Quiz night starts in 10 minutes!</pre></div>
</div>
<div class="cmd" data-k="act action me emote">
<div class="cmd-head"><h4><span class="amp">!</span>act</h4><span class="lvl admin">Admin+</span></div>
<p>Makes the bot send an action (<code>/me</code>) to the channel.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!act</span> <span class="o">[#chan]</span> <span class="a"><message></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!act</span> waves at everyone</pre></div>
</div>
<div class="cmd" data-k="msg private message target query">
<div class="cmd-head"><h4><span class="amp">!</span>msg</h4><span class="lvl owner">Owner+</span></div>
<p>Sends a message to any target — a channel, a nick (query) or a chat window.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!msg</span> <span class="o">[target]</span> <span class="a"><message></span></pre></div>
</div>
<div class="cmd" data-k="broadcast all channels message">
<div class="cmd-head"><h4><span class="amp">!</span>broadcast</h4><span class="lvl owner">Owner+</span></div>
<p>Sends a message to <strong>all</strong> channels the bot is in.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!broadcast</span> <span class="a"><message></span></pre></div>
</div>
<div class="cmd" data-k="check verify user virus advertise private">
<div class="cmd-head"><h4><span class="amp">!</span>check</h4><span class="lvl op">Op+</span></div>
<p>Sends a private verification message to a user — used to test whether they are infected/advertising
(drones often auto-reply). The message text is configurable.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!check</span> <span class="a"><nick></span></pre></div>
<p class="opt">Optional settings: <code>check-message</code> (default check text)</p>
</div>
</section>
<!-- ================= KICK & BAN COMMANDS ================= -->
<section id="cmd-bans">
<h2><span class="hash">#</span>Kick & ban commands</h2>
<p class="sec-intro">The heart of BlackTools: a full ban system with per-ban levels, durations, sticky
bans, global bans, comments and searchable banlists. Durations: <code>m</code>inutes /
<code>h</code>ours / <code>d</code>ays, <code>0</code> = permanent. Most commands accept a nick
<em>or</em> a mask — if the nick isn't on the channel, the bot will <code>WHOIS</code> it.</p>
<div class="cmd" data-k="k kick user reason">
<div class="cmd-head"><h4><span class="amp">!</span>k</h4><span class="lvl voice">Voice+</span></div>
<p>Kicks a user (or everyone matching a mask) from the channel.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!k</span> <span class="a"><nick|mask></span> <span class="o">[reason]</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!k</span> Troublemaker
<span class="t">!k</span> Troublemaker Please keep it civil</pre></div>
<p class="opt">Optional settings: <code>k-reason</code> (default kick reason)</p>
</div>
<div class="cmd" data-k="w warn warning kick">
<div class="cmd-head"><h4><span class="amp">!</span>w</h4><span class="lvl voice">Voice+</span></div>
<p>Delivers a <strong>warning kick</strong> — a kick with a configurable warning reason and message.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!w</span> <span class="a"><nick></span></pre></div>
<p class="opt">Optional settings: <code>w-reason</code> · <code>w-message</code></p>
</div>
<div class="cmd" data-k="b ban duration level global link comment permanent">
<div class="cmd-head"><h4><span class="amp">!</span>b</h4><span class="lvl op">Op+</span></div>
<p>The main ban command. Bans a nick or mask for a duration (stock default: <strong>2 days</strong>).
A duration of <code>0</code> makes the ban permanent (blacklisted). <code>-level</code> protects the
ban from removal by lower access. Owners+ can add <code>global</code> (all channels) or
<code>link</code> (linked channels). <code>-c comment</code> attaches a note visible on the ban entry.
Supports CIDR masks like <code>*!*@192.168.0.1/17</code> — and, new in 2.5.5,
<strong>regex bans</strong> with <code>-regex</code>, matched against
<code>nick!ident@host/[realname]/[banmask type]</code> (bracketed fields optional).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!b</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|regex></span> <span class="o">[-level] [duration] [reason] [-c comment]</span>
<span class="t">!b</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|regex></span> <span class="o">[-level] [duration] [global|link] [reason]</span> <span class="c"># owner+</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!b</span> SpamGuy 2d advertising
<span class="t">!b</span> *!*@198.51.100.* 12h botnet range
<span class="t">!b</span> Griefer -400 0 permanent, level 400 protection
<span class="t">!b</span> Flooder 3d flooding -c third offence this week
<span class="t">!b</span> -regex [a-z]+[0-9][0-9]!*@* 1d drone pattern</pre></div>
<p class="opt">Optional settings: <code>b-reason</code> · <code>b-bantime</code> (default 2d) ·
<code>b-banmask</code> (default <code>*!*@host</code>)</p>
</div>
<div class="cmd" data-k="ub unban remove ban wildcards global">
<div class="cmd-head"><h4><span class="amp">!</span>ub</h4><span class="lvl op">Op+</span></div>
<p>Removes a ban by nick, mask or ban ID (wildcards supported). If the nick isn't on channel the bot
WHOISes and unbans by ident/host/nick — matching regex bans are removed too. Use <code>-regex</code>
to remove a stored regex ban directly. <strong>Careful:</strong> <code>!ub *</code> removes
<em>all</em> channel bans.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ub</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|id|regex></span> <span class="o">[global|link]</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ub</span> SpamGuy
<span class="t">!ub</span> 1234 <span class="c"># by ban ID (see +showid / !sb)</span></pre></div>
</div>
<div class="cmd" data-k="sb search ban details wildcards id">
<div class="cmd-head"><h4><span class="amp">!</span>sb</h4><span class="lvl op">Op+</span></div>
<p>Searches the banlist and shows full details of a ban — who set it, when, why, expiry, comment.
Also matches and inspects regex bans (<code>-regex</code>).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!sb</span> <span class="o">[-regex]</span> <span class="a"><nick|mask|id|regex></span> <span class="o">[global]</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!sb</span> *!*@*.example.net</pre></div>
</div>
<div class="cmd" data-k="banlist list bans active">
<div class="cmd-head"><h4><span class="amp">!</span>banlist</h4><span class="lvl op">Op+</span></div>
<p>Shows the active bans on the channel — all of them, only yours, other people's, regex bans only,
gags only, or (owners+) the global list. Paged output; follow with <code>-next</code> for more
entries.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!banlist</span> <span class="a"><all|handle|regex|gag|other></span>
<span class="t">!banlist</span> global <span class="c"># owner+</span></pre></div>
</div>
<div class="cmd" data-k="black permanent blacklist ban unlimited">
<div class="cmd-head"><h4><span class="amp">!</span>black</h4><span class="lvl admin">Admin+</span></div>
<p>Bans a user <strong>permanently</strong> (blacklist). Equivalent to <code>!b ... 0</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!black</span> <span class="a"><nick|mask></span> <span class="o">[reason] [-c comment]</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!black</span> KnownTroll repeat offender -c do not remove</pre></div>
<p class="opt">Optional settings: <code>black-reason</code> · <code>black-banmask</code></p>
</div>
<div class="cmd" data-k="stick sticky ban reactivate">
<div class="cmd-head"><h4><span class="amp">!</span>stick</h4><span class="lvl admin">Admin+</span></div>
<p>Sets a <strong>sticky</strong> ban: if anyone removes it from the channel banlist, the bot puts it
right back. Stock default duration: 2 days.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!stick</span> <span class="a"><nick|mask></span> <span class="o">[duration] [reason] [-c comment]</span></pre></div>
<p class="opt">Optional settings: <code>stick-reason</code> · <code>stick-bantime</code> · <code>stick-banmask</code></p>
</div>
<div class="cmd" data-k="n nickname ban nick">
<div class="cmd-head"><h4><span class="amp">!</span>n</h4><span class="lvl op">Op+</span></div>
<p>Bans on the user's <strong>nickname</strong> (mask <code>nick!*@*</code>). Default: 2h.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!n</span> <span class="a"><nick></span></pre></div>
<p class="opt">Optional settings: <code>n-reason</code> · <code>n-bantime</code> · <code>n-banmask</code></p>
</div>
<div class="cmd" data-k="id ident ban">
<div class="cmd-head"><h4><span class="amp">!</span>id</h4><span class="lvl op">Op+</span></div>
<p>Bans on the user's <strong>ident</strong> (mask <code>*!user@*</code>). Given a nick, the bot grabs
the ident automatically. Default: 2h.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!id</span> <span class="a"><nick|ident></span></pre></div>
<p class="opt">Optional settings: <code>id-reason</code> · <code>id-bantime</code> · <code>id-banmask</code></p>
</div>
<div class="cmd" data-k="mb ident ban reason auto">
<div class="cmd-head"><h4><span class="amp">!</span>mb</h4><span class="lvl op">Op+</span></div>
<p>Bans a nickname automatically on <strong>ident</strong>, with an optional reason. Default: 2d.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!mb</span> <span class="a"><nick></span> <span class="o">[reason]</span></pre></div>
<p class="opt">Optional settings: <code>mb-reason</code> · <code>mb-bantime</code></p>
</div>
<div class="cmd" data-k="dr drone ban">
<div class="cmd-head"><h4><span class="amp">!</span>dr</h4><span class="lvl op">Op+</span></div>
<p>Bans with a default <strong>DRONE</strong> reason — for compromised clients/drones. Default: 15d.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!dr</span> <span class="a"><nick|mask></span></pre></div>
<p class="opt">Optional settings: <code>dr-reason</code> · <code>dr-bantime</code> · <code>dr-banmask</code></p>
</div>
<div class="cmd" data-k="vr virus trojan ban">
<div class="cmd-head"><h4><span class="amp">!</span>vr</h4><span class="lvl op">Op+</span></div>
<p>Bans with a default <strong>VIRUS/TROJAN</strong> reason. Default: 3d.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!vr</span> <span class="a"><nick|mask></span></pre></div>
<p class="opt">Optional settings: <code>vr-reason</code> · <code>vr-bantime</code> · <code>vr-banmask</code></p>
</div>
<div class="cmd" data-k="bot ban clone bot reason">
<div class="cmd-head"><h4><span class="amp">!</span>bot</h4><span class="lvl op">Op+</span></div>
<p>Bans with a default <strong>BOT</strong> reason — for unauthorised bots. Default: 7d.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bot</span> <span class="a"><nick|mask></span></pre></div>
<p class="opt">Optional settings: <code>bot-reason</code> · <code>bot-bantime</code> · <code>bot-banmask</code></p>
</div>
<div class="cmd" data-k="spam ban spammer reason">
<div class="cmd-head"><h4><span class="amp">!</span>spam</h4><span class="lvl op">Op+</span></div>
<p>Bans with a default <strong>SPAM</strong> reason. Default: 7d.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!spam</span> <span class="a"><nick|mask></span></pre></div>
<p class="opt">Optional settings: <code>spam-reason</code> · <code>spam-bantime</code> · <code>spam-banmask</code></p>
</div>
<div class="cmd" data-k="bw badword ban">
<div class="cmd-head"><h4><span class="amp">!</span>bw</h4><span class="lvl op">Op+</span></div>
<p>Bans with a default <strong>bad word</strong> reason. Default: 1d.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!bw</span> <span class="a"><nick|mask></span></pre></div>
<p class="opt">Optional settings: <code>bw-reason</code> · <code>bw-bantime</code> · <code>bw-banmask</code></p>
</div>
<div class="cmd" data-k="troll ban troll showtroll">
<div class="cmd-head"><h4><span class="amp">!</span>troll</h4><span class="lvl op">Op+</span></div>
<p>Bans with a default <strong>TROLL</strong> reason. With <code>+showtroll</code> enabled, the bot
notices a "trolls of the day" list to access-holders when they join (reset at midnight).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!troll</span> <span class="a"><nick></span></pre></div>
<p class="opt">Optional settings: <code>troll-reason</code> · <code>+showtroll</code></p>
</div>
<div class="cmd" data-k="gag ungag mute silence">
<div class="cmd-head"><h4><span class="amp">!</span>gag / <span class="amp">!</span>ungag</h4><span class="lvl op">Op+</span></div>
<p>Silences a user — they can't write on the channel — for a period (default: 10m). The bot re-bans
(+b with mute) if the gag is removed early. <code>!ungag</code> lifts it.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!gag</span> <span class="a"><nick></span> <span class="o">[duration] [reason]</span>
<span class="t">!ungag</span> <span class="a"><nick|mask></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!gag</span> LoudGuy 30m take a breather</pre></div>
<p class="opt">Optional settings: <code>gag-reason</code> · <code>gag-bantime</code> · <code>gag-banmask</code></p>
</div>
<div class="cmd" data-k="exempt ban exception whitelist">
<div class="cmd-head"><h4><span class="amp">!</span>exempt</h4><span class="lvl manager">Manager+</span></div>
<p>Manages the ban-exempt list: hosts on it are never banned by the bot. Owners+ can make an exempt
<code>global</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!exempt</span> add <span class="a"><ip|host></span> <span class="o">[period] [global] [reason]</span>
<span class="t">!exempt</span> list <span class="o">[global]</span>
<span class="t">!exempt</span> del <span class="a"><ip|host></span> <span class="o">[global]</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!exempt</span> add *!*@trusted.users.undernet.org 0 our regular helper</pre></div>
</div>
<div class="cmd" data-k="stats statistics bans kicks user">
<div class="cmd-head"><h4><span class="amp">!</span>stats</h4><span class="lvl admin">Admin+</span></div>
<p>Shows ban/command statistics for a user. Managers+ can <code>reset</code>. Requires the
<code>+banstats</code> setting to collect data (see also <code>!banstats total|reset</code>).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!stats</span> <span class="a"><handle></span> <span class="o">[total|reset]</span></pre></div>
</div>
<div class="cmd" data-k="report reportnick advert spam nickname regular users">
<div class="cmd-head"><h4><span class="amp">!</span>report</h4><span class="lvl all">Everyone</span></div>
<p>Lets <em>regular users</em> (and voice/protect) report a nickname for adverts or spam. The bot
relays the report to channel ops via @notice. Needs <code>+reportnick</code> and the bot opped.
Flood-limited (2 reports / 60s).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!report</span> <span class="a"><nick></span> <span class="a"><comment></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!report</span> LinkSpammer keeps pasting shady links in PM</pre></div>
</div>
</section>
<!-- ================= USER MANAGEMENT ================= -->
<section id="cmd-users">
<h2><span class="hash">#</span>User management</h2>
<p class="sec-intro">Adding people to the bot, hostmasks, automodes and suspensions. You can only act on
users with access <em>lower</em> than your own.</p>
<div class="cmd" data-k="add user access level chanserv username">
<div class="cmd-head"><h4><span class="amp">!</span>add</h4><span class="lvl admin">Admin+</span></div>
<p>Adds a user to the channel's userlist at a given level (<code>voice</code>, <code>op</code>,
<code>admin</code>, <code>manager</code>…). If the user is on channel, their current hostmask is added
(default style: <code>*!*@host</code>). If not, the Undernet default is used:
<code>*!*@<user>.users.undernet.org</code> — so you can add people by X username.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!add</span> <span class="a"><level></span> <span class="a"><nick|Xusername></span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!add</span> op JohnDoe <span class="c"># JohnDoe is on channel → current host added</span>
<span class="t">!add</span> voice SomeUserX <span class="c"># not on channel → *!*@SomeUserX.users.undernet.org</span></pre></div>
</div>
<div class="cmd" data-k="userlist access list level all">
<div class="cmd-head"><h4><span class="amp">!</span>userlist</h4><span class="lvl admin">Admin+</span></div>
<p>Shows the channel's access list, filtered by level or all of it.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!userlist</span> <span class="a"><level|all></span> <span class="c"># levels: voice · op · admin · manager · owner · master</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!userlist</span> op</pre></div>
</div>
<div class="cmd" data-k="delacc remove access delete user channel">
<div class="cmd-head"><h4><span class="amp">!</span>delacc</h4><span class="lvl admin">Admin+</span></div>
<p>Removes a user's access from the channel (their record stays in the bot). Must target someone with
lower access than you. Owners can strip global <code>owner|master</code> access too.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!delacc</span> <span class="a"><handle></span>
<span class="t">!delacc</span> <span class="a"><owner|master></span> <span class="a"><handle></span> <span class="c"># remove a global level</span></pre></div>
</div>
<div class="cmd" data-k="del delete user database totally">
<div class="cmd-head"><h4><span class="amp">!</span>del</h4><span class="lvl manager">Manager+</span></div>
<p>Deletes a user <strong>entirely</strong> from the bot's database — all channels, all hosts.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!del</span> <span class="a"><handle></span></pre></div>
</div>
<div class="cmd" data-k="auto automode autoop autovoice global">
<div class="cmd-head"><h4><span class="amp">!</span>auto</h4><span class="lvl admin">Admin+</span></div>
<p>Sets a user's automode — the bot automatically ops or voices them on join. The user must already
have access on the channel. Owners+ can apply it <code>-global</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!auto</span> <span class="a"><+/-o></span> <span class="a"><nick|handle></span> <span class="o">[-global]</span> <span class="c"># auto-op</span>
<span class="t">!auto</span> <span class="a"><+/-v></span> <span class="a"><nick|handle></span> <span class="o">[-global]</span> <span class="c"># auto-voice</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!auto</span> +v JohnDoe</pre></div>
</div>
<div class="cmd" data-k="s suspend access user duration">
<div class="cmd-head"><h4><span class="amp">!</span>s / <span class="amp">!</span>us</h4><span class="lvl admin">Admin+</span></div>
<p><code>!s</code> suspends a user's access on the channel for a period (default: 2d);
<code>!us</code> lifts the suspension. Only works downward in the hierarchy.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!s</span> <span class="a"><handle></span> <span class="o">[duration] [reason]</span>
<span class="t">!us</span> <span class="a"><handle></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!s</span> RogueOp 3d abusing kick command</pre></div>
</div>
<div class="cmd" data-k="addhost delhost hostmask user">
<div class="cmd-head"><h4><span class="amp">!</span>addhost / <span class="amp">!</span>delhost</h4><span class="lvl admin">Admin+</span></div>
<p>Adds or removes a hostmask on a user's record.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addhost</span> <span class="a"><handle></span> <span class="a"><mask></span>
<span class="t">!delhost</span> <span class="a"><handle></span> <span class="a"><mask></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addhost</span> JohnDoe *!*@JohnDoe.users.undernet.org</pre></div>
</div>
<div class="cmd" data-k="chuser rename handle user">
<div class="cmd-head"><h4><span class="amp">!</span>chuser</h4><span class="lvl manager">Manager+</span></div>
<p>Renames a user's handle in the bot's database.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!chuser</span> <span class="a"><handle></span> <span class="a"><newhandle></span></pre></div>
</div>
</section>
<!-- ================= CHANNEL MANAGEMENT ================= -->
<section id="cmd-chan">
<h2><span class="hash">#</span>Channel management</h2>
<p class="sec-intro">Settings, toggles and channel administration — the manager's toolbox.</p>
<div class="cmd" data-k="set flag option setting toggle chanmode key">
<div class="cmd-head"><h4><span class="amp">!</span>set</h4><span class="lvl manager">Manager+</span></div>
<p>The universal switchboard. Turns protections/modules on or off (<code>+flag</code> /
<code>-flag</code>) and assigns values to string options. Owners+ can use <code>global</code> to apply a
setting to every channel. See the <a href="#protections">Protections</a> and
<a href="#modules">Modules</a> sections for every flag.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> <span class="a"><+/-flag></span> <span class="c"># toggle</span>
<span class="t">!set</span> <span class="a"><option></span> <span class="a"><value></span> <span class="c"># assign</span>
<span class="t">!set</span> global <span class="a"><option></span> <span class="a"><value></span> <span class="c"># owner+ — all channels</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!set</span> +antipub <span class="c"># enable anti-advertising</span>
<span class="t">!set</span> chanmode +ntk s3cret <span class="c"># enforce modes incl. a key</span>
<span class="t">!set</span> b-bantime 4h <span class="c"># default !b duration → 4 hours</span>
<span class="t">!set</span> url https://www.example.com</pre></div>
</div>
<div class="cmd" data-k="unset reset option flag remove">
<div class="cmd-head"><h4><span class="amp">!</span>unset</h4><span class="lvl manager">Manager+</span></div>
<p>Resets a setting/option back to default. Owners+ can <code>unset global</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!unset</span> <span class="a"><flag|option></span>
<span class="t">!unset</span> global <span class="a"><flag|option></span></pre></div>
</div>
<div class="cmd" data-k="show setting value view">
<div class="cmd-head"><h4><span class="amp">!</span>show</h4><span class="lvl manager">Manager+</span></div>
<p>Shows the current value of any setting.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!show</span> <span class="a"><setting></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!show</span> antipub-bantime</pre></div>
</div>
<div class="cmd" data-k="enable disable command user global">
<div class="cmd-head"><h4><span class="amp">!</span>enable / <span class="amp">!</span>disable</h4><span class="lvl manager">Manager+</span></div>
<p>Enables/disables a command on the channel — for everyone or for a specific user. Masters+ can apply
it <code>global</code>ly (commands only, not users). Disabled commands show greyed-out in
<code>!h</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!disable</span> <span class="a"><command|all></span> <span class="o">[user] [global]</span>
<span class="t">!enable</span> <span class="a"><command|all></span> <span class="o">[user] [global]</span></pre></div>
<div class="code example"><span class="tag">examples</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!disable</span> k TriggerHappyOp <span class="c"># take !k away from one user</span>
<span class="t">!enable</span> all</pre></div>
</div>
<div class="cmd" data-k="ignore host bot ignore list">
<div class="cmd-head"><h4><span class="amp">!</span>ignore</h4><span class="lvl manager">Manager+</span></div>
<p>Adds, lists or removes bot-level ignores (default duration: 6h).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!ignore</span> add <span class="a"><ip|mask></span> <span class="o">[duration] [reason]</span>
<span class="t">!ignore</span> list
<span class="t">!ignore</span> del <span class="a"><ip|host></span></pre></div>
</div>
<div class="cmd" data-k="purge delete channel data manager">
<div class="cmd-head"><h4><span class="amp">!</span>purge</h4><span class="lvl manager">Manager+</span></div>
<p>Deletes the channel from the bot's channel database (manager-only variant of
<code>delchan</code>).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!purge</span> <span class="a"><#chan></span> <span class="a"><reason></span></pre></div>
</div>
<div class="cmd" data-k="addchan delchan add channel remove join key">
<div class="cmd-head"><h4><span class="amp">!</span>addchan / <span class="amp">!</span>delchan</h4><span class="lvl master">Master+</span></div>
<p>Adds a channel to the bot (it joins immediately; an optional key is used to get in) or removes
one.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!addchan</span> <span class="a"><#chan></span> <span class="o">[key]</span>
<span class="t">!delchan</span> <span class="a"><#chan></span> <span class="a"><reason></span></pre></div>
</div>
<div class="cmd" data-k="suspend unsuspend channel">
<div class="cmd-head"><h4><span class="amp">!</span>suspend / <span class="amp">!</span>unsuspend</h4><span class="lvl master">Master+</span></div>
<p>Suspends a channel — the bot leaves and won't join or act in it — or reverses that.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!suspend</span> <span class="a"><#chan></span> <span class="a"><reason></span>
<span class="t">!unsuspend</span> <span class="a"><#chan></span></pre></div>
</div>
<div class="cmd" data-k="channels list joined">
<div class="cmd-head"><h4><span class="amp">!</span>channels</h4><span class="lvl master">Master+</span></div>
<p>Lists all channels the bot is joined to (channels flagged <code>+invisible</code> are hidden from
non-boss users).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!channels</span></pre></div>
</div>
<div class="cmd" data-k="cp copy settings userlist banlist badchans channel">
<div class="cmd-head"><h4><span class="amp">!</span>cp</h4><span class="lvl owner">Owner+</span></div>
<p>Copies configuration from one channel to another.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cp</span> <span class="a"><userlist|banlist|settings|badchans></span> <span class="a"><#chan1></span> <span class="a"><#chan2></span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!cp</span> settings #channel #channel-ops</pre></div>
</div>
<div class="cmd" data-k="link chanlink synchronize bans channels">
<div class="cmd-head"><h4><span class="amp">!</span>link</h4><span class="lvl owner">Owner+</span></div>
<p>ChanLink module — synchronises bans across two or more channels: a ban added on one linked channel
is mirrored to the others (and removed everywhere on unban).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!link</span> <span class="a"><#chan1></span> <span class="a"><#chan2></span> | all
<span class="t">!link</span> del <span class="a"><#chan></span>
<span class="t">!link</span> <span class="a"><list|reset></span>
<span class="c"># then, ad hoc:</span>
<span class="t">!b</span> <span class="a"><nick|mask></span> <span class="o">[duration]</span> link <span class="o">[reason]</span>
<span class="t">!ub</span> <span class="a"><nick|mask></span> link</pre></div>
</div>
</section>
<!-- ================= BOT OWNER COMMANDS ================= -->
<section id="cmd-owner">
<h2><span class="hash">#</span>Bot owner commands</h2>
<p class="sec-intro">Bot lifecycle and shell-free administration. Boss owners can even edit
<code>eggdrop.conf</code> values straight from IRC — see <a href="#egg">Eggdrop.conf via IRC</a>.</p>
<div class="cmd" data-k="uptime status server connected">
<div class="cmd-head"><h4><span class="amp">!</span>uptime / <span class="amp">!</span>status</h4><span class="lvl master">Master+</span></div>
<p><code>!uptime</code> shows how long the bot has been up, when it connected and to which server.
<code>!status</code> shows monitored channels, total users, version and bot owner.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!uptime</span>
<span class="t">!status</span></pre></div>
</div>
<div class="cmd" data-k="die restart rehash save shutdown reload">
<div class="cmd-head"><h4><span class="amp">!</span>die · <span class="amp">!</span>restart · <span class="amp">!</span>rehash · <span class="amp">!</span>save</h4><span class="lvl boss">Boss owner</span></div>
<p><code>die</code> shuts the bot down. <code>restart</code> restarts it as a background process
(use when lagged/malfunctioning). <code>rehash</code> reloads all files after user/channel record
changes. <code>save</code> writes the user/channel files to disk.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!die</span> <span class="o">[reason]</span> · <span class="t">!restart</span> · <span class="t">!rehash</span> · <span class="t">!save</span></pre></div>
</div>
<div class="cmd" data-k="jump server change connect">
<div class="cmd-head"><h4><span class="amp">!</span>jump</h4><span class="lvl boss">Boss owner</span></div>
<p>Makes the bot connect to a different IRC server.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!jump</span> <span class="o">[irc server]</span></pre></div>
<div class="code example"><span class="tag">example</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!jump</span> Ashburn.Va.Us.UnderNet.org</pre></div>
</div>
<div class="cmd" data-k="nick change botnick">
<div class="cmd-head"><h4><span class="amp">!</span>nick</h4><span class="lvl boss">Boss owner</span></div>
<p>Changes the bot's nickname. <code>!set nick <newnick></code> makes it permanent (written to
the config).</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!nick</span> <span class="a"><newnick></span></pre></div>
</div>
<div class="cmd" data-k="login chanserv x authentication">
<div class="cmd-head"><h4><span class="amp">!</span>login</h4><span class="lvl boss">Boss owner</span></div>
<p>Manually logs the bot in to ChanServ (<code>X</code> on Undernet) using the configured
username/password. Auto-login is controlled by <code>black(autologin)</code> in
<code>BlackTools.tcl</code>.</p>
<div class="code syntax"><span class="tag">syntax</span><button class="copy" title="Copy">⧉</button><pre><span class="t">!login</span></pre></div>
</div>