룸 내의 유저만 조회 기능 추가
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user