]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/opserv.c
improve stats routing command
[irc/evilnet/x3.git] / src / opserv.c
index 94c2be72bfd78d9f10c48b3244006ef5caeacdb8..ad1e0c203f0ab63867e5f8c97a5c1b97f0da4c06 100644 (file)
@@ -203,6 +203,7 @@ static const struct message_entry msgtab[] = {
     { "OSMSG_WHOIS_CHANNELS",   "Channels     : %s" },
     { "OSMSG_WHOIS_HIDECHANS",  "Channel list omitted for your sanity." },
     { "OSMSG_WHOIS_VERSION",    "Version      : %s" },  
+    { "OSMSG_WHOIS_NO_NOTICE",  "No_notices   : %s" },
     { "OSMSG_UNBAN_DONE", "Ban(s) removed from channel %s." },
     { "OSMSG_CHANNEL_VOICED", "All users on %s voiced." },
     { "OSMSG_CHANNEL_DEVOICED", "All voiced users on %s de-voiced." },
@@ -303,22 +304,24 @@ static const struct message_entry msgtab[] = {
     { "OSMSG_ALERT_ADD_FAILED", "Unable to add alert. Check syntax, required parts,  and access" },
     { "OSMSG_REMOVED_ALERT", "Removed alert named $b%s$b." },
     { "OSMSG_NO_SUCH_ALERT", "No alert named $b%s$b could be found." },
-    { "OSMSG_ALERTS_LIST", "$bCurrent $O alerts$b" },
+    { "OSMSG_ALERTS_LIST", "$bCurrent $O alerts matching '$b%s$b'$b" },
     { "OSMSG_ALERTS_BAR",    "----------------------------------------------" },
     { "OSMSG_ALERTS_HEADER", "Name                 Action (by Oper)" },
     { "OSMSG_ALERTS_DESC",   "   Criteria: %s" },
     { "OSMSG_ALERT_IS",      "$b%-20s$b %-6s (by %s)" },
     { "OSMSG_ALERT_END",     "----------------End of Alerts-----------------" },
     /* routing messages */
-    { "OSMSG_ROUTINGPLAN_LIST",  "$bRouting Plans$b" },
+    { "OSMSG_ROUTINGPLAN",  "$bRouting Plan(s)$b" },
+    { "OSMSG_ROUTINGPLAN_LIST_HEAD", "$bRouting Plans$b" },
     { "OSMSG_ROUTINGPLAN_BAR",   "----------------------------------------------" },
-    { "OSMSG_ROUTINGPLAN_END",   "-------------End of Routing Plans-------------" },
+    { "OSMSG_ROUTINGPLAN_END",   "------------End of Routing Plan(s)------------" },
     { "OSMSG_ROUTINGPLAN_OPTION", "%s is set to %s" },
     { "OSMSG_ROUTINGPLAN_ACTIVE", "Auto routing is active, using plan '%s'." },
     { "OSMSG_ROUTING_ACTIVATION_ERROR", "There was an error activating the routing plan. Check for loops, and make sure the map includes my own uplink." },
     { "OSMSG_ROUTINGPLAN_OPTION_NOT_FOUND", "There is no routing plan option '%s'." },
     { "OSMSG_ROUTINGPLAN_OPTION_NOT_SET", "Option '%s' is not currently set." },
     { "OSMSG_ROUTINGPLAN_NAME",  "$b%s:$b" },
+    { "OSMSG_ROUTINGPLAN_LIST",  "$b%s$b" },
     { "OSMSG_ROUTINGPLAN_SERVER","      %s:%d <-- %s[%d/%s] (%s)" }, 
     { "OSMSG_ADDPLAN_SUCCESS", "Added new routing plan '%s'." },
     { "OSMSG_ADDPLAN_FAILED", "Could not add new plan '%s' (does it already exist?)." },
@@ -742,7 +745,7 @@ static MODCMD_FUNC(cmd_defcon)
     showDefConSettings(user, cmd);
 
     if (DefConTimeOut > 0) {
-        timeq_del(0, defcon_timeout, NULL, TIMEQ_IGNORE_DATA & TIMEQ_IGNORE_WHEN);
+        timeq_del(0, defcon_timeout, NULL, TIMEQ_IGNORE_DATA | TIMEQ_IGNORE_WHEN);
         timeq_add(now + DefConTimeOut, defcon_timeout, NULL);
     }
 
@@ -1966,6 +1969,7 @@ static MODCMD_FUNC(cmd_whois)
     if(target->version_reply) {
         reply("OSMSG_WHOIS_VERSION", target->version_reply);
     }
+    reply("OSMSG_WHOIS_NO_NOTICE", target->no_notice ? "YES":"NO");
   
     if (target->modes) {
         bpos = 0;
@@ -2322,19 +2326,18 @@ static MODCMD_FUNC(cmd_stats_alerts) {
     dict_iterator_t it;
     struct opserv_user_alert *alert;
     const char *reaction;
-    char *m;
+    char *m = NULL;
 
-    reply("OSMSG_ALERTS_LIST");
+    if(argc > 1) 
+        m = unsplit_string(argv + 1, argc - 1, NULL);
+    reply("OSMSG_ALERTS_LIST", m ? m : "*");
     reply("OSMSG_ALERTS_BAR");
     reply("OSMSG_ALERTS_HEADER");
     reply("OSMSG_ALERTS_BAR");
     for (it = dict_first(opserv_user_alerts); it; it = iter_next(it)) {
         alert = iter_data(it);
-        if(argc > 1) {
-            m = unsplit_string(argv + 1, argc - 1, NULL);
-            if(!match_ircglob(alert->text_discrim, m))
-                break; /* not a match to requested filter */
-        }
+        if(m && (!match_ircglob(alert->text_discrim, m) && strcasecmp(alert->owner, m)) )
+             continue; /* not a match to requested filter */
         switch (alert->reaction) {
         case REACT_NOTICE: reaction = "notice"; break;
         case REACT_KILL: reaction = "kill"; break;
@@ -2739,7 +2742,7 @@ opserv_notice_handler(struct userNode *user, struct userNode *bot, char *text, U
                 if(!version)
                     version = "";
                 /* opserv_debug("Opserv got CTCP VERSION Notice from %s: %s", user->nick, version); */
-                user->version_reply = strdup(version);
+                /* user->version_reply = strdup(version); done in parse-p10.c now */
                 dict_foreach(opserv_user_alerts, alert_check_user, user);
             }
         }
@@ -3141,15 +3144,27 @@ activate_routing(struct svccmd *cmd, struct userNode *user, char *plan_name)
             add_routestruct_server(opserv_route, servername, rps->port, uplink, NULL);
     }
     if(change_route_uplinks(opserv_route))
+    {
         return 1;
+    }
     else if(user) {
         reply("OSMSG_ROUTING_ACTIVATION_ERROR");
         activate_routing(cmd, user, "*");
         return 0;
     }
+    /* routing activation failed but we dont do anything? */
     return 1;
 }
 
+
+void routing_init()
+{
+    activate_routing(NULL, NULL, NULL);
+
+    /* start auto-routing system */
+    reroute_timer_reset(0); 
+}
+
 /*******************************************************
  * Functions to handle online route configuration via opserv
  */
@@ -3379,6 +3394,9 @@ static MODCMD_FUNC(cmd_reroute) {
  * and setup timer.
  */
 void reroute_timer(void *data) {
+    /* Delete any other timers such as this one.. */
+    timeq_del(0, reroute_timer, NULL, TIMEQ_IGNORE_DATA | TIMEQ_IGNORE_WHEN);
+
     if(!opserv_route || !opserv_route->servers) 
         return; /* no active route */
     char *retry_period = dict_find(opserv_routing_plan_options, "RETRY_PERIOD", NULL);
@@ -3388,6 +3406,9 @@ void reroute_timer(void *data) {
     if(freq < 1) 
         return; /* retry_period set to 0, disable */
 
+    /* opserv_debug("Reroute timer checking reroute"); */
+    log_module(MAIN_LOG, LOG_ERROR, "Reroute timer checking reroute()");
+
     /* Do the reroute C attempt */
     if(data)
         reroute(opserv_route, NULL, NULL, "C");
@@ -3593,10 +3614,23 @@ routing_handle_connect_failure(struct server *source, char *server, char *messag
 /* Delete any existing timers, and start the timer again 
  * using the passed time for the first run.
  * - this is called during a retry_period change
- *   before it has saved the new value. */
+ *   before it has saved the new value. 
+ *
+ *   If time is 0, lookup the interval. */
 void reroute_timer_reset(unsigned int time)
 {
-    timeq_del(0, reroute_timer, NULL, TIMEQ_IGNORE_DATA & TIMEQ_IGNORE_WHEN);
+    timeq_del(0, reroute_timer, NULL, TIMEQ_IGNORE_DATA | TIMEQ_IGNORE_WHEN);
+    if(time == 0) {
+        if(!opserv_route || !opserv_route->servers)
+            return; /* no active route */
+        char *retry_period = dict_find(opserv_routing_plan_options, "RETRY_PERIOD", NULL);
+        if(!retry_period)
+            return; /* retry_period invalid */
+        time = atoi(retry_period);
+        if(time < 1)
+            return; /* retry_period set to 0, disable */
+
+    }
     timeq_add(now + time, reroute_timer, "run");
 }
 
@@ -3669,21 +3703,34 @@ static MODCMD_FUNC(cmd_stats_routing_plans) {
     dict_iterator_t rpit;
     dict_iterator_t it;
     struct routingPlan *rp;
-    reply("OSMSG_ROUTINGPLAN_LIST");
-    reply("OSMSG_ROUTINGPLAN_BAR");
-    for(rpit = dict_first(opserv_routing_plans); rpit; rpit = iter_next(rpit)) {
-        const char* name = iter_key(rpit);
-        rp = iter_data(rpit);
-        reply("OSMSG_ROUTINGPLAN_NAME", name);
-        for(it = dict_first(rp->servers); it; it = iter_next(it)) {
-            const char* servername = iter_key(it);
-            struct routingPlanServer *rps = iter_data(it);
-            reply("OSMSG_ROUTINGPLAN_SERVER", servername, rps->port, rps->uplink, rps->karma, rps->offline? "offline" : "online", rps->secondaryuplink ? rps->secondaryuplink : "None");
-        }
+    if(argc > 1) {
+        reply("OSMSG_ROUTINGPLAN");
+        reply("OSMSG_ROUTINGPLAN_BAR");
+        for(rpit = dict_first(opserv_routing_plans); rpit; rpit = iter_next(rpit)) {
+            const char* name = iter_key(rpit);
+            rp = iter_data(rpit);
+            if(match_ircglob(name, argv[1])) {
+                reply("OSMSG_ROUTINGPLAN_NAME", name);
+                for(it = dict_first(rp->servers); it; it = iter_next(it)) {
+                    const char* servername = iter_key(it);
+                    struct routingPlanServer *rps = iter_data(it);
+                    reply("OSMSG_ROUTINGPLAN_SERVER", servername, rps->port, rps->uplink, rps->karma, rps->offline? "offline" : "online", rps->secondaryuplink ? rps->secondaryuplink : "None");
+                }
+            }
 
+        }
+        reply("OSMSG_ROUTINGPLAN_END");
+    }
+    else {
+        reply("OSMSG_ROUTINGPLAN_LIST_HEAD");
+        reply("OSMSG_ROUTINGPLAN_BAR");
+        for(rpit = dict_first(opserv_routing_plans); rpit; rpit = iter_next(rpit)) {
+            const char* name = iter_key(rpit);
+            reply("OSMSG_ROUTINGPLAN_LIST", name);
+        }
+        reply("OSMSG_ROUTINGPLAN_END");
+        route_show_options(cmd, user);
     }
-    reply("OSMSG_ROUTINGPLAN_END");
-    route_show_options(cmd, user);
     return 1;
 }
 
@@ -6858,7 +6905,9 @@ init_opserv(const char *nick)
     }
 
     /* start auto-routing system */
-    reroute_timer(NULL);
+    /* this cant be done here, because the routing system isnt marked active yet. */
+    /* reroute_timer(NULL); */
+
     /* start the karma timer, using the saved one if available */
     routing_karma_timer(dict_find(opserv_routing_plan_options, "KARMA_TIMER", NULL));