Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream> // cout
- #include <stdlib.h> // exit
- #include <string.h> // bzero
- #include <unistd.h>
- #include <postgresql/libpq-fe.h> // base de dados
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <map>
- #include <sstream>
- #include <vector>
- #include <string>
- #include <time.h>
- #include <algorithm>
- #include <iomanip>
- #include <pthread.h>
- #include <set>
- /////////////////////////////////////////////////////POR USERS COM USERNAME PW PONTOS ADMIN E CURRGAME
- using namespace std;
- set<int> clients;
- map<string, int> sockets;
- map<int, string> nicknames;
- bool writeline(int socketfd, string line);
- /*----------INÍCIO DAS FUNÇÕES INSERIDAS POR NÓS--------------*/
- // Conectar com a Base de Dados e Executar comandos SQL
- PGconn* conn = NULL;
- void broadcast(int origin, string text) { //manda mensagem para todos menos o próprio
- ostringstream message; //usamos um ostringstream para construir uma string e imprime numa string
- message << text;
- set<int>::iterator it;
- for (it = clients.begin(); it != clients.end(); it++)
- if (*it != origin) writeline (*it, message.str());
- writeline(origin,"");
- }
- void initDB()
- {
- conn = PQconnectdb("host='dbm.fe.up.pt' user='sinf17e11' password='lima'");
- if (!conn)
- {
- cout << "Não foi possivel ligar a base de dados" << endl;
- exit(-1);
- }
- if (PQstatus(conn) != CONNECTION_OK)
- {
- cout << "Não foi possivel ligar a base de dados" << endl;
- exit(-1);
- }
- }
- PGresult* executeSQL(string sql)
- {
- PGresult* res = PQexec(conn, sql.c_str());
- cout << "\n SQL:" << sql << "\n" << endl;
- if (!(PQresultStatus(res) == PGRES_COMMAND_OK || PQresultStatus(res) == PGRES_TUPLES_OK))
- {
- cout << "Não foi possível executar o comando!" << sql << endl;
- return NULL;
- }
- return res;
- }
- void closeDB()
- {
- PQfinish(conn);
- }
- //------------------------------------
- // Auxiliar para dividir strings
- vector<std::string> split(const std::string &s, char delim) {
- vector<string> elems;
- stringstream ss(s);
- string item;
- while (getline(ss, item, delim)) {
- elems.push_back(item);
- }
- return elems;
- }
- string intToString(int i) {
- ostringstream oss;
- oss << i;
- return oss.str();
- }
- //Comando REGISTAR
- void registar(int socketfd, string line)
- {
- string comando;
- string nickname;
- string password;
- istringstream iss(line);
- iss >> comando >> nickname >> password;
- if (nicknames.find(socketfd) != nicknames.end()) //utilizador está logged in
- {
- ostringstream mensagem;
- mensagem << "O Username " << nickname << " já se encontra conectado!";
- writeline(socketfd, mensagem.str());
- }
- else
- {
- PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')");
- if(PQntuples(res)!=0) // se já existir na base da dados
- {
- ostringstream mensagem2;
- mensagem2 << "O username " << nickname << " já existe na base de dados";
- writeline(socketfd, mensagem2.str());
- }
- else // se não existir na BD
- {
- executeSQL("INSERT INTO users VALUES ('"+nickname+"', '"+password+"', '"intToString(0)"', "FALSE")"); // Introduzir dados na BD, inicializar pontos a zero e nivel de admin falso
- ostringstream mensagem3;
- mensagem3 << "O username " << nickname << " foi criado com sucesso";
- writeline(socketfd, mensagem3.str());
- }
- }
- }
- //Comando ADMINlvl
- void admin(int socketfd, string line) //diz o tipo de permissoes admin ou jogador
- {
- string comando;
- string nickname;
- string str; //se der mal, começa por tentar fazer disto uma istringstream, senao, alterar o str=="TRUE" pq posso nao estar a chamar bem este comando em c++
- istringstream iss(line);
- iss >> comando >> nickname;
- PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')"); //encontrar o user na BD
- if(PQntuples(res)!=0)
- {
- str=PQgetvalue(res, 0, 3);
- if(str=="TRUE")
- {
- writeline(socketfd, "Permissões: Administrador.");
- return 1;
- }
- else if(str=="FALSE")
- {
- writeline(socketfd, "Permissões: Jogador.");
- return 0;
- }
- }
- else if(PQntuples(res)==0)
- {
- writeline(socketfd, "Utilizador não encontrado.");
- }
- }
- //Comando makeADMIN
- void giveadmin(int socketfd, string line)
- {
- string comando;
- string nickname;
- istringstream iss(line);
- iss >> comando >> nickname;
- if(admin(socketfd, 0)==1) //se permissoes forem de admin
- {
- PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')"); //encontrar o user na BD
- if(PQntuples(res)!=0)
- {
- executeSQL("INSERT INTO users (Admin) VALUES ("TRUE")"); //mudar o valor de admin para true
- return 1; //para verificar se bem sucedido
- }
- else if(PQntuples(res)==0)
- {
- writeline(socketfd, "Utilizador não encontrado.");
- }
- }
- if(admin(socketfd, 0)==0) //se permissoes forem de jogador
- {
- writeline(socketfd, "Não tem permissões para executar este comando.");
- }
- }
- //Comando LOGIN
- void login(int socketfd, string line)
- {
- string comando;
- string nickname;
- string password;
- istringstream iss(line);
- iss >> comando >> nickname >> password;
- if(nicknames.find(socketfd) != nicknames.end()) //utilizador já se encontra online
- {
- ostringstream mensagem;
- mensagem << "O Username " << nickname << " já se encontra conectado!" << endl;
- writeline(socketfd, mensagem.str());
- }
- else
- {
- PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')");
- if(PQntuples(res)!=0) // se utilizador estiver na base de dados
- {
- PGresult* res2 = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"') AND password=('"+password+"')");
- if(PQntuples(res2)!=0) //verifica se a password é correcta
- {
- if(nicknames.find(socketfd) != nicknames.end()) //utilizador está logged in (sessão encerrada abruptamente)
- {
- sockets.erase(nickname); //elimina a ligação deste username ao socket da sessão anterior
- nicknames.erase(socketfd);
- }
- sockets[nickname] = socketfd;
- nicknames[socketfd] = nickname;
- writeline(socketfd, "O seu login foi efectuado com sucesso!");
- }
- else
- writeline(socketfd, "Password incorrecta!! \nTente novamente!");
- }
- else
- {
- ostringstream mensagem3;
- mensagem3 << "O Username " << nickname << " NÃO existe na base de dados! \nCrie uma conta!!";
- writeline(socketfd, mensagem3.str());
- }
- }
- }
- //Comando LOGOUT
- void logout(int socketfd)
- {
- if(nicknames.find(socketfd) != nicknames.end()) //verifica se há login feito neste socket
- {
- sockets.erase(nicknames[socketfd]);
- nicknames.erase(socketfd);
- writeline(socketfd, "Logout executado com sucesso!");
- }
- else
- writeline(socketfd, "Não está nenhum username conectado com este socket.");
- }
- // Comando CATegoria nova
- void cat_nova(int socketfd,string line)
- {
- string cat;
- string comando;
- string nickname = nicknames[socketfd];
- istringstream iss(line);
- iss >> comando >> cat;
- //falta verificar se utiliz esta online
- // verifica se o utilizador já se encontra online
- if (sockets.find(nickname) == sockets.end())
- {
- writeline(socketfd,"Faça login primeiro.");
- return;
- }//SE O UTILIZADOR NAO TIVER LOGGED IN, TEM Q FAZER LOGIN
- PGresult* res = executeSQL("SELECT * FROM users WHERE nickname='"+nickname+"' AND admin = TRUE");
- if(PQntuples(res)==0)
- {
- writeline(socketfd, "Não tem permissão para criar uma categoria.");
- return;
- }
- else
- {
- PGresult* res = executeSQL("SELECT * FROM categorias WHERE nome_cat='"+cat+"'");
- if(PQntuples(res)==0)
- {
- executeSQL("INSERT INTO categorias VALUES ('"+cat+"')");
- PGresult* res = executeSQL("SELECT * FROM categorias WHERE nome_cat='"+cat+"'");
- if(PQntuples(res)>0)
- writeline(socketfd, "Categoria adicionada com sucesso");
- return;
- }
- else
- writeline(socketfd, "Essa categoria já existe");
- return;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement