Files
Shiip-of-Hakinian-Espanol/soh/soh/SohGui/SohMenuNetwork.cpp
2025-05-19 12:31:12 +02:00

185 lines
8.2 KiB
C++

#ifdef ENABLE_REMOTE_CONTROL
#include "SohMenu.h"
#include <soh/Notification/Notification.h>
#include <soh/Network/Network.h>
#include "SohGui.hpp"
#include <soh/Network/Sail/Sail.h>
#include <soh/Network/CrowdControl/CrowdControl.h>
namespace SohGui {
extern std::shared_ptr<SohMenu> mSohMenu;
using namespace UIWidgets;
void SohMenu::AddMenuNetwork() {
// Add Network Menu
AddMenuEntry("Network", CVAR_SETTING("Menu.NetworkSidebarSection"));
// Archipelago
WidgetPath path = { "Network", "Archipelago", SECTION_COLUMN_1 };
AddSidebarEntry(path.sectionName, path.sidebarName, 2);
AddWidget(path, "Popout Archipelago Settings Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("ArchipelagoSettings"))
.RaceDisable(false)
.WindowName("Archipelago Settings")
.Options(WindowButtonOptions().Tooltip("Enables the Archipelago Settings Window."));
path.column = SECTION_COLUMN_2;
AddWidget(path, "Popout Archipelago Console Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("ArchipelagoConsole"))
.RaceDisable(false)
.WindowName("Archipelago Console")
.Options(WindowButtonOptions().Tooltip("Enables the Archipelago Console Window."));
// Sail
path.sidebarName = "Sail";
path.column = SECTION_COLUMN_1;
AddSidebarEntry("Network", path.sidebarName, 3);
AddWidget(path,
"Sail is a networking protocol designed to facilitate remote "
"control of the Ship of Harkinian client. It is intended to "
"be utilized alongside a Sail server, for which we provide a "
"few straightforward implementations on our GitHub. The current "
"implementations available allow integration with Twitch chat "
"and SAMMI Bot, feel free to contribute your own!\n"
"\n"
"Click this button to copy the link to the Sail Github "
"page to your clipboard.",
WIDGET_TEXT);
AddWidget(path, ICON_FA_CLIPBOARD "##Sail", WIDGET_BUTTON)
.Callback([](WidgetInfo& info) {
ImGui::SetClipboardText("https://github.com/HarbourMasters/sail");
Notification::Emit({
.message = "Copied to clipboard",
});
})
.Options(ButtonOptions().Tooltip("https://github.com/HarbourMasters/sail"));
AddWidget(path, "Host & Port", WIDGET_CUSTOM).CustomFunction([](WidgetInfo& info) {
ImGui::BeginDisabled(Sail::Instance->isEnabled || CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGui::Text("%s", info.name.c_str());
CVarInputString("##HostSail", CVAR_REMOTE_SAIL("Host"),
InputOptions()
.Color(THEME_COLOR)
.PlaceholderText("127.0.0.1")
.DefaultValue("127.0.0.1")
.Size(ImVec2(ImGui::GetFontSize() * 15, 0))
.LabelPosition(LabelPositions::None));
ImGui::SameLine();
ImGui::Text(":");
ImGui::SameLine();
CVarInputInt("##PortSail", CVAR_REMOTE_SAIL("Port"),
InputOptions()
.Color(THEME_COLOR)
.PlaceholderText("43384")
.DefaultValue("43384")
.Size(ImVec2(ImGui::GetFontSize() * 5, 0))
.LabelPosition(LabelPositions::None));
ImGui::EndDisabled();
});
AddWidget(path, "Enable##Sail", WIDGET_BUTTON)
.PreFunc([](WidgetInfo& info) {
std::string host = CVarGetString(CVAR_REMOTE_SAIL("Host"), "127.0.0.1");
uint16_t port = CVarGetInteger(CVAR_REMOTE_SAIL("Port"), 43384);
info.options->disabled = !(!SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535);
if (Sail::Instance->isEnabled) {
info.name = "Disable##Sail";
} else {
info.name = "Enable##Sail";
}
})
.Callback([](WidgetInfo& info) {
if (Sail::Instance->isEnabled) {
CVarClear(CVAR_REMOTE_SAIL("Enabled"));
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame();
Sail::Instance->Disable();
} else {
CVarSetInteger(CVAR_REMOTE_SAIL("Enabled"), 1);
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame();
Sail::Instance->Enable();
}
});
AddWidget(path, "Connecting...##Sail", WIDGET_TEXT).PreFunc([](WidgetInfo& info) {
info.isHidden = !Sail::Instance->isEnabled;
if (Sail::Instance->isConnected) {
info.name = "Connected##Sail";
} else {
info.name = "Connecting...##Sail";
}
});
path.sidebarName = "Crowd Control";
AddSidebarEntry("Network", path.sidebarName, 3);
path.column = SECTION_COLUMN_1;
AddWidget(path,
"Crowd Control is a platform that allows viewers to interact "
"with a streamer's game in real time.\n"
"\n"
"Click the question mark to copy the link to the Crowd Control "
"website to your clipboard.",
WIDGET_TEXT);
AddWidget(path, ICON_FA_CLIPBOARD "##CrowdControl", WIDGET_BUTTON)
.Callback([](WidgetInfo& info) {
ImGui::SetClipboardText("https://crowdcontrol.live");
Notification::Emit({
.message = "Copied to clipboard",
});
})
.Options(ButtonOptions().Tooltip("https://crowdcontrol.live"));
AddWidget(path, "Host & Port", WIDGET_CUSTOM).CustomFunction([](WidgetInfo& info) {
ImGui::BeginDisabled(CrowdControl::Instance->isEnabled || CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGui::Text("%s", info.name.c_str());
CVarInputString("##HostCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Host"),
InputOptions()
.Color(THEME_COLOR)
.PlaceholderText("127.0.0.1")
.DefaultValue("127.0.0.1")
.Size(ImVec2(ImGui::GetFontSize() * 15, 0))
.LabelPosition(LabelPositions::None));
ImGui::SameLine();
ImGui::Text(":");
ImGui::SameLine();
CVarInputInt("##PortCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Port"),
InputOptions()
.Color(THEME_COLOR)
.PlaceholderText("43384")
.DefaultValue("43384")
.Size(ImVec2(ImGui::GetFontSize() * 5, 0))
.LabelPosition(LabelPositions::None));
ImGui::EndDisabled();
});
AddWidget(path, "Enable##CrowdControl", WIDGET_BUTTON)
.PreFunc([](WidgetInfo& info) {
std::string host = CVarGetString(CVAR_REMOTE_CROWD_CONTROL("Host"), "127.0.0.1");
uint16_t port = CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Port"), 43384);
info.options->disabled = !(!SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535);
if (CrowdControl::Instance->isEnabled) {
info.name = "Disable##CrowdControl";
} else {
info.name = "Enable##CrowdControl";
}
})
.Callback([](WidgetInfo& info) {
if (CrowdControl::Instance->isEnabled) {
CVarClear(CVAR_REMOTE_CROWD_CONTROL("Enabled"));
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame();
CrowdControl::Instance->Disable();
} else {
CVarSetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 1);
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame();
CrowdControl::Instance->Enable();
}
});
AddWidget(path, "Connecting...##CrowdControl", WIDGET_TEXT).PreFunc([](WidgetInfo& info) {
info.isHidden = !CrowdControl::Instance->isEnabled;
if (CrowdControl::Instance->isConnected) {
info.name = "Connected##CrowdControl";
} else {
info.name = "Connecting...##CrowdControl";
}
});
}
} // namespace SohGui
#endif