Advertisement
Guest User

Untitled

a guest
May 21st, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. #include <iostream> // cout
  2. #include <stdlib.h> // exit
  3. #include <string.h> // bzero
  4. #include <unistd.h>
  5. #include <postgresql/libpq-fe.h> // base de dados
  6.  
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <map>
  11. #include <sstream>
  12. #include <vector>
  13. #include <string>
  14. #include <time.h>
  15. #include <algorithm>
  16. #include <iomanip>
  17.  
  18. #include <pthread.h>
  19. #include <set>
  20.  
  21. /////////////////////////////////////////////////////POR USERS COM USERNAME PW PONTOS ADMIN E CURRGAME
  22.  
  23. using namespace std;
  24.  
  25. set<int> clients;
  26.  
  27. map<string, int> sockets;
  28. map<int, string> nicknames;
  29.  
  30. bool writeline(int socketfd, string line);
  31.  
  32. /*----------INÍCIO DAS FUNÇÕES INSERIDAS POR NÓS--------------*/
  33.  
  34. // Conectar com a Base de Dados e Executar comandos SQL
  35. PGconn* conn = NULL;
  36. void broadcast(int origin, string text) { //manda mensagem para todos menos o próprio
  37.  
  38. ostringstream message; //usamos um ostringstream para construir uma string e imprime numa string
  39.  
  40. message << text;
  41.  
  42.  
  43.  
  44.  
  45.  
  46. set<int>::iterator it;
  47.  
  48.  
  49.  
  50. for (it = clients.begin(); it != clients.end(); it++)
  51.  
  52. if (*it != origin) writeline (*it, message.str());
  53.  
  54.  
  55.  
  56. writeline(origin,"");
  57.  
  58.  
  59.  
  60. }
  61.  
  62. void initDB()
  63. {
  64. conn = PQconnectdb("host='dbm.fe.up.pt' user='sinf17e11' password='lima'");
  65.  
  66. if (!conn)
  67. {
  68. cout << "Não foi possivel ligar a base de dados" << endl;
  69. exit(-1);
  70. }
  71.  
  72. if (PQstatus(conn) != CONNECTION_OK)
  73. {
  74. cout << "Não foi possivel ligar a base de dados" << endl;
  75. exit(-1);
  76. }
  77. }
  78.  
  79. PGresult* executeSQL(string sql)
  80. {
  81.  
  82. PGresult* res = PQexec(conn, sql.c_str());
  83. cout << "\n SQL:" << sql << "\n" << endl;
  84.  
  85.  
  86.  
  87. if (!(PQresultStatus(res) == PGRES_COMMAND_OK || PQresultStatus(res) == PGRES_TUPLES_OK))
  88. {
  89. cout << "Não foi possível executar o comando!" << sql << endl;
  90. return NULL;
  91. }
  92.  
  93. return res;
  94. }
  95.  
  96. void closeDB()
  97. {
  98. PQfinish(conn);
  99. }
  100. //------------------------------------
  101. // Auxiliar para dividir strings
  102. vector<std::string> split(const std::string &s, char delim) {
  103. vector<string> elems;
  104. stringstream ss(s);
  105. string item;
  106. while (getline(ss, item, delim)) {
  107. elems.push_back(item);
  108. }
  109. return elems;
  110. }
  111.  
  112.  
  113. string intToString(int i) {
  114. ostringstream oss;
  115. oss << i;
  116. return oss.str();
  117. }
  118.  
  119. //Comando REGISTAR
  120. void registar(int socketfd, string line)
  121. {
  122. string comando;
  123. string nickname;
  124. string password;
  125.  
  126. istringstream iss(line);
  127.  
  128. iss >> comando >> nickname >> password;
  129.  
  130. if (nicknames.find(socketfd) != nicknames.end()) //utilizador está logged in
  131. {
  132. ostringstream mensagem;
  133. mensagem << "O Username " << nickname << " já se encontra conectado!";
  134. writeline(socketfd, mensagem.str());
  135. }
  136. else
  137. {
  138. PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')");
  139. if(PQntuples(res)!=0) // se já existir na base da dados
  140. {
  141. ostringstream mensagem2;
  142. mensagem2 << "O username " << nickname << " já existe na base de dados";
  143. writeline(socketfd, mensagem2.str());
  144. }
  145. else // se não existir na BD
  146. {
  147. executeSQL("INSERT INTO users VALUES ('"+nickname+"', '"+password+"', '"intToString(0)"', "FALSE")"); // Introduzir dados na BD, inicializar pontos a zero e nivel de admin falso
  148. ostringstream mensagem3;
  149. mensagem3 << "O username " << nickname << " foi criado com sucesso";
  150. writeline(socketfd, mensagem3.str());
  151. }
  152. }
  153. }
  154.  
  155. //Comando ADMINlvl
  156. void admin(int socketfd, string line) //diz o tipo de permissoes admin ou jogador
  157. {
  158. string comando;
  159. string nickname;
  160. 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++
  161.  
  162. istringstream iss(line);
  163.  
  164. iss >> comando >> nickname;
  165.  
  166. PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')"); //encontrar o user na BD
  167.  
  168. if(PQntuples(res)!=0)
  169. {
  170. str=PQgetvalue(res, 0, 3);
  171. if(str=="TRUE")
  172. {
  173. writeline(socketfd, "Permissões: Administrador.");
  174. return 1;
  175. }
  176. else if(str=="FALSE")
  177. {
  178. writeline(socketfd, "Permissões: Jogador.");
  179. return 0;
  180. }
  181. }
  182. else if(PQntuples(res)==0)
  183. {
  184. writeline(socketfd, "Utilizador não encontrado.");
  185. }
  186. }
  187.  
  188. //Comando makeADMIN
  189. void giveadmin(int socketfd, string line)
  190. {
  191. string comando;
  192. string nickname;
  193.  
  194. istringstream iss(line);
  195.  
  196. iss >> comando >> nickname;
  197.  
  198. if(admin(socketfd, 0)==1) //se permissoes forem de admin
  199. {
  200. PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')"); //encontrar o user na BD
  201.  
  202. if(PQntuples(res)!=0)
  203. {
  204. executeSQL("INSERT INTO users (Admin) VALUES ("TRUE")"); //mudar o valor de admin para true
  205. return 1; //para verificar se bem sucedido
  206. }
  207. else if(PQntuples(res)==0)
  208. {
  209. writeline(socketfd, "Utilizador não encontrado.");
  210. }
  211. }
  212. if(admin(socketfd, 0)==0) //se permissoes forem de jogador
  213. {
  214. writeline(socketfd, "Não tem permissões para executar este comando.");
  215. }
  216. }
  217.  
  218. //Comando LOGIN
  219. void login(int socketfd, string line)
  220. {
  221. string comando;
  222. string nickname;
  223. string password;
  224.  
  225. istringstream iss(line);
  226.  
  227. iss >> comando >> nickname >> password;
  228.  
  229. if(nicknames.find(socketfd) != nicknames.end()) //utilizador já se encontra online
  230. {
  231. ostringstream mensagem;
  232. mensagem << "O Username " << nickname << " já se encontra conectado!" << endl;
  233. writeline(socketfd, mensagem.str());
  234. }
  235.  
  236. else
  237. {
  238. PGresult* res = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"')");
  239. if(PQntuples(res)!=0) // se utilizador estiver na base de dados
  240. {
  241. PGresult* res2 = executeSQL("SELECT * FROM users WHERE nickname=('"+nickname+"') AND password=('"+password+"')");
  242. if(PQntuples(res2)!=0) //verifica se a password é correcta
  243. {
  244. if(nicknames.find(socketfd) != nicknames.end()) //utilizador está logged in (sessão encerrada abruptamente)
  245. {
  246. sockets.erase(nickname); //elimina a ligação deste username ao socket da sessão anterior
  247. nicknames.erase(socketfd);
  248. }
  249. sockets[nickname] = socketfd;
  250. nicknames[socketfd] = nickname;
  251. writeline(socketfd, "O seu login foi efectuado com sucesso!");
  252. }
  253. else
  254. writeline(socketfd, "Password incorrecta!! \nTente novamente!");
  255. }
  256. else
  257. {
  258. ostringstream mensagem3;
  259. mensagem3 << "O Username " << nickname << " NÃO existe na base de dados! \nCrie uma conta!!";
  260. writeline(socketfd, mensagem3.str());
  261. }
  262. }
  263. }
  264.  
  265.  
  266. //Comando LOGOUT
  267. void logout(int socketfd)
  268. {
  269. if(nicknames.find(socketfd) != nicknames.end()) //verifica se há login feito neste socket
  270. {
  271. sockets.erase(nicknames[socketfd]);
  272. nicknames.erase(socketfd);
  273. writeline(socketfd, "Logout executado com sucesso!");
  274. }
  275. else
  276. writeline(socketfd, "Não está nenhum username conectado com este socket.");
  277. }
  278.  
  279. // Comando CATegoria nova
  280.  
  281. void cat_nova(int socketfd,string line)
  282. {
  283. string cat;
  284. string comando;
  285. string nickname = nicknames[socketfd];
  286.  
  287. istringstream iss(line);
  288. iss >> comando >> cat;
  289.  
  290. //falta verificar se utiliz esta online
  291.  
  292. // verifica se o utilizador já se encontra online
  293. if (sockets.find(nickname) == sockets.end())
  294. {
  295. writeline(socketfd,"Faça login primeiro.");
  296. return;
  297.  
  298. }//SE O UTILIZADOR NAO TIVER LOGGED IN, TEM Q FAZER LOGIN
  299.  
  300. PGresult* res = executeSQL("SELECT * FROM users WHERE nickname='"+nickname+"' AND admin = TRUE");
  301.  
  302. if(PQntuples(res)==0)
  303. {
  304. writeline(socketfd, "Não tem permissão para criar uma categoria.");
  305. return;
  306. }
  307. else
  308. {
  309. PGresult* res = executeSQL("SELECT * FROM categorias WHERE nome_cat='"+cat+"'");
  310. if(PQntuples(res)==0)
  311. {
  312. executeSQL("INSERT INTO categorias VALUES ('"+cat+"')");
  313.  
  314. PGresult* res = executeSQL("SELECT * FROM categorias WHERE nome_cat='"+cat+"'");
  315. if(PQntuples(res)>0)
  316. writeline(socketfd, "Categoria adicionada com sucesso");
  317. return;
  318. }
  319. else
  320. writeline(socketfd, "Essa categoria já existe");
  321. return;
  322. }
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement