From 511407c8eaff5246437b2661bd4eab65460bd149 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sat, 18 Nov 2023 17:33:52 -0800 Subject: [PATCH] Removing ignore works now --- dChatServer/ChatIgnoreList.cpp | 52 +++++++++++++++-- dChatServer/ChatIgnoreList.h | 1 + dChatServer/ChatPacketHandler.cpp | 94 +++++++++++++++---------------- dChatServer/ChatServer.cpp | 18 +++--- dCommon/Game.h | 2 + 5 files changed, 106 insertions(+), 61 deletions(-) diff --git a/dChatServer/ChatIgnoreList.cpp b/dChatServer/ChatIgnoreList.cpp index a84c3cda..bcb771e7 100644 --- a/dChatServer/ChatIgnoreList.cpp +++ b/dChatServer/ChatIgnoreList.cpp @@ -9,10 +9,9 @@ #include "Database.h" -extern PlayerContainer playerContainer; - enum IgnoreReponse : uint8_t { AddIgnoreResponse = 32, + RemoveIgnoreResponse = 33, GetIgnoreListResponse = 34, }; @@ -23,7 +22,7 @@ void ChatIgnoreList::GetIgnoreList(Packet* packet) { LWOOBJID playerId; inStream.Read(playerId); - auto* receiver = playerContainer.GetPlayerData(playerId); + auto* receiver = Game::playerContainer.GetPlayerData(playerId); if (!receiver) { LOG("Tried to get ignore list, but player %llu not found in container", playerId); return; @@ -63,11 +62,12 @@ void ChatIgnoreList::AddIgnore(Packet* packet) { LWOOBJID playerId; inStream.Read(playerId); - auto* receiver = playerContainer.GetPlayerData(playerId); + auto* receiver = Game::playerContainer.GetPlayerData(playerId); if (!receiver) { LOG("Tried to get ignore list, but player %llu not found in container", playerId); return; } + inStream.IgnoreBytes(4); // ignore some garbage zeros idk LUWString toIgnoreName(33); @@ -92,7 +92,7 @@ void ChatIgnoreList::AddIgnore(Packet* packet) { bitStream.Write(IgnoreResponse::ALREADY_IGNORED); } else { - auto* playerData = playerContainer.GetPlayerData(toIgnoreStr); + auto* playerData = Game::playerContainer.GetPlayerData(toIgnoreStr); if (!playerData) { // Fall back to query auto player = Database::Get()->GetCharacterInfo(toIgnoreStr); @@ -119,3 +119,45 @@ void ChatIgnoreList::AddIgnore(Packet* packet) { Game::server->Send(&bitStream, packet->systemAddress, false); } + +void ChatIgnoreList::RemoveIgnore(Packet* packet) { + LOG_DEBUG("Removing ignore"); + + CINSTREAM_SKIP_HEADER; + LWOOBJID playerId; + inStream.Read(playerId); + + auto* receiver = Game::playerContainer.GetPlayerData(playerId); + if (!receiver) { + LOG("Tried to get ignore list, but player %llu not found in container", playerId); + return; + } + + inStream.IgnoreBytes(4); // ignore some garbage zeros idk + + LUWString removedIgnoreName(33); + inStream.Read(removedIgnoreName); + std::string removedIgnoreStr = removedIgnoreName.GetAsString(); + + LOG("Removing ignore for %s", removedIgnoreStr.c_str()); + auto toRemove = std::remove(receiver->ignoredPlayers.begin(), receiver->ignoredPlayers.end(), removedIgnoreStr); + if (toRemove == receiver->ignoredPlayers.end()) { + LOG_DEBUG("Player %llu is not ignoring %s", playerId, removedIgnoreStr.c_str()); + return; + } + + receiver->ignoredPlayers.erase(toRemove, receiver->ignoredPlayers.end()); + CBITSTREAM; + BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); + + bitStream.Write(receiver->playerID); + + //portion that will get routed: + BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, IgnoreReponse::RemoveIgnoreResponse); + + bitStream.Write(0); + LUWString playerNameSend(removedIgnoreStr, 33); + bitStream.Write(playerNameSend); + + Game::server->Send(&bitStream, packet->systemAddress, false); +} diff --git a/dChatServer/ChatIgnoreList.h b/dChatServer/ChatIgnoreList.h index 48170369..4e90677b 100644 --- a/dChatServer/ChatIgnoreList.h +++ b/dChatServer/ChatIgnoreList.h @@ -6,6 +6,7 @@ struct Packet; namespace ChatIgnoreList { void GetIgnoreList(Packet* packet); void AddIgnore(Packet* packet); + void RemoveIgnore(Packet* packet); }; #endif //!__CHATIGNORELIST__H__ diff --git a/dChatServer/ChatPacketHandler.cpp b/dChatServer/ChatPacketHandler.cpp index 0a3caa8e..46a54888 100644 --- a/dChatServer/ChatPacketHandler.cpp +++ b/dChatServer/ChatPacketHandler.cpp @@ -19,15 +19,13 @@ #include "eClientMessageType.h" #include "eGameMessageType.h" -extern PlayerContainer playerContainer; - void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) { //Get from the packet which player we want to do something with: CINSTREAM_SKIP_HEADER; LWOOBJID playerID = 0; inStream.Read(playerID); - auto player = playerContainer.GetPlayerData(playerID); + auto player = Game::playerContainer.GetPlayerData(playerID); if (!player) return; auto friendsList = Database::Get()->GetFriendsList(playerID); @@ -43,7 +41,7 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) { fd.friendName = friendData.friendName; //Now check if they're online: - auto fr = playerContainer.GetPlayerData(fd.friendID); + auto fr = Game::playerContainer.GetPlayerData(fd.friendID); if (fr) { fd.isOnline = true; @@ -97,7 +95,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { char isBestFriendRequest{}; inStream.Read(isBestFriendRequest); - auto requestor = playerContainer.GetPlayerData(requestorPlayerID); + auto requestor = Game::playerContainer.GetPlayerData(requestorPlayerID); if (!requestor) { LOG("No requestor player %llu sent to %s found.", requestorPlayerID, playerName.c_str()); return; @@ -107,7 +105,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { SendFriendResponse(requestor, requestor, eAddFriendResponseType::MYTHRAN); return; }; - std::unique_ptr requestee(playerContainer.GetPlayerData(playerName)); + std::unique_ptr requestee(Game::playerContainer.GetPlayerData(playerName)); // Check if player is online first if (isBestFriendRequest && !requestee) { @@ -175,7 +173,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { // Only do updates if there was a change in the bff status. if (oldBestFriendStatus != bestFriendStatus) { - auto maxBestFriends = playerContainer.GetMaxNumberOfBestFriends(); + auto maxBestFriends = Game::playerContainer.GetMaxNumberOfBestFriends(); if (requestee->countOfBestFriends >= maxBestFriends || requestor->countOfBestFriends >= maxBestFriends) { if (requestee->countOfBestFriends >= maxBestFriends) { SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::THEIRFRIENDLISTFULL, false); @@ -208,7 +206,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::WAITINGAPPROVAL, true, true); } } else { - auto maxFriends = playerContainer.GetMaxNumberOfFriends(); + auto maxFriends = Game::playerContainer.GetMaxNumberOfFriends(); if (requestee->friends.size() >= maxFriends) { SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::THEIRFRIENDLISTFULL, false); } else if (requestor->friends.size() >= maxFriends) { @@ -232,8 +230,8 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) { std::string friendName = PacketUtils::ReadString(0x15, packet, true); //Now to try and find both of these: - auto requestor = playerContainer.GetPlayerData(playerID); - auto requestee = playerContainer.GetPlayerData(friendName); + auto requestor = Game::playerContainer.GetPlayerData(playerID); + auto requestee = Game::playerContainer.GetPlayerData(friendName); if (!requestor || !requestee) return; eAddFriendResponseType serverResponseCode{}; @@ -315,7 +313,7 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) { Database::Get()->RemoveFriend(playerID, friendID); //Now, we need to send an update to notify the sender (and possibly, receiver) that their friendship has been ended: - auto goonA = playerContainer.GetPlayerData(playerID); + auto goonA = Game::playerContainer.GetPlayerData(playerID); if (goonA) { // Remove the friend from our list of friends for (auto friendData = goonA->friends.begin(); friendData != goonA->friends.end(); friendData++) { @@ -328,7 +326,7 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) { SendRemoveFriend(goonA, friendName, true); } - auto goonB = playerContainer.GetPlayerData(friendID); + auto goonB = Game::playerContainer.GetPlayerData(friendID); if (!goonB) return; // Do it again for other person for (auto friendData = goonB->friends.begin(); friendData != goonB->friends.end(); friendData++) { @@ -339,7 +337,7 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) { } } - std::string goonAName = GeneralUtils::UTF16ToWTF8(playerContainer.GetName(playerID)); + std::string goonAName = GeneralUtils::UTF16ToWTF8(Game::playerContainer.GetName(playerID)); SendRemoveFriend(goonB, goonAName, true); } @@ -348,11 +346,11 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) { LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - auto* sender = playerContainer.GetPlayerData(playerID); + auto* sender = Game::playerContainer.GetPlayerData(playerID); if (sender == nullptr) return; - if (playerContainer.GetIsMuted(sender)) return; + if (Game::playerContainer.GetIsMuted(sender)) return; const auto senderName = std::string(sender->playerName.c_str()); @@ -367,12 +365,12 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) { if (channel != 8) return; - auto* team = playerContainer.GetTeam(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); if (team == nullptr) return; for (const auto memberId : team->memberIDs) { - auto* otherMember = playerContainer.GetPlayerData(memberId); + auto* otherMember = Game::playerContainer.GetPlayerData(memberId); if (otherMember == nullptr) return; @@ -406,11 +404,11 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) { std::string message = PacketUtils::ReadString(0xAA, packet, true, 512); //Get the bois: - auto goonA = playerContainer.GetPlayerData(senderID); - auto goonB = playerContainer.GetPlayerData(receiverName); + auto goonA = Game::playerContainer.GetPlayerData(senderID); + auto goonB = Game::playerContainer.GetPlayerData(receiverName); if (!goonA || !goonB) return; - if (playerContainer.GetIsMuted(goonA)) return; + if (Game::playerContainer.GetIsMuted(goonA)) return; std::string goonAName = goonA->playerName.c_str(); std::string goonBName = goonB->playerName.c_str(); @@ -468,25 +466,25 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet) { inStream.Read(playerID); std::string invitedPlayer = PacketUtils::ReadString(0x14, packet, true); - auto* player = playerContainer.GetPlayerData(playerID); + auto* player = Game::playerContainer.GetPlayerData(playerID); if (player == nullptr) { return; } - auto* team = playerContainer.GetTeam(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); if (team == nullptr) { - team = playerContainer.CreateTeam(playerID); + team = Game::playerContainer.CreateTeam(playerID); } - auto* other = playerContainer.GetPlayerData(invitedPlayer); + auto* other = Game::playerContainer.GetPlayerData(invitedPlayer); if (other == nullptr) { return; } - if (playerContainer.GetTeam(other->playerID) != nullptr) { + if (Game::playerContainer.GetTeam(other->playerID) != nullptr) { return; } @@ -519,12 +517,12 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) { return; } - auto* team = playerContainer.GetTeam(leaderID); + auto* team = Game::playerContainer.GetTeam(leaderID); if (team == nullptr) { LOG("Failed to find team for leader (%llu)", leaderID); - team = playerContainer.GetTeam(playerID); + team = Game::playerContainer.GetTeam(playerID); } if (team == nullptr) { @@ -532,7 +530,7 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) { return; } - playerContainer.AddMember(team, playerID); + Game::playerContainer.AddMember(team, playerID); } void ChatPacketHandler::HandleTeamLeave(Packet* packet) { @@ -542,12 +540,12 @@ void ChatPacketHandler::HandleTeamLeave(Packet* packet) { uint32_t size = 0; inStream.Read(size); - auto* team = playerContainer.GetTeam(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); LOG("(%llu) leaving team", playerID); if (team != nullptr) { - playerContainer.RemoveMember(team, playerID, false, false, true); + Game::playerContainer.RemoveMember(team, playerID, false, false, true); } } @@ -560,24 +558,24 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet) { LOG("(%llu) kicking (%s) from team", playerID, kickedPlayer.c_str()); - auto* kicked = playerContainer.GetPlayerData(kickedPlayer); + auto* kicked = Game::playerContainer.GetPlayerData(kickedPlayer); LWOOBJID kickedId = LWOOBJID_EMPTY; if (kicked != nullptr) { kickedId = kicked->playerID; } else { - kickedId = playerContainer.GetId(GeneralUtils::UTF8ToUTF16(kickedPlayer)); + kickedId = Game::playerContainer.GetId(GeneralUtils::UTF8ToUTF16(kickedPlayer)); } if (kickedId == LWOOBJID_EMPTY) return; - auto* team = playerContainer.GetTeam(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); if (team != nullptr) { if (team->leaderID != playerID || team->leaderID == kickedId) return; - playerContainer.RemoveMember(team, kickedId, false, true, false); + Game::playerContainer.RemoveMember(team, kickedId, false, true, false); } } @@ -590,16 +588,16 @@ void ChatPacketHandler::HandleTeamPromote(Packet* packet) { LOG("(%llu) promoting (%s) to team leader", playerID, promotedPlayer.c_str()); - auto* promoted = playerContainer.GetPlayerData(promotedPlayer); + auto* promoted = Game::playerContainer.GetPlayerData(promotedPlayer); if (promoted == nullptr) return; - auto* team = playerContainer.GetTeam(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); if (team != nullptr) { if (team->leaderID != playerID) return; - playerContainer.PromoteMember(team, promoted->playerID); + Game::playerContainer.PromoteMember(team, promoted->playerID); } } @@ -613,16 +611,16 @@ void ChatPacketHandler::HandleTeamLootOption(Packet* packet) { char option; inStream.Read(option); - auto* team = playerContainer.GetTeam(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); if (team != nullptr) { if (team->leaderID != playerID) return; team->lootFlag = option; - playerContainer.TeamStatusUpdate(team); + Game::playerContainer.TeamStatusUpdate(team); - playerContainer.UpdateTeamsOnWorld(team, false); + Game::playerContainer.UpdateTeamsOnWorld(team, false); } } @@ -631,18 +629,18 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) { LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - auto* team = playerContainer.GetTeam(playerID); - auto* data = playerContainer.GetPlayerData(playerID); + auto* team = Game::playerContainer.GetTeam(playerID); + auto* data = Game::playerContainer.GetPlayerData(playerID); if (team != nullptr && data != nullptr) { if (team->local && data->zoneID.GetMapID() != team->zoneId.GetMapID() && data->zoneID.GetCloneID() != team->zoneId.GetCloneID()) { - playerContainer.RemoveMember(team, playerID, false, false, true, true); + Game::playerContainer.RemoveMember(team, playerID, false, false, true, true); return; } if (team->memberIDs.size() <= 1 && !team->local) { - playerContainer.DisbandTeam(team); + Game::playerContainer.DisbandTeam(team); return; } @@ -653,16 +651,16 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) { ChatPacketHandler::SendTeamSetLeader(data, LWOOBJID_EMPTY); } - playerContainer.TeamStatusUpdate(team); + Game::playerContainer.TeamStatusUpdate(team); const auto leaderName = GeneralUtils::UTF8ToUTF16(data->playerName); for (const auto memberId : team->memberIDs) { - auto* otherMember = playerContainer.GetPlayerData(memberId); + auto* otherMember = Game::playerContainer.GetPlayerData(memberId); if (memberId == playerID) continue; - const auto memberName = playerContainer.GetName(memberId); + const auto memberName = Game::playerContainer.GetName(memberId); if (otherMember != nullptr) { ChatPacketHandler::SendTeamSetOffWorldFlag(otherMember, data->playerID, data->zoneID); @@ -670,7 +668,7 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) { ChatPacketHandler::SendTeamAddPlayer(data, false, team->local, false, memberId, memberName, otherMember != nullptr ? otherMember->zoneID : LWOZONEID(0, 0, 0)); } - playerContainer.UpdateTeamsOnWorld(team, false); + Game::playerContainer.UpdateTeamsOnWorld(team, false); } } diff --git a/dChatServer/ChatServer.cpp b/dChatServer/ChatServer.cpp index 6671b047..fccbdb23 100644 --- a/dChatServer/ChatServer.cpp +++ b/dChatServer/ChatServer.cpp @@ -35,14 +35,12 @@ namespace Game { AssetManager* assetManager = nullptr; bool shouldShutdown = false; std::mt19937 randomEngine; + PlayerContainer playerContainer; } - Logger* SetupLogger(); void HandlePacket(Packet* packet); -PlayerContainer playerContainer; - int main(int argc, char** argv) { constexpr uint32_t chatFramerate = mediumFramerate; constexpr uint32_t chatFrameDelta = mediumFrameDelta; @@ -109,7 +107,7 @@ int main(int argc, char** argv) { Game::randomEngine = std::mt19937(time(0)); - playerContainer.Initialize(); + Game::playerContainer.Initialize(); //Run it until server gets a kill message from Master: auto t = std::chrono::high_resolution_clock::now(); @@ -201,19 +199,19 @@ void HandlePacket(Packet* packet) { if (static_cast(packet->data[1]) == eConnectionType::CHAT_INTERNAL) { switch (static_cast(packet->data[3])) { case eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION: - playerContainer.InsertPlayer(packet); + Game::playerContainer.InsertPlayer(packet); break; case eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION: - playerContainer.RemovePlayer(packet); + Game::playerContainer.RemovePlayer(packet); break; case eChatInternalMessageType::MUTE_UPDATE: - playerContainer.MuteUpdate(packet); + Game::playerContainer.MuteUpdate(packet); break; case eChatInternalMessageType::CREATE_TEAM: - playerContainer.CreateTeamServer(packet); + Game::playerContainer.CreateTeamServer(packet); break; case eChatInternalMessageType::ANNOUNCEMENT: { @@ -242,6 +240,10 @@ void HandlePacket(Packet* packet) { ChatIgnoreList::AddIgnore(packet); break; + case eChatMessageType::REMOVE_IGNORE: + ChatIgnoreList::RemoveIgnore(packet); + break; + case eChatMessageType::TEAM_GET_STATUS: ChatPacketHandler::HandleTeamStatusRequest(packet); break; diff --git a/dCommon/Game.h b/dCommon/Game.h index 79a271ec..305b4f7a 100644 --- a/dCommon/Game.h +++ b/dCommon/Game.h @@ -12,6 +12,7 @@ class AssetManager; struct SystemAddress; class EntityManager; class dZoneManager; +class PlayerContainer; namespace Game { extern Logger* logger; @@ -26,4 +27,5 @@ namespace Game { extern bool shouldShutdown; extern EntityManager* entityManager; extern dZoneManager* zoneManager; + extern PlayerContainer playerContainer; }