diff options
author | Yohann Ferreira <bertram@cegetel.net> | 2006-01-04 21:06:07 +0000 |
---|---|---|
committer | Yohann Ferreira <bertram@cegetel.net> | 2006-01-04 21:06:07 +0000 |
commit | 0417f123f1975202900ed0b3ec1bb8362f9f1567 (patch) | |
tree | 5d51c3478b0921184a950ae5847627b3f96b05ab | |
parent | 65c5f32f9622583bd158d3baa52056cb3b7be4f6 (diff) | |
download | manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.tar.gz manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.tar.bz2 manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.tar.xz manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.zip |
Implemented server response handling to the test client. Fixed a bug that made the Email change not possible. Changed some protocol value to have a litte neater client code. Added FreeBSD fix idea from icy to server code.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/accounthandler.cpp | 75 | ||||
-rw-r--r-- | src/client.cpp | 418 | ||||
-rw-r--r-- | src/dalstorage.cpp | 18 | ||||
-rw-r--r-- | src/dalstorage.h | 8 | ||||
-rw-r--r-- | src/defines.h | 12 | ||||
-rw-r--r-- | src/main.cpp | 11 | ||||
-rw-r--r-- | src/storage.h | 8 |
9 files changed, 430 insertions, 131 deletions
@@ -1,3 +1,12 @@ +2005-01-04 Yohann Ferreira <bertram@cegetel.net> + + * src/client.cpp, src/storage.h, src/dalstorage.cpp, src/dalstorage.h, + src/main.cpp, src/defines.h, src/accounthandler.cpp, src/Makefile.am: + Implemented server response handling to the test client. Fixed a bug + that made the Email change not possible. Changed some protocol value to + have a litte neater client code. Added FreeBSD fix idea from icy to + server code. + 2005-12-31 Yohann Ferreira <bertram@cegetel.net> * src/main.cpp, src/defines.h, src/utils/slangsfilter.h, diff --git a/src/Makefile.am b/src/Makefile.am index a9dd5cde..5a85c87b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,6 +6,8 @@ tmwclient_SOURCES = client.cpp \ defines.h \ messageout.h \ messageout.cpp \ + messagein.h \ + messagein.cpp \ packet.h \ packet.cpp diff --git a/src/accounthandler.cpp b/src/accounthandler.cpp index d99340b6..3aabb9bb 100644 --- a/src/accounthandler.cpp +++ b/src/accounthandler.cpp @@ -63,11 +63,12 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) std::string password = message.readString(); LOG_INFO(username << " is trying to login.", 1) + result.writeShort(SMSG_LOGIN_RESPONSE); + if (computer.getAccount().get() != NULL) { LOG_INFO("Already logged in as " << computer.getAccount()->getName() << ".", 1) LOG_INFO("Please logout first.", 1) - result.writeShort(SMSG_LOGIN_ERROR); result.writeShort(LOGIN_ALREADY_LOGGED); break; } @@ -79,13 +80,11 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) // account doesn't exist -- send error to client LOG_INFO(username << ": Account does not exist.", 1) - result.writeShort(SMSG_LOGIN_ERROR); result.writeByte(LOGIN_INVALID_USERNAME); } else if (acc->getPassword() != password) { // bad password -- send error to client LOG_INFO("Bad password for " << username, 1) - result.writeShort(SMSG_LOGIN_ERROR); result.writeByte(LOGIN_INVALID_PASSWORD); } else { LOG_INFO("Login OK by " << username, 1) @@ -93,7 +92,7 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) // Associate account with connection computer.setAccount(acc); - result.writeShort(SMSG_LOGIN_CONFIRM); + result.writeByte(LOGIN_OK); // Return information about available characters tmwserv::Beings &chars = computer.getAccount()->getCharacters(); @@ -115,10 +114,11 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_LOGOUT: { + result.writeShort(SMSG_LOGOUT_RESPONSE); + if ( computer.getAccount().get() == NULL ) { LOG_INFO("Can't logout. Not even logged in.", 1) - result.writeShort(SMSG_LOGOUT_ERROR); result.writeByte(LOGOUT_UNSUCCESSFULL); } else @@ -129,15 +129,13 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) LOG_INFO("Account without name ? Logged out anyway...", 1) // computer.unsetCharacter(); Done by unsetAccount(); computer.unsetAccount(); - result.writeShort(SMSG_LOGOUT_ERROR); - result.writeByte(LOGOUT_UNKNOWN); + result.writeByte(LOGOUT_UNSUCCESSFULL); } else { LOG_INFO(computer.getAccount()->getName() << " logs out.", 1) // computer.unsetCharacter(); Done by unsetAccount(); computer.unsetAccount(); - result.writeShort(SMSG_LOGOUT_CONFIRM); result.writeByte(LOGOUT_OK); } } @@ -149,11 +147,11 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) std::string username = message.readString(); std::string password = message.readString(); std::string email = message.readString(); + result.writeShort(SMSG_REGISTER_RESPONSE); // Checking if the Name is slang's free. if (!slangsFilter->filterContent(username)) { - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_INVALID_USERNAME); LOG_INFO(username << ": has got bad words in it.", 1) break; @@ -165,31 +163,26 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) tmwserv::AccountPtr accPtr = store.getAccount(username); if ( accPtr.get() ) // Account already exists. { - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_EXISTS_USERNAME); LOG_INFO(username << ": Username already exists.", 1) } else if ((username.length() < MIN_LOGIN_LENGTH) || (username.length() > MAX_LOGIN_LENGTH)) // Username length { - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_INVALID_USERNAME); LOG_INFO(username << ": Username too short or too long.", 1) } else if ((password.length() < MIN_PASSWORD_LENGTH) || (password.length() > MAX_PASSWORD_LENGTH)) { - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_INVALID_PASSWORD); LOG_INFO(email << ": Password too short or too long.", 1) } else if (!isEmailValid(email)) { - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_INVALID_EMAIL); LOG_INFO(email << ": Email Invalid, only a@b.c format is accepted.", 1) } - else if (store.doesEmailAlreadyExists(email)) // Search if Email already exists + else if (store.getSameEmailNumber(email) > 0) // Search if Email already exists. { - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_EXISTS_EMAIL); LOG_INFO(email << ": Email already exists.", 1) } @@ -198,7 +191,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) AccountPtr acc(new Account(username, password, email)); store.addAccount(acc); - result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_OK); store.flush(); // flush changes @@ -213,6 +205,8 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) std::string password = message.readString(); LOG_INFO(username << " wants to be deleted from our accounts.", 1) + result.writeShort(SMSG_UNREGISTER_RESPONSE); + // see if the account exists tmwserv::AccountPtr accPtr = store.getAccount(username); @@ -220,13 +214,11 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) // account doesn't exist -- send error to client LOG_INFO(username << ": Account doesn't exist anyway.", 1) - result.writeShort(SMSG_UNREGISTER_RESPONSE); result.writeByte(UNREGISTER_INVALID_USERNAME); } else if (accPtr->getPassword() != password) { // bad password -- send error to client LOG_INFO("Won't delete it : Bad password for " << username << ".", 1) - result.writeShort(SMSG_UNREGISTER_RESPONSE); result.writeByte(UNREGISTER_INVALID_PASSWORD); } else { @@ -244,7 +236,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) LOG_INFO("Farewell " << username << " ...", 1) store.delAccount(username); store.flush(); - result.writeShort(SMSG_UNREGISTER_RESPONSE); result.writeByte(UNREGISTER_OK); } } @@ -252,8 +243,9 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_EMAIL_CHANGE: { + result.writeShort(SMSG_EMAIL_CHANGE_RESPONSE); + if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_EMAIL_CHANGE_RESPONSE); result.writeByte(EMAILCHG_NOLOGIN); LOG_INFO("Not logged in. Can't change your Account's Email.", 1) break; @@ -262,21 +254,18 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) std::string email = message.readString(); if ( !isEmailValid(email) ) { - result.writeShort(SMSG_EMAIL_CHANGE_RESPONSE); result.writeByte(EMAILCHG_INVALID); LOG_INFO(email << ": Invalid format, cannot change Email for " << computer.getAccount()->getName(), 1) } - else if (store.doesEmailAlreadyExists(email)) // Search if Email already exists - { - result.writeShort(SMSG_EMAIL_CHANGE_RESPONSE); - result.writeByte(EMAILCHG_EXISTS_EMAIL); - LOG_INFO(email << ": Email already exists.", 1) + else if (store.getSameEmailNumber(email) > 1) // Search if Email already exists, + { // Except for the one already that is to + result.writeByte(EMAILCHG_EXISTS_EMAIL); // be changed. + LOG_INFO(email << ": New Email already exists.", 1) } else { computer.getAccount()->setEmail(email); - result.writeShort(SMSG_EMAIL_CHANGE_RESPONSE); result.writeByte(EMAILCHG_OK); LOG_INFO(computer.getAccount()->getName() << ": Email changed to: " << email, 1) @@ -286,15 +275,14 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_EMAIL_GET: { + result.writeShort(SMSG_EMAIL_GET_RESPONSE); if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_EMAIL_GET_RESPONSE); result.writeByte(EMAILGET_NOLOGIN); LOG_INFO("Not logged in. Can't get your Account's current Email.", 1) break; } else { - result.writeShort(SMSG_EMAIL_GET_RESPONSE); result.writeByte(EMAILGET_OK); result.writeString(computer.getAccount()->getEmail()); } @@ -303,9 +291,10 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_PASSWORD_CHANGE: { + result.writeShort(SMSG_PASSWORD_CHANGE_RESPONSE); + if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_PASSWORD_CHANGE_RESPONSE); result.writeByte(PASSCHG_NOLOGIN); LOG_INFO("Not logged in. Can't change your Account's Password.", 1) break; @@ -316,21 +305,18 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) if ( password1.length() < MIN_PASSWORD_LENGTH || password1.length() > MAX_PASSWORD_LENGTH ) { - result.writeShort(SMSG_PASSWORD_CHANGE_RESPONSE); result.writeByte(PASSCHG_INVALID); LOG_INFO(computer.getAccount()->getName() << ": New password too long or too short.", 1) } else if ( password1 != password2 ) { - result.writeShort(SMSG_PASSWORD_CHANGE_RESPONSE); result.writeByte(PASSCHG_MISMATCH); LOG_INFO(computer.getAccount()->getName() << ": New password mismatched confirmation password.", 1) } else if ( oldPassword != computer.getAccount()->getPassword() ) { - result.writeShort(SMSG_PASSWORD_CHANGE_RESPONSE); result.writeByte(PASSCHG_MISMATCH); LOG_INFO(computer.getAccount()->getName() << ": Old password is wrong.", 1) @@ -338,7 +324,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) else { computer.getAccount()->setPassword(password1); - result.writeShort(SMSG_PASSWORD_CHANGE_RESPONSE); result.writeByte(PASSCHG_OK); LOG_INFO(computer.getAccount()->getName() << ": The password was changed.", 1) @@ -348,8 +333,9 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_CHAR_CREATE: { + result.writeShort(SMSG_CHAR_CREATE_RESPONSE); + if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_CHAR_CREATE_RESPONSE); result.writeByte(CREATE_NOLOGIN); LOG_INFO("Not logged in. Can't create a Character.", 1) break; @@ -359,7 +345,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) tmwserv::Beings &chars = computer.getAccount()->getCharacters(); if (chars.size() >= MAX_OF_CHARACTERS) { - result.writeShort(SMSG_CHAR_CREATE_RESPONSE); result.writeByte(CREATE_TOO_MUCH_CHARACTERS); LOG_INFO("Already has " << MAX_OF_CHARACTERS << " characters. Can't create another Character.", 1) @@ -370,7 +355,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) // Checking if the Name is slang's free. if (!slangsFilter->filterContent(name)) { - result.writeShort(SMSG_CHAR_CREATE_RESPONSE); result.writeByte(CREATE_INVALID_NAME); LOG_INFO(name << ": Character has got bad words in it.", 1) break; @@ -378,7 +362,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) // Check if the character's name already exists if (store.doesCharacterNameExists(name)) { - result.writeShort(SMSG_CHAR_CREATE_RESPONSE); result.writeByte(CREATE_EXISTS_NAME); LOG_INFO(name << ": Character's name already exists.", 1) break; @@ -386,7 +369,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) // Check for character's name length if ((name.length() < MIN_CHARACTER_LENGTH) || (name.length() > MAX_CHARACTER_LENGTH)) { - result.writeShort(SMSG_CHAR_CREATE_RESPONSE); result.writeByte(CREATE_INVALID_NAME); LOG_INFO(name << ": Character's name too short or too long.", 1) break; @@ -404,16 +386,16 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) << computer.getAccount()->getName() << "'s account.", 1) store.flush(); // flush changes - result.writeShort(SMSG_CHAR_CREATE_RESPONSE); result.writeByte(CREATE_OK); } break; case CMSG_CHAR_SELECT: { + result.writeShort(SMSG_CHAR_SELECT_RESPONSE); + if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_CHAR_SELECT_RESPONSE); result.writeByte(SELECT_NOLOGIN); LOG_INFO("Not logged in. Can't select a Character.", 1) break; // not logged in @@ -422,7 +404,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) unsigned char charNum = message.readByte(); tmwserv::Beings &chars = computer.getAccount()->getCharacters(); - result.writeShort(SMSG_CHAR_SELECT_RESPONSE); if ( chars.size() == 0 ) { result.writeByte(SELECT_NOT_YET_CHARACTERS); @@ -449,9 +430,10 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_CHAR_DELETE: { + result.writeShort(SMSG_CHAR_DELETE_RESPONSE); + if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_CHAR_DELETE_RESPONSE); result.writeByte(DELETE_NOLOGIN); LOG_INFO("Not logged in. Can't delete a Character.", 1) break; // not logged in @@ -460,7 +442,6 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) unsigned char charNum = message.readByte(); tmwserv::Beings &chars = computer.getAccount()->getCharacters(); - result.writeShort(SMSG_CHAR_DELETE_RESPONSE); if ( chars.size() == 0 ) { result.writeByte(DELETE_NO_MORE_CHARACTERS); @@ -498,15 +479,15 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) case CMSG_CHAR_LIST: { + result.writeShort(SMSG_CHAR_LIST_RESPONSE); + if (computer.getAccount().get() == NULL) { - result.writeShort(SMSG_CHAR_LIST_RESPONSE); result.writeByte(CHAR_LIST_NOLOGIN); LOG_INFO("Not logged in. Can't list characters.", 1) break; // not logged in } - result.writeShort(SMSG_CHAR_LIST_RESPONSE); result.writeByte(CHAR_LIST_OK); // Return information about available characters tmwserv::Beings &chars = computer.getAccount()->getCharacters(); @@ -537,7 +518,7 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) default: LOG_WARN("Invalid message type", 0) - result.writeShort(SMSG_LOGIN_ERROR); + result.writeShort(SMSG_LOGIN_RESPONSE); result.writeByte(LOGIN_UNKNOWN); break; } diff --git a/src/client.cpp b/src/client.cpp index b7f59658..713e429a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -4,12 +4,13 @@ #include <iostream> #include "defines.h" #include "messageout.h" +#include "messagein.h" int main(int argc, char *argv[]) { // Initialize SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { - printf("SDL_Init: %s\n", SDL_GetError()); + std::cout << "SDL_Init: " << SDL_GetError() << std::endl; exit(1); } @@ -18,7 +19,7 @@ int main(int argc, char *argv[]) // Initialize SDL_net if (SDLNet_Init() == -1) { - printf("SDLNet_Init: %s\n", SDLNet_GetError()); + std::cout << "SDLNet_Init: " << SDLNet_GetError() << std::endl; exit(2); } @@ -27,17 +28,17 @@ int main(int argc, char *argv[]) TCPsocket tcpsock; if (SDLNet_ResolveHost(&ip, "localhost", 9601) == -1) { - printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError()); + std::cout << "SDLNet_ResolveHost: " << SDLNet_GetError() << std::endl; exit(1); } tcpsock = SDLNet_TCP_Open(&ip); if (!tcpsock) { - printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError()); + std::cout << "SDLNet_TCP_Open: " << SDLNet_GetError() << std::endl; exit(2); } - printf("Successfully connected!\n"); + std::cout << "Successfully connected!" << std::endl; int answer = 1; char line[256] = ""; @@ -47,33 +48,29 @@ int main(int argc, char *argv[]) bool responseRequired = true; MessageOut msg; - printf ("0) Quit\n"); - printf ("1) Register\n"); - printf ("2) Unregister\n"); - printf ("3) Login\n"); - printf ("4) Logout\n"); - printf ("5) Chat\n"); - printf ("6) Create character\n"); - printf ("7) Character selection\n"); - printf ("8) Delete Character\n"); - printf ("9) List Characters\n"); - printf ("10) Move Character\n"); - printf ("11) Equip Item\n"); - printf ("12) Ruby Expression\n"); - printf ("Choose your option: "); + std::cout << "0) Quit 9) Character selection" << std::endl; + std::cout << "1) Register 10) Delete Character" << std::endl; + std::cout << "2) Unregister 11) List Characters" << std::endl; + std::cout << "3) Login 12) Move Character" << std::endl; + std::cout << "4) Logout 13) Chat" << std::endl; + std::cout << "5) Change Password 14) Equip Item" << std::endl; + std::cout << "6) Change Email 15) Ruby Expression" << std::endl; + std::cout << "7) Get Email" << std::endl; + std::cout << "8) Create character" << std::endl; + std::cout << "Choose your option: "; std::cin >> answer; switch (answer) { case 1: // Register msg.writeShort(CMSG_REGISTER); - printf("Account name: ", line); + std::cout << "Account name: "; std::cin >> line; msg.writeString(line); - printf("Password: ", line); + std::cout <<"Password: "; std::cin >> line; msg.writeString(line); - printf("Email address: ", line); + std::cout << "Email address: "; std::cin >> line; msg.writeString(line); break; @@ -81,10 +78,10 @@ int main(int argc, char *argv[]) case 2: // Unregister (deleting an account) msg.writeShort(CMSG_UNREGISTER); - printf("Account name: ", line); + std::cout << "Account name: "; std::cin >> line; msg.writeString(line); - printf("Password: ", line); + std::cout << "Password: "; std::cin >> line; msg.writeString(line); break; @@ -92,10 +89,10 @@ int main(int argc, char *argv[]) case 3: // Login msg.writeShort(CMSG_LOGIN); - printf("Account name: ", line); + std::cout << "Account name: "; std::cin >> line; msg.writeString(line); - printf("Password: ", line); + std::cout << "Password: "; std::cin >> line; msg.writeString(line); break; @@ -107,51 +104,67 @@ int main(int argc, char *argv[]) break; case 5: - // Chat - msg.writeShort(CMSG_SAY); - printf("\nChat: ", line); + // Change Password + msg.writeShort(CMSG_PASSWORD_CHANGE); + std::cout << "Old Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "New Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "Retype new Password: "; std::cin >> line; msg.writeString(line); - msg.writeShort(0); - responseRequired = false; break; case 6: + // Change Email + msg.writeShort(CMSG_EMAIL_CHANGE); + std::cout << "New Email: "; + std::cin >> line; + msg.writeString(line); + break; + + case 7: + // Get current Account's Email value + msg.writeShort(CMSG_EMAIL_GET); + break; + + case 8: { // Create character msg.writeShort(CMSG_CHAR_CREATE); - printf("\nName: "); + std::cout << "Name: "; std::cin >> line; msg.writeString(line); msg.writeByte(0); } break; - case 7: + case 9: { // Select character msg.writeShort(CMSG_CHAR_SELECT); - printf("\nCharacter ID: "); + std::cout << "Character ID: "; std::cin >> line; msg.writeByte(atoi(line)); } break; - case 8: + case 10: { // Delete character msg.writeShort(CMSG_CHAR_DELETE); - printf("\nCharacter ID: "); + std::cout << "Character ID: "; std::cin >> line; msg.writeByte(atoi(line)); } break; - case 9: + case 11: { // List characters msg.writeShort(CMSG_CHAR_LIST); - std::cout <<"Character List:" << std::endl; } break; - case 10: + case 12: { // Move character long x, y; @@ -167,7 +180,17 @@ int main(int argc, char *argv[]) responseRequired = false; } break; - case 11: + case 13: + // Chat + msg.writeShort(CMSG_SAY); + std::cout << "Chat: "; + std::cin >> line; + msg.writeString(line); + msg.writeShort(0); + responseRequired = false; + break; + + case 14: { // Equip unsigned int itemId; @@ -181,7 +204,7 @@ int main(int argc, char *argv[]) msg.writeByte(slot); } break; - case 12: + case 15: { std::cout << "Expr: "; std::cin >> line; @@ -194,32 +217,321 @@ int main(int argc, char *argv[]) default: continue; } - printf("\n"); - + std::cout << "Sent: " << std::endl; + // Message hex for (unsigned int i = 0; i < msg.getPacket()->length; i++) { - printf("%x ", msg.getPacket()->data[i]); + std::cout << int(msg.getPacket()->data[i]) << " "; } - printf("\n\n"); + std::cout << std::endl; SDLNet_TCP_Send(tcpsock, msg.getPacket()->data, msg.getPacket()->length); + // Raw Datas + char data[1024]; + int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024); + if (responseRequired) { - char data[1024]; - int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024); - printf("Received:\n"); + std::cout << "Received: "; if (recvLength != -1) { for (unsigned int i = 0; i < recvLength; i++) { - printf("%x ", data[i]); + std::cout << int(data[i]) << " "; } } else { - printf("ERROR!"); + std::cout << "ERROR!" << std::endl; } - printf("\n\n"); + std::cout << std::endl; } - } - + + // Response handling + // Transforming it into a MessageIn object + if (recvLength >= 2) + { + Packet *packet = new Packet(data, recvLength); + MessageIn msg(packet); // (MessageIn frees packet) + + switch (msg.getId()) { + case SMSG_REGISTER_RESPONSE: + // Register + switch (msg.readByte()) + { + case REGISTER_OK: + std::cout << "Account registered." << std::endl; + break; + case REGISTER_INVALID_USERNAME: + std::cout << "Account registering: Invalid username." << std::endl; + break; + case REGISTER_INVALID_PASSWORD: + std::cout << "Account registering: Invalid password." << std::endl; + break; + case REGISTER_INVALID_EMAIL: + std::cout << "Account registering: Invalid Email." << std::endl; + break; + case REGISTER_EXISTS_USERNAME: + std::cout << "Account registering: Username already exists." << std::endl; + break; + case REGISTER_EXISTS_EMAIL: + std::cout << "Account registering: Email already exists." << std::endl; + break; + } + break; + + case SMSG_UNREGISTER_RESPONSE: + // Register + switch (msg.readByte()) + { + case UNREGISTER_OK: + std::cout << "Account unregistered." << std::endl; + break; + case UNREGISTER_INVALID_PASSWORD: + std::cout << "Account unregistering: Invalid password." << std::endl; + break; + case UNREGISTER_INVALID_USERNAME: + std::cout << "Account unregistering: Invalid username." << std::endl; + break; + case UNREGISTER_INVALID_UNSUFFICIENT_RIGHTS: + std::cout << "Account unregistering: unsufficient rights." << std::endl; + break; + } + break; + + case SMSG_LOGIN_RESPONSE: + // Register + switch (msg.readByte()) + { + case LOGIN_OK: + char charNumber; + charNumber = msg.readByte(); + std::cout << "Account has " << int(charNumber) << " characters." << std::endl; + for (unsigned int i = 0; i < charNumber; i++) + { + if (i >0) std::cout << ", "; + std::cout << msg.readString(); + } + std::cout << "." << std::endl; + break; + case LOGIN_INVALID_USERNAME: + std::cout << "Login: Invalid Username." << std::endl; + break; + case LOGIN_INVALID_PASSWORD: + std::cout << "Login: Invalid Password." << std::endl; + break; + case LOGIN_INVALID_VERSION: + std::cout << "TODO:Login: Invalid Version." << std::endl; + break; + case LOGIN_ALREADY_LOGGED: + std::cout << "Login: Already logged with another account." << std::endl; + break; + case LOGIN_SERVER_FULL: + std::cout << "TODO:Login: Server has reached maximum of clients." << std::endl; + break; + case LOGIN_ACCOUNT_BANNED: + std::cout << "Login: Your account has been banned." << std::endl; + break; + case LOGIN_ACCOUNT_REVIEW: + std::cout << "TODO:Login: Your account is being reviewed." << std::endl; + break; + default: + case LOGIN_UNKNOWN: + std::cout << "Login: Unknown error." << std::endl; + break; + } + break; + + case SMSG_LOGOUT_RESPONSE: + { + switch (msg.readByte()) + { + case LOGOUT_OK: + std::cout << "Logout..." << std::endl; + break; + default: + case LOGOUT_UNSUCCESSFULL: + std::cout << "Logout: unsuccessfull." << std::endl; + break; + } + } + break; + + case SMSG_PASSWORD_CHANGE_RESPONSE: + { + switch (msg.readByte()) + { + case PASSCHG_OK: + std::cout << "Password correctly changed." << std::endl; + break; + default: + case PASSCHG_NOLOGIN: + std::cout << "Password change: Not logged in." << std::endl; + break; + case PASSCHG_MISMATCH: + std::cout << "Password change: Passwords mismatch." << std::endl; + break; + case PASSCHG_INVALID: + std::cout << "Password change: New password is invalid." << std::endl; + break; + } + } + break; + + case SMSG_EMAIL_CHANGE_RESPONSE: + { + switch (msg.readByte()) + { + case EMAILCHG_OK: + std::cout << "Email correctly changed." << std::endl; + break; + default: + case EMAILCHG_NOLOGIN: + std::cout << "Email change: Not logged in." << std::endl; + break; + case EMAILCHG_EXISTS_EMAIL: + std::cout << "Email change: Email already exists." << std::endl; + break; + case EMAILCHG_INVALID: + std::cout << "Email change: New Email is invalid." << std::endl; + break; + } + } + break; + + case SMSG_EMAIL_GET_RESPONSE: + { + switch (msg.readByte()) + { + case EMAILGET_OK: + std::cout << "Current Email: " << msg.readString() << std::endl; + break; + default: + case EMAILGET_NOLOGIN: + std::cout << "Email change: Not logged in." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_CREATE_RESPONSE: + { + switch (msg.readByte()) + { + case CREATE_OK: + std::cout << "Character Created successfully." << std::endl; + break; + case CREATE_EXISTS_NAME: + std::cout << "Character Creation: Character's name already exists." + << std::endl; + break; + case CREATE_NOLOGIN: + std::cout << "Character Creation: Not logged in." << std::endl; + break; + case CREATE_TOO_MUCH_CHARACTERS: + std::cout << "Character Creation: Too much characters." << std::endl; + break; + case CREATE_INVALID_HAIR: + std::cout << "Character Creation: Invalid Hair Value." << std::endl; + break; + case CREATE_INVALID_NAME: + std::cout << "Character Creation: Invalid Name." << std::endl; + break; + case CREATE_INVALID_SEX: + std::cout << "Character Creation: Invalid Sex value." << std::endl; + break; + case CREATE_INVALID_RAW_STATS: + std::cout << "TODO: Character Creation: Invalid Raw Stats." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_DELETE_RESPONSE: + { + switch (msg.readByte()) + { + case DELETE_OK: + std::cout << "Character deleted." << std::endl; + break; + case DELETE_INVALID_NAME: + std::cout << "Character Deletion: Character's name doesn't exist." + << std::endl; + break; + case DELETE_NOLOGIN: + std::cout << "Character Deletion: Not logged in." << std::endl; + break; + case DELETE_NO_MORE_CHARACTERS: + std::cout << "Character Creation: No more characters." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_SELECT_RESPONSE: + { + switch (msg.readByte()) + { + case SELECT_OK: + std::cout << "Character selected." << std::endl; + break; + case SELECT_INVALID: + std::cout << "Character Selection: invalid ID." + << std::endl; + break; + case SELECT_NOLOGIN: + std::cout << "Character Selection: Not logged in." << std::endl; + break; + case SELECT_NOT_YET_CHARACTERS: + std::cout << "Character Selection: No character to select." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_LIST_RESPONSE: + { + switch (msg.readByte()) + { + case CHAR_LIST_OK: + char charNumber; + charNumber = msg.readByte(); + std::cout << "Character List:" << std::endl + << "---------------" << std::endl; + std::cout << int(charNumber) << " characters in the account." + << std::endl; + for (unsigned int i = 0; i < charNumber; i++) + { + std::cout << msg.readString() << ":" << std::endl; + std::cout << "Gender: " << int(msg.readByte()) << ", "; + std::cout << "Level: " << int(msg.readByte()) << ", "; + std::cout << "Money: " << int(msg.readByte()) << ", " + << std::endl; + std::cout << "Strength: " << int(msg.readByte()) << ", "; + std::cout << "Agility: " << int(msg.readByte()) << ", "; + std::cout << "Vitality: " << int(msg.readByte()) << ", " + << std::endl; + std::cout << "Intelligence: " << int(msg.readByte()) << ", "; + std::cout << "Dexterity: " << int(msg.readByte()) << ", "; + std::cout << "Luck: " << int(msg.readByte()) << ", " + << std::endl << std::endl; + } + break; + case CHAR_LIST_NOLOGIN: + std::cout << "Character List: Not logged in." + << std::endl; + break; + } + } + break; + + + default: + continue; + } // End switch MessageId + + } // end if recLength > 2 (MessageLength > 2) + + + } // End running loop + SDLNet_TCP_Close(tcpsock); return 0; diff --git a/src/dalstorage.cpp b/src/dalstorage.cpp index c0359754..4b6ce81f 100644 --- a/src/dalstorage.cpp +++ b/src/dalstorage.cpp @@ -406,10 +406,11 @@ DALStorage::getEmailList() } /** - * Tells if Email already exists. + * Return the number of same Emails in account's table. */ -bool -DALStorage::doesEmailAlreadyExists(const std::string &email) + +unsigned int +DALStorage::getSameEmailNumber(const std::string &email) { // If not opened already open(); @@ -427,16 +428,9 @@ DALStorage::doesEmailAlreadyExists(const std::string &email) } std::stringstream ssStream(accountInfo(0,0)); - int iReturn = -1; + unsigned int iReturn = 0; ssStream >> iReturn; - if ( iReturn > 0 ) - { - return true; - } - else - { - return false; - } + return iReturn; } catch (const dal::DbSqlQueryExecFailure& e) { // TODO: throw an exception. diff --git a/src/dalstorage.h b/src/dalstorage.h index d3785568..ae22b65f 100644 --- a/src/dalstorage.h +++ b/src/dalstorage.h @@ -100,11 +100,11 @@ class DALStorage: public Storage getEmailList(); /** - * Tells if Email already exists. - * @return true if Email is already in database + * Return the number of same Emails in account's table. + * @return Number of same Email. */ - bool - doesEmailAlreadyExists(const std::string &email); + unsigned int + getSameEmailNumber(const std::string &email); /** * Tells if the character's name already exists diff --git a/src/defines.h b/src/defines.h index a997ace9..43841ffe 100644 --- a/src/defines.h +++ b/src/defines.h @@ -98,11 +98,9 @@ enum { SMSG_UNREGISTER_RESPONSE = 0x0004, CMSG_LOGIN = 0x0010, CMSG_ENCRYPTED_LOGIN = 0x0011, - SMSG_LOGIN_ERROR = 0x0012, - SMSG_LOGIN_CONFIRM = 0x0013, - CMSG_LOGOUT = 0x0014, - SMSG_LOGOUT_ERROR = 0x0015, - SMSG_LOGOUT_CONFIRM = 0x0016, + SMSG_LOGIN_RESPONSE = 0x0012, + CMSG_LOGOUT = 0x0013, + SMSG_LOGOUT_RESPONSE = 0x0014, CMSG_CHAR_CREATE = 0x0020, SMSG_CHAR_CREATE_RESPONSE = 0x0021, CMSG_CHAR_DELETE = 0x0022, @@ -178,8 +176,7 @@ enum { // Logout return values enum { LOGOUT_OK = 0, - LOGOUT_UNSUCCESSFULL, - LOGOUT_UNKNOWN + LOGOUT_UNSUCCESSFULL }; // Account register return values @@ -206,6 +203,7 @@ enum { CREATE_INVALID_NAME, CREATE_INVALID_HAIR, CREATE_INVALID_SEX, + CREATE_INVALID_RAW_STATS, CREATE_EXISTS_NAME, CREATE_TOO_MUCH_CHARACTERS, CREATE_NOLOGIN diff --git a/src/main.cpp b/src/main.cpp index b6b0659b..d39b04c5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,7 @@ #include <SDL.h> #include <SDL_net.h> -#ifdef __USE_UNIX98 +#if (defined __USE_UNIX98 || defined __FreeBSD__) #include "../config.h" #endif @@ -131,7 +131,7 @@ void initialize() std::string configPath = CONFIG_FILE; #else -#ifdef __USE_UNIX98 +#if (defined __USE_UNIX98 || defined __FreeBSD__) std::string configPath = getenv("HOME"); configPath += "/."; configPath += DEFAULT_CONFIG_FILE; @@ -146,7 +146,7 @@ void initialize() std::string logPath = LOG_FILE; #else -#ifdef __USE_UNIX98 +#if (defined __USE_UNIX98 || defined __FreeBSD__) std::string logPath = getenv("HOME"); logPath += "/."; logPath += DEFAULT_LOG_FILE; @@ -343,7 +343,7 @@ void parseOptions(int argc, char *argv[]) */ int main(int argc, char *argv[]) { -#ifdef __USE_UNIX98 +#if (defined __USE_UNIX98 || defined __FreeBSD__) LOG_INFO("The Mana World Server v" << PACKAGE_VERSION, 0) #endif @@ -370,6 +370,9 @@ int main(int argc, char *argv[]) connectionHandler->registerHandler(CMSG_CHAR_SELECT, accountHandler); connectionHandler->registerHandler(CMSG_CHAR_DELETE, accountHandler); connectionHandler->registerHandler(CMSG_CHAR_LIST, accountHandler); + connectionHandler->registerHandler(CMSG_EMAIL_GET, accountHandler); + connectionHandler->registerHandler(CMSG_PASSWORD_CHANGE, accountHandler); + connectionHandler->registerHandler(CMSG_EMAIL_CHANGE, accountHandler); connectionHandler->registerHandler(CMSG_SAY, chatHandler); connectionHandler->registerHandler(CMSG_ANNOUNCE, chatHandler); diff --git a/src/storage.h b/src/storage.h index 534eca0a..6a844320 100644 --- a/src/storage.h +++ b/src/storage.h @@ -292,11 +292,11 @@ class Storage std::list<std::string> getEmailList() = 0; /** - * Return if an Email is already in account's table. - * @return true if Email already exists. + * Return the number of same Emails in account's table. + * @return Number of same Email. */ - virtual bool - doesEmailAlreadyExists(const std::string &email) = 0; + virtual unsigned int + getSameEmailNumber(const std::string &email) = 0; /** * Tells if the character's name already exists |