#include #include #include #include "bot.h" #include "rcon.h" /* Global Parameters for Bot */ char *auth_password = NULL; char *local_host = NULL; char *local_port = NULL; char *local_config = NULL; /* Channel where the Rcon Loggin Goes */ char *logging_channel = NULL; /* Servers Linked List */ struct rcon_server_t *servers = NULL; struct rcon_server_t *current_server = NULL; /* Server Currently Being Monitored by the Rcon Logger */ /* Parameters for the Rcon Logger */ int ircactions = OFF; int ircteamchat = OFF; int irckills = OFF; int ircteamkills = OFF; int ircchat = OFF; int ircrcon = OFF; int ircteamwounds = OFF; /* Rcon Logging Socket */ int rcon_logging_socket = 0; /* Functions */ int rcon_auth_status(hash_t nick) { struct tree_t *node = NULL; node = tree_find(nick_tree,nick); if (node == NULL) { return 0; } else { return node->rcon_authed; } } void rcon_auth(hash_t nick) { struct tree_t *node = NULL; node = tree_find(nick_tree,nick); if (node != NULL) { node->rcon_authed = 1; } } void rcon_deauth(hash_t nick) { struct tree_t *node = NULL; node = tree_find(nick_tree,nick); if (node != NULL) { node->rcon_authed = 0; } } void deauth_all(struct tree_t *node) { if(node == NULL) { node = nick_tree; } if (node->left != NULL) { deauth_all(node->left); } if (node->right != NULL) { deauth_all(node->right); } node->rcon_authed = 0; } void clean_servers() { struct rcon_server_t *l_serv = NULL; struct rcon_server_t *c_serv = servers; while(c_serv != NULL) { if(c_serv->name != NULL) { free(c_serv->name); } if(c_serv->password != NULL) { free(c_serv->password); } if(c_serv->host != NULL) { free(c_serv->host); } l_serv = c_serv; c_serv = c_serv->next; free(l_serv); } servers = NULL; current_server = NULL; } struct rcon_server_t *find_server(char *server_name) { struct rcon_server_t *c_serv = servers; hash_t serv_h = hash(server_name); if(DEBUG) {fprintf(stderr,"find_server:%s\n",server_name);} while(c_serv != NULL) { if (c_serv->hash == serv_h) { return c_serv; } else { c_serv = c_serv->next; } } if(DEBUG) {fprintf(stderr,"find_server: Returning NULL\n");} return NULL; } struct rcon_server_t *add_server(char *server_name) { struct rcon_server_t *c_serv = servers; struct rcon_server_t *l_serv = NULL; hash_t serv_h = hash(server_name); if(DEBUG) {fprintf(stderr,"add_server: %s\n",server_name);} while(c_serv != NULL) { l_serv = c_serv; c_serv = c_serv->next; } c_serv = malloc(sizeof(struct rcon_server_t)); if (l_serv == NULL) { servers = c_serv; } else { l_serv->next = c_serv; } c_serv->name = strdup(server_name); c_serv->hash = serv_h; c_serv->next = NULL; c_serv->password = NULL; c_serv->host = NULL; if(DEBUG) {fprintf(stderr,"add_server: Added %p\n",c_serv);} return c_serv; } void load_rcon_config(char *fileprefix) { FILE *config; char buffer[BUFSIZE]; char *temp = NULL; char *word1 = NULL; char *word2 = NULL; char *word3 = NULL; struct rcon_server_t *server = NULL; snprintf(buffer,BUFSIZE,"%s.rcon",fileprefix); config = fopen(buffer,"r"); while(get_line(config,buffer,BUFSIZE) != EOF) { chomp(buffer,strlen(buffer)); if ((*buffer) != '#') { word1 = word(buffer,1); word2 = word(buffer,2); word3 = word(buffer,3); if(strcasecmp(word1,"auth_password") == 0) { auth_password = strdup(word2); } else if(strcasecmp(word1,"local_port") == 0) { local_port = strdup(word2); } else if(strcasecmp(word1,"local_host") == 0) { local_host = strdup(word2); } else if(strcasecmp(word1,"logging_channel") == 0) { logging_channel = strdup(word2); } else if(strcasecmp(word1,"server") == 0) { server = find_server(word2); if(strcasecmp(word3,"enable") == 0) { if(server == NULL) { add_server(word2); } } else if(server != NULL) { if(strcasecmp(word3,"host") == 0) { if(server->host != NULL) { free(server->host); } server->host = word(buffer,4); } else if(strcasecmp(word3,"port") == 0) { temp = word(buffer,4); server->port = atoi(temp); free(temp); } else if(strcasecmp(word3,"password") == 0) { if(server->password != NULL) { free(server->password); } server->password = word(buffer,4); } } } free(word1); free(word2); free(word3); } } fclose(config); } void init_logging_socket() { struct sockaddr_in addr; rcon_logging_socket = socket(PF_INET,SOCK_DGRAM,0); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(local_port)); inet_aton("0.0.0.0",&addr.sin_addr); bind(rcon_logging_socket,(struct sockaddr *)&addr,sizeof(addr)); } char *get_name(char *buffer) { char *temp1; char *temp2; char *name; int length; temp1 = buffer; temp2 = temp1; while(*temp2 != '<' && *temp2 != '\0') { ++temp2; } length = temp2 - temp1; name = malloc(length + 2); /* *temp2 = '\0'; */ strncpy(name,temp1,length); *(name + length) = '\0'; if (DEBUG) {fprintf(stderr,"get_name: %s\n",name);} return name; } /* Grotty little hack this is :) */ int get_team(char *buffer) { int team = TERRORIST; char *temp = buffer; while (*temp != '\0') { ++temp; } if(DEBUG) { fprintf(stderr,"\tget_team: buffer: %p, temp: %p\n",buffer,temp); } if((temp - buffer) >= 4) { temp -= 3; if(DEBUG) {fprintf(stderr,"\tget_team: %s\n",temp);} if(strcmp(temp,"ST>") == 0) { team = TERRORIST; } else { team = CT; } } return team; } /* The Daddy... */ int process_log_message(char *buffer) { char *temp = NULL; char *player = NULL; char *player2 = NULL; char *msg = NULL; char type[32]; hash_t temp_h; int done = 0; int team; const char *team_s; int team2; const char *team2_s; int i; int ct_score,t_score; hash_t token[5]; if(DEBUG) {fprintf(stderr,"process_log_message: %s\n",buffer);} /* Get the hashes of the first 5 words, starting at word 6 */ for(i = 1; i <= 5; i++) { temp = word_q(buffer,(i + 5)); de_quote(temp); token[i] = hash(temp); free(temp); } if((token[2] == words[SAY]) || (token[2] == words[SAY_TEAM])) { if((ircchat == ON && token[2] == words[SAY]) || ((ircteamchat == ON && token[2] == words[SAY_TEAM]))) { if(token[2] == words[SAY]) { strcpy(type,"5C"); } else { strcpy(type,"7T"); } /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); /* Get Player Team */ team = get_team(temp); /* Clean Up */ free(temp); /* Get Their Message */ msg = word_q(buffer,8); de_quote(msg); /* Players Life Status - Due to Valve this may break */ temp = word_q(buffer,9); if (strcmp(temp,"(dead)") == 0) { *temp = '*'; *(temp + 1) = '\0'; if(DEBUG) {fprintf(stderr,"\t\tdead\n");} } else { *temp = '\0'; if(DEBUG) {fprintf(stderr,"\t\talive\n");} } if (team == CT) { sprintf(buffer,"<%s> [%sCT] <%s> %s",type,temp,player,msg); } else { sprintf(buffer,"<%s> [%sT] <%s> %s",type,temp,player,msg); } /* Wipe the arse */ free(temp); free(msg); free(player); done = 1; } } if(ircteamwounds == ON && !done) { if (token[2] == words[ATTACKED]) { /* For the Attacker */ /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); /* Get Player Team */ team = get_team(temp); /* Clean Up */ free(temp); /* For the Victim */ /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player2 = get_name(temp); /* Get Player Team */ team2 = get_team(temp); /* Clean Up */ free(temp); /* Get the Weapon used */ temp = word_q(buffer,9); if(team == team2) { sprintf(buffer,"<4K> [4T] %s Wounded [4T] %s with %s [12TEAMWOUND]", player,player2,temp); } /* Clean Up */ free(player); free(player2); free(temp); done = 1; } } if((ircteamkills == ON || irckills == ON) && !done) { if(token[2] == words[KILLED]) { /* For the Attacker */ /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); /* Get Player Team */ team = get_team(temp); /* Clean Up */ free(temp); /* For the Victim */ /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player2 = get_name(temp); /* Get Player Team */ team2 = get_team(temp); /* Clean Up */ free(temp); /* Get the Weapon used */ temp = word_q(buffer,9); if(team == CT) { team_s = ct_tok; } else { team_s = t_tok; } if(team2 == CT) { team2_s = ct_tok; } else { team2_s = t_tok; } if(team != team2 && irckills == ON) { sprintf(buffer,"<4K> [%s] %s Killed [%s] %s with %s", team_s,player,team2_s,player2,temp); } else if(team == team2 && (ircteamkills == ON || irckills == ON)) { sprintf(buffer,"<4K> [%s] %s Killed [%s] %s with %s [4TEAMKILL]", team_s,player,team2_s,player2,temp); } /* Clean Up */ free(player); free(player2); free(temp); done = 1; } else if(token[2] == words[SUICIDE] && irckills == ON) { /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); /* Get Player Team */ team = get_team(temp); /* Clean Up */ free(temp); /* Get the Weapon used */ temp = word_q(buffer,9); if(team == CT) { team_s = ct_tok; } else { team_s = t_tok; } if(strcasecmp(temp,"world") != 0 && strcasecmp(temp,"worldspawn") != 0) { sprintf(buffer,"<4K> [%s] %s Killed themselves with %s", team_s,player,temp); } else { sprintf(buffer,"<4K> [%s] %s fell to their death", team_s,player); } } } if(ircactions == ON && !done) { if(token[1] == words[WORLD] && token[2] == words[TRIGGERED]) { /* Get the real value of word 8 (de_quote) */ temp = word_q(buffer,8); de_quote(temp); temp_h = hash(temp); free(temp); if(temp_h == words[ROUND_START]) { sprintf(buffer,"[14G] Round Start"); done = 1; } else if(temp_h == words[ROUND_DRAW]) { sprintf(buffer,"[14G] Round Draw"); done = 1; } } else if(token[2] == words[TRIGGERED]) { /* Get the real value of word 8 (de_quote) */ temp = word_q(buffer,8); de_quote(temp); temp_h = hash(temp); free(temp); /* Get Player Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); if(temp_h == words[SPAWNED_WITH_THE_BOMB]) { sprintf(buffer,"[14G] %s spawned with the bomb",player); done = 1; } else if(temp_h == words[DROPPED_THE_BOMB]) { sprintf(buffer,"[14G] %s dropped the bomb",player); done = 1; } else if(temp_h == words[GOT_THE_BOMB]) { sprintf(buffer,"[14G] %s got the bomb",player); done = 1; } else if(temp_h == words[PLANTED_THE_BOMB]) { sprintf(buffer,"[14G] %s planted the bomb",player); done = 1; } else if(temp_h == words[DEFUSED_THE_BOMB]) { free(temp); /* Prevent Memory Leak */ /* Get CT Score */ temp = word_q(buffer,11); i = strlen(temp); *(temp + i) = '\0'; de_quote(temp); ct_score = atoi(temp); free(temp); /* Get T Score */ temp = word_q(buffer,13); i = strlen(temp); *(temp + i) = '\0'; de_quote(temp); t_score = atoi(temp); /* free(temp); */ sprintf(buffer,"[14G] %s defused the bomb -=- CT: %d T: %d",player,ct_score,t_score); done = 1; } else if(temp_h == words[BECAME_VIP]) { sprintf(buffer,"[14G] %s spawned as VIP",player); done = 1; } else if(temp_h == words[KILLED_A_HOSTAGE]) { team = get_team(temp); if(team == CT) { sprintf(buffer,"<4K> [CT] %s Killed a hostage",player); } else { sprintf(buffer,"<4K> [T] %s Killed a hostage",player); } done = 1; } /* Clean up */ free(temp); free(player); } else if(token[1] == words[TEAM]) { /* Get the real value of word 9 (de_quote) */ temp = word_q(buffer,9); de_quote(temp); temp_h = hash(temp); free(temp); /* Get CT Score */ temp = word_q(buffer,11); i = strlen(temp); *(temp + i) = '\0'; de_quote(temp); ct_score = atoi(temp); free(temp); /* Get T Score */ temp = word_q(buffer,13); i = strlen(temp); *(temp + i) = '\0'; de_quote(temp); t_score = atoi(temp); free(temp); temp = NULL; if(temp_h == words[TERRORISTS_WIN]) { temp = strdup("Terrorists Win"); } else if(temp_h == words[TARGET_BOMBED]) { temp = strdup("Target Successfuly Bombed"); } else if(temp_h == words[VIP_ASSASSINATED]) { temp = strdup("VIP Assassinated"); } else if(temp_h == words[VIP_ESCAPED]) { temp = strdup("VIP Escaped"); } else if(temp_h == words[CTS_WIN]) { temp = strdup("Counter-Terrorists Win"); } else if(temp_h == words[ALL_HOSTAGES_RESCUED]) { temp = strdup("All Hostages Rescued"); } else if(temp_h == words[TARGET_SAVED]) { temp = strdup("Target Saved"); } if(temp != NULL) { sprintf(buffer,"[14G] %s -=- CT: %d T: %d",temp,ct_score,t_score); done = 1; free(temp); } } else if(token[2] == words[DISCONNECTED]) { /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); sprintf(buffer,"[3S] Player Quit: %s",player); done = 1; /* Clean Up */ free(temp); free(player); } else if(token[2] == words[ENTERED] && token[3] == words[THE] && token[4] == words[GAME]) { /* Get Players Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); sprintf(buffer,"[3S] Player Entering game: %s",player); done = 1; /* Clean Up */ free(temp); free(player); } else if(token[1] == words[LOADING] && token[2] == words[MAP] ) { temp = word_q(buffer,8); de_quote(temp); sprintf(buffer,"[3S] Loading Map: %s",temp); free(temp); done = 1; } else if(token[3] == words[NAME]) { /* Get Players Old Name */ temp = word_q(buffer,6); de_quote(temp); player = get_name(temp); free(temp); /* Get Players New Name */ temp = word_q(buffer,10); de_quote(temp); sprintf(buffer,"[3S] %s changed nick to %s",player,temp); free(temp); done = 1; } } if(ircrcon == ON && !done) { if(token[1] == words[SERVER] && token[2] == words[SAY]) { temp = word_q(buffer,8); sprintf(buffer,"<5C> [S] %s",temp); free(temp); done = 1; } else if(token[1] == words[BAD]) { temp = word_q(buffer,10); /* Command */ player = word_q(buffer,12); /* From */ sprintf(buffer,"[3S] Failed Rcon: %s from %s",temp,player); free(temp); free(player); done = 1; } else { temp = word_q(buffer,6); if(strcasecmp(temp,"Rcon:") == 0) { free(temp); temp = word_q(buffer,9); /* Command */ player = word_q(buffer,11); /* From */ sprintf(buffer,"[3S] Rcon: %s from %s",temp,player); free(player); done = 1; } free(temp); } } if(DEBUG) {fprintf(stderr,"process_log_message: done: %d\n",done);} return done; } void check_rcon_log(int out_soc) { char buffer[RCONBUF]; char *buffer_ptr; int ret = 0; if(DEBUG) {fprintf(stderr,"check_rcon_log: enter, soc: %d\n",rcon_logging_socket);} ret = recv(rcon_logging_socket,buffer,RCONBUF,MSG_DONTWAIT); while (ret != EAGAIN && ret != 0 && ret != -1) { if(DEBUG) {fprintf(stderr,"check_rcon_log: msg:%d\n",ret);} buffer_ptr = buffer; if((*buffer) == '˙' && (*(buffer + 1)) == '˙' && (*(buffer + 2)) == '˙' && (*(buffer + 3)) == '˙') { buffer_ptr += 4; /* Bypass Start Chars */ ret = process_log_message(buffer_ptr); if (ret) { queue_msg(out_soc,logging_channel,buffer_ptr,0); } } ret = recv(rcon_logging_socket,buffer,RCONBUF,MSG_DONTWAIT); } if(DEBUG) {fprintf(stderr,"check_rcon_log: left\n");} } int rcon_command(struct rcon_server_t *server, char *command, char *buffer) { struct sockaddr_in addr; struct hostent *host; char *temp; int ret; int i; int s; if(DEBUG) {fprintf(stderr,"rcon_command: enter %s\n",command);} host = gethostbyname(server->host); if(host == NULL) { return 0; } memcpy(&addr.sin_addr.s_addr,host->h_addr_list[0],host->h_length); addr.sin_family = AF_INET; addr.sin_port = htons(server->port); s = socket(PF_INET,SOCK_DGRAM,0); sprintf(buffer,"˙˙˙˙challenge rcon\n"); sendto(s,buffer,(strlen(buffer) + 1),0,(struct sockaddr *)&addr,sizeof(addr)); if(DEBUG) {fprintf(stderr,"rcon_command: 1:%s\n",buffer);} i = 0; while(i < 1000000) { usleep(50000); ret = recv(s,buffer,RCONBUF,MSG_DONTWAIT); if(ret != EAGAIN && ret != 0 && ret != -1) { break; } i += 50000; } if(DEBUG) {fprintf(stderr,"rcon_command: 1r: %s\n",buffer);} if(ret == 0 || ret == EAGAIN || ret == -1) { shutdown(s,2); return 0; } chomp(buffer,strlen(buffer)); temp = word(buffer,3); sprintf(buffer,"˙˙˙˙rcon %s \"%s\" %s",temp,server->password,command); sendto(s,buffer,(strlen(buffer) + 1),0,(struct sockaddr *)&addr,sizeof(addr)); if(DEBUG) {fprintf(stderr,"rcon_command: 2: %s\n",buffer);} i = 0; while(i < 1000000) { usleep(50000); ret = recv(s,buffer,RCONBUF,MSG_DONTWAIT); if(ret != EAGAIN && ret != 0 && ret != -1) { break; } i += 50000; } if(ret == 0 || ret == EAGAIN || ret == -1) { ret = 0; } shutdown(s,2); free(temp); if(DEBUG) {fprintf(stderr,"rcon_command: 2r %s, ret: %d\n",buffer,ret);} return ret; } void rcon_logoff() { char rconbuffer[RCONBUF]; struct rcon_server_t *server = current_server; if(server != NULL) { rcon_command(server,"log off",rconbuffer); rcon_command(server,"mp_logmessage 0",rconbuffer); rcon_command(server,"mp_logdetail 0",rconbuffer); } current_server = NULL; } void rcon_reset(char *config) { rcon_logoff(); if(config != NULL) { if(local_config != NULL) { free(local_config); } local_config = strdup(config); } if(auth_password != NULL) { free(auth_password); auth_password = NULL; } if(local_host != NULL) { free(local_host); local_host = NULL; } if(local_port != NULL) { free(local_port); local_port = NULL; } if(logging_channel != NULL) { free(logging_channel); logging_channel = NULL; } if(rcon_logging_socket != 0) { shutdown(rcon_logging_socket,2); } deauth_all(nick_tree); clean_servers(); if(local_config != NULL) { load_rcon_config(local_config); } else { fprintf(stderr,"rcon_reset: Got NULL config"); exit(1); } init_logging_socket(); } int rcon_logon(struct rcon_server_t *server) { char rconbuffer[RCONBUF]; char command[BUFSIZE]; int ret = 0; ret = rcon_command(server,"log on",rconbuffer); if(ret == 0) { return 0; } else { rcon_command(server,"mp_logmessages 1",rconbuffer); rcon_command(server,"mp_logdetail 2",rconbuffer); } sprintf(command,"logaddress %s %s",local_host,local_port); ret = rcon_command(server,command,rconbuffer); if(ret != 0) { ret = 1; } current_server = server; return ret; } void rconbot_shutdown(int s) { rcon_reset(NULL); quit(s,VERSION); exit(0); } void rconbot_server(int s, char *nick, char *server_name) { struct rcon_server_t *server = NULL; server = find_server(server_name); if(server != NULL) { rcon_logoff(); queue_msg(s,nick,"Status: Handshaking with server",0); if(rcon_logon(server)) { queue_msg(s,nick,"Status: Connected",0); } else { queue_msg(s,nick,"Status: Handshaking Failed",0); } } else { queue_msg(s,nick,"Server not Found",0); } } void rconbot_logoff(int s, char *nick) { if(current_server != NULL) { rcon_logoff(); queue_msg(s,nick,"Status: Disconnected",0); } } void rconbot_reset(int s, char *config) { if(logging_channel != NULL) {part(s,logging_channel);} rcon_reset(config); if(logging_channel != NULL) {join(s,logging_channel);} } void rconbot_help(int s, char *nick, hash_t subject) { if(subject == words[STATUS]) { queue_msg(s,nick,HELP_STATUS,0); } else if(subject == words[SERVER]) { queue_msg(s,nick,HELP_SERVER,0); } else if(subject == words[SHUTDOWN]) { queue_msg(s,nick,HELP_SHUTDOWN,0); } else if(subject == words[DBSTATUS]) { queue_msg(s,nick,HELP_DBSTATUS,0); } else if(subject == words[RCON]) { queue_msg(s,nick,HELP_RCON,0); } else if(subject == words[IRC]) { queue_msg(s,nick,HELP_IRC,0); } else { queue_msg(s,nick,HELP_HELP1,0); queue_msg(s,nick,HELP_HELP2,0); } } void rconbot_status(int s, char *nick) { char buffer[BUFSIZE]; sprintf(buffer,".-:= %s Status =:-.",VERSION); queue_msg(s,nick,buffer,0); if(current_server != NULL) { sprintf(buffer,"Current Server: %s",current_server->name); } else { strcpy(buffer,"Current Server: None"); } queue_msg(s,nick,buffer,0); } void rconbot_rcon(int s, char *nick, char *command) { char buffer[RCONBUF]; if(current_server != NULL) { rcon_command(current_server,command,buffer); } else { queue_msg(s,nick,"Command Failed: Not Connected",0); } } void rconbot_irc(int s, char *nick, hash_t type, hash_t bool) { char buffer[BUFSIZE]; int set; int on; *buffer = '\0'; if(bool == words[ON]) { set = ON; on = 1; } else { set = OFF; on = 0; } if(type == words[CHAT]) { sprintf(buffer,"-= Chat Reporting %s =-",on?"On":"Off"); ircchat = set; } else if(type == words[ACTIONS]) { sprintf(buffer,"-= Acitons Reporting %s =-",on?"On":"Off"); ircactions = set; } else if(type == words[KILLS]) { sprintf(buffer,"-= Kills Reporting %s =-",on?"On":"Off"); irckills = set; } else if(type == words[TEAMKILLS]) { sprintf(buffer,"-= TeamKills Reporting %s =-",on?"On":"Off"); ircteamkills = set; } else if(type == words[RCON]) { sprintf(buffer,"-= Rcon Reporting %s =-",on?"On":"Off"); ircrcon = set; } else if(type == words[TEAMWOUNDS]) { sprintf(buffer,"-= Teamwound Reporting %s =-",on?"On":"Off"); ircteamwounds = set; } else if(type == words[TEAMCHAT]) { sprintf(buffer,"-= Team-Chat Reporting %s =-",on?"On":"Off"); ircteamchat = set; } else if(type == words[ALL]) { sprintf(buffer,"-= All Reporting %s =-",on?"On":"Off"); ircchat = set; ircactions = set; irckills = set; ircteamkills = set; ircrcon = set; ircteamwounds = set; ircteamchat = set; } if(strlen(buffer) > 0) { queue_msg(s,nick,buffer,0); if(strcasecmp(nick,logging_channel) != 0) { queue_msg(s,logging_channel,buffer,0); } } } void rconbot_dbstatus(int s, char *nick, char *player) { char buffer[BUFSIZE]; char rconbuffer[RCONBUF]; char *rcon = rconbuffer; int i; int found = 0; char *id,*wonid,*frag,*tim,*ping,*loss,*adr; char *temp; if(current_server != NULL) { chomp(player,strlen(player)); sprintf(buffer,"status %s",player); rcon_command(current_server,buffer,rconbuffer); if(DEBUG) {fprintf(stderr,"rconbot_dbstatus: %s\n",rconbuffer);} for(i = 0; i < 5; i++) { while(*rcon != '\n' && *rcon != '\0') { ++rcon; } if(*rcon != '\0') {++rcon;} } while(*rcon != '#' && *rcon != '\0') { ++rcon; } while(*rcon != '\n' && *rcon != '\0') { ++rcon; } if(*rcon != '\0') {++rcon;} while(*rcon == '#' && !found) { temp = word_q(rcon,3); de_quote(temp); if(strcasecmp(player,temp) == 0) { id = word_q(rcon,4); wonid = word_q(rcon,5); frag = word_q(rcon,6); tim = word_q(rcon,7); ping = word_q(rcon,8); loss = word_q(rcon,9); adr = word_q(rcon,10); chomp(adr,strlen(adr)); found = 1; } else { while(*rcon != '\n' && *rcon != '\0') { ++rcon; } if(*rcon != '\0') { ++rcon; } } free(temp); } if(found) { sprintf(buffer,"Player Info: Nick: %s WonID: %s Time: %s Frags: %s Ping: %s Address: %s",player,wonid,tim,frag,ping,adr); queue_msg(s,nick,buffer,0); free(id); free(wonid); free(frag); free(tim); free(ping); free(loss); free(adr); } else { sprintf(buffer,"Player Info: %s Not Found on Server",player); queue_msg(s,nick,buffer,0); } } else { queue_msg(s,nick,"Command Failed: Not Connected",0); } } void rcon_bot_command(int s, char *channel, char *nick, char *data) { hash_t nick_h = hash(nick); int i; char *temp; hash_t word1,word2,word3; static time_t last_unauth; time_t current_time = time(NULL); if(DEBUG) {fprintf(stderr,"rcon_bot_command: nick %s, data: %s\n",nick,data);} if(rcon_auth_status(nick_h) == 1) { /* Get the Hashes for the First 3 words, */ /* taking first word as first word after !rconbot */ temp = word(data,2); word1 = hash(temp); free(temp); /* stay clean */ temp = word(data,3); word2 = hash(temp); free(temp); temp = word(data,4); word3 = hash(temp); free(temp); if(word1 == words[HELP]) { rconbot_help(s,channel,word2); } else if(word1 == words[STATUS]) { rconbot_status(s,channel); } else if(word1 == words[SERVER]) { temp = word(data,3); rconbot_server(s,channel,temp); free(temp); } else if(word1 == words[RCON]) { temp = pword_q(data,3); rconbot_rcon(s,channel,temp); } else if(word1 == words[IRC]) { rconbot_irc(s,channel,word2,word3); } else if(word1 == words[DBSTATUS]) { temp = pword_q(data,3); rconbot_dbstatus(s,channel,temp); } else if(word1 == words[DISCONNECT]) { rconbot_logoff(s,channel); } else if(word1 == words[RESET]) { rconbot_reset(s,NULL); } else if(word1 == words[SHUTDOWN]) { rconbot_shutdown(s); } else if(word1 == words[AUTH]) { temp = word(data,2); word1 = hash(temp); free(temp); /* stay clean */ temp = word(data,3); if((*nick) != '#' && strcmp(temp,auth_password) == 0) { rcon_auth(nick_h); queue_msg(s,nick,"Auth Successful",0); } free(temp); } } else { if((current_time - last_unauth) > 1) { temp = word(data,2); word1 = hash(temp); free(temp); /* stay clean */ if(word1 == words[AUTH]) { temp = word(data,3); if((*nick) != '#' && strcmp(temp,auth_password) == 0) { rcon_auth(nick_h); queue_msg(s,nick,"Auth Successful",0); } free(temp); } else if(*nick != '#') { queue_msg(s,nick,"Sorry you are not authorized",0); } } last_unauth = current_time; } if(DEBUG) {fprintf(stderr,"rcon_bot_command:left\n");} }