예제 #1
0
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;
}
예제 #2
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;
	}
}
예제 #3
0
/**
 * 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;
}
예제 #4
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;
}