static int flood_attack_channel(int p_or_n, struct Client *source_p,
struct Channel *chptr, char *chname);
+/* Fifteen seconds should be plenty for a client to reply a ctcp */
+#define LARGE_CTCP_TIME 15
+
#define ENTITY_NONE 0
#define ENTITY_CHANNEL 1
#define ENTITY_CHANNEL_OPMOD 2
if(!IsServer(source_p) && !IsService(source_p) && !is_chanop_voiced(msptr))
{
sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, with_prefix);
+ get_id(&me, source_p),
+ get_id(source_p, source_p),
+ with_prefix);
return (-1);
}
{
sendto_channel_flags(client_p, ALL_MEMBERS, source_p, chptr,
"%s %s :%s", command, chptr->chname, text);
+ if (p_or_n != NOTICE && *text == '\001' &&
+ rb_dlink_list_length(&chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2))
+ source_p->large_ctcp_sent = rb_current_time();
}
}
else if(chptr->mode.mode & MODE_OPMODERATE &&
return;
}
}
+
+ if (do_floodcount && p_or_n == NOTICE && *text == '\001' &&
+ target_p->large_ctcp_sent + LARGE_CTCP_TIME >= rb_current_time())
+ do_floodcount = 0;
+
+ if (do_floodcount &&
+ flood_attack_client(p_or_n, source_p, target_p))
+ return;
}
else if(source_p->from == target_p->from)
{
sendto_one_numeric(source_p, ERR_NONONREG,
form_str(ERR_NONONREG),
target_p->name);
- /* Only so opers can watch for floods */
- if (do_floodcount)
- (void) flood_attack_client(p_or_n, source_p, target_p);
}
else
{
target_p->localClient->last_caller_id_time = rb_current_time();
}
- /* Only so opers can watch for floods */
- if (do_floodcount)
- (void) flood_attack_client(p_or_n, source_p, target_p);
}
}
else
- {
- /* If the client is remote, we dont perform a special check for
- * flooding.. as we wouldnt block their message anyway.. this means
- * we dont give warnings.. we then check if theyre opered
- * (to avoid flood warnings), lastly if theyre our client
- * and flooding -- fl */
- if(!do_floodcount ||
- !flood_attack_client(p_or_n, source_p, target_p))
- sendto_anywhere(target_p, source_p, command, ":%s", text);
- }
+ sendto_anywhere(target_p, source_p, command, ":%s", text);
}
- else if(!do_floodcount ||
- !flood_attack_client(p_or_n, source_p, target_p))
+ else
sendto_anywhere(target_p, source_p, command, ":%s", text);
return;
nick + 1,
(*nick == '#') ? MATCH_HOST : MATCH_SERVER,
"%s $%s :%s", command, nick, text);
+ if (p_or_n != NOTICE && *text == '\001')
+ source_p->large_ctcp_sent = rb_current_time();
return;
}
}