]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_message.c
Put back fb7d6089158e, not setting large_ctcp_sent for CTCP ACTION.
[irc/rqf/shadowircd.git] / modules / core / m_message.c
index be1a732a4eb225923db0a2603a1cc77e39a86d07..3f814f6585117702075a47ffff372ee44df813a6 100644 (file)
@@ -95,6 +95,9 @@ static int flood_attack_client(int p_or_n, struct Client *source_p, struct Clien
 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
@@ -510,6 +513,18 @@ msg_channel(int p_or_n, const char *command,
                if(result == CAN_SEND_OPV ||
                   !flood_attack_channel(p_or_n, source_p, chptr, chptr->chname))
                {
+                       if (p_or_n != NOTICE && *text == '\001' &&
+                                       strncasecmp(text + 1, "ACTION", 6))
+                       {
+                               if (chptr->mode.mode & MODE_NOCTCP)
+                               {
+                                       sendto_one_numeric(source_p, ERR_CANNOTSENDTOCHAN,
+                                                          form_str(ERR_CANNOTSENDTOCHAN), chptr->chname);
+                                       return;
+                               }
+                               else if (rb_dlink_list_length(&chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2))
+                                       source_p->large_ctcp_sent = rb_current_time();
+                       }
                        sendto_channel_flags(client_p, ALL_MEMBERS, source_p, chptr,
                                             "%s %s :%s", command, chptr->chname, text);
                }
@@ -766,6 +781,10 @@ msg_client(int p_or_n, const char *command,
                        }
                }
 
+               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;
@@ -1089,6 +1108,8 @@ handle_special(int p_or_n, const char *command, struct Client *client_p,
                                    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;
        }
 }