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);
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, " ");
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);
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();
#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();
return 1;
}
-int main(void)
-{
+int main(void) {
+main:
start_time = time(0);
if(!load_mysql_config()) return 0;
+ statistics_enabled = get_int_field("statistics.enable");
+
queue_init();
init_lang();
init_parser();
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);
destroyEvents();
queue_loop();
}
+ cleanup();
+ goto main;
}
int stricmp (const char *s1, const char *s2)
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);
+ }
+}
#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
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."},
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;
int paramcount;
int global_access;
char *channel_access;
+ int triggered;
struct cmd_function *next;
};
struct trigger_cache *next;
};
+extern int statistics_commands;
+
void init_modcmd();
void free_modcmd();
struct ClientSocket* get_prefered_bot(int botid);