]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/m_stats.c
Allow /ojoin !#channel/%#channel, if admin/halfop are enabled.
[irc/rqf/shadowircd.git] / modules / m_stats.c
index 12adc9c3ff7ae2652596f94563f942e87bd1b7b3..67e53bb711d3166b6aef49210e59d0c502d6765a 100644 (file)
@@ -94,6 +94,7 @@ static void stats_tdeny(struct Client *);
 static void stats_deny(struct Client *);
 static void stats_exempt(struct Client *);
 static void stats_events(struct Client *);
+static void stats_prop_klines(struct Client *);
 static void stats_hubleaf(struct Client *);
 static void stats_auth(struct Client *);
 static void stats_tklines(struct Client *);
@@ -137,6 +138,7 @@ static struct StatsStruct stats_cmd_table[] = {
        {'E', stats_events,             1, 1, },
        {'f', stats_comm,               1, 1, },
        {'F', stats_comm,               1, 1, },
+       {'g', stats_prop_klines,        1, 0, },
        {'h', stats_hubleaf,            0, 0, },
        {'H', stats_hubleaf,            0, 0, },
        {'i', stats_auth,               0, 0, },
@@ -450,6 +452,32 @@ stats_events (struct Client *source_p)
        rb_dump_events(stats_events_cb, source_p);
 }
 
+static void
+stats_prop_klines(struct Client *source_p)
+{
+       struct ConfItem *aconf;
+       rb_dlink_node *ptr;
+       char *user, *host, *pass, *oper_reason;
+
+       RB_DLINK_FOREACH(ptr, prop_bans.head)
+       {
+               aconf = ptr->data;
+
+               /* Skip non-klines and deactivated klines. */
+               if(aconf->status != CONF_KILL)
+                       continue;
+
+               get_printable_kline(source_p, aconf, &host, &pass, 
+                               &user, &oper_reason);
+
+               sendto_one_numeric(source_p, RPL_STATSKLINE,
+                               form_str(RPL_STATSKLINE),
+                               'g', host, user, pass,
+                               oper_reason ? "|" : "",
+                               oper_reason ? oper_reason : "");
+       }
+}
+
 static void
 stats_hubleaf(struct Client *source_p)
 {
@@ -704,7 +732,7 @@ stats_operedup (struct Client *source_p)
                if(IsOperInvis(target_p) && !IsOper(source_p))
                        continue;
 
-               if(get_metadata(target_p, "away"))
+               if(target_p->user->away)
                        continue;
 
                count++;
@@ -744,7 +772,7 @@ stats_tresv(struct Client *source_p)
                if(aconf->hold)
                        sendto_one_numeric(source_p, RPL_STATSQLINE, 
                                        form_str(RPL_STATSQLINE),
-                                       'q', aconf->port, aconf->name, aconf->passwd);
+                                       'q', aconf->port, aconf->host, aconf->passwd);
        }
 
        HASH_WALK(i, R_MAX, ptr, resvTable)
@@ -753,7 +781,7 @@ stats_tresv(struct Client *source_p)
                if(aconf->hold)
                        sendto_one_numeric(source_p, RPL_STATSQLINE, 
                                        form_str(RPL_STATSQLINE),
-                                       'q', aconf->port, aconf->name, aconf->passwd);
+                                       'q', aconf->port, aconf->host, aconf->passwd);
        }
        HASH_WALK_END
 }
@@ -772,7 +800,7 @@ stats_resv(struct Client *source_p)
                if(!aconf->hold)
                        sendto_one_numeric(source_p, RPL_STATSQLINE, 
                                        form_str(RPL_STATSQLINE),
-                                       'Q', aconf->port, aconf->name, aconf->passwd);
+                                       'Q', aconf->port, aconf->host, aconf->passwd);
        }
 
        HASH_WALK(i, R_MAX, ptr, resvTable)
@@ -781,7 +809,7 @@ stats_resv(struct Client *source_p)
                if(!aconf->hold)
                        sendto_one_numeric(source_p, RPL_STATSQLINE, 
                                        form_str(RPL_STATSQLINE),
-                                       'Q', aconf->port, aconf->name, aconf->passwd);
+                                       'Q', aconf->port, aconf->host, aconf->passwd);
        }
        HASH_WALK_END
 }
@@ -959,6 +987,8 @@ static struct shared_flags shared_flagtable[] =
        { SHARED_TDLINE,        'd' },
        { SHARED_PDLINE,        'D' },
        { SHARED_UNDLINE,       'E' },
+       { SHARED_DIE,       'I' },
+       { SHARED_MODULE,        'M' },
        { 0,                    '\0'}
 };
 
@@ -1081,7 +1111,7 @@ stats_tgecos(struct Client *source_p)
                if(aconf->hold)
                        sendto_one_numeric(source_p, RPL_STATSXLINE,
                                        form_str(RPL_STATSXLINE),
-                                       'x', aconf->port, aconf->name,
+                                       'x', aconf->port, aconf->host,
                                        aconf->passwd);
        }
 }
@@ -1099,7 +1129,7 @@ stats_gecos(struct Client *source_p)
                if(!aconf->hold)
                        sendto_one_numeric(source_p, RPL_STATSXLINE,
                                        form_str(RPL_STATSXLINE),
-                                       'X', aconf->port, aconf->name
+                                       'X', aconf->port, aconf->host
                                        aconf->passwd);
        }
 }
@@ -1137,6 +1167,7 @@ stats_memory (struct Client *source_p)
        int conf_count = 0;     /* conf lines */
        int users_invited_count = 0;    /* users invited */
        int user_channels = 0;  /* users in channels */
+       int aways_counted = 0;
        size_t number_servers_cached;   /* number of servers cached by scache */
 
        size_t channel_memory = 0;
@@ -1145,6 +1176,7 @@ stats_memory (struct Client *source_p)
        size_t channel_invex_memory = 0;
        size_t channel_quiet_memory = 0;
 
+       size_t away_memory = 0; /* memory used by aways */
        size_t ww = 0;          /* whowas array count */
        size_t wwm = 0;         /* whowas array memory used */
        size_t conf_memory = 0; /* memory used by conf lines */
@@ -1179,6 +1211,11 @@ stats_memory (struct Client *source_p)
                        users_counted++;
                        users_invited_count += rb_dlink_list_length(&target_p->user->invited);
                        user_channels += rb_dlink_list_length(&target_p->user->channel);
+                       if(target_p->user->away)
+                       {
+                               aways_counted++;
+                               away_memory += (strlen(target_p->user->away) + 1);
+                       }
                }
        }
 
@@ -1239,9 +1276,10 @@ stats_memory (struct Client *source_p)
                           (unsigned long) users_invited_count * sizeof(rb_dlink_node));
 
        sendto_one_numeric(source_p, RPL_STATSDEBUG,
-                          "z :User channels %u(%lu)",
+                          "z :User channels %u(%lu) Aways %u(%d)",
                           user_channels,
-                          (unsigned long) user_channels * sizeof(rb_dlink_node));
+                          (unsigned long) user_channels * sizeof(rb_dlink_node),
+                          aways_counted, (int) away_memory);
 
        sendto_one_numeric(source_p, RPL_STATSDEBUG,
                           "z :Attached confs %u(%lu)",