diff options
| author | Joursoir <chat@joursoir.net> | 2020-12-02 12:46:42 +0000 | 
|---|---|---|
| committer | Joursoir <chat@joursoir.net> | 2020-12-02 12:46:42 +0000 | 
| commit | ad0a2dc909fbb772d42ab6faf13bba74fbc2483d (patch) | |
| tree | 22e71f968850b7862331040f035c1125fdb44880 /src/server/rooms.cpp | |
| parent | a6b8d6e475700efcb7ae1f7cdb7afeb2027fd4b7 (diff) | |
| download | want-chat-ad0a2dc909fbb772d42ab6faf13bba74fbc2483d.tar.gz want-chat-ad0a2dc909fbb772d42ab6faf13bba74fbc2483d.tar.bz2 want-chat-ad0a2dc909fbb772d42ab6faf13bba74fbc2483d.zip  | |
try to make the code is easier; start work with db
Diffstat (limited to 'src/server/rooms.cpp')
| -rw-r--r-- | src/server/rooms.cpp | 329 | 
1 files changed, 0 insertions, 329 deletions
diff --git a/src/server/rooms.cpp b/src/server/rooms.cpp deleted file mode 100644 index ba1ee1b..0000000 --- a/src/server/rooms.cpp +++ /dev/null @@ -1,329 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "rooms.hpp" -#include "chat.hpp" - -#define USE_IN_ROOM 0 -#define USE_IN_LOBBY 1 -#define USE_ANYWHERE 2 - -static char **ParseToArg(const char *input, int &arrc); -static unsigned long hash(const char *str); -static bool checkForbiddenSymbols(const char *str); - -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_create = 1; -const int cmd_id_join = 2; -const int cmd_id_exit = 3; -const int cmd_id_rooms = 4; - -const int cmd_count = 4; -const struct cmd_info cmd[cmd_count] = { -	{cmd_id_create, "/create", hash("/create"), USE_IN_LOBBY, 0, "Usage: /create [pass-key]"}, -	{cmd_id_join, "/join", hash("/join"), USE_IN_LOBBY, 1, "Usage: /join *id* [pass-key]"}, -	{cmd_id_exit, "/exit", hash("/exit"), USE_IN_ROOM, 0, "Usage: /exit"}, -	{cmd_id_rooms, "/rooms", hash("/rooms"), USE_IN_LOBBY, 0, "Usage: /rooms"} // print all public rooms - -	// IDEA: /clear - clear screen -}; - -ChatRoom::ChatRoom(Server *i_server, int id, char *pass) -        : the_server(i_server), code(id), first(0) -{ -	if(pass) -		strcpy(secret_pass, pass); -	else secret_pass[0] = 0; -} - -ChatRoom::~ChatRoom() -{ -	while(first) { -        item *tmp = first; -        first = first->next; -        the_server->CloseConnection(tmp->s); -        delete tmp; -    } -} - -void ChatRoom::SendAll(const char *msg, ChatSession *except, -	const int spec_msg) -{ -    CONSOLE_LOG("Send message all: %s\n", msg); -    item *p; -    for(p = first; p; p = p->next) -        if(p->s != except) -            p->s->Send(msg, spec_msg); -} - -void ChatRoom::HandleMessage(ChatSession *ses, const char *str) -{ -	int status = ses->state; -	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) { -				ses->Send("Incorrect name. Name length from 3 to 18 chars"); -				CloseSession(ses); -			} -			if(checkForbiddenSymbols(str)) { -				ses->Send("Incorrect name. You use forbidden symbols."); -				CloseSession(ses); -			} -			ses->SetName(str); - -			ses->Send("Welcome to WantChat!"); -		    ses->Send(" "); -		    ses->Send("It is anonymous chat in retro-style 80s."); -		    ses->Send("Use our chat-client for more immersed."); -		    ses->Send(" "); -		    ses->Send("This project is open source :)"); -		    ses->Send("Github: github.com/Joursoir/want-chat"); -		    ses->Send(" "); -		    ses->Send("To join to room using /join room_id"); -		    ses->Send("You can find rooms using /rooms"); -		    ses->Send(" "); -		    ses->Send("For more detailed info: /help. Good chatting!"); -		    ses->Send(" "); - -			ses->state = no_wait; -		} - -		return; -	} - -	if(str[0] == '/') { // if user sent a command -		int argc = 0; -		char **argv = ParseToArg(str, argc); -		this->HandleCommand(ses, argc, argv); - -		for(int i = 0; i < argc; i++) -			delete[] argv[i]; -		delete[] argv; -	} -	else if(code != std_id_lobby) { -	    char *msg = new char[max_msg_len]; -	    sprintf(msg, "%s: %s", ses->GetName(), str); - -	    this->SendAll(msg, 0, usual_msg); -	     -	    delete[] msg; -	} -	else ses->Send("In the lobby you can only write commands"); -} - -void ChatRoom::HandleCommand(ChatSession *ses, 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 ses->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 ses->Send(onlyroom_msg); -	else if(cmd[what_command].lobby_cmd == USE_IN_LOBBY && code != std_id_lobby) -		return ses->Send(onlylobby_msg); - -	// right usage: -	if(cmd[what_command].min_argc > count-1) -		return ses->Send(cmd[what_command].usage); - -	switch(cmd[what_command].id) { -		case cmd_id_create: { -			char *pass = 0; -			if(count > 1) { -				if(strlen(argvar[1]) > max_room_lenpass) -					return ses->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); -			ses->Send(cmsg); -			delete[] cmsg; - -			the_server->ChangeSessionRoom(this, ses, 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, ses, id, pass); -			if(h_status == enter_noexist) -				return ses->Send("Room with that ID didn't exist"); -			else if(h_status == enter_private) -				return ses->Send("It is private room, join using password"); -			else if(h_status == enter_uncorrect_pass) -				return ses->Send("Oops, this password is not valid"); - -			break; -		} -		case cmd_id_exit: { -			the_server->GotoLobby(this, ses); -			break; -		} -		case cmd_id_rooms: { -			// in development -			break; -		} -		default: break; -	} -} - -const char *ChatRoom::GetSecretPass() -{ -	if(secret_pass[0] != 0) -		return secret_pass; -	return 0; -} - -void ChatRoom::AddSession(ChatSession *ses) -{ -	item *p = new item; -    p->next = first; -    p->s = ses; -    first = p; - -    if(code == std_id_lobby) -    	return; - -    const char welcome_msg[] = "Welcome to the room #"; -	const char entered_msg[] = " has entered the room"; - -	const char *name = ses->GetName(); - -    char *wmsg = new char[sizeof(welcome_msg) + 2]; -    sprintf(wmsg, "%s%d", welcome_msg, code); -    ses->Send(wmsg); -    delete[] wmsg; - -    char *emsg = new char[strlen(name) + sizeof(entered_msg)]; -    sprintf(emsg, "%s%s", name, entered_msg); -    this->SendAll(emsg, ses); -   	delete[] emsg; - -} - -void ChatRoom::RemoveSession(ChatSession *ses) -{ -	if(code != std_id_lobby) { -		const char left_msg[] = " has left the room"; -		const char *name = ses->GetName(); - -	    int len = strlen(name); -	    char *lmsg = new char[len + sizeof(left_msg) + 2]; -	    sprintf(lmsg, "%s%s", name, left_msg); -	    this->SendAll(lmsg, ses); -	    delete[] lmsg; -	} - -	item **p; -	for(p = &first; *p; p = &((*p)->next)) { -		if( ((*p)->s) == ses ) { -			item *tmp = *p; -			*p = tmp->next; -			// not delete ChatSession! -			delete tmp; -			 -			if(code != std_id_lobby && !first) -				the_server->DeleteRoom(code); - -			return; -		} -	} -} - -void ChatRoom::CloseSession(ChatSession *ses) -{ -	Server *serv = the_server; -	this->RemoveSession(ses); -	serv->CloseConnection(ses); -} - -////////////////////////////////////////////////////////////// - -static char **ParseToArg(const char *input, int &arrc) -{ -	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; -	} - -	arr[arrc] = 0; -	return arr; -} - -static unsigned long hash(const char *str) -{ -    unsigned long hash = 5381; -    char c; - -    while( (c = *str++) ) -        hash = ((hash << 5) + hash) + c; - -    return hash; -} - -static bool checkForbiddenSymbols(const char *str) -{ -	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; -		} -	} - -	return 0; -}
\ No newline at end of file  | 
