]> jfr.im git - solanum.git/blobdiff - src/tgchange.c
implement configurable channel modes (closes #31)
[solanum.git] / src / tgchange.c
index 387b191750a637074d2be942c01161b3c9d6eae8..0db3a1948910c27dfc84bb173fb92faf6e330f6f 100644 (file)
 #include "client.h"
 #include "s_stats.h"
 #include "hash.h"
+#include "s_conf.h"
 #include "s_newconf.h"
+#include "s_serv.h"
+#include "send.h"
+
+static int add_hashed_target(struct Client *source_p, uint32_t hashv);
 
 struct Channel *
 find_allowing_channel(struct Client *source_p, struct Client *target_p)
@@ -48,9 +53,7 @@ find_allowing_channel(struct Client *source_p, struct Client *target_p)
 int
 add_target(struct Client *source_p, struct Client *target_p)
 {
-       int i, j;
        uint32_t hashv;
-       uint32_t *targets;
 
        /* can msg themselves or services without using any target slots */
        if(source_p == target_p || IsService(target_p))
@@ -65,6 +68,27 @@ add_target(struct Client *source_p, struct Client *target_p)
                return 1;
 
        hashv = fnv_hash_upper((const unsigned char *)use_id(target_p), 32);
+       return add_hashed_target(source_p, hashv);
+}
+
+int
+add_channel_target(struct Client *source_p, struct Channel *chptr)
+{
+       uint32_t hashv;
+
+       if(!ConfigChannel.channel_target_change)
+               return 1;
+
+       hashv = fnv_hash_upper((const unsigned char *)chptr->chname, 32);
+       return add_hashed_target(source_p, hashv);
+}
+
+static int
+add_hashed_target(struct Client *source_p, uint32_t hashv)
+{
+       int i, j;
+       uint32_t *targets;
+
        targets = source_p->localClient->targets;
 
        /* check for existing target, and move it to the head */
@@ -104,6 +128,22 @@ add_target(struct Client *source_p, struct Client *target_p)
                {
                        ServerStats.is_tgch++;
                        add_tgchange(source_p->sockhost);
+
+                       if (!IsTGExcessive(source_p))
+                       {
+                               SetTGExcessive(source_p);
+                               /* This is sent to L_ALL because it's regenerated on all servers
+                                * that have the TGINFO module loaded.
+                                */
+                               sendto_realops_snomask(SNO_BOTS, L_ALL,
+                                       "Excessive target change from %s (%s@%s)",
+                                       source_p->name, source_p->username,
+                                       source_p->orighost);
+                       }
+
+                       sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS,
+                               "ENCAP * TGINFO 0");
+
                        return 0;
                }
        }