#include "s_bsd.h"
#include "s_debug.h"
#include "s_misc.h"
+#include "s_stats.h"
#include "send.h"
#include "struct.h"
#include "sys.h" /* FALSE bleah */
}
}
+/** Update whether #me is a hub or not.
+ */
+static void
+feature_notify_hub(void)
+{
+ if (feature_bool(FEAT_HUB))
+ SetHub(&me);
+ else
+ ClearHub(&me);
+}
+
/** Sets a feature to the given value.
* @param[in] from Client trying to set parameters.
* @param[in] fields Array of parameters to set.
F_S(PROVIDER, FEAT_NULL, 0, 0),
F_B(KILL_IPMISMATCH, FEAT_OPER, 0, 0),
F_B(IDLE_FROM_MSG, 0, 1, 0),
- F_B(HUB, 0, 0, 0),
+ F_B(HUB, 0, 0, feature_notify_hub),
F_B(WALLOPS_OPER_ONLY, 0, 0, 0),
F_B(NODNS, 0, 0, 0),
F_N(RANDOM_SEED, FEAT_NODISP, random_seed_set, 0, 0, 0, 0, 0, 0),
F_S(HIDDEN_IP, 0, "127.0.0.1", 0),
F_B(CONNEXIT_NOTICES, 0, 0, 0),
F_B(OPLEVELS, 0, 1, 0),
+ F_B(ZANNELS, 0, 1, 0),
F_B(LOCAL_CHANNELS, 0, 1, 0),
F_B(TOPIC_BURST, 0, 0, 0),
+ F_B(DISABLE_GLINES, 0, 0, 0),
/* features that probably should not be touched */
F_I(KILLCHASETIMELIMIT, 0, 30, 0),
F_B(HIS_STATS_x, 0, 1, 0),
F_B(HIS_STATS_y, 0, 1, 0),
F_B(HIS_STATS_z, 0, 1, 0),
+ F_B(HIS_STATS_IAUTH, 0, 1, 0),
F_B(HIS_WHOIS_SERVERNAME, 0, 1, 0),
F_B(HIS_WHOIS_IDLETIME, 0, 1, 0),
F_B(HIS_WHOIS_LOCALCHAN, 0, 1, 0),
F_B(HIS_WHO_SERVERNAME, 0, 1, 0),
F_B(HIS_WHO_HOPCOUNT, 0, 1, 0),
+ F_B(HIS_MODEWHO, 0, 1, 0),
F_B(HIS_BANWHO, 0, 1, 0),
F_B(HIS_KILLWHO, 0, 1, 0),
F_B(HIS_REWRITE, 0, 1, 0),
/* Misc. random stuff */
F_S(NETWORK, 0, "UnderNet", 0),
F_S(URL_CLIENTS, 0, "ftp://ftp.undernet.org/pub/irc/clients", 0),
+ F_S(URLREG, 0, "http://cservice.undernet.org/live/", 0),
#undef F_S
#undef F_B
if (change && feat->notify) /* call change notify function */
(*feat->notify)();
+
+ if (from)
+ return feature_get(from, fields, count);
}
return 0;
if (change && feat->notify) /* call change notify function */
(*feat->notify)();
+
+ if (from)
+ return feature_get(from, fields, count);
}
return 0;
{
int i;
- cli_magic(&his) = CLIENT_MAGIC;
- cli_status(&his) = STAT_SERVER;
-
for (i = 0; features[i].type; i++) {
switch (features[i].flags & FEAT_MASK) {
case FEAT_NONE: /* you're on your own */
break;
}
}
+
+ cli_magic(&his) = CLIENT_MAGIC;
+ cli_status(&his) = STAT_SERVER;
+ feature_notify_servername();
+ feature_notify_serverinfo();
}
/** Report all F-lines to a user.
void
feature_report(struct Client* to, const struct StatDesc* sd, char* param)
{
+ char changed;
+ int report;
int i;
for (i = 0; features[i].type; i++) {
(features[i].flags & FEAT_OPER && !IsAnOper(to)))
continue; /* skip this one */
+ changed = (features[i].flags & FEAT_MARK) ? 'F' : 'f';
+ report = (features[i].flags & FEAT_MARK) || sd->sd_funcdata;
+
switch (features[i].flags & FEAT_MASK) {
case FEAT_NONE:
if (features[i].report) /* let the callback handle this */
- (*features[i].report)(to, features[i].flags & FEAT_MARK ? 1 : 0);
+ (*features[i].report)(to, report);
break;
case FEAT_INT: /* Report an F-line with integer values */
- if (features[i].flags & FEAT_MARK) /* it's been changed */
- send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s %d",
- features[i].type, features[i].v_int);
+ if (report) /* it's been changed */
+ send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s %d",
+ changed, features[i].type, features[i].v_int);
break;
case FEAT_BOOL: /* Report an F-line with boolean values */
- if (features[i].flags & FEAT_MARK) /* it's been changed */
- send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s %s",
- features[i].type, features[i].v_int ? "TRUE" : "FALSE");
+ if (report) /* it's been changed */
+ send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s %s",
+ changed, features[i].type, features[i].v_int ? "TRUE" : "FALSE");
break;
case FEAT_STR: /* Report an F-line with string values */
- if (features[i].flags & FEAT_MARK) { /* it's been changed */
+ if (report) { /* it's been changed */
if (features[i].v_str)
- send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s %s",
- features[i].type, features[i].v_str);
+ send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s %s",
+ changed, features[i].type, features[i].v_str);
else /* Actually, F:<type> would reset it; you want F:<type>: */
- send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s",
- features[i].type);
+ send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s",
+ changed, features[i].type);
}
break;
}