From ba4d879b8d312efad6693c5b377886daa4228860 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:47:23 +0200 Subject: [PATCH] Add option to export Websocket, Twitch, HTTP connections --- data/locale/en-US.ini | 3 ++ plugins/base/utils/connection-manager.cpp | 46 +++++++++++++++++++++++ plugins/http/http-server.cpp | 44 ++++++++++++++++++++++ plugins/twitch/token.cpp | 44 ++++++++++++++++++++++ 4 files changed, 137 insertions(+) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 83c87593..b925cccb 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -205,6 +205,9 @@ AdvSceneSwitcher.macroTab.export.usePlainText="Use plain text" AdvSceneSwitcher.macroTab.export.additionalContent="Export Additional Content" AdvSceneSwitcher.macroTab.export.variables="Variables" AdvSceneSwitcher.macroTab.export.actionQueues="Action Queues" +AdvSceneSwitcher.macroTab.export.httpServers="HTTP Servers" +AdvSceneSwitcher.macroTab.export.twitchConnections="Twitch Connections" +AdvSceneSwitcher.macroTab.export.websocketConnections="Websocket Connections" AdvSceneSwitcher.macroTab.import="Import" AdvSceneSwitcher.macroTab.import.info="Paste the export string into the below text box to import macros:" AdvSceneSwitcher.macroTab.import.invalid="Invalid import data provided!" diff --git a/plugins/base/utils/connection-manager.cpp b/plugins/base/utils/connection-manager.cpp index c869eda2..daa92aea 100644 --- a/plugins/base/utils/connection-manager.cpp +++ b/plugins/base/utils/connection-manager.cpp @@ -1,5 +1,6 @@ #include "connection-manager.hpp" #include "layout-helpers.hpp" +#include "macro-export-extensions.hpp" #include "name-dialog.hpp" #include "obs-module-helper.hpp" #include "plugin-state-helpers.hpp" @@ -24,6 +25,51 @@ bool setup() AddSaveStep(saveConnections); AddLoadStep(loadConnections); AddPluginCleanupStep([]() { connections.clear(); }); + AddMacroExportExtension( + {"AdvSceneSwitcher.macroTab.export.websocketConnections", + "websocketConnections", + [](obs_data_t *data, const QStringList &selectedIds) { + OBSDataArrayAutoRelease array = + obs_data_array_create(); + for (const auto &c : connections) { + if (!selectedIds.isEmpty() && + !selectedIds.contains( + QString::fromStdString(c->Name()))) + continue; + OBSDataAutoRelease item = obs_data_create(); + c->Save(item); + obs_data_array_push_back(array, item); + } + obs_data_set_array(data, "websocketConnections", + array); + }, + [](obs_data_t *data, const QStringList &) { + OBSDataArrayAutoRelease array = obs_data_get_array( + data, "websocketConnections"); + const size_t count = obs_data_array_count(array); + for (size_t i = 0; i < count; ++i) { + OBSDataAutoRelease item = + obs_data_array_item(array, i); + auto con = WSConnection::Create(); + con->Load(item); + if (!GetWeakConnectionByName(con->Name()) + .expired()) + continue; + connections.emplace_back(con); + ConnectionSelectionSignalManager::Instance() + ->Add(QString::fromStdString( + con->Name())); + } + }, + []() -> QList> { + QList> items; + for (const auto &c : connections) { + const QString name = + QString::fromStdString(c->Name()); + items.append({name, name}); + } + return items; + }}); return true; } diff --git a/plugins/http/http-server.cpp b/plugins/http/http-server.cpp index 4117b543..cd7d8810 100644 --- a/plugins/http/http-server.cpp +++ b/plugins/http/http-server.cpp @@ -1,6 +1,7 @@ #include "http-server.hpp" #include "layout-helpers.hpp" #include "log-helper.hpp" +#include "macro-export-extensions.hpp" #include "obs-module-helper.hpp" #include "plugin-state-helpers.hpp" @@ -32,6 +33,49 @@ bool setup() } httpServers.clear(); }); + AddMacroExportExtension( + {"AdvSceneSwitcher.macroTab.export.httpServers", "httpServers", + [](obs_data_t *data, const QStringList &selectedIds) { + OBSDataArrayAutoRelease array = + obs_data_array_create(); + for (const auto &s : httpServers) { + if (!selectedIds.isEmpty() && + !selectedIds.contains( + QString::fromStdString(s->Name()))) + continue; + OBSDataAutoRelease item = obs_data_create(); + s->Save(item); + obs_data_array_push_back(array, item); + } + obs_data_set_array(data, "httpServers", array); + }, + [](obs_data_t *data, const QStringList &) { + OBSDataArrayAutoRelease array = + obs_data_get_array(data, "httpServers"); + const size_t count = obs_data_array_count(array); + for (size_t i = 0; i < count; ++i) { + OBSDataAutoRelease item = + obs_data_array_item(array, i); + auto server = HttpServer::Create(); + server->Load(item); + if (!GetWeakHttpServerByName(server->Name()) + .expired()) + continue; + httpServers.emplace_back(server); + HttpServerSignalManager::Instance()->Add( + QString::fromStdString( + server->Name())); + } + }, + []() -> QList> { + QList> items; + for (const auto &s : httpServers) { + const QString name = + QString::fromStdString(s->Name()); + items.append({name, name}); + } + return items; + }}); return true; } diff --git a/plugins/twitch/token.cpp b/plugins/twitch/token.cpp index f62a4004..4aba4570 100644 --- a/plugins/twitch/token.cpp +++ b/plugins/twitch/token.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,49 @@ static bool setupTwitchTokenSupport() AddSaveStep(saveConnections); AddLoadStep(loadConnections); AddPluginCleanupStep([]() { twitchTokens.clear(); }); + AddMacroExportExtension( + {"AdvSceneSwitcher.macroTab.export.twitchConnections", + "twitchConnections", + [](obs_data_t *data, const QStringList &selectedIds) { + OBSDataArrayAutoRelease array = + obs_data_array_create(); + for (const auto &t : twitchTokens) { + if (!selectedIds.isEmpty() && + !selectedIds.contains( + QString::fromStdString(t->Name()))) + continue; + OBSDataAutoRelease item = obs_data_create(); + t->Save(item); + obs_data_array_push_back(array, item); + } + obs_data_set_array(data, "twitchConnections", array); + }, + [](obs_data_t *data, const QStringList &) { + OBSDataArrayAutoRelease array = + obs_data_get_array(data, "twitchConnections"); + const size_t count = obs_data_array_count(array); + for (size_t i = 0; i < count; ++i) { + OBSDataAutoRelease item = + obs_data_array_item(array, i); + auto token = TwitchToken::Create(); + token->Load(item); + if (!GetWeakTwitchTokenByName(token->Name()) + .expired()) + continue; + twitchTokens.emplace_back(token); + TwitchConnectionSignalManager::Instance()->Add( + QString::fromStdString(token->Name())); + } + }, + []() -> QList> { + QList> items; + for (const auto &t : twitchTokens) { + const QString name = + QString::fromStdString(t->Name()); + items.append({name, name}); + } + return items; + }}); return true; }