int hash_pm(int actor_node, char *text) { /** public function - see header */ int socket=clients.client[actor_node].socket; char char_name[MAX_CHAR_NAME_LEN]=""; char message[1024]=""; if(sscanf(text, "%*s %s %[^\n]", char_name, message)!=2){ send_text(socket, CHAT_SERVER, "%cyou need to use the format #PM [character name][message]", c_red3+127); return 0; } send_pm(actor_node, char_name, message); return 0; }
void handle_command(char *user, char *command, char *args) { int privilege; if (!strcasecmp(user, cfg.admin)) { privilege = 5; } else { privilege = get_privilege_for_user(user); } // Handle trade commands if (command[0] != '#') { handle_trade_command(user, command, args); return; } if (privilege < 1) { return; } // Level 1 commands if (privilege < 2) { return; } // Level 2 commands if (!strcasecmp(command, "#reload")) { load_config(); send_pm("%s %s", user, "OK"); return; } if (privilege < 3) { return; } // Level 3 commands if (privilege < 4) { return; } // Level 4 commands if (!strcasecmp(command, "#get_credits")) { int credits = get_credits_for_user(args); send_pm("%s %s has %d gold coin(s) in credit", user, args, credits); return; } if (!strcasecmp(command, "#get_priv")) { int priv = get_privilege_for_user(args); send_pm("%s %s's privilege level is %d", user, args, priv); return; } if (privilege < 5) { return; } // Level 5 commands if (!strcasecmp(command, "#set_credits") && args) { char *ptr = strchr(args, ' '); int credits; if (!ptr || ptr[1] < '0' || ptr[1] > '9') { return; } *ptr++ = 0; credits = atoi(ptr); set_credits_for_user(args, credits); send_pm("%s %s now has %d gold coin(s) in credit", user, args, credits); return; } if (!strcasecmp(command, "#add_credits") && args) { char *ptr = strchr(args, ' '); int credits; if (!ptr || ptr[1] < '0' || ptr[1] > '9') { return; } *ptr++ = 0; credits = atoi(ptr); add_credits_to_user(args, credits); send_pm("%s %s now has %d gold coin(s) in credit", user, args, get_credits_for_user(args)); return; } if (!strcasecmp(command, "#rem_credits") && args) { char *ptr = strchr(args, ' '); int credits; if (!ptr || ptr[1] < '0' || ptr[1] > '9') { return; } *ptr++ = 0; credits = atoi(ptr); remove_credits_from_user(args, credits); send_pm("%s %s now has %d gold coin(s) in credit", user, args, get_credits_for_user(args)); return; } if (!strcasecmp(command, "#set_priv") && args) { char *ptr = strchr(args, ' '); int priv; if (!ptr || ptr[1] < '0' || ptr[1] > '9') { return; } *ptr++ = 0; priv = atoi(ptr); set_privilege_for_user(args, priv); send_pm("%s %s's privilege level is now %d", user, args, priv); return; } if (!strcasecmp(command, "#say") && args) { send_raw_text(args); return; } }
/** * Process the user input * It handles building commands to the server as well as just sending messages */ int process_user(){ int buffer_len = strlen(buffer); int command = 0; unsigned char* next_arg = buffer; print_prompt(windows[INPUT_WIN]); if(buffer_len == 0){ return 0; } // TODO: add command processing if(buffer[0] == '/'){ next_arg = strchr(buffer,' '); if(next_arg){ *next_arg = 0; // null terminate the command next_arg++; } if(strcmp(buffer+1,"who") == 0){ command = USER_LIST; } else if(strcmp(buffer+1,"pm") == 0){ command = PM; } else if(strcmp(buffer+1,"whois") == 0){ command = WHOIS; } else if(strcmp(buffer+1,"q") == 0){ command = -1; } else if(strcmp(buffer+1,"quit") == 0){ command = -1; } else if(strcmp(buffer+1,"help") == 0){ command = HELP; } } switch(command){ case -1: close_interface(); return -1; break; case 0: { struct message message; memset(&message,0,sizeof(struct message)); strcpy(message.message,buffer); message.length = strlen(message.message); message.user_id = CONFIG->self.id; send_message(CONFIG->self.socket,&message); } break; case PM: { unsigned char* to = next_arg; next_arg = strchr(next_arg,' '); if(next_arg){ *next_arg = 0; // null terminate the command next_arg++; }else{ return 0; } struct private_message message; memset(&message,0,sizeof(struct private_message)); strcpy(message.to, to); strcpy(message.message.message,next_arg); message.message.length = strlen(message.message.message); message.message.user_id = CONFIG->self.id; message.from = CONFIG->self.id; send_pm(CONFIG->self.socket,&message); } break; case WHOIS: { send_whois_request(CONFIG->self.socket, next_arg); } break; case USER_LIST: send_user_list_request(CONFIG->self.socket); break; case HELP: { struct message msg; msg.user_id = 65535; memset(msg.message,0,sizeof(msg.message)); strcpy(msg.message,"[Commands: ]"); msg.length = strlen(msg.message); add_message(&msg); strcpy(msg.message,"[who Show who is on the server]"); msg.length = strlen(msg.message); add_message(&msg); strcpy(msg.message,"[whois <user> <msg> Get details about a user]"); msg.length = strlen(msg.message); add_message(&msg); strcpy(msg.message,"[pm <username> Send a private message to a user]"); msg.length = strlen(msg.message); add_message(&msg); /*strcpy(msg.message,"[Commands: ]"); msg.length = strlen(msg.message); add_message(&msg); strcpy(msg.message,"[Commands: ]"); msg.length = strlen(msg.message); add_message(&msg); */ show_messages(windows[CHAT_WIN]); wrefresh(windows[CHAT_WIN]); } break; } memset(buffer,0,sizeof(buffer)); return 0; }
int main(int argc, char **argv) { int last_heartbeat = 0, i = 0; fd_set fds; struct timeval tv; init(); disconnected = 1; while (!quit) { if (disconnected) { init_connection(cfg.server_address, cfg.server_port); unsigned char str[256]; int i, len = strlen(cfg.username) + strlen(cfg.password) + 3; if (len >= 40-2) { log_error ("Name or password too long!\n"); return 0; } str[0] = LOG_IN; sprintf ((char *) (str+1), "%s %s", cfg.username, cfg.password); send_to_server (str, len); disconnected = 0; FD_ZERO(&fds); } tv.tv_sec = 5; tv.tv_usec = 0; cur_time = SDL_GetTicks(); while(i++ < 100 && !logged_in) { get_server_message(); SDL_Delay(10); } get_server_message(); // send a heartbeat every 25 seconds if (cur_time-(25 * 1000) >= last_heartbeat) { Uint8 str[1]; str[0] = HEART_BEAT; send_to_server(str, 1); last_heartbeat = cur_time; } // limit the length of a trade if (cfg.max_trade_time > 0 && trade.active && cur_time-cfg.max_trade_time >= trade.time) { abort_trade(); send_pm("%s %s", trade.partner, "Sorry, the trade was taking too long."); } SDL_Delay (100); } return 0; }