sword_game/server/SessionManager.cpp

48 lines
1.5 KiB
C++

#include "SessionManager.h"
#include "Logger.h"
SessionManager &SessionManager::GetInstance() {
static SessionManager instance;
return instance;
}
void SessionManager::Leave(std::shared_ptr<Session> session) {
std::lock_guard<std::mutex> lock(mutex_);
if (sessions_.erase(session) > 0) {
Logger::Log("클라이언트[", session->GetNickname(),
"]가 퇴장했습니다. 총 세션 수: ", sessions_.size());
}
}
bool SessionManager::TryJoin(std::shared_ptr<Session> session,
const std::string &nickname) {
std::lock_guard<std::mutex> lock(mutex_);
// 중복 체크
for (const auto &existing : sessions_) {
if (existing->GetNickname() == nickname) {
Logger::Log("이미 접속 중인 유저 로그인 시도: ", nickname);
return false;
}
}
// 중복이 없으면 닉네임 설정 후 추가
session->SetNickname(nickname);
sessions_.insert(session);
Logger::Log("클라이언트[", nickname,
"]가 입장했습니다. 총 세션 수: ", sessions_.size());
return true;
}
void SessionManager::Broadcast(PacketHeader header,
std::span<const uint8_t> body) {
std::lock_guard<std::mutex> lock(mutex_);
std::vector<uint8_t> buffer(sizeof(PacketHeader) + body.size());
std::memcpy(buffer.data(), &header, sizeof(PacketHeader));
std::memcpy(buffer.data() + sizeof(PacketHeader), body.data(), body.size());
for (auto &session : sessions_) {
session->Send(buffer);
}
}