Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/source/banlist.c
1069 views
1
/*
2
* this code is Copyright Colten Edwards (c) 96
3
*/
4
5
#include "irc.h"
6
static char cvsrevision[] = "$Id: banlist.c 205 2012-06-07 04:22:17Z tcava $";
7
CVS_REVISION(banlist_c)
8
#include "struct.h"
9
#include "commands.h"
10
#include "list.h"
11
#include "hook.h"
12
#include "ignore.h"
13
#include "ircaux.h"
14
#include "output.h"
15
#include "screen.h"
16
#include "server.h"
17
#include "window.h"
18
#include "who.h"
19
#include "whowas.h"
20
#include "vars.h"
21
#include "userlist.h"
22
#include "misc.h"
23
#include "timer.h"
24
#include "hash2.h"
25
#include "cset.h"
26
#define MAIN_SOURCE
27
#include "modval.h"
28
29
#ifndef Server2_8hybrid
30
#define Server2_8hybrid 5
31
#endif
32
33
int defban = 2;
34
35
static char *mode_buf = NULL;
36
static int mode_len = 0;
37
38
static char *mode_str = NULL;
39
static char *user = NULL;
40
static int mode_str_len = 0;
41
static int push_len = 0;
42
static char plus_mode[20] = "\0";
43
44
void add_mode_buffer( char *buffer, int mode_str_len)
45
{
46
47
malloc_strcat(&mode_buf, buffer);
48
mode_len += push_len;
49
}
50
51
void flush_mode(ChannelList *chan)
52
{
53
54
if (mode_buf)
55
my_send_to_server(chan?chan->server:from_server, "%s", mode_buf);
56
new_free(&mode_buf);
57
mode_len = 0;
58
}
59
60
int delay_flush_all (void *arg, char *sub)
61
{
62
char buffer[BIG_BUFFER_SIZE+1];
63
char *args = (char *)arg;
64
char *serv_num = NULL;
65
char *channel = NULL;
66
int ofs = from_server;
67
68
69
channel = next_arg(args, &args);
70
if ((serv_num = next_arg(args, &args)))
71
from_server = atoi(serv_num);
72
if (channel && *channel && mode_str && user)
73
{
74
sprintf(buffer, "MODE %s %s%s %s\r\n", channel, plus_mode, mode_str, user);
75
push_len = strlen(buffer);
76
add_mode_buffer(buffer, push_len);
77
mode_str_len = 0;
78
new_free(&mode_str);
79
new_free(&user);
80
memset(plus_mode, 0, sizeof(plus_mode));
81
push_len = 0;
82
}
83
flush_mode(NULL);
84
new_free(&arg);
85
from_server = ofs;
86
return 0;
87
}
88
89
void flush_mode_all(ChannelList *chan)
90
{
91
char buffer[BIG_BUFFER_SIZE+1];
92
93
94
if (mode_str && user)
95
{
96
sprintf(buffer, "MODE %s %s%s %s\r\n", chan->channel, plus_mode, mode_str, user);
97
push_len = strlen(buffer);
98
add_mode_buffer(buffer, push_len);
99
mode_str_len = 0;
100
new_free(&mode_str);
101
new_free(&user);
102
memset(plus_mode, 0, sizeof(plus_mode));
103
push_len = 0;
104
}
105
flush_mode(chan);
106
}
107
108
109
void add_mode(ChannelList *chan, char *mode, int plus, char *nick, char *reason, int max_modes)
110
{
111
char buffer[BIG_BUFFER_SIZE+1];
112
/*
113
KICK $C nick :reason
114
MODE $C +/-o nick
115
MODE $C +/-b userhost
116
*/
117
118
119
if (mode_len >= (IRCD_BUFFER_SIZE-100))
120
{
121
flush_mode(chan);
122
push_len = 0;
123
}
124
125
if (reason)
126
{
127
sprintf(buffer, "KICK %s %s :%s\r\n", chan->channel, nick, reason);
128
push_len = strlen(buffer);
129
add_mode_buffer(buffer, push_len);
130
}
131
else
132
{
133
mode_str_len++;
134
strcat(plus_mode, plus ? "+" : "-");
135
malloc_strcat(&mode_str, mode);
136
m_s3cat(&user, space, nick);
137
if (mode_str_len >= max_modes)
138
{
139
sprintf(buffer, "MODE %s %s%s %s\r\n", chan->channel, plus_mode, mode_str, user);
140
push_len = strlen(buffer);
141
add_mode_buffer(buffer, push_len);
142
new_free(&mode_str);
143
new_free(&user);
144
memset(plus_mode, 0, sizeof(plus_mode));
145
mode_str_len = push_len = 0;
146
}
147
}
148
}
149
150
151
BUILT_IN_COMMAND(fuckem)
152
{
153
char c;
154
ChannelList *chan;
155
int server;
156
char buffer[BIG_BUFFER_SIZE];
157
BanList *Bans;
158
if (!(chan = prepare_command(&server, NULL, NEED_OP)))
159
return;
160
for (Bans = chan->bans; Bans; Bans = Bans->next)
161
add_mode(chan, "b", 0, Bans->ban, NULL, get_int_var(NUM_BANMODES_VAR));
162
for (c = 'a'; c <= 'z'; c++)
163
{
164
sprintf(buffer, "*!*@*%c*", c);
165
add_mode(chan, "b", 1, buffer, NULL, get_int_var(NUM_BANMODES_VAR));
166
}
167
flush_mode_all(chan);
168
}
169
170
171
/*
172
* Lamer Kick! Kicks All UnOpped People from Current Channel
173
*/
174
BUILT_IN_COMMAND(LameKick)
175
{
176
char *channel = NULL;
177
ChannelList *chan;
178
NickList *tmp;
179
char *buffer = NULL;
180
char *buf2 = NULL;
181
int old_server = from_server;
182
183
184
if (args && *args && is_channel(args))
185
channel = next_arg(args, &args);
186
if ((chan = prepare_command(&from_server, channel, NEED_OP)))
187
{
188
char reason[BIG_BUFFER_SIZE+1];
189
int len_buffer = 0;
190
int count = 0;
191
int total = 0;
192
*reason = 0;
193
quote_it(args ? args : empty_string, NULL, reason);
194
malloc_sprintf(&buffer, "KICK %%s %%s :<\002BX\002-LK> %s", reason);
195
len_buffer = strlen(buffer) + 2;
196
for (tmp = next_nicklist(chan, NULL); tmp; tmp = next_nicklist(chan, tmp))
197
{
198
int level= 0;
199
if (tmp->userlist)
200
level = ((tmp->userlist->flags | 0xff) & PROT_ALL);
201
/* if (!tmp->chanop && !tmp->voice && ((tmp->userlist && !level) || !tmp->userlist))*/
202
203
if (!nick_isop(tmp) && !nick_isvoice(tmp) && ((tmp->userlist && !level) || !tmp->userlist))
204
{
205
m_s3cat(&buf2, ",", tmp->nick);
206
count++;
207
total++;
208
if (((get_int_var(NUM_KICKS_VAR)) &&
209
(count >= get_int_var(NUM_KICKS_VAR))) ||
210
(strlen(buf2) + len_buffer) >= (IRCD_BUFFER_SIZE - (NICKNAME_LEN + 5)))
211
{
212
send_to_server(buffer, chan->channel, buf2);
213
new_free(&buf2);
214
count = 0;
215
}
216
}
217
}
218
if (buf2)
219
send_to_server(buffer, chan->channel, buf2);
220
new_free(&buffer);
221
new_free(&buf2);
222
say("Sent the Server all the Lamer Kicks, Sit back and Watch %d kicks!", total);
223
}
224
from_server = old_server;
225
}
226
227
static void shitlist_erase(ShitList **clientlist)
228
{
229
ShitList *Client, *tmp;
230
231
for (Client = *clientlist; Client;)
232
{
233
new_free(&Client->filter);
234
new_free(&Client->reason);
235
tmp = Client->next;
236
new_free((char **)&Client);
237
Client = tmp;
238
}
239
*clientlist = NULL;
240
}
241
242
static char *screw(char *user)
243
{
244
char *p;
245
for (p = user; p && *p;)
246
{
247
switch(*p)
248
{
249
case '.':
250
case ':':
251
case '*':
252
case '@':
253
case '!':
254
p+=1;
255
break;
256
default:
257
*p = '?';
258
if (*(p+1) && *(p+2))
259
p+=2;
260
else
261
p++;
262
}
263
}
264
return user;
265
}
266
267
char * ban_it(char *nick, char *user, char *host, char *ip)
268
{
269
static char banstr[BIG_BUFFER_SIZE/4+1];
270
char *t = user;
271
char *t1 = user;
272
char *tmp;
273
274
*banstr = 0;
275
while (strlen(t1)>9)
276
t1++;
277
t1 = clear_server_flags(t1);
278
switch (defban)
279
{
280
case 7:
281
if (ip)
282
{
283
snprintf(banstr, sizeof banstr, "*!*@%s",
284
cluster(ip));
285
break;
286
}
287
case 2: /* Better */
288
snprintf(banstr, sizeof banstr, "*!*%s@%s", t1,
289
cluster(host));
290
break;
291
case 3: /* Host */
292
snprintf(banstr, sizeof banstr, "*!*@%s", host);
293
break;
294
case 4: /* Domain */
295
tmp = strrchr(host, '.');
296
if (tmp) {
297
snprintf(banstr, sizeof banstr, "*!*@*%s",
298
tmp);
299
} else {
300
snprintf(banstr, sizeof banstr, "*!*@%s",
301
host);
302
}
303
break;
304
case 5: /* User */
305
snprintf(banstr, sizeof banstr, "*!%s@%s", t,
306
cluster(host));
307
break;
308
case 6: /* Screw */
309
snprintf(banstr, sizeof banstr, "*!*%s@%s", t1, host);
310
screw(banstr);
311
break;
312
case 1: /* Normal */
313
default:
314
snprintf(banstr, sizeof banstr, "%s!*%s@%s", nick, t1,
315
host);
316
break;
317
}
318
return banstr;
319
}
320
321
void userhost_unban(UserhostItem *stuff, char *nick1, char *args)
322
{
323
char *tmp;
324
ChannelList *chan;
325
char *channel = NULL;
326
BanList *bans;
327
328
char *host = NULL;
329
char *ip_str = NULL;
330
WhowasList *whowas = NULL;
331
NickList *n = NULL;
332
int count = 0;
333
int old_server = from_server;
334
335
336
if (!stuff || !stuff->nick || !nick1 ||
337
!strcmp(stuff->user, "<UNKNOWN>") ||
338
my_stricmp(stuff->nick, nick1))
339
{
340
if (nick1 && (whowas = check_whowas_nick_buffer(nick1, args, 0)))
341
{
342
malloc_sprintf(&host, "%s!%s", whowas->nicklist->nick, whowas->nicklist->host);
343
bitchsay("Using WhoWas info for unban of %s ", nick1);
344
n = whowas->nicklist;
345
}
346
else if (nick1)
347
{
348
bitchsay("No match for the unban of %s on %s", nick1, args);
349
return;
350
}
351
if (!nick1)
352
return;
353
}
354
else
355
{
356
tmp = clear_server_flags(stuff->user);
357
malloc_sprintf(&host, "%s!%s@%s",stuff->nick, tmp, stuff->host);
358
}
359
360
channel = next_arg(args, &args);
361
if (args && *args)
362
from_server = atoi(args);
363
if (!(chan = prepare_command(&from_server, channel, NEED_OP)))
364
{
365
new_free(&host);
366
return;
367
}
368
if (!n)
369
n = find_nicklist_in_channellist(stuff->nick, chan, 0);
370
371
if (n && n->ip)
372
{
373
size_t len = strlen(n->nick)+strlen(n->host)+strlen(n->ip)+10;
374
ip_str = alloca(len);
375
*ip_str = 0;
376
strmopencat(ip_str, len, stuff->nick, "!", stuff->user, "@", n->ip, NULL);
377
}
378
for (bans = chan->bans; bans; bans = bans->next)
379
{
380
if (!bans->sent_unban && (wild_match(bans->ban, host) || (ip_str && wild_match(bans->ban, ip_str))) )
381
{
382
add_mode(chan, "b", 0, bans->ban, NULL, get_int_var(NUM_BANMODES_VAR));
383
bans->sent_unban++;
384
count++;
385
}
386
}
387
388
flush_mode_all(chan);
389
if (!count)
390
bitchsay("No match for Unban of %s on %s", nick1, args);
391
new_free(&host);
392
from_server = old_server;
393
}
394
395
396
void userhost_ban(UserhostItem *stuff, char *nick1, char *args)
397
{
398
char *temp;
399
char *str= NULL;
400
char *channel;
401
ChannelList *c = NULL;
402
NickList *n = NULL;
403
404
char *ob = "-o+b";
405
char *b = "+b";
406
407
char *host = NULL, *nick = NULL, *user = NULL, *chan = NULL;
408
WhowasList *whowas = NULL;
409
410
int fuck = 0;
411
int set_ignore = 0;
412
413
414
channel = next_arg(args, &args);
415
temp = next_arg(args, &args);
416
417
fuck = !my_stricmp("FUCK", args);
418
set_ignore = !my_stricmp("BKI", args);
419
420
if (!stuff || !stuff->nick || !nick1 || !strcmp(stuff->user, "<UNKNOWN>") || my_stricmp(stuff->nick, nick1))
421
{
422
if (nick1 && channel && (whowas = check_whowas_nick_buffer(nick1, channel, 0)))
423
{
424
nick = whowas->nicklist->nick;
425
user = m_strdup(clear_server_flags(whowas->nicklist->host));
426
host = strchr(user, '@');
427
*host++ = 0;
428
bitchsay("Using WhoWas info for ban of %s ", nick1);
429
n = whowas->nicklist;
430
}
431
else if (nick1)
432
{
433
bitchsay("No match for the %s of %s on %s", fuck ? "Fuck":"Ban", nick1, channel);
434
return;
435
}
436
}
437
else
438
{
439
nick = stuff->nick;
440
user = m_strdup(clear_server_flags(stuff->user));
441
host = stuff->host;
442
}
443
444
if (!(my_stricmp(nick, get_server_nickname(from_server))))
445
{
446
bitchsay("Try to kick yourself again!!");
447
new_free(&user);
448
return;
449
}
450
451
if (is_on_channel(channel, from_server, nick))
452
chan = channel;
453
c = lookup_channel(channel, from_server, 0);
454
if (c && !n)
455
n = find_nicklist_in_channellist(nick, c, 0);
456
send_to_server("MODE %s %s %s %s", channel, chan ? ob : b, chan?nick:empty_string, ban_it(nick, user, host, (n && n->ip)?n->ip:NULL));
457
if (fuck)
458
{
459
malloc_sprintf(&str, "%s!*%s@%s %s 3 Auto-Shit", nick, user, host, channel);
460
#ifdef WANT_USERLIST
461
add_shit(NULL, str, NULL, NULL);
462
#endif
463
new_free(&str);
464
} else if (set_ignore)
465
ignore_nickname(ban_it("*", user, host, NULL) , IGNORE_ALL, 0);
466
new_free(&user);
467
}
468
469
BUILT_IN_COMMAND(multkick)
470
{
471
char *to = NULL, *temp = NULL, *reason = NULL;
472
ChannelList *chan;
473
int server = from_server;
474
int filter = 0;
475
476
477
if (command && *command)
478
filter = 1;
479
480
if (!(to = next_arg(args, &args)))
481
to = NULL;
482
483
if (to && !is_channel(to))
484
{
485
temp = to;
486
if (args && *args)
487
*(temp + strlen(temp)) = ' ';
488
to = NULL;
489
}
490
else
491
temp = args;
492
493
if (!(chan = prepare_command(&server, to, NEED_OP)))
494
return;
495
496
if (!temp || !*temp)
497
return;
498
499
reason = strchr(temp, ':');
500
501
if (reason)
502
*reason++ = 0;
503
504
if (!reason || !*reason)
505
reason = get_reason(NULL, NULL);
506
507
while (temp && *temp)
508
{
509
my_send_to_server(server, "KICK %s %s :\002%s\002", chan->channel,
510
next_arg(temp, &temp), reason);
511
}
512
}
513
514
BUILT_IN_COMMAND(massdeop)
515
{
516
ChannelList *chan;
517
518
register NickList *nicks;
519
520
char *spec, *rest, *to;
521
int maxmodes, count, all = 0;
522
char buffer[BIG_BUFFER_SIZE + 1];
523
int isvoice = 0;
524
int old_server = from_server;
525
526
527
maxmodes = get_int_var(NUM_OPMODES_VAR);
528
529
if (command && !my_stricmp(command, "mdvoice"))
530
isvoice = 1;
531
532
rest = NULL;
533
spec = NULL;
534
535
if (!(to = next_arg(args, &args)))
536
to = NULL;
537
if (to && !is_channel(to))
538
{
539
spec = to;
540
to = NULL;
541
}
542
if (!(chan = prepare_command(&from_server, to, NEED_OP)))
543
return;
544
545
546
if (!spec && !(spec = next_arg(args, &args)))
547
spec = "*!*@*";
548
if (*spec == '-')
549
{
550
rest = spec;
551
spec = "*!*@*";
552
}
553
else
554
rest = args;
555
if (rest && !my_stricmp(rest, "-all"))
556
all = 1;
557
558
count = 0;
559
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
560
{
561
sprintf(buffer, "%s!%s", nicks->nick, nicks->host);
562
#if 0
563
if ((all || (!isvoice && nicks->chanop) || (isvoice && nicks->voice)) &&
564
my_stricmp(nicks->nick, get_server_nickname(from_server)) &&
565
wild_match(spec, buffer))
566
#endif
567
if ((all || (!isvoice && nick_isop(nicks)) || (isvoice && nick_isvoice(nicks))) &&
568
my_stricmp(nicks->nick, get_server_nickname(from_server)) &&
569
wild_match(spec, buffer))
570
{
571
add_mode(chan, isvoice? "v":"o", 0, nicks->nick, NULL, maxmodes);
572
count++;
573
}
574
575
}
576
flush_mode_all(chan);
577
from_server = old_server;
578
if (!count)
579
say("No matches for %s of %s on %s", command?command:"massdeop", spec, chan->channel);
580
}
581
582
BUILT_IN_COMMAND(doop)
583
{
584
char *to = NULL,
585
*temp = NULL;
586
ChannelList *chan = NULL;
587
int count,
588
max = get_int_var(NUM_OPMODES_VAR);
589
int old_server = from_server;
590
591
/* command is mode char to use - if none given, default to op */
592
if (!command)
593
command = "o";
594
595
count = 0;
596
597
if (!(to = next_arg(args, &args)))
598
to = NULL;
599
if (to && !is_channel(to))
600
{
601
temp = to;
602
to = NULL;
603
}
604
605
if (!(chan = prepare_command(&from_server, to, NEED_OP)))
606
return;
607
608
if (!temp)
609
temp = next_arg(args, &args);
610
611
while (temp && *temp)
612
{
613
count++;
614
add_mode(chan, command, 1, temp, NULL, max);
615
temp = next_arg(args, &args);
616
}
617
flush_mode_all(chan);
618
from_server = old_server;
619
}
620
621
BUILT_IN_COMMAND(dodeop)
622
{
623
char *to = NULL, *temp;
624
int count, max;
625
ChannelList *chan;
626
int server = from_server;
627
628
count = 0;
629
temp = NULL;
630
max = get_int_var(NUM_OPMODES_VAR);
631
632
/* command is mode char to use - if none given, default to deop */
633
if (!command)
634
command = "o";
635
636
if (!(to = next_arg(args, &args)))
637
to = NULL;
638
if (to && !is_channel(to))
639
{
640
temp = to;
641
to = NULL;
642
}
643
644
if (!(chan = prepare_command(&server, to, NEED_OP)))
645
return;
646
647
if (!temp)
648
temp = next_arg(args, &args);
649
650
while (temp && *temp)
651
{
652
count++;
653
add_mode(chan, command, 0, temp, NULL, max);
654
temp = next_arg(args, &args);
655
}
656
flush_mode_all(chan);
657
}
658
659
BUILT_IN_COMMAND(massop)
660
{
661
ChannelList *chan;
662
663
register NickList *nicks;
664
665
char *to = NULL,
666
*spec,
667
*rest;
668
char buffer[BIG_BUFFER_SIZE + 1];
669
670
int maxmodes = get_int_var(NUM_OPMODES_VAR),
671
count,
672
i,
673
all = 0,
674
massvoice =0;
675
int server = 0;
676
677
678
if (command)
679
massvoice = 1;
680
681
rest = NULL;
682
spec = NULL;
683
684
if (!(to = next_arg(args, &args)))
685
to = NULL;
686
if (to && !is_channel(to) )
687
{
688
spec = to;
689
to = NULL;
690
}
691
692
if (!(chan = prepare_command(&server, to, NEED_OP)))
693
return;
694
695
if (!spec && !(spec = next_arg(args, &args)))
696
spec = "*!*@*";
697
if (*spec == '-')
698
{
699
rest = spec;
700
spec = "*!*@*";
701
}
702
else
703
rest = args;
704
705
if (rest && !my_stricmp(rest, "-all"))
706
all = 1;
707
708
count = 0;
709
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
710
{
711
i = 0;
712
sprintf(buffer, "%s!%s", nicks->nick, nicks->host);
713
if ((my_stricmp(nicks->nick, get_server_nickname(from_server)) && wild_match(spec, buffer)))
714
{
715
if ((massvoice && !nick_isvoice(nicks) && !nick_isop(nicks)) || !nick_isop(nicks))
716
{
717
add_mode(chan, massvoice?"v":"o", 1, nicks->nick, NULL, maxmodes);
718
count++;
719
}
720
}
721
}
722
flush_mode_all(chan);
723
if (!count)
724
say("No matches for %s of %s on %s", command? command : "massop", spec, chan->channel);
725
}
726
727
BUILT_IN_COMMAND(masskick)
728
{
729
ChannelList *chan;
730
register NickList *nicks;
731
ShitList *masskick_list = NULL, *new = NULL;
732
char *to, *spec, *rest, *buffer = NULL, *q;
733
int server = from_server;
734
735
int all = 0;
736
int ops = 0;
737
738
739
rest = NULL;
740
spec = NULL;
741
742
if (!(to = next_arg(args, &args)))
743
to = NULL;
744
745
if (to && !is_channel(to))
746
{
747
spec = to;
748
to = NULL;
749
}
750
751
if (!(chan = prepare_command(&server, to, NEED_OP)))
752
return;
753
754
if (spec && !strncmp(spec, "-all", 4))
755
{
756
all = 1;
757
spec = next_arg(args, &args);
758
}
759
760
if (spec && !strncmp(spec, "-ops", 4))
761
{
762
ops = 1;
763
spec = next_arg(args, &args);
764
}
765
if (!spec)
766
return;
767
rest = args;
768
if (rest && !*rest)
769
rest = NULL;
770
771
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
772
{
773
int doit = 0;
774
q = clear_server_flags(nicks->host);
775
malloc_sprintf(&buffer, "%s!*%s", nicks->nick, q);
776
if (all)
777
doit = 1;
778
else if (ops && nick_isop(nicks))
779
doit = 1;
780
else if (!nick_isop(nicks))
781
doit = 1;
782
else if (get_cset_int_var(chan->csets, KICK_OPS_CSET))
783
doit = 1;
784
if (doit && !isme(nicks->nick) && (wild_match(spec, buffer) || wild_match(nicks->nick, spec)))
785
#if 0
786
if ((all || (ops && nicks->chanop) || !nicks->chanop || get_cset_int_var(chan->csets, KICK_OPS_CSET)) &&
787
my_stricmp(nicks->nick, get_server_nickname(from_server)) &&
788
(wild_match(spec, buffer) || wild_match(nicks->nick, spec)))
789
#endif
790
{
791
new = (ShitList *)new_malloc(sizeof(ShitList));
792
malloc_sprintf(&new->filter, "%s", nicks->nick);
793
add_to_list((List **)&masskick_list, (List *)new);
794
}
795
new_free(&buffer);
796
}
797
798
if (masskick_list)
799
{
800
int len = 0, num = 0;
801
char *send_buf = NULL;
802
char buf[BIG_BUFFER_SIZE + 1];
803
char reason[BIG_BUFFER_SIZE+1];
804
*reason = 0;
805
quote_it(rest ? rest : "MassKick", NULL, reason);
806
bitchsay("Performing (%s) Mass Kick on %s", all? "opz/non-opz" : ops ? "ops":"non-opz", chan->channel);
807
sprintf(buf, "KICK %%s %%s :\002%s\002", reason);
808
len = strlen(buf);
809
for (new = masskick_list; new; new = new->next)
810
{
811
send_buf = m_s3cat(&send_buf, ",", new->filter);
812
num++;
813
if ((get_int_var(NUM_KICKS_VAR) && (num == get_int_var(NUM_KICKS_VAR))) || (strlen(send_buf)+len) >= (IRCD_BUFFER_SIZE - (NICKNAME_LEN + 5)))
814
{
815
num = 0;
816
send_to_server(buf, chan->channel, send_buf);
817
new_free(&send_buf);
818
}
819
}
820
if (send_buf)
821
send_to_server(buf, chan->channel, send_buf);
822
new_free(&send_buf);
823
shitlist_erase(&masskick_list);
824
}
825
else
826
bitchsay("No matches for mass kick of %s on %s", spec, chan->channel);
827
}
828
829
BUILT_IN_COMMAND(mknu)
830
{
831
ChannelList *chan;
832
NickList *nicks;
833
char *to = NULL, *rest;
834
int count;
835
int server = from_server;
836
int kickops;
837
838
if (args && (is_channel(args) || !strncmp(args, "* ", 2) || !strcmp(args, "*")))
839
to = next_arg(args, &args);
840
841
if (!(chan = prepare_command(&server, to, NEED_OP)))
842
return;
843
844
rest = args;
845
if (rest && !*rest)
846
rest = NULL;
847
848
kickops = get_cset_int_var(chan->csets, KICK_OPS_CSET);
849
count = 0;
850
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
851
{
852
if (nicks->userlist || (nick_isop(nicks) && !kickops) || isme(nicks->nick))
853
continue;
854
count++;
855
send_to_server("KICK %s %s :(non-users) \002%s\002", chan->channel, nicks->nick, rest ? rest : get_reason(nicks->nick, NULL));
856
}
857
if (!count)
858
say("No matches for masskick of non-users on %s", chan->channel);
859
}
860
861
BUILT_IN_COMMAND(masskickban)
862
{
863
ChannelList *chan;
864
register NickList *nicks;
865
char *to = NULL, *spec, *rest;
866
int count, all = 0;
867
int server = from_server;
868
char buffer[BIG_BUFFER_SIZE + 1];
869
char tempbuf[BIG_BUFFER_SIZE+1];
870
871
872
rest = NULL;
873
spec = NULL;
874
875
if (!(to = next_arg(args, &args)))
876
to = NULL;
877
if (to && !is_channel(to))
878
{
879
spec = to;
880
to = NULL;
881
}
882
883
if (!(chan = prepare_command(&server,to, NEED_OP)))
884
return;
885
886
if (!spec && !(spec = next_arg(args, &args)))
887
return;
888
if (args && !strncmp(args, "-all", 4))
889
{
890
all = 1;
891
next_arg(args, &args);
892
}
893
rest = args;
894
if (rest && !*rest)
895
rest = NULL;
896
897
count = 0;
898
if (!strchr(spec, '!'))
899
{
900
strcpy(tempbuf, "*!");
901
if (!strchr(spec, '@'))
902
strcat(tempbuf, "*@");
903
strcat(tempbuf, spec);
904
}
905
else
906
strcpy(tempbuf, spec);
907
908
send_to_server("MODE %s +b %s", chan->channel, tempbuf);
909
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
910
{
911
*buffer = '\0';
912
strmopencat(buffer, IRCD_BUFFER_SIZE, nicks->nick, "!", nicks->host, NULL);
913
if ((all || !nick_isop(nicks) || get_cset_int_var(chan->csets, KICK_OPS_CSET)) &&
914
!isme(nicks->nick) && wild_match(tempbuf, buffer))
915
{
916
count++;
917
send_to_server("KICK %s %s :(%s) \002%s\002", chan->channel, nicks->nick, spec, rest ? rest : get_reason(nicks->nick, NULL));
918
}
919
}
920
if (!count)
921
say("No matches for masskickban of %s on %s", spec, chan->channel);
922
}
923
924
BUILT_IN_COMMAND(massban)
925
{
926
ChannelList *chan;
927
register NickList *nicks;
928
ShitList *massban_list = NULL, *tmp;
929
char *to = NULL, *spec, *rest;
930
char *buffer = NULL;
931
int server = from_server;
932
933
int maxmodes, all = 0;
934
935
936
maxmodes = get_int_var(NUM_BANMODES_VAR);
937
938
rest = NULL;
939
spec = NULL;
940
941
if (!(to = next_arg(args, &args)))
942
to = NULL;
943
if (to && !is_channel(to))
944
{
945
spec = to;
946
to = NULL;
947
}
948
949
if (!(chan = prepare_command(&server, to, NEED_OP)))
950
return;
951
952
if (!spec && !(spec = next_arg(args, &args)))
953
spec = "*!*@*";
954
if (*spec == '-')
955
{
956
rest = spec;
957
spec = "*!*@*";
958
}
959
else
960
rest = args;
961
962
if (rest && !my_stricmp(rest, "-all"))
963
all = 1;
964
965
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
966
{
967
new_free(&buffer);
968
malloc_sprintf(&buffer, "%s!%s", nicks->nick, nicks->host);
969
970
if ((all || !nick_isop(nicks) || get_cset_int_var(chan->csets, KICK_OPS_CSET)) &&
971
!isme(nicks->nick) && wild_match(spec, buffer))
972
{
973
char *temp = NULL;
974
char *p, *q;
975
ShitList *new;
976
temp = LOCAL_COPY(nicks->host);
977
978
q = clear_server_flags(temp);
979
p = strchr(temp, '@');
980
*p++ = 0;
981
982
new = (ShitList *)new_malloc(sizeof(ShitList));
983
malloc_sprintf(&new->filter, "*!*%s@%s ", q, cluster(p));
984
add_to_list((List **)&massban_list, (List *)new);
985
}
986
}
987
new_free(&buffer);
988
if (massban_list)
989
{
990
char modestr[100];
991
int i = 0;
992
993
bitchsay("Performing Mass Bans on %s", chan->channel);
994
for (tmp = massban_list; tmp; tmp = tmp->next)
995
{
996
malloc_strcat(&buffer, tmp->filter);
997
modestr[i] = 'b';
998
i++;
999
if (i > maxmodes)
1000
{
1001
modestr[i] = '\0';
1002
send_to_server("MODE %s +%s %s", chan->channel, modestr, buffer);
1003
i = 0;
1004
new_free(&buffer);
1005
}
1006
}
1007
modestr[i] = '\0';
1008
if (buffer && *buffer)
1009
{
1010
send_to_server("MODE %s +%s %s", chan->channel, modestr, buffer);
1011
new_free(&buffer);
1012
}
1013
shitlist_erase(&massban_list);
1014
} else
1015
say("No matches for massban of %s on %s", spec, chan->channel);
1016
}
1017
1018
BUILT_IN_COMMAND(unban)
1019
{
1020
char *to, *spec, *host;
1021
ChannelList *chan;
1022
BanList *bans;
1023
int count = 0;
1024
int server = from_server;
1025
1026
1027
to = spec = host = NULL;
1028
1029
if (!(to = new_next_arg(args, &args)))
1030
to = NULL;
1031
if (to && !is_channel(to))
1032
{
1033
spec = to;
1034
to = NULL;
1035
}
1036
1037
if (!(chan = prepare_command(&server, to, NEED_OP)))
1038
return;
1039
1040
set_display_target(chan->channel, LOG_CRAP);
1041
if (!spec && !(spec = next_arg(args, &args)))
1042
{
1043
spec = "*";
1044
host = "*@*";
1045
}
1046
1047
if (spec && *spec == '#')
1048
{
1049
count = atoi(spec);
1050
}
1051
if (!strchr(spec, '*'))
1052
{
1053
userhostbase(spec, userhost_unban, 1, "%s %d", chan->channel, current_window->refnum);
1054
reset_display_target();
1055
return;
1056
}
1057
1058
if (count)
1059
{
1060
int tmp = 1;
1061
for (bans = chan->bans; bans; bans = bans->next)
1062
{
1063
if (tmp == count)
1064
{
1065
if (bans->sent_unban == 0)
1066
{
1067
send_to_server("MODE %s -b %s", chan->channel, bans->ban);
1068
bans->sent_unban++;
1069
tmp = 0;
1070
break;
1071
}
1072
} else
1073
tmp++;
1074
}
1075
if (tmp != 0)
1076
count = 0;
1077
}
1078
else
1079
{
1080
char *banstring = NULL;
1081
int num = 0;
1082
count = 0;
1083
for (bans = chan->bans; bans; bans = bans->next)
1084
{
1085
if (wild_match(bans->ban, spec) || wild_match(spec, bans->ban))
1086
{
1087
if (bans->sent_unban == 0)
1088
{
1089
m_s3cat(&banstring, space, bans->ban);
1090
bans->sent_unban++;
1091
count++;
1092
num++;
1093
}
1094
}
1095
if (count && (count % get_int_var(NUM_BANMODES_VAR) == 0))
1096
{
1097
send_to_server("MODE %s -%s %s", chan->channel, strfill('b', num), banstring);
1098
new_free(&banstring);
1099
num = 0;
1100
}
1101
}
1102
if (banstring && num)
1103
send_to_server("MODE %s -%s %s", chan->channel, strfill('b', num), banstring);
1104
new_free(&banstring);
1105
}
1106
if (!count)
1107
bitchsay("No ban matching %s found", spec);
1108
reset_display_target();
1109
}
1110
1111
BUILT_IN_COMMAND(dokick)
1112
{
1113
char *to = NULL,
1114
*spec = NULL,
1115
*reason = NULL;
1116
ChannelList *chan;
1117
int server = from_server;
1118
1119
1120
if (!(to = next_arg(args, &args)))
1121
to = NULL;
1122
1123
if (to && !is_channel(to))
1124
{
1125
spec = to;
1126
to = NULL;
1127
}
1128
1129
if (!(chan = prepare_command(&server, (to && !strcmp(to, "*"))? NULL : to, NEED_OP)))
1130
return;
1131
set_display_target(chan->channel, LOG_KICK);
1132
1133
if (!spec && !(spec = next_arg(args, &args)))
1134
return;
1135
if (args && *args)
1136
reason = args;
1137
else
1138
reason = get_reason(spec, NULL);
1139
1140
send_to_server("KICK %s %s :%s", chan->channel, spec, reason);
1141
reset_display_target();
1142
}
1143
1144
BUILT_IN_COMMAND(kickban)
1145
{
1146
char *to = NULL,
1147
*tspec = NULL,
1148
*spec = NULL,
1149
*tnick = NULL,
1150
*rest = NULL;
1151
1152
ChannelList *chan;
1153
NickList *nicks;
1154
int count = 0;
1155
int server = from_server;
1156
int set_ignore = 0;
1157
int kick_first = 0;
1158
time_t time = 0;
1159
1160
1161
if (!(to = next_arg(args, &args)))
1162
to = NULL;
1163
1164
if (to && !is_channel(to))
1165
{
1166
spec = to;
1167
to = NULL;
1168
}
1169
1170
if (!(chan = prepare_command(&server, to, NEED_OP)))
1171
return;
1172
set_display_target(chan->channel, LOG_KICK);
1173
if (command)
1174
{
1175
if (!strstr(command, "KB"))
1176
kick_first = 1;
1177
set_ignore = (command[strlen(command)-1] == 'I') ? 1 : 0;
1178
}
1179
if (!spec && !(spec = new_next_arg(args, &args)))
1180
{
1181
reset_display_target();
1182
return;
1183
}
1184
if (command && (!my_stricmp(command, "TBK") || !my_stricmp(command, "TKB")))
1185
{
1186
char *string_time;
1187
time = get_cset_int_var(chan->csets, BANTIME_CSET);
1188
if ((string_time = next_arg(args, &args)))
1189
time = atoi(string_time);
1190
malloc_sprintf(&rest, "Timed kickban for %s", convert_time(time));
1191
rest = args;
1192
if (rest && !*rest)
1193
rest = NULL;
1194
}
1195
else
1196
{
1197
rest = args;
1198
if (rest && !*rest)
1199
rest = NULL;
1200
}
1201
tspec = alloca(strlen(spec)+1);
1202
strcpy(tspec, spec);
1203
while ((tnick = next_in_comma_list(tspec, &tspec)))
1204
{
1205
int exact = 1;
1206
if (!tnick || !*tnick) break;
1207
exact = strchr(tnick, '*') ? 0 : 1;
1208
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
1209
{
1210
char *p, *user, *host;
1211
if (isme(nicks->nick))
1212
continue;
1213
if (exact && my_stricmp(nicks->nick, tnick))
1214
continue;
1215
else if (!exact && !wild_match(tnick, nicks->nick))
1216
continue;
1217
p = LOCAL_COPY(nicks->host);
1218
user = clear_server_flags(p);
1219
host = strchr(user, '@');
1220
*host++ = 0;
1221
if (kick_first)
1222
send_to_server("KICK %s %s :%s\r\nMODE %s +b %s",
1223
chan->channel, nicks->nick, rest ? rest : get_reason(nicks->nick, NULL),
1224
chan->channel, ban_it(nicks->nick, user, host, nicks->ip));
1225
else
1226
send_to_server("MODE %s -o+b %s %s\r\nKICK %s %s :%s",
1227
chan->channel, nicks->nick, ban_it(nicks->nick, user, host, nicks->ip),
1228
chan->channel, nicks->nick, rest ? rest : get_reason(nicks->nick, NULL));
1229
count++;
1230
if (command && (!my_stricmp(command, "TKB") || !my_stricmp(command, "TBK")))
1231
add_timer(0, empty_string, time*1000, 1, timer_unban, m_sprintf("%d %s %s", from_server, chan->channel, ban_it(nicks->nick, user, host, nicks->ip)), NULL, -1, "timed-unban");
1232
else if (command && !my_stricmp(command, "FUCK"))
1233
{
1234
char *temp = NULL;
1235
malloc_sprintf(&temp, "%s!*%s@%s %s 3 Auto-Shit", nicks->nick, user, host, chan->channel);
1236
#ifdef WANT_USERLIST
1237
add_shit(NULL, temp, NULL, NULL);
1238
#endif
1239
new_free(&temp);
1240
} else if (set_ignore)
1241
ignore_nickname(ban_it("*", user, host, NULL), IGNORE_ALL, 0);
1242
}
1243
}
1244
if (!count && !isme(spec))
1245
userhostbase(spec, userhost_ban, 1, "%s %s %s", chan->channel, spec, command ? (!strcmp(command, "FUCK") ? "FUCK": set_ignore ? "BKI":empty_string):empty_string);
1246
reset_display_target();
1247
}
1248
1249
BUILT_IN_COMMAND(ban)
1250
{
1251
char *to = NULL,
1252
*spec = NULL,
1253
*rest = NULL;
1254
ChannelList *chan;
1255
NickList *nicks;
1256
int server = from_server;
1257
int found = 0;
1258
1259
1260
if (!(to = next_arg(args, &args)))
1261
to = NULL;
1262
1263
if (to && !is_channel(to))
1264
{
1265
spec = to;
1266
to = NULL;
1267
}
1268
1269
if (!(chan = prepare_command(&server, to, NEED_OP)))
1270
return;
1271
1272
if (!spec && !(spec = new_next_arg(args, &args)))
1273
return;
1274
rest = args;
1275
1276
if (rest && !*rest)
1277
rest = NULL;
1278
1279
for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks))
1280
{
1281
if (!my_stricmp(spec, nicks->nick))
1282
{
1283
char *t, *host, *user;
1284
t = LOCAL_COPY(nicks->host);
1285
user = clear_server_flags(t);
1286
host = strchr(user, '@');
1287
*host++ = 0;
1288
1289
send_to_server("MODE %s -o+b %s %s", chan->channel, nicks->nick, ban_it(nicks->nick, user, host, nicks->ip));
1290
found++;
1291
1292
}
1293
}
1294
if (!found)
1295
{
1296
if (strchr(spec, '!') && strchr(spec, '@'))
1297
send_to_server("MODE %s +b %s", chan->channel, spec);
1298
else
1299
userhostbase(spec, userhost_ban, 1, "%s %s", chan->channel, spec);
1300
}
1301
}
1302
1303
BUILT_IN_COMMAND(banstat)
1304
{
1305
char *channel = NULL, *tmp = NULL, *check = NULL;
1306
ChannelList *chan;
1307
BanList *tmpc;
1308
int count = 1;
1309
int server;
1310
1311
1312
if (args && *args)
1313
{
1314
tmp = next_arg(args, &args);
1315
if (*tmp == '#' && is_channel(tmp))
1316
malloc_strcpy(&channel, tmp);
1317
else
1318
malloc_strcpy(&check, tmp);
1319
if (args && *args && channel)
1320
{
1321
tmp = next_arg(args, &args);
1322
malloc_strcpy(&check, tmp);
1323
}
1324
}
1325
1326
if ((chan = prepare_command(&server, channel, NO_OP)))
1327
{
1328
if (!chan->bans && !chan->exemptbans)
1329
{
1330
bitchsay("No bans on %s", chan->channel);
1331
return;
1332
}
1333
if (chan->bans)
1334
{
1335
if ((do_hook(BANS_HEADER_LIST, "%s %s %s %s %s", "#", "Channel", "Ban", "SetBy", "Seconds")))
1336
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_HEADER_FSET), NULL));
1337
for (tmpc = chan->bans; tmpc; tmpc = tmpc->next, count++)
1338
{
1339
if (check && (!wild_match(check, tmpc->ban) || !wild_match(tmpc->ban, check)))
1340
continue;
1341
if (do_hook(BANS_LIST, "%d %s %s %s %lu", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time))
1342
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time));
1343
}
1344
if (do_hook(BANS_FOOTER_LIST, "%d %s", count, chan->channel))
1345
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FOOTER_FSET), "%d %s", count, chan->channel));
1346
}
1347
if (chan->exemptbans)
1348
{
1349
count = 1;
1350
if ((do_hook(EBANS_HEADER_LIST, "%s %s %s %s %s", "#", "Channel", "ExBan", "SetBy", "Seconds")))
1351
put_it("%s", convert_output_format(fget_string_var(FORMAT_EBANS_HEADER_FSET), NULL));
1352
for (tmpc = chan->exemptbans; tmpc; tmpc = tmpc->next, count++)
1353
{
1354
if (check && (!wild_match(check, tmpc->ban) || !wild_match(tmpc->ban, check)))
1355
continue;
1356
if (do_hook(EBANS_LIST, "%d %s %s %s %lu", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time))
1357
put_it("%s", convert_output_format(fget_string_var(FORMAT_EBANS_FSET), "%d %s %s %s %l", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time));
1358
}
1359
if (do_hook(EBANS_FOOTER_LIST, "%d %s", count, chan->channel))
1360
put_it("%s", convert_output_format(fget_string_var(FORMAT_EBANS_FOOTER_FSET), "%d %s", count, chan->channel));
1361
}
1362
new_free(&check);
1363
new_free(&channel);
1364
}
1365
else if (channel)
1366
send_to_server("MODE %s b", channel);
1367
}
1368
1369
void remove_bans (char *stuff, char *line)
1370
{
1371
ChannelList *chan;
1372
int count = 1;
1373
BanList *tmpc, *next;
1374
char *banstring = NULL;
1375
int num = 0;
1376
int server = from_server;
1377
1378
1379
if (stuff && (chan = prepare_command(&server, stuff, NEED_OP)))
1380
{
1381
int done = 0;
1382
if (!chan->bans)
1383
{
1384
bitchsay("No bans on %s", stuff);
1385
return;
1386
}
1387
1388
for (tmpc = chan->bans; tmpc; tmpc = tmpc->next, count++)
1389
if (!tmpc->sent_unban && (matchmcommand(line, count)))
1390
{
1391
malloc_strcat(&banstring, tmpc->ban);
1392
malloc_strcat(&banstring, space);
1393
num++;
1394
tmpc->sent_unban++;
1395
if (num % get_int_var(NUM_BANMODES_VAR) == 0)
1396
{
1397
send_to_server("MODE %s -%s %s", stuff, strfill('b', num), banstring);
1398
new_free(&banstring);
1399
num = 0;
1400
}
1401
done++;
1402
}
1403
if (banstring && num)
1404
send_to_server("MODE %s -%s %s", stuff, strfill('b', num), banstring);
1405
new_free(&banstring);
1406
num = 0;
1407
if (!done)
1408
{
1409
for (tmpc = chan->exemptbans; tmpc; tmpc = tmpc->next, count++)
1410
if (!tmpc->sent_unban && (matchmcommand(line, count)))
1411
{
1412
malloc_strcat(&banstring, tmpc->ban);
1413
malloc_strcat(&banstring, space);
1414
num++;
1415
tmpc->sent_unban++;
1416
if (num % get_int_var(NUM_BANMODES_VAR) == 0)
1417
{
1418
send_to_server("MODE %s -%s %s", stuff, strfill('e', num), banstring);
1419
new_free(&banstring);
1420
num = 0;
1421
}
1422
done++;
1423
}
1424
}
1425
if (banstring && num)
1426
send_to_server("MODE %s -%s %s", stuff, strfill('b', num), banstring);
1427
for (tmpc = chan->bans; tmpc; tmpc = next)
1428
{
1429
next = tmpc->next;
1430
if (tmpc->sent_unban)
1431
{
1432
if ((tmpc = (BanList *)remove_from_list((List**)&chan->bans, tmpc->ban)))
1433
{
1434
new_free(&tmpc->ban);
1435
new_free(&tmpc->setby);
1436
new_free((char **)&tmpc);
1437
tmpc = NULL;
1438
}
1439
}
1440
}
1441
for (tmpc = chan->exemptbans; tmpc; tmpc = next)
1442
{
1443
next = tmpc->next;
1444
if (tmpc->sent_unban)
1445
{
1446
if ((tmpc = (BanList *)remove_from_list((List**)&chan->exemptbans, tmpc->ban)))
1447
{
1448
new_free(&tmpc->ban);
1449
new_free(&tmpc->setby);
1450
new_free((char **)&tmpc);
1451
tmpc = NULL;
1452
}
1453
}
1454
}
1455
new_free(&banstring);
1456
}
1457
}
1458
1459
BUILT_IN_COMMAND(tban)
1460
{
1461
ChannelList *chan;
1462
int count = 1;
1463
BanList *tmpc;
1464
int server;
1465
1466
1467
if ((chan = prepare_command(&server, NULL, NEED_OP)))
1468
{
1469
1470
if (!chan->bans)
1471
{
1472
bitchsay("No bans on %s", chan->channel);
1473
return;
1474
}
1475
if ((do_hook(BANS_HEADER_LIST, "%s %s %s %s %s", "#", "Channel", "Ban", "SetBy", "Seconds")))
1476
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_HEADER_FSET), NULL));
1477
for (tmpc = chan->bans; tmpc; tmpc = tmpc->next, count++)
1478
if (do_hook(BANS_LIST, "%d %s %s %s %lu", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time))
1479
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time));
1480
for (tmpc = chan->exemptbans; tmpc; tmpc = tmpc->next, count++)
1481
if (do_hook(BANS_LIST, "%d %s %s %s %lu", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time))
1482
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", count, chan->channel, tmpc->ban, tmpc->setby?tmpc->setby:get_server_name(from_server), (unsigned long)tmpc->time));
1483
add_wait_prompt("Which ban to delete (-2, 2-5, ...) ? ", remove_bans, chan->channel, WAIT_PROMPT_LINE, 1);
1484
}
1485
}
1486
1487
static const char *bantypes[] = { "*Unknown*", "\002N\002ormal",
1488
"\002B\002etter", "\002H\002ost", "\002D\002omain",
1489
"\002U\002ser", "\002S\002crew", "\002I\002P" };
1490
1491
static void set_default_bantype(char value, char *helparg)
1492
{
1493
switch(toupper(value))
1494
{
1495
case 'B':
1496
defban = 2;
1497
break;
1498
case 'H':
1499
defban = 3;
1500
break;
1501
case 'D':
1502
defban = 4;
1503
break;
1504
case 'I':
1505
defban = 7;
1506
break;
1507
case 'S':
1508
defban = 6;
1509
break;
1510
case 'U':
1511
defban = 5;
1512
break;
1513
case 'N':
1514
defban = 1;
1515
break;
1516
default :
1517
return;
1518
}
1519
bitchsay("BanType set to %s",
1520
bantypes[defban >= 1 && defban <= 7 ? defban : 0]);
1521
}
1522
1523
BUILT_IN_COMMAND(bantype)
1524
{
1525
if (args && *args)
1526
set_default_bantype(*args, helparg);
1527
else
1528
bitchsay("Current BanType is %s",
1529
bantypes[defban >= 1 && defban <= 7 ? defban : 0]);
1530
}
1531
1532