- Timestamp:
- Jul 19, 2014, 12:32:33 AM (11 years ago)
- Branches:
- master
- Children:
- 4c00935
- Parents:
- cdb0e98
- Location:
- server
- Files:
-
- 4 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
server/DataAccess.cpp
rcdb0e98 r53643ca 6 6 #include <crypt.h> 7 7 8 #include "LuaLoader.h" 9 8 10 using namespace std; 9 11 10 12 DataAccess::DataAccess() 11 13 { 14 LuaLoader luaLoader; 15 16 string database, username, password; 17 18 if (luaLoader.runScript("db_settings.lua")) { 19 cout << "Loading settings" << endl; 20 21 database = luaLoader.getValue("database"); 22 username = luaLoader.getValue("username"); 23 password = luaLoader.getValue("password"); 24 25 cout << database << endl; 26 cout << username << endl; 27 cout << password << endl; 28 } else { 29 cout << "Failed to load settings from lua script" << endl; 30 } 31 12 32 mysql_init(&mysql); 13 33 connection = mysql_real_connect(&mysql, "localhost", "pythonAdmin", "pyMaster09*", "pythondb", 0, 0, 0); … … 52 72 } 53 73 74 // this is no longer used anywhere 54 75 int DataAccess::updatePlayer(string username, string password) 55 76 { … … 85 106 cout << "Creating a new player" << endl; 86 107 p = new Player(string(row[1]), string(row[2])); 108 p->setId(atoi(row[0])); 87 109 if (row[3] == NULL) { 88 110 p->setClass(Player::CLASS_NONE); … … 93 115 } 94 116 cout << "Player class: " << p->playerClass << endl; 95 cout << "Created new player" << endl; 117 if (row[7] == NULL) 118 cout << "wins: NULL" << endl; 119 else 120 cout << "wins: " << atoi(row[7]) << endl; 121 if (row[8] == NULL) 122 cout << "losses: NULL" << endl; 123 else 124 cout << "losses: " << atoi(row[8]) << endl; 125 cout << "Loaded player from db" << endl; 96 126 }else { 97 127 cout << "Returned no results for some reason" << endl; … … 112 142 MYSQL_RES *result; 113 143 MYSQL_ROW row; 114 ostringstream oss;115 144 116 145 result = select("users", ""); … … 139 168 } 140 169 170 int* DataAccess::getPlayerRecord(int playerId) { 171 MYSQL_RES *result; 172 MYSQL_ROW row; 173 ostringstream oss; 174 int* record = new int[5]; 175 176 oss << "id=" << playerId; 177 result = select("users", oss.str()); 178 179 if ( ( row = mysql_fetch_row(result)) != NULL ) { 180 cout << "Retrieved player record successfully" << endl; 181 record[0] = atoi(row[4]); // level 182 record[1] = atoi(row[5]); // experience 183 record[2] = atoi(row[6]); // honor 184 record[3] = atoi(row[7]); // wins 185 record[4] = atoi(row[8]); // losses 186 cout << "record[0]:" << record[0] << endl; 187 cout << "record[1]:" << record[1] << endl; 188 cout << "record[2]:" << record[2] << endl; 189 cout << "record[3]:" << record[3] << endl; 190 cout << "record[4]:" << record[4] << endl; 191 } 192 193 if (result == NULL) { 194 cout << mysql_error(connection) << endl; 195 return NULL; 196 } 197 198 mysql_free_result(result); 199 200 return record; 201 } 202 203 int** DataAccess::getPlayerGameHistory(int playerId, unsigned int& numGames) 204 { 205 // each array is the score for one game 206 // the columns are result, team, blue score, and red score 207 // for result 0 is defeat and 1 is victory 208 // for team, 0 is blue and 1 is red 209 210 MYSQL_RES *result; 211 MYSQL_ROW row; 212 ostringstream oss; 213 214 int** gameHistory; 215 216 oss << "user_id=" << playerId; 217 result = select("gameHistory", oss.str()); 218 219 numGames = mysql_num_rows(result); 220 gameHistory = (int**)malloc(sizeof(int*)*numGames); 221 cout << "Result has " << numGames << " rows" << endl; 222 223 int i=0; 224 while ( ( row = mysql_fetch_row(result)) != NULL ) { 225 gameHistory[i] = new int[4]; 226 227 int userTeam = atoi(row[2]); 228 int blueScore = atoi(row[4]); 229 int redScore = atoi(row[3]); 230 int gameResult = -1; 231 232 if (blueScore == 3) { 233 if (userTeam == 0) 234 gameResult = 1; 235 else 236 gameResult = 0; 237 }else if (redScore == 3) { 238 if (userTeam == 1) 239 gameResult = 1; 240 else 241 gameResult = 0; 242 }else { 243 cout << "Recorded game has no team with 3 points" << endl; 244 } 245 246 gameHistory[i][0] = gameResult; 247 gameHistory[i][1] = userTeam; 248 gameHistory[i][2] = blueScore; 249 gameHistory[i][3] = redScore; 250 251 i++; 252 } 253 254 if (result == NULL) { 255 cout << mysql_error(connection) << endl; 256 return NULL; 257 } 258 259 mysql_free_result(result); 260 261 return gameHistory; 262 } 263 264 int DataAccess::saveGameHistory(int playerId, int team, int blueScore, int redScore) 265 { 266 ostringstream oss; 267 268 cout << "Saving game to db" << endl; 269 oss << playerId << ", " << team << ", " << blueScore << ", " << redScore; 270 271 return insert("gameHistory", "user_id, user_team, blue_score, red_score", oss.str()); 272 } 273 141 274 int DataAccess::insert(string table, string columns, string values) 142 275 { … … 156 289 if (query_state != 0) { 157 290 cout << mysql_error(connection) << endl; 158 return 1;291 return -1; 159 292 } 160 293 … … 168 301 169 302 if (connection == NULL) { 170 cout << "Error: no ndatabase connection exists" << endl;303 cout << "Error: no database connection exists" << endl; 171 304 return -1; 172 305 } … … 179 312 if (query_state != 0) { 180 313 cout << mysql_error(connection) << endl; 181 return 1;314 return -1; 182 315 } 183 316 … … 198 331 if (!filter.empty()) 199 332 oss << " WHERE " << filter; 333 cout << "executing select query: " << oss.str() << endl; 200 334 201 335 query_state = mysql_query(connection, oss.str().c_str()); -
server/DataAccess.h
rcdb0e98 r53643ca 1 #ifndef _DATA_ACCES _H1 #ifndef _DATA_ACCESS_H 2 2 #define _DATA_ACCESS_H 3 3 … … 16 16 ~DataAccess(); 17 17 18 int insertPlayer(string username, string password, Player::PlayerClass playerClass);19 int updatePlayer(string username, string password);20 21 18 Player* getPlayer(string username); 22 19 list<Player*>* getPlayers(); 23 20 bool verifyPassword(string encrypted, string password); 21 int insertPlayer(string username, string password, Player::PlayerClass playerClass); 22 // this method needs to be more rebust. maybe pass in a player object amd 23 // the method could use the player id to find the player and update any 24 // attributes that changed 25 int updatePlayer(string username, string password); 26 27 int* getPlayerRecord(int playerId); 28 int** getPlayerGameHistory(int playerId, unsigned int& numGames); 29 int saveGameHistory(int playerId, int team, int blueScore, int redScore); 24 30 25 31 int insert(string table, string rows, string values); -
server/makefile
rcdb0e98 r53643ca 1 1 CC = g++ 2 2 #LIB_FLAGS = -lssl -lmysqlclient -lcrypt -lrt 3 LIB_FLAGS = -lmysqlclient -lcrypt -lrt 3 LIB_FLAGS = -lmysqlclient -lcrypt -lrt -llua5.2 4 4 FLAGS = -Wall -g 5 5 COMMON_PATH = ../common 6 DEPENDENCIES = Common.o MessageContainer.o MessageProcessor.o Player.o WorldMap.o DataAccess.o Projectile.o Game.o GameSummary.o 6 DEPENDENCIES = Common.o MessageContainer.o MessageProcessor.o Player.o WorldMap.o DataAccess.o Projectile.o Game.o GameSummary.o LuaLoader.o 7 7 8 server : server.cpp $(DEPENDENCIES)8 gameServer : server.cpp $(DEPENDENCIES) 9 9 $(CC) -o $@ $+ $(FLAGS) $(LIB_FLAGS) 10 10 … … 38 38 clean: 39 39 rm *.o 40 rm server40 rm gameServer -
server/server.cpp
rcdb0e98 r53643ca 43 43 // from used to be const. Removed that so I could take a reference 44 44 // and use it to send messages 45 void processMessage(const NETWORK_MSG& clientMsg, struct sockaddr_in& from, MessageProcessor& msgProcessor, map<unsigned int, Player*>& mapPlayers, map<string, Game*>& mapGames, unsigned int& unusedPlayerId, ofstream& outputLog); 46 47 void updateUnusedPlayerId(unsigned int& id, map<unsigned int, Player*>& mapPlayers); 45 void processMessage(const NETWORK_MSG& clientMsg, struct sockaddr_in& from, MessageProcessor& msgProcessor, map<unsigned int, Player*>& mapPlayers, map<string, Game*>& mapGames, ofstream& outputLog); 46 48 47 Player *findPlayerByName(map<unsigned int, Player*> &m, string name); 49 48 Player *findPlayerByAddr(map<unsigned int, Player*> &m, const sockaddr_in &addr); … … 63 62 map<unsigned int, Projectile> mapProjectiles; 64 63 map<string, Game*> mapGames; 65 unsigned int unusedPlayerId = 1;66 64 ofstream outputLog; 67 65 … … 117 115 118 116 map<unsigned int, Player*>::iterator it; 119 120 cout << "Updating player targets and respawning dead players" << endl;121 117 122 118 // set targets for all chasing players (or make them attack if they're close enough) … … 179 175 } 180 176 181 cout << "Processing players in a game" << endl;182 183 177 // process players currently in a game 184 178 map<string, Game*>::iterator itGames; … … 188 182 game = itGames->second; 189 183 if (game->handleGameEvents()) { 184 // save game record 185 int winningTeam = -1; 186 if (game->getBlueScore() == 3) 187 winningTeam = 0; 188 else if (game->getRedScore() == 3) 189 winningTeam = 1; 190 191 if (winningTeam == -1) 192 cout << "Error: Game ended, but neither team has a score of 3" << endl; 193 else { 194 map<unsigned int, Player*>::iterator it; 195 DataAccess da; 196 197 for (it = game->getPlayers().begin(); it != game->getPlayers().end(); it++) { 198 da.saveGameHistory(it->second->getId(), winningTeam, game->getBlueScore(), game->getRedScore()); 199 } 200 } 201 190 202 // send a GAME_INFO message with 0 players to force clients to delete the game 191 203 int numPlayers = 0; … … 200 212 itGames++; 201 213 } 202 203 cout << "Processing projectiles" << endl;204 214 205 215 // move all projectiles … … 230 240 if (msgProcessor.receiveMessage(&clientMsg, &from) >= 0) 231 241 { 232 processMessage(clientMsg, from, msgProcessor, mapPlayers, mapGames, unusedPlayerId,outputLog);242 processMessage(clientMsg, from, msgProcessor, mapPlayers, mapGames, outputLog); 233 243 234 244 cout << "Finished processing the message" << endl; … … 255 265 } 256 266 257 void processMessage(const NETWORK_MSG &clientMsg, struct sockaddr_in &from, MessageProcessor &msgProcessor, map<unsigned int, Player*>& mapPlayers, map<string, Game*>& mapGames, unsigned int& unusedPlayerId,ofstream& outputLog)267 void processMessage(const NETWORK_MSG &clientMsg, struct sockaddr_in &from, MessageProcessor &msgProcessor, map<unsigned int, Player*>& mapPlayers, map<string, Game*>& mapGames, ofstream& outputLog) 258 268 { 259 269 NETWORK_MSG serverMsg; … … 331 341 else 332 342 { 333 updateUnusedPlayerId(unusedPlayerId, mapPlayers);334 p->setId(unusedPlayerId);335 343 cout << "new player id: " << p->getId() << endl; 336 344 p->setAddr(from); … … 369 377 msgProcessor.broadcastMessage(serverMsg, mapPlayers); 370 378 371 mapPlayers[ unusedPlayerId] = p;379 mapPlayers[p->getId()] = p; 372 380 } 373 381 … … 403 411 404 412 msgProcessor.broadcastMessage(serverMsg, mapPlayers); 405 406 if (p->getId() < unusedPlayerId)407 unusedPlayerId = p->getId();408 413 409 414 mapPlayers.erase(p->getId()); … … 569 574 case MSG_TYPE_PROFILE: 570 575 { 576 cout << "Received a PROFILE message" << endl; 577 578 unsigned int id; 579 580 memcpy(&id, clientMsg.buffer, 4); 581 582 cout << "Player id: " << id << endl; 583 unsigned int numGames = 0; 584 int** gameHistory = da.getPlayerGameHistory(id, numGames); 585 int* playerRecord = da.getPlayerRecord(id); 586 587 int honorPoints = playerRecord[0]; 588 int wins = playerRecord[1]; 589 int losses = playerRecord[2]; 590 571 591 serverMsg.type = MSG_TYPE_PROFILE; 572 592 573 // each array is the score for one game574 // the columns are result, team, blue score, and red score575 // for result 0 is defeat and 1 is victory576 // for team, 0 is blue and 1 is red577 int scores[][4] = {578 {1, 1, 2, 3},579 {1, 0, 3, 2},580 {0, 1, 3, 1},581 {1, 1, 0, 3},582 {0, 0, 2, 3},583 {1, 0, 3, 2},584 {1, 0, 3, 0},585 {0, 1, 3, 1},586 {1, 1, 1, 3},587 {1, 0, 3, 2}588 };589 590 int honorPoints = 1000;591 int numGames = 10;592 593 memcpy(serverMsg.buffer, &honorPoints, 4); 593 memcpy(serverMsg.buffer+4, &numGames, 4); 594 for (unsigned int i=0; i<sizeof(scores)/sizeof(scores[0]); i++) { 595 memcpy(serverMsg.buffer+8+i*16, &scores[i][0], 4); 596 memcpy(serverMsg.buffer+12+i*16, &scores[i][1], 4); 597 memcpy(serverMsg.buffer+16+i*16, &scores[i][2], 4); 598 memcpy(serverMsg.buffer+20+i*16, &scores[i][3], 4); 599 } 594 memcpy(serverMsg.buffer+4, &wins, 4); 595 memcpy(serverMsg.buffer+8, &losses, 4); 596 memcpy(serverMsg.buffer+12, &numGames, 4); 597 for (unsigned int i=0; i<numGames; i++) { 598 memcpy(serverMsg.buffer+16+i*16, &gameHistory[i][0], 4); 599 memcpy(serverMsg.buffer+20+i*16, &gameHistory[i][1], 4); 600 memcpy(serverMsg.buffer+24+i*16, &gameHistory[i][2], 4); 601 memcpy(serverMsg.buffer+28+i*16, &gameHistory[i][3], 4); 602 delete[] gameHistory[i]; 603 } 604 605 //delete[] gameHistory; 606 free(gameHistory); 607 delete[] playerRecord; 600 608 601 609 msgProcessor.sendMessage(&serverMsg, &from); … … 825 833 } 826 834 827 void updateUnusedPlayerId(unsigned int& id, map<unsigned int, Player*>& mapPlayers)828 {829 while (mapPlayers.find(id) != mapPlayers.end())830 id++;831 }832 833 835 Player *findPlayerByName(map<unsigned int, Player*> &m, string name) 834 836 {
Note:
See TracChangeset
for help on using the changeset viewer.