diff options
Diffstat (limited to 'src/server/ChatRoom.cpp')
| -rw-r--r-- | src/server/ChatRoom.cpp | 296 | 
1 files changed, 81 insertions, 215 deletions
diff --git a/src/server/ChatRoom.cpp b/src/server/ChatRoom.cpp index 2d368e3..50c364c 100644 --- a/src/server/ChatRoom.cpp +++ b/src/server/ChatRoom.cpp @@ -1,42 +1,10 @@  #include <stdio.h>  #include <string.h> -#include <stdlib.h>  #include "ChatRoom.hpp"  #include "ChatServer.hpp"  #include "UserInfo.hpp" -#define DB_BUFFER_SIZE 128 -#define USE_IN_ROOM 0 -#define USE_IN_LOBBY 1 -#define USE_ANYWHERE 2 - -struct cmd_info { -	int id; // never -1 !!! -	char name[15]; -	const unsigned long name_hash; -	int lobby_cmd; // USE_IN_ROOM, USE_IN_LOBBY, USE_ANYWHERE -	int min_argc; -	char usage[64]; -}; - -const int cmd_id_help = 0; -const int cmd_id_create = 1; -const int cmd_id_join = 2; -const int cmd_id_exit = 3; -const int cmd_id_rooms = 4; - -const int cmd_count = 5; -const struct cmd_info cmd[cmd_count] = { -	{cmd_id_help, "/help", ChatRoom::hash("/help"), USE_ANYWHERE, 0, "Usage: /help"}, -	{cmd_id_create, "/create", ChatRoom::hash("/create"), USE_IN_LOBBY, 0, "Usage: /create [pass-key]"}, -	{cmd_id_join, "/join", ChatRoom::hash("/join"), USE_IN_LOBBY, 1, "Usage: /join *id* [pass-key]"}, -	{cmd_id_exit, "/exit", ChatRoom::hash("/exit"), USE_IN_ROOM, 0, "Usage: /exit"}, -	{cmd_id_rooms, "/rooms", ChatRoom::hash("/rooms"), USE_IN_LOBBY, 0, "Usage: /rooms"} // print all public rooms - -	// IDEA: /clear - clear screen -}; -  ChatRoom::ChatRoom(ChatServer *i_server, int id, char *pass)          : the_server(i_server), code(id)  { @@ -58,59 +26,55 @@ ChatRoom::~ChatRoom()  void ChatRoom::HandleMessage(UserInfo *u, const char *str)  {  	int status = u->GetStatus(); -	if(status != no_wait) { -		if(status == wait_name) { -			// handle name, if OK - will send hello msg -			int len = strlen(str); -			if(len > max_name_len || len < min_name_len) { -				u->Send("Incorrect name. Name length from 3 to 18 chars"); -				CloseSession(u); -			} -			if(checkForbiddenSymbols(str)) { -				u->Send("Incorrect name. You use forbidden symbols."); -				CloseSession(u); +	if(status == wait_name) { +		if(!CheckEnterNickname(u, str)) { +			CloseSession(u); +			return; +		} +		u->SetName(str); + +		// query to server +		char *msg = new char[DB_BUFFER_SIZE]; +		sprintf(msg, "SELECT password FROM users WHERE name = '%s' LIMIT 1", str); +		AnswerDB *ans = the_server->QuerySelect(msg); +		if(ans) { +			DB_ROW *row = ans->GetNextRow(); + +			sprintf(msg, "Welcome to WantChat, %s!", u->GetName()); +			u->Send(msg); +			u->Send(" "); +			u->Send("Welcome to anonymous chat in retro-style 80s."); +			u->Send("Use our chat-client for more immersed."); +		 	u->Send(" "); +			u->Send("This project is open source :)"); +			u->Send("Github: github.com/Joursoir/want-chat"); +			u->Send(" "); +			u->Send("To join to room using /join room_id"); +			u->Send("You can find rooms using /rooms"); +			u->Send(" "); +			u->Send("For more detailed info: /help. Good chatting!"); +			u->Send(" "); + +			if(row) { +				u->SetPassword((*row)[0]); +				u->SetStatus(wait_login); + +				u->Send("Please, log in using /login");  			} - -			//if(userInServer(char *nickname)) -			// проверить если кто-то с данным именем.. - -			u->SetName(str); - -			char *msg = new char[DB_BUFFER_SIZE]; -			sprintf(msg, "SELECT password FROM users WHERE name = '%s' LIMIT 1", str); -			CONSOLE_LOG("%s\n", msg); -			AnswerDB *ans = the_server->QuerySelect(msg); -			if(ans) { -				DB_ROW *row = ans->GetNextRow(); - -				char *pass = 0; -				if(row) { -					pass = new char[max_player_lenpass]; -					strcpy(pass, (*row)[0]); - -					CONSOLE_LOG("account exist! \n"); -				} +			else { +				u->SetStatus(wait_reg); +				u->Send("Please, create account using /reg");  			} -			else CONSOLE_LOG("account noexist :( \n"); -			delete[] msg; - -			u->Send("Welcome to WantChat!"); -		    u->Send(" "); -		    u->Send("It is anonymous chat in retro-style 80s."); -		    u->Send("Use our chat-client for more immersed."); -		    u->Send(" "); -		    u->Send("This project is open source :)"); -		    u->Send("Github: github.com/Joursoir/want-chat"); -		    u->Send(" "); -		    u->Send("To join to room using /join room_id"); -		    u->Send("You can find rooms using /rooms"); -		    u->Send(" "); -		    u->Send("For more detailed info: /help. Good chatting!"); -		    u->Send(" "); - -			u->SetStatus(no_wait);  		} +		else { +			// handling error +			CloseSession(u); +			return; +		} +		// query to server +		delete[] msg; +		delete ans;  		return;  	} @@ -131,89 +95,10 @@ void ChatRoom::HandleMessage(UserInfo *u, const char *str)  	    delete[] msg;  	} -	else u->Send("In the lobby you can only write commands"); -} - -void ChatRoom::HandleCommand(UserInfo *u, int count, -	char **argvar) -{ -	unsigned long hash_cmd = -1; -	hash_cmd = hash(argvar[0]); - -	int what_command = -1; -	for(int i = 0; i < cmd_count; i++) { -		if(cmd[i].name_hash == hash_cmd) { -			what_command = i; -			break; -		} -	} - -	if(what_command == -1) -		return u->Send("Unknown command. Use: /help"); - -	const char onlyroom_msg[] = "You can use this command only in rooms!"; -	const char onlylobby_msg[] = "You can use this command only in lobby!"; - -	// scope of command: -	if(cmd[what_command].lobby_cmd == USE_IN_ROOM && code == std_id_lobby) -		return u->Send(onlyroom_msg); -	else if(cmd[what_command].lobby_cmd == USE_IN_LOBBY && code != std_id_lobby) -		return u->Send(onlylobby_msg); - -	// right usage: -	if(cmd[what_command].min_argc > count-1) -		return u->Send(cmd[what_command].usage); - -	switch(cmd[what_command].id) { -		case cmd_id_help: { -			u->Send("Help info..."); -			break; -		} -		case cmd_id_create: { -			char *pass = 0; -			if(count > 1) { -				if(strlen(argvar[1]) > max_room_lenpass) -					return u->Send("Maximum length of pass equals 24"); -				pass = argvar[1]; -			} -			int id = the_server->AddRoom(pass); - -			const char fcmsg[] = "You create a room #"; -			const char scmsg[] = " with password: "; -			char *cmsg = new char[strlen(fcmsg)+3+strlen(scmsg)+max_room_lenpass]; -			if(pass) sprintf(cmsg, "%s%d%s%s", fcmsg, id, scmsg, pass); -			else sprintf(cmsg, "%s%d", fcmsg, id); -			u->Send(cmsg); -			delete[] cmsg; - -			the_server->ChangeSessionRoom(this, u, id, pass); -			break; -		} -		case cmd_id_join: { -			int id = atoi(argvar[1]); -			char *pass = argvar[2]; // if count == 2, then argvar[2] = 0  - -			int h_status = the_server->ChangeSessionRoom(this, u, id, pass); -			if(h_status == enter_noexist) -				return u->Send("Room with that ID didn't exist"); -			else if(h_status == enter_private) -				return u->Send("It is private room, join using password"); -			else if(h_status == enter_uncorrect_pass) -				return u->Send("Oops, this password is not valid"); - -			u->Send("You has entered the room"); -			break; -		} -		case cmd_id_exit: { -			u->Send("You has left the room"); -			the_server->GotoLobby(this, u); -			break; -		} -		case cmd_id_rooms: { -			// in development -			break; -		} -		default: break; +	else { +		if(status == wait_reg) u->Send(first_reg); +		else if(status == wait_login) u->Send(first_login); +		else u->Send("In the lobby you can write only commands");  	}  } @@ -272,61 +157,42 @@ void ChatRoom::CloseSession(UserInfo *u)  	serv->CloseConnection(u);  } -////////////////////////////////////////////////////////////// - -char **ChatRoom::ParseToArg(const char *input, int &arrc) +bool ChatRoom::CheckEnterNickname(UserInfo *u, const char *name)  { -	int max_argv = 5; -	arrc = 0; -	char **arr = new char*[max_argv+1]; - -	int start = 0; -	for(int i = 0; i < (int) strlen(input)+1; i++) { -		if(input[i] == ' ' || input[i] == '\0' || input[i] == '\n') { // end -			if(start == std_id_lobby) -				continue; - -			int size = i - start; -			arr[arrc] = new char[size+1]; -			memcpy(arr[arrc], input + start, sizeof(char) * size); -			arr[arrc][size] = '\0'; -			 -			start = -1; -			arrc++; -			if(arrc == max_argv) -				break; -		} -		else if(start == -1) -			start = i; +	int len = strlen(name); +	if(len > max_name_len || len < min_name_len) { +		int length = strlen("Incorrect name. Name length from  to  chars"); +		char *msg = new char[length + 2 + 2]; +		sprintf(msg, "Incorrect name. Name length from %d to %d chars", min_name_len, max_name_len); +		u->Send(msg); +		delete[] msg; +		return 0;  	} - -	arr[arrc] = 0; -	return arr; -} - -unsigned long ChatRoom::hash(const char *str) -{ -    unsigned long hash = 5381; -    char c; - -    while( (c = *str++) ) -        hash = ((hash << 5) + hash) + c; - -    return hash; +	if(CheckForbiddenSymbols(name)) { +		u->Send("Incorrect name. You use forbidden symbols"); +		return 0; +	} +	if(the_server->IsUserOnline(name) != 0) { +		u->Send("Someone with this name is in the chat already"); +		return 0; +	} +	return 1;  } -bool ChatRoom::checkForbiddenSymbols(const char *str) +bool ChatRoom::CheckEnterPassword(UserInfo *u, const char *pass)  { -	char banned_symbols[] = {'!', '@', '#', '\'', -		'\"', '\\', '/', '^', '&', '*', ';', ','}; - -	int num = sizeof(banned_symbols)/sizeof(char); -	for(int i = 0; i < (int)strlen(str); i++) { -		for(int j = 0; j < num; j++) { -			if(str[i] == banned_symbols[j]) -				return 1; -		} +	int len = strlen(pass); +	if(len > max_player_lenpass || len < min_player_lenpass) { +		int length = strlen("Incorrect pass. Length from  to  chars"); +		char *msg = new char[length + 2 + 2]; +		sprintf(msg, "Incorrect pass. Length from %d to %d chars", min_player_lenpass, max_player_lenpass); +		u->Send(msg); +		delete[] msg; +		return 0;  	} - -	return 0; +	if(CheckForbiddenSymbols(pass)) { +		u->Send("Incorrect password. You use forbidden symbols"); +		return 0; +	} +	return 1;  }
\ No newline at end of file  | 
