From b9148949fba616b76e4eef4c2dbd4775507b52ae Mon Sep 17 00:00:00 2001 From: AvarianKnight Date: Thu, 15 Dec 2022 22:54:52 -0600 Subject: [PATCH] feat(devtools): add a server version of neteventlog --- .../citizen-devtools/src/NetEventLog.cpp | 59 ++++++++++++++++--- .../include/ResourceEventComponent.h | 3 + .../citizen-server-gui/src/ServerGui.cpp | 1 + .../src/ServerResources.cpp | 5 ++ 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/code/components/citizen-devtools/src/NetEventLog.cpp b/code/components/citizen-devtools/src/NetEventLog.cpp index 6d4ec5f612..f8ccaee06c 100644 --- a/code/components/citizen-devtools/src/NetEventLog.cpp +++ b/code/components/citizen-devtools/src/NetEventLog.cpp @@ -1,11 +1,11 @@ #include -#ifndef IS_FXSERVER #include #include +#ifndef IS_FXSERVER #include - +#endif #include #include @@ -18,17 +18,27 @@ struct EventLogEntry std::string eventName; size_t payloadSize; bool out; + std::optional eventSource; }; -static boost::circular_buffer g_eventLog(150); +static boost::circular_buffer g_eventLog( + // We want a bigger buffer on the server because it will send/receive *a lot* more events, and 150 will quickly get filled +#if IS_FXSERVER + 600 +#else + 150 +#endif +); static std::mutex g_eventLogMutex; -static void EventLog_Add(const std::string& eventName, size_t payloadSize, bool out) +static void EventLog_Add(const std::string& eventName, size_t payloadSize, bool out, std::optional eventSource = std::nullopt) { EventLogEntry eve; eve.eventName = eventName; eve.payloadSize = payloadSize; eve.out = out; + // this should always be nullopt on client + eve.eventSource = eventSource; std::unique_lock lock(g_eventLogMutex); g_eventLog.push_front(std::move(eve)); @@ -55,13 +65,24 @@ static InitFunction initFunction([]() if (ImGui::Begin("Network Event Log", &eventLogEnabled)) { - ImGui::Columns(3); + // If we're on the server we're going to have the "Sender/Receiver" field so we need an extra column + ImGui::Columns( +#ifdef IS_FXSERVER + 4 +#else + 3 +#endif + ); { ImGui::Text("Dir"); ImGui::NextColumn(); ImGui::Text("Name"); ImGui::NextColumn(); +#ifdef IS_FXSERVER + ImGui::Text("Sender/Receiver"); + ImGui::NextColumn(); +#endif ImGui::Text("Size"); ImGui::NextColumn(); @@ -69,10 +90,21 @@ static InitFunction initFunction([]() for (auto& entry : g_eventLog) { - ImGui::Text((entry.out) ? "C->S" : "S->C"); + + ImGui::Text( +#ifndef IS_FXSERVER + (entry.out) ? "C->S" : "S->C" +#else + (entry.out) ? "S->C" : "C->S" +#endif + ); ImGui::NextColumn(); ImGui::Text("%s", entry.eventName.c_str()); ImGui::NextColumn(); +#if IS_FXSERVER + ImGui::Text("%s", entry.eventSource.value_or("server").c_str()); + ImGui::NextColumn(); +#endif ImGui::Text("%lld B", entry.payloadSize); ImGui::NextColumn(); } @@ -92,11 +124,23 @@ static InitFunction initFunction([]() { if (eventSource.find("net:") == 0) { +#if IS_FXSERVER + EventLog_Add(eventName, eventPayload.size(), false, std::optional{ eventSource.substr(4) }); +#else EventLog_Add(eventName, eventPayload.size(), false); +#endif + } }); + + eventManager->OnClientEventTriggered.Connect([](const std::string_view& eventName, size_t& eventSize, const std::optional& eventTarget) + { + EventLog_Add(std::string{ eventName }, eventSize, true, std::string{ eventTarget.value_or("-1") }); + }); + }, INT32_MAX); +#ifndef IS_FXSERVER NetLibrary::OnNetLibraryCreate.Connect([](NetLibrary* library) { library->OnTriggerServerEvent.Connect([](const std::string& eventName, const std::string& eventPayload) @@ -104,5 +148,6 @@ static InitFunction initFunction([]() EventLog_Add(eventName, eventPayload.size(), true); }); }); -}); #endif +}); + diff --git a/code/components/citizen-resources-core/include/ResourceEventComponent.h b/code/components/citizen-resources-core/include/ResourceEventComponent.h index 0a23d8047c..2805761c5b 100644 --- a/code/components/citizen-resources-core/include/ResourceEventComponent.h +++ b/code/components/citizen-resources-core/include/ResourceEventComponent.h @@ -130,6 +130,9 @@ class RESOURCES_CORE_EXPORT ResourceEventManagerComponent : public fwRefCountabl // fwEvent OnQueueEvent; + // Arguments: eventName, eventPayloadSize, eventSource + fwEvent&> OnClientEventTriggered; + // // Triggers an event immediately. Returns a value indicating whether the event was not canceled. // diff --git a/code/components/citizen-server-gui/src/ServerGui.cpp b/code/components/citizen-server-gui/src/ServerGui.cpp index ccb691bfe6..f267a443bb 100644 --- a/code/components/citizen-server-gui/src/ServerGui.cpp +++ b/code/components/citizen-server-gui/src/ServerGui.cpp @@ -99,6 +99,7 @@ class ServerGui : public fwRefCountable, public fx::IAttachedGetComponent()->AddToBuffer(R"( devgui_convar "Tools/Performance/Resource Monitor" resmon +devgui_convar "Tools/Network/Network Event Log" netEventLog devgui_convar "Tools/Network/State/Network Object Viewer" netobjviewer devgui_convar "Tools/Network/State/Player List" svplayerlist )"); diff --git a/code/components/citizen-server-impl/src/ServerResources.cpp b/code/components/citizen-server-impl/src/ServerResources.cpp index 1e5c55339b..689296cb62 100644 --- a/code/components/citizen-server-impl/src/ServerResources.cpp +++ b/code/components/citizen-server-impl/src/ServerResources.cpp @@ -1133,6 +1133,11 @@ void fx::ServerEventComponent::TriggerClientEvent(const std::string_view& eventN client->SendPacket(0, outBuffer, NetPacketType_Reliable); }); } + + auto manager = fx::ResourceManager::GetCurrent(); + auto eventManager = manager->GetComponent(); + + eventManager->OnClientEventTriggered(eventName, dataLen, targetSrc); } static InitFunction initFunction2([]()