From: pk910 Date: Sun, 6 Nov 2011 22:52:06 +0000 (+0100) Subject: added support for an external statistics script X-Git-Tag: v5.3~198 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=410cb79dd46afc2da46d2ac3fc2010a77ccb9f0e added support for an external statistics script --- diff --git a/src/IRCParser.c b/src/IRCParser.c index c8d61d2..c22f595 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -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); diff --git a/src/IRCParser.h b/src/IRCParser.h index f4f6e30..e4f1ec1 100644 --- a/src/IRCParser.h +++ b/src/IRCParser.h @@ -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(); diff --git a/src/main.c b/src/main.c index 183ebae..50cf11d 100644 --- a/src/main.c +++ b/src/main.c @@ -37,6 +37,10 @@ #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); + } +} diff --git a/src/main.h b/src/main.h index a2e9af1..2e62793 100644 --- a/src/main.h +++ b/src/main.h @@ -105,8 +105,15 @@ #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 diff --git a/src/modcmd.c b/src/modcmd.c index 856da05..b20a39e 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -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; diff --git a/src/modcmd.h b/src/modcmd.h index 4ba89a9..4f06162 100644 --- a/src/modcmd.h +++ b/src/modcmd.h @@ -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);