summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYohann Ferreira <bertram@cegetel.net>2006-01-04 21:06:07 +0000
committerYohann Ferreira <bertram@cegetel.net>2006-01-04 21:06:07 +0000
commit0417f123f1975202900ed0b3ec1bb8362f9f1567 (patch)
tree5d51c3478b0921184a950ae5847627b3f96b05ab
parent65c5f32f9622583bd158d3baa52056cb3b7be4f6 (diff)
downloadmanaserv-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--ChangeLog9
-rw-r--r--src/Makefile.am2
-rw-r--r--src/accounthandler.cpp75
-rw-r--r--src/client.cpp418
-rw-r--r--src/dalstorage.cpp18
-rw-r--r--src/dalstorage.h8
-rw-r--r--src/defines.h12
-rw-r--r--src/main.cpp11
-rw-r--r--src/storage.h8
9 files changed, 430 insertions, 131 deletions
diff --git a/ChangeLog b/ChangeLog
index bbd0555b..53570aea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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