Parse Game Name and Location.

This commit is contained in:
HikikoMarmy
2025-04-15 21:13:51 +01:00
parent 71a1ef719b
commit 247cd434e5
6 changed files with 38 additions and 14 deletions

View File

@@ -15,6 +15,24 @@ GameSessionManager::~GameSessionManager()
{ {
} }
std::tuple<std::wstring, std::wstring> GameSessionManager::ParseInfoData( const std::wstring &str )
{
size_t openBracket = str.find( '[' );
size_t closeBracket = str.find( ']', openBracket );
if( openBracket != std::string::npos && closeBracket != std::string::npos )
{
std::wstring roomName = str.substr( 0, openBracket );
std::wstring areaName = str.substr( openBracket + 1, closeBracket - openBracket - 1 );
roomName.erase( roomName.find_last_not_of( L" \t\r\n" ) + 1 );
return { roomName, areaName };
}
return { str, L"" };
}
void GameSessionManager::OnDisconnectUser( sptr_user user ) void GameSessionManager::OnDisconnectUser( sptr_user user )
{ {
if( !user || user->m_gameId < 0 ) if( !user || user->m_gameId < 0 )
@@ -41,13 +59,15 @@ void GameSessionManager::OnDisconnectUser( sptr_user user )
} }
} }
bool GameSessionManager::CreatePublicGameSession( sptr_user owner, std::wstring gameName ) bool GameSessionManager::CreatePublicGameSession( sptr_user owner, std::wstring gameInfo )
{ {
auto new_session = std::make_shared< GameSession >(); auto new_session = std::make_shared< GameSession >();
auto [gameName, gameLocation] = ParseInfoData( gameInfo );
new_session->m_type = GameSession::GameType::Public; new_session->m_type = GameSession::GameType::Public;
new_session->m_gameIndex = m_gameIndex; new_session->m_gameIndex = m_gameIndex;
new_session->m_gameLocation = L"Kelethin"; new_session->m_gameLocation = gameLocation;
new_session->m_gameName = gameName; new_session->m_gameName = gameName;
new_session->m_minimumLevel = 1; new_session->m_minimumLevel = 1;
new_session->m_maximumLevel = 9999; new_session->m_maximumLevel = 9999;
@@ -68,8 +88,10 @@ bool GameSessionManager::CreatePublicGameSession( sptr_user owner, std::wstring
return true; return true;
} }
bool GameSessionManager::CreatePrivateGameSession( sptr_user owner, std::wstring gameName ) bool GameSessionManager::CreatePrivateGameSession( sptr_user owner, std::wstring gameInfo )
{ {
auto [gameName, gameLocation] = ParseInfoData( gameInfo );
// Check if the game name or host session id is already in use // Check if the game name or host session id is already in use
for( auto &gameSession : m_gameSessionList ) for( auto &gameSession : m_gameSessionList )
{ {
@@ -87,7 +109,7 @@ bool GameSessionManager::CreatePrivateGameSession( sptr_user owner, std::wstring
new_session->m_type = GameSession::GameType::Private; new_session->m_type = GameSession::GameType::Private;
new_session->m_gameIndex = m_gameIndex; new_session->m_gameIndex = m_gameIndex;
new_session->m_gameLocation = L"Kelethin"; new_session->m_gameLocation = gameLocation;
new_session->m_gameName = gameName; new_session->m_gameName = gameName;
new_session->m_minimumLevel = 1; new_session->m_minimumLevel = 1;
new_session->m_maximumLevel = 9999; new_session->m_maximumLevel = 9999;

View File

@@ -11,6 +11,8 @@ private:
int32_t m_gameIndex; int32_t m_gameIndex;
std::vector< sptr_game_session > m_gameSessionList; std::vector< sptr_game_session > m_gameSessionList;
std::tuple< std::wstring, std::wstring > ParseInfoData( const std::wstring &str );
public: public:
GameSessionManager(); GameSessionManager();
~GameSessionManager(); ~GameSessionManager();
@@ -30,8 +32,8 @@ public:
void OnDisconnectUser( sptr_user user ); void OnDisconnectUser( sptr_user user );
bool CreatePublicGameSession( sptr_user user, std::wstring gameName ); bool CreatePublicGameSession( sptr_user user, std::wstring gameInfo );
bool CreatePrivateGameSession( sptr_user user, std::wstring gameName ); bool CreatePrivateGameSession( sptr_user user, std::wstring gameInfo );
bool ForceTerminateGame( const int32_t gameId ); bool ForceTerminateGame( const int32_t gameId );
sptr_game_session FindGame( const int32_t gameId ); sptr_game_session FindGame( const int32_t gameId );
sptr_game_session FindGame( const std::wstring &gameName ); sptr_game_session FindGame( const std::wstring &gameName );

View File

@@ -7,14 +7,14 @@ void RequestCreatePrivateGame::Deserialize( sptr_byte_stream stream )
DeserializeHeader( stream ); DeserializeHeader( stream );
m_sessionId = stream->read_encrypted_utf16(); m_sessionId = stream->read_encrypted_utf16();
m_gameName = stream->read_utf16(); m_gameInfo = stream->read_utf16();
} }
sptr_generic_response RequestCreatePrivateGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestCreatePrivateGame::ProcessRequest( sptr_user user, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto result = GameSessionManager::Get().CreatePrivateGameSession( user, m_gameName ); auto result = GameSessionManager::Get().CreatePrivateGameSession( user, m_gameInfo );
if( !result ) if( !result )
{ {
@@ -22,7 +22,7 @@ sptr_generic_response RequestCreatePrivateGame::ProcessRequest( sptr_user user,
return std::make_shared< ResultCreatePrivateGame >( this, CREATE_REPLY::GENERAL_ERROR, "", 0 ); return std::make_shared< ResultCreatePrivateGame >( this, CREATE_REPLY::GENERAL_ERROR, "", 0 );
} }
Log::Info( "[%S] Create Private Game: %S", m_sessionId.c_str(), m_gameName.c_str() ); Log::Info( "[%S] Create Private Game: %S", m_sessionId.c_str(), m_gameInfo.c_str() );
return std::make_shared< ResultCreatePrivateGame >( this, CREATE_REPLY::SUCCESS, Config::service_ip, Config::discovery_port ); return std::make_shared< ResultCreatePrivateGame >( this, CREATE_REPLY::SUCCESS, Config::service_ip, Config::discovery_port );
} }

View File

@@ -4,7 +4,7 @@ class RequestCreatePrivateGame : public GenericRequest
{ {
private: private:
std::wstring m_sessionId; std::wstring m_sessionId;
std::wstring m_gameName; std::wstring m_gameInfo;
enum CREATE_REPLY { enum CREATE_REPLY {
SUCCESS = 0, SUCCESS = 0,

View File

@@ -17,14 +17,14 @@ void RequestCreatePublicGame::Deserialize( sptr_byte_stream stream )
auto unknown_c = stream->read_u32(); auto unknown_c = stream->read_u32();
auto unknown_d = stream->read_u32(); auto unknown_d = stream->read_u32();
m_gameName = stream->read_utf16(); m_gameInfo = stream->read_utf16();
} }
sptr_generic_response RequestCreatePublicGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestCreatePublicGame::ProcessRequest( sptr_user user, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto result = GameSessionManager::Get().CreatePublicGameSession( user, m_gameName ); auto result = GameSessionManager::Get().CreatePublicGameSession( user, m_gameInfo );
if( !result ) if( !result )
{ {
@@ -32,7 +32,7 @@ sptr_generic_response RequestCreatePublicGame::ProcessRequest( sptr_user user, s
return std::make_shared< ResultCreatePublicGame >( this, CREATE_REPLY::GENERAL_ERROR, "", 0 ); return std::make_shared< ResultCreatePublicGame >( this, CREATE_REPLY::GENERAL_ERROR, "", 0 );
} }
Log::Info( "[%S] Create Public Game: %S", m_sessionId.c_str(), m_gameName.c_str() ); Log::Info( "[%S] Create Public Game: %S", m_sessionId.c_str(), m_gameInfo.c_str() );
return std::make_shared< ResultCreatePublicGame >(this, CREATE_REPLY::SUCCESS, Config::service_ip, Config::discovery_port); return std::make_shared< ResultCreatePublicGame >(this, CREATE_REPLY::SUCCESS, Config::service_ip, Config::discovery_port);
} }

View File

@@ -4,7 +4,7 @@ class RequestCreatePublicGame : public GenericRequest
{ {
private: private:
std::wstring m_sessionId; std::wstring m_sessionId;
std::wstring m_gameName; std::wstring m_gameInfo;
int32_t m_minimumLevel; int32_t m_minimumLevel;
int32_t m_maximumLevel; int32_t m_maximumLevel;