feat: 중복 로그인 방지 코드 추가

This commit is contained in:
bumpsoo 2026-02-04 13:58:58 +00:00
parent 1d103d7f16
commit 17013f70f5
6 changed files with 102 additions and 7 deletions

View file

@ -30,14 +30,50 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
auto userData = co_await DatabaseManager::GetInstance().LoadUser(nickname);
session->SetNickname(userData.nickname);
// 골드와 검 레벨 설정 (닉네임은 TryJoin에서 설정)
session->SetGold(userData.gold);
session->SetSwordLevel(userData.swordLevel);
Logger::Log("클라이언트 로그인: ", nickname, " (Gold: ", session->GetGold(),
PKT_SC_LoginResult loginResult;
// 원자적으로 중복 체크 및 세션 추가
if (!SessionManager::GetInstance().TryJoin(session, userData.nickname)) {
// 이미 접속 중인 유저
Logger::Log("중복 로그인 거부: ", nickname);
loginResult.result = 0;
PacketHeader header;
header.id = static_cast<uint16_t>(PacketID::SC_LoginResult);
header.size = sizeof(PKT_SC_LoginResult);
std::vector<uint8_t> buffer(sizeof(PacketHeader) +
sizeof(PKT_SC_LoginResult));
std::memcpy(buffer.data(), &header, sizeof(PacketHeader));
std::memcpy(buffer.data() + sizeof(PacketHeader), &loginResult,
sizeof(PKT_SC_LoginResult));
session->Send(buffer);
co_return;
}
Logger::Log("클라이언트 로그인 성공: ", nickname,
" (Gold: ", session->GetGold(),
", Level: ", session->GetSwordLevel(), ")");
SessionManager::GetInstance().Join(session);
// 로그인 성공 응답
loginResult.result = 1;
PacketHeader header;
header.id = static_cast<uint16_t>(PacketID::SC_LoginResult);
header.size = sizeof(PKT_SC_LoginResult);
std::vector<uint8_t> buffer(sizeof(PacketHeader) +
sizeof(PKT_SC_LoginResult));
std::memcpy(buffer.data(), &header, sizeof(PacketHeader));
std::memcpy(buffer.data() + sizeof(PacketHeader), &loginResult,
sizeof(PKT_SC_LoginResult));
session->Send(buffer);
} break;
case PacketID::CS_UpgradeSword: {