00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "net/ea/loginhandler.h"
00023
00024 #include "net/ea/protocol.h"
00025
00026 #include "net/messagein.h"
00027 #include "net/messageout.h"
00028
00029 #include "log.h"
00030 #include "logindata.h"
00031 #include "main.h"
00032 #include "serverinfo.h"
00033
00034 #include "utils/gettext.h"
00035 #include "utils/strprintf.h"
00036 #include "utils/stringutils.h"
00037
00038 extern SERVER_INFO **server_info;
00039
00040 Net::LoginHandler *loginHandler;
00041
00042 namespace EAthena {
00043
00044 LoginHandler::LoginHandler()
00045 {
00046 static const Uint16 _messages[] = {
00047 SMSG_UPDATE_HOST,
00048 SMSG_LOGIN_DATA,
00049 SMSG_LOGIN_ERROR,
00050 0
00051 };
00052 handledMessages = _messages;
00053 loginHandler = this;
00054 }
00055
00056 void LoginHandler::handleMessage(MessageIn &msg)
00057 {
00058 int code;
00059
00060 switch (msg.getId())
00061 {
00062 case SMSG_UPDATE_HOST:
00063 int len;
00064
00065 len = msg.readInt16() - 4;
00066 mUpdateHost = msg.readString(len);
00067
00068 logger->log("Received update host \"%s\" from login server",
00069 mUpdateHost.c_str());
00070 break;
00071
00072 case SMSG_LOGIN_DATA:
00073
00074 msg.skip(2);
00075
00076 n_server = (msg.getLength() - 47) / 32;
00077 server_info =
00078 (SERVER_INFO**) malloc(sizeof(SERVER_INFO*) * n_server);
00079
00080 mLoginData->session_ID1 = msg.readInt32();
00081 mLoginData->account_ID = msg.readInt32();
00082 mLoginData->session_ID2 = msg.readInt32();
00083 msg.skip(30);
00084 mLoginData->sex = msg.readInt8() ? GENDER_MALE : GENDER_FEMALE;
00085
00086 for (int i = 0; i < n_server; i++)
00087 {
00088 server_info[i] = new SERVER_INFO;
00089
00090 server_info[i]->address = msg.readInt32();
00091 server_info[i]->port = msg.readInt16();
00092 server_info[i]->name = msg.readString(20);
00093 server_info[i]->online_users = msg.readInt32();
00094 server_info[i]->updateHost = mUpdateHost;
00095 msg.skip(2);
00096
00097 logger->log("Network: Server: %s (%s:%d)",
00098 server_info[i]->name.c_str(),
00099 ipToString(server_info[i]->address),
00100 server_info[i]->port);
00101 }
00102 state = STATE_CHAR_SERVER;
00103 break;
00104
00105 case SMSG_LOGIN_ERROR:
00106 code = msg.readInt8();
00107 logger->log("Login::error code: %i", code);
00108
00109 switch (code) {
00110 case 0:
00111 errorMessage = _("Unregistered ID");
00112 break;
00113 case 1:
00114 errorMessage = _("Wrong password");
00115 break;
00116 case 2:
00117 errorMessage = _("Account expired");
00118 break;
00119 case 3:
00120 errorMessage = _("Rejected from server");
00121 break;
00122 case 4:
00123
00124 errorMessage = _("You have been permanently banned from "
00125 "the game. Please contact the GM Team.");
00126 break;
00127 case 6:
00128 errorMessage = strprintf(_("You have been temporarily "
00129 "banned from the game until "
00130 "%s.\n Please contact the GM "
00131 "team via the forums."),
00132 msg.readString(20).c_str());
00133 break;
00134 case 9:
00135 errorMessage = _("This user name is already taken");
00136 break;
00137 default:
00138 errorMessage = _("Unknown error");
00139 break;
00140 }
00141 state = STATE_ERROR;
00142 break;
00143 }
00144 }
00145
00146 void LoginHandler::loginAccount(LoginData *loginData)
00147 {
00148 mLoginData = loginData;
00149 sendLoginRegister(loginData->username, loginData->password);
00150 }
00151
00152 void LoginHandler::changeEmail(const std::string &email)
00153 {
00154
00155 }
00156
00157 void LoginHandler::changePassword(const std::string &username,
00158 const std::string &oldPassword,
00159 const std::string &newPassword)
00160 {
00161
00162 }
00163
00164 void LoginHandler::chooseServer(int server)
00165 {
00166
00167 }
00168
00169 void LoginHandler::registerAccount(LoginData *loginData)
00170 {
00171 mLoginData = loginData;
00172
00173 std::string username = loginData->username;
00174 username.append((loginData->sex == GENDER_FEMALE) ? "_F" : "_M");
00175
00176 sendLoginRegister(username, loginData->password);
00177 }
00178
00179 void LoginHandler::unregisterAccount(const std::string &username,
00180 const std::string &password)
00181 {
00182
00183 }
00184
00185 void LoginHandler::sendLoginRegister(const std::string &username,
00186 const std::string &password)
00187 {
00188 MessageOut outMsg(0x0064);
00189 outMsg.writeInt32(0);
00190 outMsg.writeString(username, 24);
00191 outMsg.writeString(password, 24);
00192
00193
00194
00195
00196
00197
00198
00199 outMsg.writeInt8(0x01);
00200 }
00201
00202 }