48 lines
1.5 KiB
C++
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);
|
|
}
|
|
}
|