added support for an external statistics script
authorpk910 <philipp@zoelle1.de>
Sun, 6 Nov 2011 22:52:06 +0000 (23:52 +0100)
committerpk910 <philipp@zoelle1.de>
Sun, 6 Nov 2011 23:08:12 +0000 (00:08 +0100)
src/IRCParser.c
src/IRCParser.h
src/main.c
src/main.h
src/modcmd.c
src/modcmd.h

index c8d61d2917a4fcb5a5db601f74d78860bc40f337..c22f595544a9622fd39e78b065974146f5a3896d 100644 (file)
@@ -29,6 +29,9 @@
 
 struct irc_cmd *irc_commands = NULL;
 static struct UserNode *registering_users = NULL;
+int statistics_privmsg = 0;
+int statistics_network_users = 0;
+int statistics_network_channels = 0;
 
 static void parse_line(struct ClientSocket *client, char *line);
 static void register_irc_function(char *command, irc_cmd_t *func);
@@ -323,6 +326,8 @@ static IRC_CMD(raw_privmsg) {
     if(argv[0][0] == '#') { //Channel message
         struct ChanNode *chan = getChanByName(argv[0]);
         if(chan && chan->chanbot == client->user) {
+            if(statistics_enabled)
+                statistics_privmsg++;
             if(argv[1][0] == '\001') {
                 char *cmd = &argv[1][1];
                 char *text = strstr(cmd, " ");
@@ -455,9 +460,41 @@ static IRC_CMD(raw_367) {
     return 1;
 }
 
+static IRC_CMD(raw_251) {
+    if(argc < 2) return 0;
+    char *total_user_str = argv[1];
+    char total_visible[20], total_invisible[20];
+    int i, total_visible_pos = 0, total_invisible_pos = 0;
+    while(*total_user_str) {
+        if(*total_user_str == ' ') {
+            i++;
+        } else if(i == 2) {
+            if(total_visible_pos < 20)
+                total_visible[total_visible_pos++] = *total_user_str;
+        } else if(i == 5) {
+            if(total_invisible_pos < 20)
+                total_invisible[total_invisible_pos++] = *total_user_str;
+        }
+        total_user_str++;
+    }
+    total_visible[total_visible_pos] = '\0';
+    total_invisible[total_invisible_pos] = '\0';
+    statistics_network_users = atoi(total_visible) + atoi(total_invisible);
+    return 1;
+}
+
+static IRC_CMD(raw_254) {
+    if(argc < 3) return 0;
+    statistics_network_channels = atoi(argv[1]);
+    statistics_update();
+    return 1;
+}
+
 void init_parser() {
     //all the raws we receive...
     register_irc_function("001", raw_001);
+    register_irc_function("251", raw_251);
+    register_irc_function("254", raw_254);
     register_irc_function("324", raw_324);
     register_irc_function("367", raw_367);
     register_irc_function("INVITE", raw_invite);
index f4f6e30bcd3167753d4e83d575f9a878ac264941..e4f1ec14d85d583b4cdc00cef2468521e65beac2 100644 (file)
@@ -31,6 +31,10 @@ struct irc_cmd {
     struct irc_cmd *next;
 };
 
+extern int statistics_privmsg;
+extern int statistics_network_users;
+extern int statistics_network_channels;
+
 int parse_lines(struct ClientSocket *client, char *lines, int len);
 void bot_disconnect(struct ClientSocket *client);
 void init_parser();
index 183ebaedb3e1e205215b51ed0a8c7395d9beb91d..50cf11d3d6136323aa191d0121cac5bad2398ff7 100644 (file)
 #include "ConfigParser.h"
 
 time_t start_time;
+static int running;
+static int statistics_requested_lusers = 0;
+int statistics_enabled;
+TIMEQ_CALLBACK(main_statistics);
 
 void cleanup() {
     free_sockets();
@@ -87,8 +91,8 @@ static int load_mysql_config() {
     return 1;
 }
 
-int main(void)
-{
+int main(void) {
+main:
     
     start_time = time(0);
     
@@ -106,6 +110,8 @@ int main(void)
     
     if(!load_mysql_config()) return 0;
     
+    statistics_enabled = get_int_field("statistics.enable");
+    
     queue_init();
     init_lang();
     init_parser();
@@ -121,9 +127,11 @@ int main(void)
     init_DBHelper();
     
     load_languages();
+    timeq_add(10, main_statistics, NULL);
     
     time_t socket_wait;
-    while(1) {
+    running = 1;
+    while(running) {
         socket_wait = time(0) + SOCKET_SELECT_TIME;
         do {
             socket_loop(SOCKET_SELECT_TIME);
@@ -134,6 +142,8 @@ int main(void)
         destroyEvents();
         queue_loop();
     }
+    cleanup();
+    goto main;
 }
 
 int stricmp (const char *s1, const char *s2)
@@ -165,3 +175,60 @@ int stricmplen (const char *s1, const char *s2, int len)
    return c1 - c2;
 }
 
+void restart_bot(int hard_restart) {
+    running = 0;
+}
+
+void stop_bot() {
+    cleanup();
+    exit(0);
+}
+
+void reload_config() {
+    loadConfig("neonserv.conf");
+}
+
+TIMEQ_CALLBACK(main_statistics) {
+    int update_minutes = get_int_field("statistics.frequency");
+    if(!update_minutes) update_minutes = 2;
+    timeq_add(update_minutes * 60, main_statistics, NULL);
+    if(get_int_field("statistics.enable")) {
+        statistics_enabled = 1;
+        statistics_requested_lusers = 1;
+        if(get_int_field("statistics.include_lusers")) {
+            struct ClientSocket *bot, *lusersbot = NULL;
+            for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
+                if(bot->flags & SOCKET_FLAG_PREFERRED)
+                    lusersbot = bot;
+            }
+            bot = lusersbot;
+            if(bot == NULL) bot = getBots(SOCKET_FLAG_READY, NULL);
+            putsock(bot, "LUSERS");
+        } else {
+            statistics_update();
+        }
+    } else
+        statistics_enabled = 0;
+}
+
+void statistics_update() {
+    if(get_int_field("statistics.enable") && statistics_requested_lusers && get_string_field("statistics.execute")) {
+        statistics_requested_lusers = 0;
+        int update_minutes = get_int_field("statistics.frequency");
+        if(!update_minutes) update_minutes = 2;
+        char command[MAXLEN];
+        /* parameters:
+         - visible users
+         - visible chanusers
+         - visible channels
+         - privmsg per minute
+         - commands per minute
+         - network users
+         - network channels
+        */
+        sprintf(command, "%s %d %d %d %.2f %.2f %d %d", get_string_field("statistics.execute"), getUserCount(), getChanUserCount(), getChannelCount(), ((float) statistics_privmsg / update_minutes), ((float) statistics_commands / update_minutes), statistics_network_users, statistics_network_channels);
+        statistics_privmsg = 0;
+        statistics_commands = 0;
+        system(command);
+    }
+}
index a2e9af1352a535e547778cbe3dfae90ce14dbaa0..2e627939b8d49df4bdf77093f8cf161259c1b72b 100644 (file)
 #define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN
 
 extern time_t start_time;
+extern int statistics_enabled;
 
 int stricmp (const char *s1, const char *s2);
 int stricmplen (const char *s1, const char *s2, int len);
 
+void restart_bot(int hard_restart);
+void stop_bot();
+void reload_config();
+
+void statistics_update();
+
 #endif
\ No newline at end of file
index 856da055dcf314d4b4b1f5aa1f6d33746098577c..b20a39e26dc40e5e9fcf8e3e90f83723c9cc135f 100644 (file)
@@ -57,6 +57,7 @@ static struct cmd_function *cmd_functions = NULL;
 static struct trigger_callback *trigger_callbacks = NULL;
 static struct cmd_bot_alias *bot_aliases = NULL;
 static struct ClientSocket *tmp_text_client;
+int statistics_commands = 0;
 
 static const struct default_language_entry msgtab[] = {
     {"MODCMD_LESS_PARAM_COUNT", "This command requires more parameters."},
@@ -153,6 +154,8 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s
     struct cmd_binding *cbind;
     for(cbind = cmd_binds[bind_index]; cbind; cbind = cbind->next) {
         if(cbind->botid == client->botid && stricmp(cbind->cmd, message) == 0) {
+            if(statistics_enabled)
+                statistics_commands++;
             if((cbind->func->flags & CMDFLAG_FUNCMD)) {
                 if(!sent_chan)
                     break;
index 4ba89a96a4090ed2df73fc3f135673c589242bf6..4f0616269e1696263604e8f772e3aca4c2383215 100644 (file)
@@ -52,6 +52,7 @@ struct cmd_function {
     int paramcount;
     int global_access;
     char *channel_access;
+    int triggered;
     
     struct cmd_function *next;
 };
@@ -76,6 +77,8 @@ struct trigger_cache {
     struct trigger_cache *next;
 };
 
+extern int statistics_commands;
+
 void init_modcmd();
 void free_modcmd();
 struct ClientSocket* get_prefered_bot(int botid);