]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_message.c
Use full (:n!u@h) prefix for sending ETB from a user to clients.
[irc/rqf/shadowircd.git] / modules / core / m_message.c
index be1a732a4eb225923db0a2603a1cc77e39a86d07..62db04d783b3c1294391d99c2facada46622921c 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
@@ -512,6 +515,9 @@ msg_channel(int p_or_n, const char *command,
                {
                        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 &&
@@ -738,6 +744,7 @@ static void
 msg_client(int p_or_n, const char *command,
           struct Client *source_p, struct Client *target_p, const char *text)
 {
+       const char *awaymsg;
        int do_floodcount = 0;
 
        if(MyClient(source_p))
@@ -766,6 +773,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;
@@ -778,9 +789,9 @@ msg_client(int p_or_n, const char *command,
                return;
        }
 
-       if(MyConnect(source_p) && (p_or_n != NOTICE) && target_p->user && target_p->user->away)
+       if(MyConnect(source_p) && (p_or_n != NOTICE) && target_p->user && (awaymsg = get_metadata(target_p, "away")) != NULL)
                sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY),
-                                  target_p->name, target_p->user->away);
+                                  target_p->name, awaymsg);
 
        if(MyClient(target_p))
        {
@@ -1089,6 +1100,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;
        }
 }