added possibility to select a bot used for the statistics
[NeonServV5.git] / src / modules / stats.mod / module.c
index ee8a20d98b2436156e845b4d196eb277262e8ff1..4780077c49739e35666736f293626eb1573df819 100644 (file)
@@ -1,4 +1,4 @@
-/* module.c - NeonServ v5.4
+/* module.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -39,10 +39,6 @@ static void module_start(int type) {
         timeq_add_name("stats", 60, module_id, stats_timer_callback, NULL);
 }
 
-static void module_loop() {
-    
-}
-
 static void module_stop(int type) {
     timeq_del_name("stats");
 }
@@ -98,23 +94,29 @@ static TIMEQ_CALLBACK(stats_timer_callback) {
     if(get_int_field(tmp))
         pkgpos += sprintf(pkgbuf + pkgpos, "*\n");
     else {
-        struct ClientSocket *bot, *bot1, *bot2, *bot3;
+        sprintf(tmp, "modules/%s/use_bot", modname);
+        char *botname = get_string_field(tmp);
+        struct ClientSocket *bot, *bot1 = NULL, *bot2 = NULL, *bot3 = NULL, *bot4 = NULL;
         for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
-            if(bot->botid == 1 && (bot->flags & SOCKET_FLAG_PREFERRED))
+            if(botname && !stricmp(bot->nick, botname))
                 bot1 = bot;
-            else if((bot->flags & SOCKET_FLAG_PREFERRED))
+            else if(bot->botid == 1 && (bot->flags & SOCKET_FLAG_PREFERRED))
                 bot2 = bot;
-            else
+            else if((bot->flags & SOCKET_FLAG_PREFERRED))
                 bot3 = bot;
+            else
+                bot4 = bot;
         }
         if(bot1)
             bot = bot1;
         else if(bot2)
             bot = bot2;
-        else
+        else if(bot3)
             bot = bot3;
+        else
+            bot = bot4;
         if(bot) {
-            pkgpos += sprintf(pkgbuf + pkgpos, "%s!%s@%s %d\n", bot->user->nick, bot->user->ident, bot->host, bot->port);
+            pkgpos += sprintf(pkgbuf + pkgpos, "%s!%s@%s %d\n", (bot->user ? bot->user->nick : "*"), (bot->user ? bot->user->ident : "*"), (bot->host ? bot->host : "*"), bot->port);
         } else
             pkgpos += sprintf(pkgbuf + pkgpos, "?\n");
     }
@@ -133,6 +135,7 @@ static TIMEQ_CALLBACK(stats_timer_callback) {
         int chanuser_count = getChanUserCount();
         pkgpos += sprintf(pkgbuf + pkgpos, "%d %d\n", user_count, chanuser_count);
     }
+    pkgpos += sprintf(pkgbuf + pkgpos, "%lu\n", getStartTime());
     pkgbuf[pkgpos] = 0;
     //send package
     #ifndef WIN32
@@ -147,21 +150,22 @@ static TIMEQ_CALLBACK(stats_timer_callback) {
         if (!host) return;
         si_other.sin_addr = *(struct in_addr*)host->h_addr;
     }
+    sendto(sock, pkgbuf, pkgpos, 0, &si_other, sizeof(si_other));
     #else
     struct sockaddr_in si_other;
     int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if (sock == -1) return;
     si_other.sin_family = AF_INET;
     si_other.sin_port = htons(STATS_UPDATE_PORT);
-    si_other.sin_addr.s_addr = inet_addr(client->host);
+    si_other.sin_addr.s_addr = inet_addr(STATS_UPDATE_HOST);
     if (si_other.sin_addr.s_addr == INADDR_NONE) {
-        struct hostent *host = gethostbyname(client->host);
+        struct hostent *host = gethostbyname(STATS_UPDATE_HOST);
         if(!host) return;
         memcpy(&(si_other.sin_addr), host->h_addr_list[0], 4);
     }
+    sendto(sock, pkgbuf, pkgpos, 0, (struct sockaddr *) &si_other, sizeof(si_other));
     #endif
-    sendto(sock, pkgbuf, pkgpos, 0, &si_other, sizeof(si_other));
     close(sock);
 }
 
-MODULE_HEADER(module_initialize, module_start, module_loop, module_stop);
+MODULE_HEADER(module_initialize, module_start, module_stop);