summaryrefslogtreecommitdiff
path: root/src/net/tmwa/loginhandler.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2011-07-28 03:27:26 +0300
committerAndrei Karas <akaras@inbox.ru>2011-07-28 22:22:17 +0300
commit0cc6167c407c1cf18158ca0e154a3b1cab48853d (patch)
treef1e0fe4300113d3bb969bc72e5712ec84b4e2ab5 /src/net/tmwa/loginhandler.cpp
parent7b15124d28592ee7b9248c9ff3b19e710c1ce4ee (diff)
downloadmv-0cc6167c407c1cf18158ca0e154a3b1cab48853d.tar.gz
mv-0cc6167c407c1cf18158ca0e154a3b1cab48853d.tar.bz2
mv-0cc6167c407c1cf18158ca0e154a3b1cab48853d.tar.xz
mv-0cc6167c407c1cf18158ca0e154a3b1cab48853d.zip
Extract shared logic from charserverhandler and loginhandler netcode to ea namespace.
Diffstat (limited to 'src/net/tmwa/loginhandler.cpp')
-rw-r--r--src/net/tmwa/loginhandler.cpp256
1 files changed, 32 insertions, 224 deletions
diff --git a/src/net/tmwa/loginhandler.cpp b/src/net/tmwa/loginhandler.cpp
index 0cc1670bb..62d8833ec 100644
--- a/src/net/tmwa/loginhandler.cpp
+++ b/src/net/tmwa/loginhandler.cpp
@@ -46,9 +46,7 @@ namespace TmwAthena
extern ServerInfo charServer;
-LoginHandler::LoginHandler():
- mVersionResponse(false),
- mRegistrationEnabled(true)
+LoginHandler::LoginHandler()
{
static const Uint16 _messages[] =
{
@@ -65,172 +63,30 @@ LoginHandler::LoginHandler():
LoginHandler::~LoginHandler()
{
- delete_all(mWorlds);
}
void LoginHandler::handleMessage(Net::MessageIn &msg)
{
- int code, worldCount;
-
switch (msg.getId())
{
case SMSG_CHAR_PASSWORD_RESPONSE:
- {
- // 0: acc not found, 1: success, 2: password mismatch, 3: pass too short
- int errMsg = msg.readInt8();
- // Successful pass change
- if (errMsg == 1)
- {
- Client::setState(STATE_CHANGEPASSWORD_SUCCESS);
- }
- // pass change failed
- else
- {
- switch (errMsg)
- {
- case 0:
- errorMessage =
- _("Account was not found. Please re-login.");
- break;
- case 2:
- errorMessage = _("Old password incorrect.");
- break;
- case 3:
- errorMessage = _("New password too short.");
- break;
- default:
- errorMessage = _("Unknown error.");
- break;
- }
- Client::setState(STATE_ACCOUNTCHANGE_ERROR);
- }
- }
+ procecessCharPasswordResponse(msg);
break;
case SMSG_UPDATE_HOST:
- int len;
-
- len = msg.readInt16() - 4;
- mUpdateHost = msg.readString(len);
- loginData.updateHost = mUpdateHost;
-
- logger->log("Received update host \"%s\" from login server.",
- mUpdateHost.c_str());
- break;
+ processUpdateHost(msg);
+ break;
case SMSG_LOGIN_DATA:
- // Skip the length word
- msg.skip(2);
-
- clearWorlds();
-
- worldCount = (msg.getLength() - 47) / 32;
-
- mToken.session_ID1 = msg.readInt32();
- mToken.account_ID = msg.readInt32();
- mToken.session_ID2 = msg.readInt32();
- msg.skip(30); // unknown
- // reserve bits for future usage
- mToken.sex = (msg.readInt8() & 1) ? GENDER_MALE : GENDER_FEMALE;
-
- for (int i = 0; i < worldCount; i++)
- {
- WorldInfo *world = new WorldInfo;
-
- world->address = msg.readInt32();
- world->port = msg.readInt16();
- world->name = msg.readString(20);
- world->online_users = msg.readInt32();
- config.setValue("updatehost", mUpdateHost);
- world->updateHost = mUpdateHost;
- msg.skip(2); // unknown
-
- logger->log("Network: Server: %s (%s:%d)",
- world->name.c_str(),
- ipToString(world->address),
- world->port);
-
- mWorlds.push_back(world);
- }
- Client::setState(STATE_WORLD_SELECT);
+ processLoginData(msg);
break;
case SMSG_LOGIN_ERROR:
- code = msg.readInt8();
- logger->log("Login::error code: %i", code);
-
- switch (code)
- {
- case 0:
- errorMessage = _("Unregistered ID.");
- break;
- case 1:
- errorMessage = _("Wrong password.");
- break;
- case 2:
- errorMessage = _("Account expired.");
- break;
- case 3:
- errorMessage = _("Rejected from server.");
- break;
- case 4:
- errorMessage = _("You have been permanently banned from "
- "the game. Please contact the GM team.");
- break;
- case 5:
- errorMessage = _("Client too old.");
- break;
- case 6:
- errorMessage = strprintf(_("You have been temporarily "
- "banned from the game until "
- "%s.\nPlease contact the GM "
- "team via the forums."),
- msg.readString(20).c_str());
- break;
- case 7:
- errorMessage = _("Server overpopulated.");
- break;
- case 9:
- errorMessage = _("This user name is already taken.");
- break;
- case 10:
- errorMessage = _("Wrong name.");
- break;
- case 99:
- errorMessage = _("Username permanently erased.");
- break;
- default:
- errorMessage = _("Unknown error.");
- break;
- }
- Client::setState(STATE_ERROR);
+ processLoginError(msg);
break;
case SMSG_SERVER_VERSION_RESPONSE:
- {
- // TODO: verify these!
-
- char b1 = msg.readInt8(); // -1
- char b2 = msg.readInt8(); // T
- char b3 = msg.readInt8(); // M
- char b4 = msg.readInt8(); // W
- if (b1 == -1 && b2 == 'E' && b3 == 'V' && b4 == 'L')
- {
- unsigned int options = msg.readInt8();
- mRegistrationEnabled = options;
- msg.skip(2);
- serverVersion = msg.readInt8();
- }
- else
- {
- unsigned int options = msg.readInt32();
- mRegistrationEnabled = options;
- serverVersion = 0;
- }
-
- // Leave this last
- mVersionResponse = true;
- }
+ processServerVersion(msg);
break;
default:
@@ -261,42 +117,6 @@ void LoginHandler::disconnect()
mNetwork->disconnect();
}
-bool LoginHandler::isRegistrationEnabled()
-{
- return mRegistrationEnabled;
-}
-
-void LoginHandler::getRegistrationDetails()
-{
- // Not supported, so move on
- Client::setState(STATE_REGISTER);
-}
-
-void LoginHandler::loginAccount(LoginData *loginData)
-{
-
- if (loginData)
- {
- // Since we're attempting to use the tAthena protocol,
- // let's reset the character slots to the good value,
- // in case we just logged out a Manaserv server
- // with a different config.
- loginData->resetCharacterSlots();
-
- sendLoginRegister(loginData->username, loginData->password);
- }
-}
-
-void LoginHandler::logout()
-{
- // TODO
-}
-
-void LoginHandler::changeEmail(const std::string &email A_UNUSED)
-{
- // TODO
-}
-
void LoginHandler::changePassword(const std::string &username A_UNUSED,
const std::string &oldPassword,
const std::string &newPassword)
@@ -306,38 +126,6 @@ void LoginHandler::changePassword(const std::string &username A_UNUSED,
outMsg.writeString(newPassword, 24);
}
-void LoginHandler::chooseServer(unsigned int server)
-{
- if (server >= mWorlds.size() || !mWorlds[server])
- return;
-
- charServer.clear();
- if (config.getBoolValue("usePersistentIP"))
- charServer.hostname = Client::getServerName();
- else
- charServer.hostname = ipToString(mWorlds[server]->address);
- charServer.port = mWorlds[server]->port;
-
- Client::setState(STATE_UPDATE);
-}
-
-void LoginHandler::registerAccount(LoginData *loginData)
-{
- if (!loginData)
- return;
-
- std::string username = loginData->username;
- username.append((loginData->gender == GENDER_FEMALE) ? "_F" : "_M");
-
- sendLoginRegister(username, loginData->password);
-}
-
-void LoginHandler::unregisterAccount(const std::string &username A_UNUSED,
- const std::string &password A_UNUSED)
-{
- // TODO
-}
-
void LoginHandler::sendLoginRegister(const std::string &username,
const std::string &password)
{
@@ -355,15 +143,35 @@ void LoginHandler::sendLoginRegister(const std::string &username,
outMsg.writeInt8(0x03);
}
-Worlds LoginHandler::getWorlds() const
+ServerInfo *LoginHandler::getCharServer()
{
- return mWorlds;
+ return &charServer;
}
-void LoginHandler::clearWorlds()
+void LoginHandler::processServerVersion(Net::MessageIn &msg)
{
- delete_all(mWorlds);
- mWorlds.clear();
+ // TODO: verify these!
+
+ char b1 = msg.readInt8(); // -1
+ char b2 = msg.readInt8(); // T
+ char b3 = msg.readInt8(); // M
+ char b4 = msg.readInt8(); // W
+ if (b1 == -1 && b2 == 'E' && b3 == 'V' && b4 == 'L')
+ {
+ unsigned int options = msg.readInt8();
+ mRegistrationEnabled = options;
+ msg.skip(2);
+ serverVersion = msg.readInt8();
+ }
+ else
+ {
+ unsigned int options = msg.readInt32();
+ mRegistrationEnabled = options;
+ serverVersion = 0;
+ }
+
+ // Leave this last
+ mVersionResponse = true;
}
} // namespace TmwAthena