Files
2022-10-26 12:25:11 +08:00

118 lines
2.9 KiB
C++

#include "StdAfx.h"
#include ".\tempuser.h"
#include "UserSessionFactory.h"
#include "User.h"
#include <Constant.h>
#include <PacketStruct_SM.h>
#include "UserManager.h"
#include "UserInfoParser.h"
#include "UserInfo.h"
#include "ServerInfoParser.h"
#include "WorldManager.h"
TempUser::TempUser(void)
{
}
TempUser::~TempUser(void)
{
}
VOID TempUser::OnDisconnect()
{
}
VOID TempUser::Init()
{
UserSession::Init();
}
VOID TempUser::Release()
{
UserSession::Release();
}
BOOL TempUser::SendPacket( MSG_BASE* pMsg, WORD wSize )
{
return UserSession::SendPacket( pMsg, wSize );
}
VOID TempUser::OnRecv( BYTE * pMsg, WORD wSize )
{
//1. 인증요청 패킷이 오면.. 인증검사 단계를 거치고,
//2. 성공이면... 새로운 네트워크객체를 생성시켜서, 할당하고, 메니져에 추가한다.
//3. 실패면..... 실패 메세지를 보낸다.
const WORD wLoginSyn = MAKEWORD( SM_USER, SM_USER_LOGIN_SYN );
MSG_BASE* pMsgBase = (MSG_BASE*)pMsg;
if( !pMsgBase ) return;
WORD wMsgKey = MAKEWORD( pMsgBase->m_byCategory, pMsgBase->m_byProtocol );
if( wLoginSyn == wMsgKey) //로그인 패킷이면..
{
MSG_SM_USER_LOGIN_SYN *pRecvMsg = (MSG_SM_USER_LOGIN_SYN*)pMsg;
if( !pRecvMsg ) return;
UserInfo* pUserInfo = UserInfoParser::Instance()->GetUserInfo( pRecvMsg->m_szUserID, pRecvMsg->m_szPassWord, GetIP() );
if( pUserInfo ) //있으면...
{
User* pNewUser = (User*)UserSessionFactory::Instance()->AllocUser( UT_USER );
pNewUser->SetUserKey( pUserInfo->GetUserGUID() );
pNewUser->SetID( pUserInfo->GetUserID() );
pNewUser->SetPassword( pUserInfo->GetUserPassWord() );
pNewUser->SetGrade( pUserInfo->GetUserGrade() );
Redirect( pNewUser );
UserSessionFactory::Instance()->FreeUser( this );
UserManager::Instance()->AddUser( pNewUser );
MSGOUT( "[User Login] ID : %s, IP : %s, KEY : %d", pUserInfo->GetUserID(), GetIP(), pNewUser->GetUserKey() );
MSG_SM_USER_LOGIN_ACK AckMsg;
AckMsg.m_byResult = RC_USER_LOGIN_SUCCESS;
AckMsg.m_dwUserKey = pUserInfo->GetUserGUID();
AckMsg.m_byGrade = pUserInfo->GetUserGrade();
pNewUser->SendPacket( &AckMsg, sizeof(AckMsg) );
// 서버정보 Send
MSG_SM_SERVER_INFO_CMD CmdMsg;
WorldManager::Instance()->SerializeServerInfoStreamForUser( CmdMsg.m_ServerTotalInfo, pNewUser->GetUserKey() );
pNewUser->SendPacket( &CmdMsg, CmdMsg.GetSize() );
#ifdef __20080312__SOLARAUTH_SERVER_PATCH
MSG_SM_SCRIPTFOLDER_INFO_CMD FoldInfo;
WorldManager::Instance()->SerializeScriptFolderInfoStream( FoldInfo.m_SCFolderTotalInfo, pNewUser->GetUserKey() );
pNewUser->SendPacket( &FoldInfo, FoldInfo.GetSize() );
#endif
// FTP 연결 정보 Send
MSG_SM_SERVER_FTP_INFO_CMD FtpCmd;
WorldManager::Instance()->SerializeFtpInfoStreamForUser( FtpCmd.m_FtpTotalInfo, pNewUser->GetUserKey() );
pNewUser->SendPacket( &FtpCmd, FtpCmd.GetSize() );
}
else //없으면..
{
MSG_SM_USER_LOGIN_ACK ack;
ack.m_byResult = RC_USER_LOGIN_FAIL;
SendPacket( &ack, sizeof(ack) );
}
}
}