259
265
case FLOOD_NOTICE:
261
267
/* Flooding chan! either by public or notice */
262
if (me_op(chan) && !chan_sentkick(m)) {
263
putlog(LOG_MODES, chan->dname, IRC_FLOODKICK, floodnick);
264
dprintf(DP_MODE, "KICK %s %s :%s\n", chan->name, floodnick,
266
m->flags |= SENTKICK;
268
if (!chan_sentkick(m) &&
269
(me_op(chan) || (me_halfop(chan) && !chan_hasop(m)))) {
270
putlog(LOG_MODES, chan->dname, IRC_FLOODKICK, floodnick);
271
dprintf(DP_MODE, "KICK %s %s :%s\n", chan->name, floodnick, CHAN_FLOOD);
272
m->flags |= SENTKICK;
272
(u_match_mask(global_exempts, from) ||
273
u_match_mask(chan->exempts, from)))
277
if (use_exempts && (u_match_mask(global_exempts, from) ||
278
u_match_mask(chan->exempts, from)))
275
280
simple_sprintf(h, "*!*@%s", p);
276
if (!isbanned(chan, h) && me_op(chan)) {
277
check_exemptlist(chan, from);
278
do_mask(chan, chan->channel.ban, h, 'b');
281
if (!isbanned(chan, h) && (me_op(chan) || me_halfop(chan))) {
282
check_exemptlist(chan, from);
283
do_mask(chan, chan->channel.ban, h, 'b');
280
if ((u_match_mask(global_bans, from))
281
|| (u_match_mask(chan->bans, from)))
282
return 1; /* Already banned */
285
if ((u_match_mask(global_bans, from)) ||
286
(u_match_mask(chan->bans, from)))
287
return 1; /* Already banned */
283
288
if (which == FLOOD_JOIN)
284
putlog(LOG_MISC | LOG_JOIN, chan->dname, IRC_FLOODIGNORE3, p);
289
putlog(LOG_MISC | LOG_JOIN, chan->dname, IRC_FLOODIGNORE3, p);
286
putlog(LOG_MISC | LOG_JOIN, chan->dname, IRC_FLOODIGNORE4, p);
291
putlog(LOG_MISC | LOG_JOIN, chan->dname, IRC_FLOODIGNORE4, p);
287
292
strcpy(ftype + 4, " flood");
288
u_addban(chan, h, botnetnick, ftype, now + (60 * ban_time), 0);
289
if (!channel_enforcebans(chan) && me_op(chan)) {
291
for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
292
sprintf(s, "%s!%s", m->nick, m->userhost);
293
if (wild_match(h, s) &&
294
(m->joined >= chan->floodtime[which]) &&
295
!chan_sentkick(m) && !match_my_nick(m->nick)) {
296
m->flags |= SENTKICK;
297
if (which == FLOOD_JOIN)
298
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, m->nick,
301
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, m->nick,
293
u_addban(chan, h, botnetnick, ftype, now + (60 * chan->ban_time), 0);
294
if (!channel_enforcebans(chan) && (me_op(chan) || me_halfop(chan))) {
297
for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
298
sprintf(s, "%s!%s", m->nick, m->userhost);
299
if (wild_match(h, s) && (m->joined >= chan->floodtime[which]) &&
300
!chan_sentkick(m) && !match_my_nick(m->nick) && (me_op(chan) ||
301
(me_halfop(chan) && !chan_hasop(m)))) {
302
m->flags |= SENTKICK;
303
if (which == FLOOD_JOIN)
304
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, m->nick,
307
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, m->nick,
308
if (me_op(chan) && !chan_sentkick(m)) {
309
putlog(LOG_MODES, chan->dname, "Kicking %s, for mass kick.", floodnick);
310
dprintf(DP_MODE, "KICK %s %s :%s\n", chan->name, floodnick,
312
m->flags |= SENTKICK;
314
if ((me_op(chan) || (me_halfop(chan) && !chan_hasop(m))) &&
316
putlog(LOG_MODES, chan->dname, "Kicking %s, for mass kick.", floodnick);
317
dprintf(DP_MODE, "KICK %s %s :%s\n", chan->name, floodnick,
319
m->flags |= SENTKICK;
316
if (me_op(chan) && !chan_sentkick(m)) {
317
putlog(LOG_MODES, chan->dname,
318
CHAN_MASSDEOP, chan->dname, from);
319
dprintf(DP_MODE, "KICK %s %s :%s\n",
320
chan->name, floodnick, CHAN_MASSDEOP_KICK);
321
m->flags |= SENTKICK;
323
if ((me_op(chan) || (me_halfop(chan) && !chan_hasop(m))) &&
325
putlog(LOG_MODES, chan->dname, CHAN_MASSDEOP, chan->dname, from);
326
dprintf(DP_MODE, "KICK %s %s :%s\n",
327
chan->name, floodnick, CHAN_MASSDEOP_KICK);
328
m->flags |= SENTKICK;
342
347
/* Kick any user (except friends/masters) with certain mask from channel
343
348
* with a specified comment. Ernst 18/3/1998
345
static void kick_all(struct chanset_t *chan, char *hostmask, char *comment, int bantype)
350
static void kick_all(struct chanset_t *chan, char *hostmask, char *comment,
348
354
char kicknick[512], s[UHOSTLEN];
349
struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
355
struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
350
356
int k, l, flushed;
358
if (!me_op(chan) && !me_halfop(chan))
357
364
for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
358
365
sprintf(s, "%s!%s", m->nick, m->userhost);
359
366
get_user_flagrec(m->user ? m->user : get_user_by_host(s), &fr, chan->dname);
360
if (wild_match(hostmask, s) && !chan_sentkick(m) &&
361
!match_my_nick(m->nick) && !chan_issplit(m) &&
362
!glob_friend(fr) && !chan_friend(fr) &&
364
((bantype && isexempted(chan, s)) ||
365
(u_match_mask(global_exempts,s) ||
366
u_match_mask(chan->exempts, s)))) &&
367
!(channel_dontkickops(chan) &&
368
(chan_op(fr) || (glob_op(fr) && !chan_deop(fr))))) { /* arthur2 */
367
if ((me_op(chan) || (me_halfop(chan) && !chan_hasop(m))) &&
368
wild_match(hostmask, s) && !chan_sentkick(m) &&
369
!match_my_nick(m->nick) && !chan_issplit(m) &&
370
!glob_friend(fr) && !chan_friend(fr) && !(use_exempts && ((bantype &&
371
isexempted(chan, s)) || (u_match_mask(global_exempts, s) ||
372
u_match_mask(chan->exempts, s)))) && !(channel_dontkickops(chan) &&
373
(chan_op(fr) || (glob_op(fr) && !chan_deop(fr))))) {
370
/* We need to kick someone, flush eventual bans first */
371
flush_mode(chan, QUICK);
375
/* We need to kick someone, flush eventual bans first */
376
flush_mode(chan, QUICK);
374
m->flags |= SENTKICK; /* Mark as pending kick */
379
m->flags |= SENTKICK; /* Mark as pending kick */
376
strcat(kicknick, ",");
381
strcat(kicknick, ",");
377
382
strcat(kicknick, m->nick);
379
384
l = strlen(chan->name) + strlen(kicknick) + strlen(comment) + 5;
380
385
if ((kick_method != 0 && k == kick_method) || (l > 480)) {
381
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, kicknick, comment);
386
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, kicknick, comment);
393
398
static void refresh_ban_kick(struct chanset_t *chan, char *user, char *nick)
399
404
m = ismember(chan, nick);
405
if (!m || chan_sentkick(m))
402
/* Check global bans in first cycle and channel bans
408
/* Check global bans in first cycle and channel bans in second cycle. */
404
409
for (cycle = 0; cycle < 2; cycle++) {
405
410
for (b = cycle ? chan->bans : global_bans; b; b = b->next) {
406
411
if (wild_match(b->mask, user)) {
407
struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
408
char c[512]; /* The ban comment. */
412
struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
413
char c[512]; /* The ban comment. */
411
sprintf(s, "%s!%s", m->nick, m->userhost);
412
get_user_flagrec(m->user ? m->user : get_user_by_host(s), &fr,
414
if (!glob_friend(fr) && !chan_friend(fr))
415
add_mode(chan, '-', 'o', nick); /* Guess it can't hurt. */
416
check_exemptlist(chan, user);
417
do_mask(chan, chan->channel.ban, b->mask, 'b');
419
if (b->desc && b->desc[0] != '@')
420
egg_snprintf(c, sizeof c, "%s%s", IRC_PREBANNED, b->desc);
423
kick_all(chan, b->mask, c[0] ? c : IRC_YOUREBANNED, 0);
424
return; /* Drop out on 1st ban. */
416
sprintf(s, "%s!%s", m->nick, m->userhost);
417
get_user_flagrec(m->user ? m->user : get_user_by_host(s), &fr,
419
if (!glob_friend(fr) && !chan_friend(fr)) {
420
add_mode(chan, '-', 'o', nick); /* Guess it can't hurt. */
421
check_exemptlist(chan, user);
422
do_mask(chan, chan->channel.ban, b->mask, 'b');
424
if (b->desc && b->desc[0] != '@')
425
egg_snprintf(c, sizeof c, "%s %s", IRC_PREBANNED, b->desc);
428
kick_all(chan, b->mask, c[0] ? c : IRC_YOUREBANNED, 0);
429
return; /* Drop out on 1st ban. */
643
647
add_mode(chan, '+', 'c', "");
644
648
else if (mns & CHANNOCLR && cur & CHANNOCLR)
645
649
add_mode(chan, '-', 'c', "");
650
if (pls & CHANNOCTCP && !(cur & CHANNOCTCP))
651
add_mode(chan, '+', 'C', "");
652
else if (mns & CHANNOCTCP && cur & CHANNOCTCP)
653
add_mode(chan, '-', 'C', "");
646
654
if (pls & CHANREGON && !(cur & CHANREGON))
647
655
add_mode(chan, '+', 'R', "");
648
656
else if (mns & CHANREGON && cur & CHANREGON)
649
657
add_mode(chan, '-', 'R', "");
650
if (pls & CHANMODR && !(cur & CHANMODR))
658
if (pls & CHANMODREG && !(cur & CHANMODREG))
651
659
add_mode(chan, '+', 'M', "");
652
else if (mns & CHANMODR && cur & CHANMODR)
660
else if (mns & CHANMODREG && cur & CHANMODREG)
653
661
add_mode(chan, '-', 'M', "");
662
if (pls & CHANLONLY && !(cur & CHANLONLY))
663
add_mode(chan, '+', 'r', "");
664
else if (mns & CHANLONLY && cur & CHANLONLY)
665
add_mode(chan, '-', 'r', "");
654
666
if (pls & CHANTOPIC && !(cur & CHANTOPIC))
655
667
add_mode(chan, '+', 't', "");
656
668
else if (mns & CHANTOPIC && cur & CHANTOPIC)
688
static void check_this_member(struct chanset_t *chan, char *nick, struct flag_record *fr)
700
static void check_this_member(struct chanset_t *chan, char *nick,
701
struct flag_record *fr)
691
704
char s[UHOSTLEN], *p;
693
706
m = ismember(chan, nick);
694
if (!m || match_my_nick(nick))
707
if (!m || match_my_nick(nick) || (!me_op(chan) && !me_halfop(chan)))
711
#ifdef NO_HALFOP_CHANMODES
714
if (me_op(chan) || me_halfop(chan)) {
716
if (HALFOP_CANDOMODE('o')) {
717
if (chan_hasop(m) && ((chan_deop(*fr) || (glob_deop(*fr) &&
718
!chan_op(*fr))) || (channel_bitch(chan) && (!chan_op(*fr) &&
719
!(glob_op(*fr) && !chan_deop(*fr)))))) {
720
add_mode(chan, '-', 'o', m->nick);
722
if (!chan_hasop(m) && (chan_op(*fr) || (glob_op(*fr) &&
723
!chan_deop(*fr))) && (channel_autoop(chan) || glob_autoop(*fr) ||
726
add_mode(chan, '+', 'o', m->nick);
728
set_delay(chan, m->nick);
734
if (HALFOP_CANDOMODE('h')) {
735
if (chan_hashalfop(m) && ((chan_dehalfop(*fr) || (glob_dehalfop(*fr) &&
736
!chan_halfop(*fr)) || (channel_bitch(chan) && (!chan_halfop(*fr) &&
737
!(glob_halfop(*fr) && !chan_dehalfop(*fr)))))))
738
add_mode(chan, '-', 'h', m->nick);
739
if (!chan_sentop(m) && !chan_hasop(m) && !chan_hashalfop(m) &&
740
(chan_halfop(*fr) || (glob_halfop(*fr) && !chan_dehalfop(*fr))) &&
741
(channel_autohalfop(chan) || glob_autohalfop(*fr) ||
742
chan_autohalfop(*fr))) {
744
add_mode(chan, '+', 'h', m->nick);
746
set_delay(chan, m->nick);
747
m->flags |= SENTHALFOP;
752
if (HALFOP_CANDOMODE('v')) {
753
if (chan_hasvoice(m) && (chan_quiet(*fr) || (glob_quiet(*fr) &&
755
add_mode(chan, '-', 'v', m->nick);
756
if (!chan_hasvoice(m) && !chan_hasop(m) && !chan_hashalfop(m) &&
757
(chan_voice(*fr) || (glob_voice(*fr) && !chan_quiet(*fr))) &&
758
(channel_autovoice(chan) || glob_gvoice(*fr) || chan_gvoice(*fr))) {
760
add_mode(chan, '+', 'v', m->nick);
762
set_delay(chan, m->nick);
763
m->flags |= SENTVOICE;
769
if (!me_op(chan) && (!me_halfop(chan) ||
770
(strchr(NOHALFOPS_MODES, 'b') != NULL) ||
771
(strchr(NOHALFOPS_MODES, 'e') != NULL) ||
772
(strchr(NOHALFOPS_MODES, 'I') != NULL)))
697
775
sprintf(s, "%s!%s", m->nick, m->userhost);
698
/* if channel user is current a chanop */
700
/* if user is channel deop */
701
if (chan_deop(*fr) ||
702
/* OR global deop and NOT channel op */
703
(glob_deop(*fr) && !chan_op(*fr))) {
705
add_mode(chan, '-', 'o', m->nick);
706
/* if channel mode is bitch */
707
} else if (channel_bitch(chan) &&
708
/* AND the user isnt a channel op */
710
/* AND the user isnt a global op, (or IS a chan deop) */
711
!(glob_op(*fr) && !chan_deop(*fr)))) {
713
add_mode(chan, '-', 'o', m->nick);
716
/* check vs invites */
718
(u_match_mask(global_invites,s) ||
719
u_match_mask(chan->invites, s)))
776
if (use_invites && (u_match_mask(global_invites, s) ||
777
u_match_mask(chan->invites, s)))
720
778
refresh_invite(chan, s);
721
/* don't kickban if permanent exempted */
723
(u_match_mask(global_exempts,s) ||
724
u_match_mask(chan->exempts, s)))) {
726
if (u_match_mask(global_bans, s) ||
727
u_match_mask(chan->bans, s)) {
779
if (!(use_exempts && (u_match_mask(global_exempts, s) ||
780
u_match_mask(chan->exempts, s)))) {
781
if (u_match_mask(global_bans, s) || u_match_mask(chan->bans, s))
729
782
refresh_ban_kick(chan, s, m->nick);
730
/* ^ will use the ban comment */
733
if (!chan_sentkick(m) && (chan_kick(*fr) || glob_kick(*fr))) {
783
if (!chan_sentkick(m) && (chan_kick(*fr) || glob_kick(*fr)) &&
784
(me_op(chan) || (me_halfop(chan) && !chan_hasop(m)))) {
734
785
check_exemptlist(chan, s);
735
786
quickban(chan, m->userhost);
736
787
p = get_user(&USERENTRY_COMMENT, m->user);
737
788
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, m->nick,
738
p ? p : IRC_POLITEKICK);
789
p ? p : IRC_POLITEKICK);
739
790
m->flags |= SENTKICK;
742
/* now lets look at de-op'd ppl */
743
if (!chan_hasop(m) &&
744
/* if they're an op, channel or global (without channel +d) */
745
(chan_op(*fr) || (glob_op(*fr) && !chan_deop(*fr))) &&
746
/* and the channel is op on join, or they are auto-opped */
747
(channel_autoop(chan) || (glob_autoop(*fr) || chan_autoop(*fr)))) {
749
add_mode(chan, '+', 'o', m->nick);
750
/* otherwise, lets check +v stuff if the llamas want it */
751
} else if (!chan_hasvoice(m) && !chan_hasop(m)) {
752
if ((channel_autovoice(chan) && !chan_quiet(*fr) &&
753
(chan_voice(*fr) || glob_voice(*fr))) ||
754
(!chan_quiet(*fr) && (glob_gvoice(*fr) || chan_gvoice(*fr)))) {
755
add_mode(chan, '+', 'v', m->nick);
757
/* do they have a voice on the channel */
758
if (chan_hasvoice(m) &&
759
/* do they have the +q & no +v */
760
(chan_quiet(*fr) || (glob_quiet(*fr) && !chan_voice(*fr)))) {
761
add_mode(chan, '-', 'v', m->nick);
766
795
static void check_this_user(char *hand, int delete, char *host)
927
965
static int got352or4(struct chanset_t *chan, char *user, char *host,
928
char *nick, char *flags)
966
char *nick, char *flags)
930
968
char userhost[UHOSTLEN];
933
m = ismember(chan, nick); /* In my channel list copy? */
934
if (!m) { /* Nope, so update */
935
m = newmember(chan); /* Get a new channel entry */
936
m->joined = m->split = m->delay = 0L; /* Don't know when he joined */
937
m->flags = 0; /* No flags for now */
938
m->last = now; /* Last time I saw him */
971
m = ismember(chan, nick); /* In my channel list copy? */
972
if (!m) { /* Nope, so update */
973
m = newmember(chan); /* Get a new channel entry */
974
m->joined = m->split = m->delay = 0L; /* Don't know when he joined */
975
m->flags = 0; /* No flags for now */
976
m->last = now; /* Last time I saw him */
940
strcpy(m->nick, nick); /* Store the nick in list */
978
strcpy(m->nick, nick); /* Store the nick in list */
941
979
/* Store the userhost */
942
980
simple_sprintf(m->userhost, "%s@%s", user, host);
943
981
simple_sprintf(userhost, "%s!%s", nick, m->userhost);
944
982
/* Combine n!u@h */
945
m->user = NULL; /* No handle match (yet) */
946
if (match_my_nick(nick)) { /* Is it me? */
947
strcpy(botuserhost, m->userhost); /* Yes, save my own userhost */
948
m->joined = now; /* set this to keep the whining masses happy */
983
m->user = NULL; /* No handle match (yet) */
984
if (match_my_nick(nick)) { /* Is it me? */
985
strcpy(botuserhost, m->userhost); /* Yes, save my own userhost */
986
m->joined = now; /* set this to keep the whining masses happy */
950
if (strchr(flags, '@') != NULL) /* Flags say he's opped? */
951
m->flags |= (CHANOP | WASOP); /* Yes, so flag in my table */
988
if (strpbrk(flags, opchars) != NULL)
989
m->flags |= (CHANOP | WASOP);
953
991
m->flags &= ~(CHANOP | WASOP);
954
if (strchr(flags, '+') != NULL) /* Flags say he's voiced? */
955
m->flags |= CHANVOICE; /* Yes */
992
if (strchr(flags, '%') != NULL)
993
m->flags |= (CHANHALFOP | WASHALFOP);
995
m->flags &= ~(CHANHALFOP | WASHALFOP);
996
if (strchr(flags, '+') != NULL)
997
m->flags |= CHANVOICE;
957
999
m->flags &= ~CHANVOICE;
958
if (!(m->flags & (CHANVOICE | CHANOP)))
1000
if (!(m->flags & (CHANVOICE | CHANOP | CHANHALFOP)))
959
1001
m->flags |= STOPWHO;
960
1002
if (match_my_nick(nick) && any_ops(chan) && !me_op(chan)) {
961
1003
check_tcl_need(chan->dname, "op");
1516
1574
* name now. This will happen when we initially join the channel, as we
1517
1575
* dont know the unique channel name that the server has made up. <cybah>
1519
int l_chname = strlen(chname);
1577
int l_chname = strlen(chname);
1521
1579
if (l_chname > (CHANNEL_ID_LEN + 1)) {
1522
1580
ch_dname = nmalloc(l_chname + 1);
1523
1581
if (ch_dname) {
1524
egg_snprintf(ch_dname, l_chname + 2, "!%s",
1525
chname + (CHANNEL_ID_LEN + 1));
1526
chan = findchan_by_dname(ch_dname);
1528
/* Hmm.. okay. Maybe the admin's a genius and doesn't know the
1529
* difference between id and descriptive channel names. Search
1530
* the channel name in the dname list using the id-name.
1532
chan = findchan_by_dname(chname);
1534
/* Duh, I was right. Mark this channel as inactive and log
1537
chan->status |= CHAN_INACTIVE;
1538
putlog(LOG_MISC, "*", "Deactivated channel %s, because it uses "
1539
"an ID channel-name. Use the descriptive name instead.",
1541
dprintf(DP_SERVER, "PART %s\n", chname);
1582
egg_snprintf(ch_dname, l_chname + 2, "!%s",
1583
chname + (CHANNEL_ID_LEN + 1));
1584
chan = findchan_by_dname(ch_dname);
1586
/* Hmm.. okay. Maybe the admin's a genius and doesn't know the
1587
* difference between id and descriptive channel names. Search
1588
* the channel name in the dname list using the id-name.
1590
chan = findchan_by_dname(chname);
1592
/* Duh, I was right. Mark this channel as inactive and log
1595
chan->status |= CHAN_INACTIVE;
1596
putlog(LOG_MISC, "*", "Deactivated channel %s, because it uses "
1597
"an ID channel-name. Use the descriptive name instead.",
1599
dprintf(DP_SERVER, "PART %s\n", chname);
1547
1605
} else if (!chan) {
1554
1612
if (!chan || channel_inactive(chan)) {
1555
putlog(LOG_MISC, "*", "joined %s but didn't want to!", chname);
1556
dprintf(DP_MODE, "PART %s\n", chname);
1613
strcpy(uhost, from);
1614
nick = splitnick(&uhost);
1615
if (match_my_nick(nick)) {
1616
putlog(LOG_MISC, "*", "joined %s but didn't want to!", chname);
1617
dprintf(DP_MODE, "PART %s\n", chname);
1557
1619
} else if (!channel_pending(chan)) {
1558
1620
chan->status &= ~CHAN_STOP_CYCLE;
1559
1621
strcpy(uhost, from);
1560
1622
nick = splitnick(&uhost);
1561
1623
detect_chan_flood(nick, uhost, from, chan, FLOOD_JOIN, NULL);
1625
chan = findchan(chname);
1628
chan = findchan_by_dname(ch_dname);
1630
chan = findchan_by_dname(chname);
1633
/* The channel doesn't exist anymore, so get out of here. */
1562
1636
/* Grab last time joined before we update it */
1563
1637
u = get_user_by_host(from);
1564
get_user_flagrec(u, &fr, chan->dname); /* Lam: fix to work with !channels */
1638
get_user_flagrec(u, &fr, chan->dname); /* Lam: fix to work with !channels */
1565
1639
if (!channel_active(chan) && !match_my_nick(nick)) {
1566
1640
/* uh, what?! i'm on the channel?! */
1567
1641
putlog(LOG_MISC, chan->dname,
1568
"confused bot: guess I'm on %s and didn't realize it",
1642
"confused bot: guess I'm on %s and didn't realize it",
1570
1644
chan->status |= CHAN_ACTIVE;
1571
1645
chan->status &= ~CHAN_PEND;
1572
1646
reset_chan_info(chan);
1574
1648
m = ismember(chan, nick);
1575
1649
if (m && m->split && !egg_strcasecmp(m->userhost, uhost)) {
1576
check_tcl_rejn(nick, uhost, u, chan->dname);
1577
/* The tcl binding might have deleted the current user. Recheck. */
1578
u = get_user_by_host(from);
1582
m->flags = (chan_hasop(m) ? WASOP : 0);
1584
set_handle_laston(chan->dname, u, now);
1585
m->flags |= STOPWHO;
1586
putlog(LOG_JOIN, chan->dname, "%s (%s) returned to %s.", nick, uhost,
1650
check_tcl_rejn(nick, uhost, u, chan->dname);
1652
chan = findchan(chname);
1655
chan = findchan_by_dname(ch_dname);
1657
chan = findchan_by_dname(chname);
1660
/* The channel doesn't exist anymore, so get out of here. */
1663
/* The tcl binding might have deleted the current user. Recheck. */
1664
u = get_user_by_host(from);
1668
m->flags = (chan_hasop(m) ? WASOP : 0) | (chan_hashalfop(m) ? WASHALFOP : 0);
1670
set_handle_laston(chan->dname, u, now);
1671
m->flags |= STOPWHO;
1672
putlog(LOG_JOIN, chan->dname, "%s (%s) returned to %s.", nick, uhost,
1590
killmember(chan, nick);
1591
m = newmember(chan);
1676
killmember(chan, nick);
1677
m = newmember(chan);
1597
1683
strcpy(m->nick, nick);
1598
strcpy(m->userhost, uhost);
1600
m->flags |= STOPWHO;
1602
check_tcl_join(nick, uhost, u, chan->dname);
1604
/* The tcl binding might have deleted the current user and the
1605
* current channel, so we'll now have to re-check whether they
1608
chan = findchan(chname);
1611
chan = findchan_by_dname(ch_dname);
1613
chan = findchan_by_dname(chname);
1616
/* The channel doesn't exist anymore, so get out of here. */
1619
/* The record saved in the channel record always gets updated,
1620
so we can use that. */
1623
if (match_my_nick(nick)) {
1624
/* It was me joining! Need to update the channel record with the
1625
* unique name for the channel (as the server see's it). <cybah>
1627
strncpy(chan->name, chname, 81);
1629
chan->status &= ~CHAN_JUPED;
1684
strcpy(m->userhost, uhost);
1686
m->flags |= STOPWHO;
1688
check_tcl_join(nick, uhost, u, chan->dname);
1690
/* The tcl binding might have deleted the current user and the
1691
* current channel, so we'll now have to re-check whether they
1694
chan = findchan(chname);
1697
chan = findchan_by_dname(ch_dname);
1699
chan = findchan_by_dname(chname);
1702
/* The channel doesn't exist anymore, so get out of here. */
1705
/* The record saved in the channel record always gets updated,
1706
* so we can use that. */
1709
if (match_my_nick(nick)) {
1710
/* It was me joining! Need to update the channel record with the
1711
* unique name for the channel (as the server see's it). <cybah>
1713
strncpy(chan->name, chname, 81);
1715
chan->status &= ~CHAN_JUPED;
1631
1717
/* ... and log us joining. Using chan->dname for the channel is
1632
* important in this case. As the config file will never contain
1633
* logs with the unique name.
1635
if (chname[0] == '!')
1636
putlog(LOG_JOIN | LOG_MISC, chan->dname, "%s joined %s (%s)",
1637
nick, chan->dname, chname);
1639
putlog(LOG_JOIN | LOG_MISC, chan->dname, "%s joined %s.", nick,
1641
reset_chan_info(chan);
1643
struct chanuserrec *cr;
1645
putlog(LOG_JOIN, chan->dname,
1646
"%s (%s) joined %s.", nick, uhost, chan->dname);
1647
/* Don't re-display greeting if they've been on the channel
1651
struct laston_info *li = 0;
1653
cr = get_chanrec(m->user, chan->dname);
1654
if (!cr && no_chanrec_info)
1655
li = get_user(&USERENTRY_LASTON, m->user);
1656
if (channel_greet(chan) && use_info &&
1657
((cr && now - cr->laston > wait_info) ||
1659
(!li || now - li->laston > wait_info)))) {
1662
if (!(u->flags & USER_BOT)) {
1663
s = get_user(&USERENTRY_INFO, u);
1664
get_handle_chaninfo(u->handle, chan->dname, s1);
1665
/* Locked info line overides non-locked channel specific
1668
if (!s || (s1[0] && (s[0] != '@' || s1[0] == '@')))
1673
dprintf(DP_HELP, "PRIVMSG %s :[%s] %s\n",
1674
chan->name, nick, s);
1678
set_handle_laston(chan->dname, u, now);
1718
* important in this case. As the config file will never contain
1719
* logs with the unique name.
1721
if (chname[0] == '!')
1722
putlog(LOG_JOIN | LOG_MISC, chan->dname, "%s joined %s (%s)",
1723
nick, chan->dname, chname);
1725
putlog(LOG_JOIN | LOG_MISC, chan->dname, "%s joined %s.", nick,
1727
reset_chan_info(chan);
1729
struct chanuserrec *cr;
1731
putlog(LOG_JOIN, chan->dname,
1732
"%s (%s) joined %s.", nick, uhost, chan->dname);
1733
/* Don't re-display greeting if they've been on the channel
1737
struct laston_info *li = 0;
1739
cr = get_chanrec(m->user, chan->dname);
1740
if (!cr && no_chanrec_info)
1741
li = get_user(&USERENTRY_LASTON, m->user);
1742
if (channel_greet(chan) && use_info &&
1743
((cr && now - cr->laston > wait_info) ||
1744
(no_chanrec_info && (!li || now - li->laston > wait_info)))) {
1747
if (!(u->flags & USER_BOT)) {
1748
s = get_user(&USERENTRY_INFO, u);
1749
get_handle_chaninfo(u->handle, chan->dname, s1);
1750
/* Locked info line overides non-locked channel specific
1753
if (!s || (s1[0] && (s[0] != '@' || s1[0] == '@')))
1758
dprintf(DP_HELP, "PRIVMSG %s :[%s] %s\n", chan->name, nick,
1763
set_handle_laston(chan->dname, u, now);
1681
/* ok, the op-on-join,etc, tests...first only both if Im opped */
1683
/* Check for and reset exempts and invites.
1685
* This will require further checking to account for when to use the
1688
if (u_match_mask(global_invites,from) ||
1689
u_match_mask(chan->invites, from))
1690
refresh_invite(chan, from);
1691
if (!(use_exempts &&
1692
(u_match_mask(global_exempts,from) ||
1693
u_match_mask(chan->exempts, from)))) {
1766
if (me_op(chan) || me_halfop(chan)) {
1767
/* Check for and reset exempts and invites.
1769
* This will require further checking to account for when to use the
1772
if ((me_op(chan) || (strchr(NOHALFOPS_MODES, 'I') == NULL)) &&
1773
(u_match_mask(global_invites, from) ||
1774
u_match_mask(chan->invites, from)))
1775
refresh_invite(chan, from);
1776
if ((me_op(chan) || (strchr(NOHALFOPS_MODES, 'b') == NULL)) &&
1777
(!use_exempts || (!u_match_mask(global_exempts, from) &&
1778
!u_match_mask(chan->exempts, from)))) {
1694
1779
if (channel_enforcebans(chan) && !chan_op(fr) && !glob_op(fr) &&
1695
1780
!glob_friend(fr) && !chan_friend(fr) && !chan_sentkick(m) &&
1696
!(use_exempts && isexempted(chan, from))) {
1781
(!use_exempts || !isexempted(chan, from)) && (me_op(chan) ||
1782
(me_halfop(chan) && !chan_hasop(m)))) {
1697
1783
for (b = chan->channel.ban; b->mask[0]; b = b->next) {
1698
1784
if (wild_match(b->mask, from)) {
1699
1785
dprintf(DP_SERVER, "KICK %s %s :%s\n", chname, m->nick,
1706
/* If it matches a ban, dispose of them. */
1707
if (u_match_mask(global_bans, from) ||
1708
u_match_mask(chan->bans, from)) {
1709
refresh_ban_kick(chan, from, nick);
1710
/* Likewise for kick'ees */
1711
} else if (!chan_sentkick(m) && (glob_kick(fr) || chan_kick(fr))) {
1712
check_exemptlist(chan, from);
1713
quickban(chan, from);
1714
p = get_user(&USERENTRY_COMMENT, m->user);
1715
dprintf(DP_MODE, "KICK %s %s :%s\n", chname, nick,
1716
(p && (p[0] != '@')) ? p : IRC_COMMENTKICK);
1717
m->flags |= SENTKICK;
1720
/* Are they a chan op, or global op without chan deop? */
1721
if ((chan_op(fr) || (glob_op(fr) && !chan_deop(fr))) &&
1722
/* ... and is it op-on-join or is the use marked auto-op? */
1723
(channel_autoop(chan) || glob_autoop(fr) || chan_autoop(fr))) {
1724
/* Yes! do the honors. */
1726
add_mode(chan, '+', 'o', nick);
1792
/* If it matches a ban, dispose of them. */
1793
if (u_match_mask(global_bans, from) || u_match_mask(chan->bans, from))
1794
refresh_ban_kick(chan, from, nick);
1795
else if (!chan_sentkick(m) && (glob_kick(fr) || chan_kick(fr)) &&
1796
(me_op(chan) || (me_halfop(chan) && !chan_hasop(m)))) {
1797
check_exemptlist(chan, from);
1798
quickban(chan, from);
1799
p = get_user(&USERENTRY_COMMENT, m->user);
1800
dprintf(DP_MODE, "KICK %s %s :%s\n", chname, nick,
1801
(p && (p[0] != '@')) ? p : IRC_COMMENTKICK);
1802
m->flags |= SENTKICK;
1805
#ifdef NO_HALFOP_CHANMODES
1808
if ((me_op(chan) || (strchr(NOHALFOPS_MODES, 'o') == NULL)) &&
1809
(chan_op(fr) || (glob_op(fr) && !chan_deop(fr))) &&
1810
(channel_autoop(chan) || glob_autoop(fr) || chan_autoop(fr))) {
1812
add_mode(chan, '+', 'o', nick);
1728
1814
set_delay(chan, nick);
1729
1815
m->flags |= SENTOP;
1731
} else if ((channel_autovoice(chan) &&
1732
(chan_voice(fr) || (glob_voice(fr) && !chan_quiet(fr)))) ||
1733
((glob_gvoice(fr) || chan_gvoice(fr)) && !chan_quiet(fr))) {
1735
add_mode(chan, '+', 'v', nick);
1737
set_delay(chan, nick);
1738
m->flags |= SENTVOICE;
1817
} else if ((me_op(chan) || (strchr(NOHALFOPS_MODES, 'h') == NULL)) &&
1818
(chan_halfop(fr) || (glob_halfop(fr) &&
1819
!chan_dehalfop(fr))) && (channel_autohalfop(chan) ||
1820
glob_autohalfop(fr) || chan_autohalfop(fr))) {
1822
add_mode(chan, '+', 'h', nick);
1824
set_delay(chan, nick);
1825
m->flags |= SENTHALFOP;
1827
} else if ((me_op(chan) || (strchr(NOHALFOPS_MODES, 'v') == NULL)) &&
1828
((channel_autovoice(chan) && (chan_voice(fr) ||
1829
(glob_voice(fr) && !chan_quiet(fr)))) ||
1830
((glob_gvoice(fr) || chan_gvoice(fr)) &&
1831
!chan_quiet(fr)))) {
1833
add_mode(chan, '+', 'v', nick);
1835
set_delay(chan, nick);
1836
m->flags |= SENTVOICE;
1839
#ifdef NO_HALFOP_CHANMODES
1770
1872
if (!channel_active(chan)) {
1772
1874
putlog(LOG_MISC, chan->dname,
1773
"confused bot: guess I'm on %s and didn't realize it", chan->dname);
1875
"confused bot: guess I'm on %s and didn't realize it",
1774
1877
chan->status |= CHAN_ACTIVE;
1775
1878
chan->status &= ~CHAN_PEND;
1776
1879
reset_chan_info(chan);
1778
1881
set_handle_laston(chan->dname, u, now);
1779
check_tcl_part(nick, from, u, chan->dname, msg); /* This must be directly above the killmember, in case
1780
we're doing anything to the record that would affect
1882
/* This must be directly above the killmember, in case we're doing anything
1883
* to the record that would affect the above */
1884
check_tcl_part(nick, from, u, chan->dname, msg);
1886
chan = findchan(chname);
1782
1890
killmember(chan, nick);
1784
putlog(LOG_JOIN, chan->dname, "%s (%s) left %s (%s).", nick, from, chan->dname, msg);
1892
putlog(LOG_JOIN, chan->dname, "%s (%s) left %s (%s).", nick, from,
1786
putlog(LOG_JOIN, chan->dname, "%s (%s) left %s.", nick, from, chan->dname);
1895
putlog(LOG_JOIN, chan->dname, "%s (%s) left %s.", nick, from,
1787
1897
/* If it was me, all hell breaks loose... */
1788
1898
if (match_my_nick(nick)) {
1789
1899
clear_channel(chan, 1);
1790
1900
chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
1791
1901
if (!channel_inactive(chan))
1792
dprintf(DP_MODE, "JOIN %s %s\n",
1793
(chan->name[0]) ? chan->name : chan->dname,
1794
chan->channel.key[0] ? chan->channel.key : chan->key_prot);
1902
dprintf(DP_MODE, "JOIN %s %s\n",
1903
(chan->name[0]) ? chan->name : chan->dname,
1904
chan->channel.key[0] ? chan->channel.key : chan->key_prot);
1796
1906
check_lonely_channel(chan);
1859
1990
static int gotnick(char *from, char *msg)
1861
char *nick, s1[UHOSTLEN], buf[UHOSTLEN], *uhost = buf;
1992
char *nick, *chname, s1[UHOSTLEN], buf[UHOSTLEN], *uhost = buf;
1993
unsigned char found = 0;
1862
1994
memberlist *m, *mm;
1863
struct chanset_t *chan;
1995
struct chanset_t *chan, *oldchan = NULL;
1864
1996
struct userrec *u;
1865
struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
1997
struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
1867
1999
strcpy(uhost, from);
1868
2000
nick = splitnick(&uhost);
1870
clear_chanlist_member(nick); /* Cache for nick 'nick' is meaningless now. */
1871
for (chan = chanset; chan; chan = chan->next) {
2002
clear_chanlist_member(nick); /* Cache for nick 'nick' is meaningless now. */
2003
for (chan = chanset; chan; chan = chan->next) {
2005
chname = chan->dname;
1872
2006
m = ismember(chan, nick);
1874
2008
putlog(LOG_JOIN, chan->dname, "Nick change: %s -> %s", nick, msg);
1876
2010
if (rfc_casecmp(nick, msg)) {
1877
/* Not just a capitalization change */
1878
mm = ismember(chan, msg);
1880
/* Someone on channel with old nick?! */
1882
putlog(LOG_JOIN, chan->dname,
1883
"Possible future nick collision: %s", mm->nick);
1885
putlog(LOG_MISC, chan->dname,
1886
"* Bug: nick change to existing nick");
1887
killmember(chan, mm->nick);
2011
/* Not just a capitalization change */
2012
mm = ismember(chan, msg);
2014
/* Someone on channel with old nick?! */
2016
putlog(LOG_JOIN, chan->dname,
2017
"Possible future nick collision: %s", mm->nick);
2019
putlog(LOG_MISC, chan->dname,
2020
"* Bug: nick change to existing nick");
2021
killmember(chan, mm->nick);
1894
2028
sprintf(s1, "%s!%s", msg, uhost);
1895
2029
strcpy(m->nick, msg);
1896
2030
detect_chan_flood(msg, uhost, from, chan, FLOOD_NICK, NULL);
2032
if (!findchan_by_dname(chname)) {
1897
2036
/* don't fill the serverqueue with modes or kicks in a nickflood */
1898
2037
if (chan_sentkick(m) || chan_sentdeop(m) || chan_sentop(m) ||
1899
chan_sentdevoice(m) || chan_sentvoice(m))
1900
m->flags |= STOPCHECK;
2038
chan_sentdehalfop(m) || chan_senthalfop(m) || chan_sentdevoice(m) ||
2040
m->flags |= STOPCHECK;
1901
2041
/* Any pending kick or mode to the old nick is lost. */
1902
m->flags &= ~(SENTKICK | SENTDEOP | SENTOP | SENTVOICE | SENTDEVOICE);
2042
m->flags &= ~(SENTKICK | SENTDEOP | SENTOP | SENTDEHALFOP | SENTHALFOP |
2043
SENTVOICE | SENTDEVOICE);
1903
2044
/* nick-ban or nick is +k or something? */
1904
2045
if (!chan_stopcheck(m)) {
1905
get_user_flagrec(m->user ? m->user : get_user_by_host(s1), &fr, chan->dname);
1906
check_this_member(chan, m->nick, &fr);
2046
get_user_flagrec(m->user ? m->user : get_user_by_host(s1), &fr,
2048
check_this_member(chan, m->nick, &fr);
1908
u = get_user_by_host(from); /* make sure this is in the loop, someone could have changed the record
1909
in an earlier iteration of the loop */
2050
/* Make sure this is in the loop, someone could have changed the record
2051
* in an earlier iteration of the loop. */
2052
u = get_user_by_host(from);
1910
2054
check_tcl_nick(nick, uhost, u, chan->dname, msg);
2056
if (!findchan_by_dname(chname)) {
2063
u = get_user_by_host(from);
2066
check_tcl_nick(nick, uhost, u, s1, msg);
1951
2106
for (chan = chanset; chan; chan = chan->next) {
2108
chname = chan->dname;
1952
2109
m = ismember(chan, nick);
1954
2111
u = get_user_by_host(from2);
1956
set_handle_laston(chan->dname, u, now); /* If you remove this, the bot will crash when the user record in question
1957
is removed/modified during the tcl binds below, and the users was on more
1958
than one monitored channel */
2113
/* If you remove this, the bot will crash when the user record in
2114
* question is removed/modified during the tcl binds below, and the
2115
* users was on more than one monitored channel */
2116
set_handle_laston(chan->dname, u, now);
1962
check_tcl_splt(nick, from, u, chan->dname);
1963
putlog(LOG_JOIN, chan->dname, "%s (%s) got netsplit.", nick,
2119
check_tcl_splt(nick, from, u, chan->dname);
2121
if (!findchan_by_dname(chname)) {
2125
putlog(LOG_JOIN, chan->dname, "%s (%s) got netsplit.", nick, from);
1966
check_tcl_sign(nick, from, u, chan->dname, msg);
1967
putlog(LOG_JOIN, chan->dname, "%s (%s) left irc: %s", nick,
1969
killmember(chan, nick);
1970
check_lonely_channel(chan);
2127
check_tcl_sign(nick, from, u, chan->dname, msg);
2129
if (!findchan_by_dname(chname)) {
2133
putlog(LOG_JOIN, chan->dname, "%s (%s) left irc: %s", nick, from, msg);
2134
killmember(chan, nick);
2135
check_lonely_channel(chan);
2019
2184
get_user_flagrec(u, &fr, chan->dname);
2020
2185
m = ismember(chan, nick);
2021
2186
/* Discard -- kick user if it was to the channel */
2022
if (me_op(chan) && m && !chan_sentkick(m) &&
2023
!chan_friend(fr) && !glob_friend(fr) &&
2024
!(channel_dontkickops(chan) &&
2025
(chan_op(fr) || (glob_op(fr) && !chan_deop(fr)))) && /* arthur2 */
2026
!(use_exempts && ban_fun &&
2027
/* don't kickban if permanent exempted -- Eule */
2028
(u_match_mask(global_exempts, from) ||
2029
u_match_mask(chan->exempts, from)))) {
2187
if (m && (me_op(chan) || (me_halfop(chan) && !chan_hasop(m))) &&
2188
!chan_sentkick(m) && !chan_friend(fr) && !glob_friend(fr) &&
2189
!(channel_dontkickops(chan) && (chan_op(fr) || (glob_op(fr) &&
2190
!chan_deop(fr)))) && !(use_exempts && ban_fun &&
2191
(u_match_mask(global_exempts, from) ||
2192
u_match_mask(chan->exempts, from)))) {
2031
check_exemptlist(chan, from);
2032
u_addban(chan, quickban(chan, uhost), botnetnick,
2033
IRC_FUNKICK, now + (60 * ban_time), 0);
2194
check_exemptlist(chan, from);
2195
u_addban(chan, quickban(chan, uhost), botnetnick,
2196
IRC_FUNKICK, now + (60 * chan->ban_time), 0);
2035
2198
if (kick_fun) {
2036
/* This can induce kickflood - arthur2 */
2037
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, nick,
2039
m->flags |= SENTKICK;
2199
/* This can induce kickflood - arthur2 */
2200
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, nick, IRC_FUNKICK);
2201
m->flags |= SENTKICK;
2042
2204
if (!ignoring) {
2043
2205
putlog(LOG_MODES, "*", "Avalanche from %s!%s in %s - ignoring",
2044
nick, uhost, chan->dname);
2206
nick, uhost, chan->dname);
2045
2207
p = strchr(uhost, '@');
2050
2212
simple_sprintf(buf2, "*!*@%s", p);
2051
2213
addignore(buf2, botnetnick, "ctcp avalanche", now + (60 * ignore_time));
2066
2228
strcpy(ctcp, p1);
2067
2229
strcpy(p1 - 1, p + 1);
2068
2230
detect_chan_flood(nick, uhost, from, chan,
2069
strncmp(ctcp, "ACTION ", 7) ?
2070
FLOOD_CTCP : FLOOD_PRIVMSG, NULL);
2231
strncmp(ctcp, "ACTION ", 7) ?
2232
FLOOD_CTCP : FLOOD_PRIVMSG, NULL);
2234
chan = findchan(realto);
2071
2238
/* Respond to the first answer_ctcp */
2072
2239
p = strchr(msg, 1);
2073
2240
if (ctcp_count < answer_ctcp) {
2075
if (ctcp[0] != ' ') {
2076
code = newsplit(&ctcp);
2077
u = get_user_by_host(from);
2078
if (!ignoring || trigger_on_ignore) {
2079
if (!check_tcl_ctcp(nick, uhost, u, to, code, ctcp))
2080
update_idle(chan->dname, nick);
2082
/* Log DCC, it's to a channel damnit! */
2083
if (!strcmp(code, "ACTION")) {
2084
putlog(LOG_PUBLIC, chan->dname, "Action: %s %s", nick, ctcp);
2086
putlog(LOG_PUBLIC, chan->dname,
2087
"CTCP %s: %s from %s (%s) to %s", code, ctcp, nick,
2242
if (ctcp[0] != ' ') {
2243
code = newsplit(&ctcp);
2244
u = get_user_by_host(from);
2245
if (!ignoring || trigger_on_ignore) {
2246
if (!check_tcl_ctcp(nick, uhost, u, to, code, ctcp)) {
2248
chan = findchan(realto);
2252
update_idle(chan->dname, nick);
2255
/* Log DCC, it's to a channel damnit! */
2256
if (!strcmp(code, "ACTION")) {
2257
putlog(LOG_PUBLIC, chan->dname, "Action: %s %s", nick, ctcp);
2259
putlog(LOG_PUBLIC, chan->dname,
2260
"CTCP %s: %s from %s (%s) to %s", code, ctcp, nick,
2155
2338
get_user_flagrec(u, &fr, chan->dname);
2156
2339
m = ismember(chan, nick);
2157
2340
/* Discard -- kick user if it was to the channel */
2158
if (me_op(chan) && m && !chan_sentkick(m) &&
2159
!chan_friend(fr) && !glob_friend(fr) &&
2160
!(channel_dontkickops(chan) &&
2161
(chan_op(fr) || (glob_op(fr) && !chan_deop(fr)))) && /* arthur2 */
2162
!(use_exempts && ban_fun &&
2163
/* don't kickban if permanent exempted -- Eule */
2164
(u_match_mask(global_exempts,from) ||
2165
u_match_mask(chan->exempts, from)))) {
2341
if (me_op(chan) && m && !chan_sentkick(m) && !chan_friend(fr) &&
2342
!glob_friend(fr) && !(channel_dontkickops(chan) && (chan_op(fr) ||
2343
(glob_op(fr) && !chan_deop(fr)))) && !(use_exempts && ban_fun &&
2344
(u_match_mask(global_exempts, from) ||
2345
u_match_mask(chan->exempts, from)))) {
2167
check_exemptlist(chan, from);
2168
u_addban(chan, quickban(chan, uhost), botnetnick,
2169
IRC_FUNKICK, now + (60 * ban_time), 0);
2347
check_exemptlist(chan, from);
2348
u_addban(chan, quickban(chan, uhost), botnetnick,
2349
IRC_FUNKICK, now + (60 * chan->ban_time), 0);
2171
2351
if (kick_fun) {
2172
/* This can induce kickflood - arthur2 */
2173
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, nick,
2175
m->flags |= SENTKICK;
2352
/* This can induce kickflood - arthur2 */
2353
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, nick, IRC_FUNKICK);
2354
m->flags |= SENTKICK;
2193
2372
strcpy(p1 - 1, p + 1);
2194
2373
p = strchr(msg, 1);
2195
2374
detect_chan_flood(nick, uhost, from, chan,
2196
strncmp(ctcp, "ACTION ", 7) ?
2197
FLOOD_CTCP : FLOOD_PRIVMSG, NULL);
2375
strncmp(ctcp, "ACTION ", 7) ?
2376
FLOOD_CTCP : FLOOD_PRIVMSG, NULL);
2378
chan = findchan(realto);
2198
2382
if (ctcp[0] != ' ') {
2199
code = newsplit(&ctcp);
2200
if (!ignoring || trigger_on_ignore) {
2201
check_tcl_ctcr(nick, uhost, u, chan->dname, code, msg);
2203
putlog(LOG_PUBLIC, chan->dname, "CTCP reply %s: %s from %s (%s) to %s",
2204
code, msg, nick, from, chan->dname);
2205
update_idle(chan->dname, nick);
2383
code = newsplit(&ctcp);
2384
if (!ignoring || trigger_on_ignore) {
2385
check_tcl_ctcr(nick, uhost, u, chan->dname, code, msg);
2387
chan = findchan(realto);
2392
putlog(LOG_PUBLIC, chan->dname,
2393
"CTCP reply %s: %s from %s (%s) to %s", code, msg, nick,
2395
update_idle(chan->dname, nick);
2212
2402
/* Check even if we're ignoring the host. (modified by Eule 17.7.99) */
2213
2403
detect_chan_flood(nick, uhost, from, chan, FLOOD_NOTICE, NULL);
2214
if (!ignoring || trigger_on_ignore)
2405
chan = findchan(realto);
2409
if (!ignoring || trigger_on_ignore) {
2215
2410
check_tcl_notc(nick, uhost, u, to, msg);
2412
chan = findchan(realto);
2217
2418
putlog(LOG_PUBLIC, chan->dname, "-%s:%s- %s", nick, to, msg);
2218
2419
update_idle(chan->dname, nick);
2223
static cmd_t irc_raw[] =
2225
{"324", "", (Function) got324, "irc:324"},
2226
{"352", "", (Function) got352, "irc:352"},
2227
{"354", "", (Function) got354, "irc:354"},
2228
{"315", "", (Function) got315, "irc:315"},
2229
{"367", "", (Function) got367, "irc:367"},
2230
{"368", "", (Function) got368, "irc:368"},
2231
{"403", "", (Function) got403, "irc:403"},
2232
{"405", "", (Function) got405, "irc:405"},
2233
{"471", "", (Function) got471, "irc:471"},
2234
{"473", "", (Function) got473, "irc:473"},
2235
{"474", "", (Function) got474, "irc:474"},
2236
{"475", "", (Function) got475, "irc:475"},
2237
{"INVITE", "", (Function) gotinvite, "irc:invite"},
2238
{"TOPIC", "", (Function) gottopic, "irc:topic"},
2239
{"331", "", (Function) got331, "irc:331"},
2240
{"332", "", (Function) got332, "irc:332"},
2241
{"JOIN", "", (Function) gotjoin, "irc:join"},
2242
{"PART", "", (Function) gotpart, "irc:part"},
2243
{"KICK", "", (Function) gotkick, "irc:kick"},
2244
{"NICK", "", (Function) gotnick, "irc:nick"},
2245
{"QUIT", "", (Function) gotquit, "irc:quit"},
2246
{"PRIVMSG", "", (Function) gotmsg, "irc:msg"},
2247
{"NOTICE", "", (Function) gotnotice, "irc:notice"},
2248
{"MODE", "", (Function) gotmode, "irc:mode"},
2249
{"346", "", (Function) got346, "irc:346"},
2250
{"347", "", (Function) got347, "irc:347"},
2251
{"348", "", (Function) got348, "irc:348"},
2252
{"349", "", (Function) got349, "irc:349"},
2253
{NULL, NULL, NULL, NULL}
2424
static cmd_t irc_raw[] = {
2425
{"324", "", (Function) got324, "irc:324"},
2426
{"352", "", (Function) got352, "irc:352"},
2427
{"354", "", (Function) got354, "irc:354"},
2428
{"315", "", (Function) got315, "irc:315"},
2429
{"367", "", (Function) got367, "irc:367"},
2430
{"368", "", (Function) got368, "irc:368"},
2431
{"403", "", (Function) got403, "irc:403"},
2432
{"405", "", (Function) got405, "irc:405"},
2433
{"471", "", (Function) got471, "irc:471"},
2434
{"473", "", (Function) got473, "irc:473"},
2435
{"474", "", (Function) got474, "irc:474"},
2436
{"475", "", (Function) got475, "irc:475"},
2437
{"INVITE", "", (Function) gotinvite, "irc:invite"},
2438
{"TOPIC", "", (Function) gottopic, "irc:topic"},
2439
{"331", "", (Function) got331, "irc:331"},
2440
{"332", "", (Function) got332, "irc:332"},
2441
{"JOIN", "", (Function) gotjoin, "irc:join"},
2442
{"PART", "", (Function) gotpart, "irc:part"},
2443
{"KICK", "", (Function) gotkick, "irc:kick"},
2444
{"NICK", "", (Function) gotnick, "irc:nick"},
2445
{"QUIT", "", (Function) gotquit, "irc:quit"},
2446
{"PRIVMSG", "", (Function) gotmsg, "irc:msg"},
2447
{"NOTICE", "", (Function) gotnotice, "irc:notice"},
2448
{"MODE", "", (Function) gotmode, "irc:mode"},
2449
{"346", "", (Function) got346, "irc:346"},
2450
{"347", "", (Function) got347, "irc:347"},
2451
{"348", "", (Function) got348, "irc:348"},
2452
{"349", "", (Function) got349, "irc:349"},
2453
{NULL, NULL, NULL, NULL}