룸 내의 유저만 조회 기능 추가

This commit is contained in:
2025-05-10 17:40:58 +09:00
parent 91a3cfd9f4
commit 7c382bead0
5 changed files with 131 additions and 21 deletions

View File

@@ -48,12 +48,14 @@ public:
void processRoomJoinRequestPacket(RoomJoinRequestPacket roomJoinRequestPacket, IOCPPASSINDATA* data);
void processRoomExitRequestPacket(RoomExitRequestPacket roomExitRequestPacket, IOCPPASSINDATA* data);
void processUsersListRequestPacket(UsersListRequestPacket usersListRequestPacket, IOCPPASSINDATA* data);
void processUsersListInRoomRequestPacket(RoomUsersListRequestPacket roomUsersListRequestPacket, IOCPPASSINDATA* data);
void processDataPostPacket(DataPostPacket dataPostPacket, IOCPPASSINDATA* data);
void processContinuePacket(ContinuePacket continuePacket, IOCPPASSINDATA* data);
bool registerUser(std::string userName, std::shared_ptr<TCPSocket> sock);
void deleteUser(Snowflake UID);
std::vector<std::pair<Snowflake, std::string>> getUserList();
std::vector<std::pair<Snowflake, std::string>> getUserListInRoom(Snowflake RID);
Snowflake createRoom(std::string roomName);
void deleteRoom(Snowflake RID);

View File

@@ -148,6 +148,8 @@ PacketSet ServerManager::packetParser(Packet Packet) {
return PacketSet::ROOMEXITREQUEST;
case RequestType::USERS_LIST:
return PacketSet::USERSLISTREQUEST;
case RequestType::ROOM_USERS_LIST:
return PacketSet::ROOMUSERSLISTREQUEST;
case RequestType::DATA:
return PacketSet::INVALID;
}
@@ -166,6 +168,8 @@ PacketSet ServerManager::packetParser(Packet Packet) {
return PacketSet::ROOMEXITRESPONSE;
case RequestType::USERS_LIST:
return PacketSet::USERSLISTRESPONSE;
case RequestType::ROOM_USERS_LIST:
return PacketSet::ROOMUSERSLISTRESPONSE;
case RequestType::DATA:
return PacketSet::INVALID;
}
@@ -340,7 +344,37 @@ void ServerManager::processUsersListRequestPacket(UsersListRequestPacket usersLi
}
}
void ServerManager::processDataPostPacket(DataPostPacket dataPostPacket, IOCPPASSINDATA* data) {
void ServerManager::processUsersListInRoomRequestPacket(RoomUsersListRequestPacket roomUsersListRequestPacket, IOCPPASSINDATA *data) {
std::unique_lock<std::mutex> lock(resourceMutex_);
Snowflake roomID;
::memcpy(&roomID.snowflake, roomUsersListRequestPacket.__data.roomId, sizeof(Snowflake));
auto usersList = getUserListInRoom(roomID);
for (auto user : usersList) {
UsersListResponsePacket usersListResponsePacket;
usersListResponsePacket.__data.packetType = Chattr::PacketCategory::PACKET_RESPONSE;
usersListResponsePacket.__data.requestType = Chattr::RequestType::USERS_LIST;
usersListResponsePacket.__data.dataType = Chattr::DataType::BINARY;
usersListResponsePacket.__data.packetLength = sizeof(Chattr::ResponseStatusCode) + sizeof(std::uint32_t) + sizeof(Snowflake) + user.second.size();
usersListResponsePacket.__data.responseStatusCode = Chattr::ResponseStatusCode::RES_OK;
usersListResponsePacket.__data.usersCount = usersList.size();
::memcpy(usersListResponsePacket.__data.userId, &user.first, sizeof(Snowflake));
::memcpy(usersListResponsePacket.__data.name, user.second.c_str(), user.second.size());
int packetLength = usersListResponsePacket.__data.packetLength;
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data);
ptr->wsabuf.len = packetLength + 8;
usersListResponsePacket.convToN();
memcpy(ptr->wsabuf.buf, usersListResponsePacket.serialized, packetLength + 8);
data->sendbytes = packetLength + 8;
data->IOCPInstance->send(ptr, 1, 0);
}
}
void ServerManager::processDataPostPacket(DataPostPacket dataPostPacket, IOCPPASSINDATA *data)
{
std::unique_lock<std::mutex> lock(resourceMutex_);
Snowflake destID;
::memcpy(&destID.snowflake, dataPostPacket.__data.destId, sizeof(Snowflake));
@@ -373,12 +407,12 @@ void ServerManager::processDataPostPacket(DataPostPacket dataPostPacket, IOCPPAS
int packetLength = dataPostPacket.__data.packetLength;
dataPostPacket.convToN();
for (auto dest : destinationSockets) {
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data);
ptr->socket = dest;
ptr->wsabuf.len = packetLength + 8;
dataPostPacket.convToN();
memcpy(ptr->wsabuf.buf, dataPostPacket.serialized, packetLength + 8);
data->sendbytes = packetLength + 8;
data->IOCPInstance->send(ptr, 1, 0);
@@ -459,6 +493,17 @@ std::vector<std::pair<Snowflake, std::string>> ServerManager::getUserList() {
return userList;
}
std::vector<std::pair<Snowflake, std::string>> ServerManager::getUserListInRoom(Snowflake RID) {
std::vector<std::pair<Snowflake, std::string>> userList;
userList.reserve(rooms_[RID].size());
for (auto user : rooms_[RID])
userList.push_back({ user.first, userNames_[user.first] });
return userList;
}
Snowflake ServerManager::createRoom(std::string roomName) {
Snowflake RID = GenerateID();
roomNames_[RID] = roomName;
@@ -494,6 +539,7 @@ void ServerManager::run() {
while (true) {
spdlog::info("Waiting for connection...");
listenSock_.accept(clientSock_, clientAddr_);
spdlog::trace("Accepted connection from {}, [{}]", clientSock_.sock, (std::string)clientAddr_);
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
ptr->socket = std::make_shared<TCPSocket>(std::move(clientSock_));
ptr->wsabuf.len = 1500;