From 49263dd2a004868c1e9b9e9cf495893b27df0631 Mon Sep 17 00:00:00 2001 From: ScureX <47725553+ScureX@users.noreply.github.com> Date: Sun, 14 Aug 2022 11:37:18 +0200 Subject: Hot reload banlist on player join (#233) * added banlist hotreload * fix formatting * didnt append, cleared whole file oopsie * unfuckedunban not rewriting file * fixed not checking for new line --- NorthstarDedicatedTest/bansystem.cpp | 25 +++++++++++++++++++++++-- NorthstarDedicatedTest/bansystem.h | 1 + 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/NorthstarDedicatedTest/bansystem.cpp b/NorthstarDedicatedTest/bansystem.cpp index 88c7d042..b96e69e3 100644 --- a/NorthstarDedicatedTest/bansystem.cpp +++ b/NorthstarDedicatedTest/bansystem.cpp @@ -44,8 +44,24 @@ void ServerBanSystem::OpenBanlist() enabledModsStream.close(); } - // open write stream for banlist - m_sBanlistStream.open(GetNorthstarPrefix() + "/banlist.txt", std::ofstream::out | std::ofstream::binary | std::ofstream::app); + // open write stream for banlist // dont do this to allow for all time access + // m_sBanlistStream.open(GetNorthstarPrefix() + "/banlist.txt", std::ofstream::out | std::ofstream::binary | std::ofstream::app); +} + +void ServerBanSystem::ReloadBanlist() +{ + std::ifstream fsBanlist(GetNorthstarPrefix() + "/banlist.txt"); + + if (!fsBanlist.fail()) + { + std::string line; + // since we wanna use this as the reload func we need to clear the list + m_vBannedUids.clear(); + while (std::getline(fsBanlist, line)) + m_vBannedUids.push_back(strtoull(line.c_str(), nullptr, 10)); + + fsBanlist.close(); + } } void ServerBanSystem::ClearBanlist() @@ -55,6 +71,7 @@ void ServerBanSystem::ClearBanlist() // reopen the file, don't provide std::ofstream::app so it clears on open m_sBanlistStream.close(); m_sBanlistStream.open(GetNorthstarPrefix() + "/banlist.txt", std::ofstream::out | std::ofstream::binary); + m_sBanlistStream.close(); } void ServerBanSystem::BanUID(uint64_t uid) @@ -64,11 +81,13 @@ void ServerBanSystem::BanUID(uint64_t uid) std::string content((std::istreambuf_iterator(fsBanlist)), (std::istreambuf_iterator())); fsBanlist.close(); + m_sBanlistStream.open(GetNorthstarPrefix() + "/banlist.txt", std::ofstream::out | std::ofstream::binary | std::ofstream::app); if (content.back() != '\n') m_sBanlistStream << std::endl; m_vBannedUids.push_back(uid); m_sBanlistStream << std::to_string(uid) << std::endl; + m_sBanlistStream.close(); spdlog::info("{} was banned", uid); } @@ -148,11 +167,13 @@ void ServerBanSystem::UnbanUID(uint64_t uid) for (std::string updatedLine : banlistText) m_sBanlistStream << updatedLine << std::endl; + m_sBanlistStream.close(); spdlog::info("{} was unbanned", uid); } bool ServerBanSystem::IsUIDAllowed(uint64_t uid) { + ReloadBanlist(); // Reload to have up to date list on join return std::find(m_vBannedUids.begin(), m_vBannedUids.end(), uid) == m_vBannedUids.end(); } diff --git a/NorthstarDedicatedTest/bansystem.h b/NorthstarDedicatedTest/bansystem.h index 0f618843..e78094bf 100644 --- a/NorthstarDedicatedTest/bansystem.h +++ b/NorthstarDedicatedTest/bansystem.h @@ -9,6 +9,7 @@ class ServerBanSystem public: void OpenBanlist(); + void ReloadBanlist(); void ClearBanlist(); void BanUID(uint64_t uid); void UnbanUID(uint64_t uid); -- cgit v1.2.3