From 28d9e2974c74ad2c332571faefc6782c41d9ba61 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Thu, 21 Oct 2021 18:13:40 -0600 Subject: [PATCH] CI: add GitHub Actions CI to build fresh images --- .ci/build.sh | 17 + .github/workflows/ci.yml | 30 + Dockerfile | 18 +- ...remove-citra-room-dependence-on-core.patch | 877 ++++++++++++++++++ patches/0002-partial-revert-pr-5759.patch | 27 + 5 files changed, 963 insertions(+), 6 deletions(-) create mode 100755 .ci/build.sh create mode 100644 .github/workflows/ci.yml create mode 100644 patches/0001-remove-citra-room-dependence-on-core.patch create mode 100644 patches/0002-partial-revert-pr-5759.patch diff --git a/.ci/build.sh b/.ci/build.sh new file mode 100755 index 0000000..deaae31 --- /dev/null +++ b/.ci/build.sh @@ -0,0 +1,17 @@ +#!/bin/bash -ex + +TOPDIR="$(dirname "$0")" + +for i in "$TOPDIR"/../patches/*.patch; do + echo "Applying $i ..." + patch -Np1 -i "$i" +done + +export CFLAGS="-ftree-vectorize -flto" +export CXXFLAGS="$CFLAGS" +export LDFLAGS="-flto -fuse-linker-plugin" + +mkdir -p build && cd build +cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DENABLE_QT=OFF -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF -DUSE_DISCORD_PRESENCE=OFF -DENABLE_FFMPEG_VIDEO_DUMPER=OFF +ninja citra-room +strip ./bin/Release/citra-room diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..8678b94 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: 'Citra Rooms Docker Image CI' + +on: + push: + branches: [ "*" ] + tags: [ "*" ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker BuildX + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + if: (github.ref == 'refs/heads/master') && (github.repository == 'citra-emu/citra-multiplayer-dedicated') + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build Image + uses: docker/build-push-action@v2 + with: + platforms: 'linux/amd64,linux/arm64' + push: ${{ (github.ref == 'refs/heads/master') && (github.repository == 'citra-emu/citra-multiplayer-dedicated') }} + tags: citraemu/citra-multiplayer-dedicated:latest diff --git a/Dockerfile b/Dockerfile index effc4cd..2906373 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,17 @@ -FROM citraemu/build-environments:linux-fresh +FROM debian:bullseye AS build +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get -y full-upgrade && \ + apt-get install -y build-essential libsdl2-dev wget git ccache cmake ninja-build +COPY . /root/build-files + +RUN git clone --recursive https://github.com/citra-emu/citra-canary.git /root/citra-canary && \ + cd /root/citra-canary && /root/build-files/.ci/build.sh + +FROM debian:bullseye-slim AS final +LABEL maintainer="citraemu" # Create app directory WORKDIR /usr/src/app - -# Download the Citra binary. -# Bundle citra-room inside the image and delete the downloaded tar file. -RUN wget -O citra-linux.tar.xz https://github.com/citra-emu/citra-canary/releases/download/canary-1641/citra-linux-20200413-e9f68ae.tar.xz && \ - tar --wildcards --strip=1 -xJf citra-linux.tar.xz */citra-room && rm citra-linux.tar.xz +COPY --from=build /root/citra-canary/build/bin/Release/citra-room /usr/src/app ENTRYPOINT [ "/usr/src/app/citra-room" ] diff --git a/patches/0001-remove-citra-room-dependence-on-core.patch b/patches/0001-remove-citra-room-dependence-on-core.patch new file mode 100644 index 0000000..b88608c --- /dev/null +++ b/patches/0001-remove-citra-room-dependence-on-core.patch @@ -0,0 +1,877 @@ +From 036ef599a4fa6952bb3930e0c3ddde90cbe90405 Mon Sep 17 00:00:00 2001 +From: Vitor Kiguchi +Date: Thu, 20 Aug 2020 04:46:35 -0300 +Subject: [PATCH 1/2] Move webservice settings to own file + +--- + src/citra/config.cpp | 9 ++++---- + src/citra_qt/configuration/config.cpp | 17 +++++++------- + src/citra_qt/configuration/configure_web.cpp | 17 +++++++------- + src/citra_qt/main.cpp | 5 ++-- + src/citra_qt/multiplayer/direct_connect.cpp | 7 +++--- + src/citra_qt/multiplayer/host_room.cpp | 17 +++++++------- + src/citra_qt/multiplayer/lobby.cpp | 15 ++++++------ + src/core/announce_multiplayer_session.cpp | 14 ++++++------ + src/core/settings.h | 6 ----- + src/core/telemetry_session.cpp | 17 +++++++------- + src/dedicated_room/citra-room.cpp | 24 ++++++++------------ + src/network/CMakeLists.txt | 2 ++ + src/network/network_settings.cpp | 11 +++++++++ + src/network/network_settings.h | 20 ++++++++++++++++ + 14 files changed, 105 insertions(+), 76 deletions(-) + create mode 100644 src/network/network_settings.cpp + create mode 100644 src/network/network_settings.h + +diff --git a/src/citra/config.cpp b/src/citra/config.cpp +index 88a36ed66ee..ff18f780cfb 100644 +--- a/src/citra/config.cpp ++++ b/src/citra/config.cpp +@@ -18,6 +18,7 @@ + #include "core/settings.h" + #include "input_common/main.h" + #include "input_common/udp/client.h" ++#include "network/network_settings.h" + + Config::Config() { + // TODO: Don't hardcode the path; let the frontend decide where to put the config files. +@@ -266,12 +267,12 @@ void Config::ReadValues() { + } + + // Web Service +- Settings::values.enable_telemetry = ++ NetSettings::values.enable_telemetry = + sdl2_config->GetBoolean("WebService", "enable_telemetry", true); +- Settings::values.web_api_url = ++ NetSettings::values.web_api_url = + sdl2_config->GetString("WebService", "web_api_url", "https://api.citra-emu.org"); +- Settings::values.citra_username = sdl2_config->GetString("WebService", "citra_username", ""); +- Settings::values.citra_token = sdl2_config->GetString("WebService", "citra_token", ""); ++ NetSettings::values.citra_username = sdl2_config->GetString("WebService", "citra_username", ""); ++ NetSettings::values.citra_token = sdl2_config->GetString("WebService", "citra_token", ""); + + // Video Dumping + Settings::values.output_format = +diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp +index 8901c47c2d8..bd6a7b5565c 100644 +--- a/src/citra_qt/configuration/config.cpp ++++ b/src/citra_qt/configuration/config.cpp +@@ -15,6 +15,7 @@ + #include "input_common/main.h" + #include "input_common/udp/client.h" + #include "network/network.h" ++#include "network/network_settings.h" + + Config::Config() { + // TODO: Don't hardcode the path; let the frontend decide where to put the config files. +@@ -686,15 +687,15 @@ void Config::ReadUpdaterValues() { + void Config::ReadWebServiceValues() { + qt_config->beginGroup(QStringLiteral("WebService")); + +- Settings::values.enable_telemetry = ++ NetSettings::values.enable_telemetry = + ReadSetting(QStringLiteral("enable_telemetry"), true).toBool(); +- Settings::values.web_api_url = ++ NetSettings::values.web_api_url = + ReadSetting(QStringLiteral("web_api_url"), QStringLiteral("https://api.citra-emu.org")) + .toString() + .toStdString(); +- Settings::values.citra_username = ++ NetSettings::values.citra_username = + ReadSetting(QStringLiteral("citra_username")).toString().toStdString(); +- Settings::values.citra_token = ++ NetSettings::values.citra_token = + ReadSetting(QStringLiteral("citra_token")).toString().toStdString(); + + qt_config->endGroup(); +@@ -1138,14 +1139,14 @@ void Config::SaveUpdaterValues() { + void Config::SaveWebServiceValues() { + qt_config->beginGroup(QStringLiteral("WebService")); + +- WriteSetting(QStringLiteral("enable_telemetry"), Settings::values.enable_telemetry, true); ++ WriteSetting(QStringLiteral("enable_telemetry"), NetSettings::values.enable_telemetry, true); + WriteSetting(QStringLiteral("web_api_url"), +- QString::fromStdString(Settings::values.web_api_url), ++ QString::fromStdString(NetSettings::values.web_api_url), + QStringLiteral("https://api.citra-emu.org")); + WriteSetting(QStringLiteral("citra_username"), +- QString::fromStdString(Settings::values.citra_username)); ++ QString::fromStdString(NetSettings::values.citra_username)); + WriteSetting(QStringLiteral("citra_token"), +- QString::fromStdString(Settings::values.citra_token)); ++ QString::fromStdString(NetSettings::values.citra_token)); + + qt_config->endGroup(); + } +diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp +index cc7ca675f1d..e97a227205a 100644 +--- a/src/citra_qt/configuration/configure_web.cpp ++++ b/src/citra_qt/configuration/configure_web.cpp +@@ -7,8 +7,8 @@ + #include + #include "citra_qt/configuration/configure_web.h" + #include "citra_qt/uisettings.h" +-#include "core/settings.h" + #include "core/telemetry_session.h" ++#include "network/network_settings.h" + #include "ui_configure_web.h" + + static constexpr char token_delimiter{':'}; +@@ -70,16 +70,16 @@ void ConfigureWeb::SetConfiguration() { + tr("What is my token?")); + +- ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry); ++ ui->toggle_telemetry->setChecked(NetSettings::values.enable_telemetry); + +- if (Settings::values.citra_username.empty()) { ++ if (NetSettings::values.citra_username.empty()) { + ui->username->setText(tr("Unspecified")); + } else { +- ui->username->setText(QString::fromStdString(Settings::values.citra_username)); ++ ui->username->setText(QString::fromStdString(NetSettings::values.citra_username)); + } + + ui->edit_token->setText(QString::fromStdString( +- GenerateDisplayToken(Settings::values.citra_username, Settings::values.citra_token))); ++ GenerateDisplayToken(NetSettings::values.citra_username, NetSettings::values.citra_token))); + + // Connect after setting the values, to avoid calling OnLoginChanged now + connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged); +@@ -91,12 +91,13 @@ void ConfigureWeb::SetConfiguration() { + } + + void ConfigureWeb::ApplyConfiguration() { +- Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked(); ++ NetSettings::values.enable_telemetry = ui->toggle_telemetry->isChecked(); + UISettings::values.enable_discord_presence = ui->toggle_discordrpc->isChecked(); + if (user_verified) { +- Settings::values.citra_username = ++ NetSettings::values.citra_username = + UsernameFromDisplayToken(ui->edit_token->text().toStdString()); +- Settings::values.citra_token = TokenFromDisplayToken(ui->edit_token->text().toStdString()); ++ NetSettings::values.citra_token = ++ TokenFromDisplayToken(ui->edit_token->text().toStdString()); + } else { + QMessageBox::warning( + this, tr("Token not verified"), +diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp +index a804bfb985d..af3925bbc7f 100644 +--- a/src/citra_qt/main.cpp ++++ b/src/citra_qt/main.cpp +@@ -83,6 +83,7 @@ + #include "core/savestate.h" + #include "core/settings.h" + #include "game_list_p.h" ++#include "network/network_settings.h" + #include "ui_main.h" + #include "video_core/renderer_base.h" + #include "video_core/video_core.h" +@@ -128,7 +129,7 @@ void GMainWindow::ShowTelemetryCallout() { + "data is collected to help improve Citra. " + "

Would you like to share your usage data with us?"); + if (QMessageBox::question(this, tr("Telemetry"), telemetry_message) != QMessageBox::Yes) { +- Settings::values.enable_telemetry = false; ++ NetSettings::values.enable_telemetry = false; + Settings::Apply(); + } + } +@@ -1578,7 +1579,7 @@ void GMainWindow::OnLoadComplete() { + } + + void GMainWindow::OnMenuReportCompatibility() { +- if (!Settings::values.citra_token.empty() && !Settings::values.citra_username.empty()) { ++ if (!NetSettings::values.citra_token.empty() && !NetSettings::values.citra_username.empty()) { + CompatDB compatdb{this}; + compatdb.exec(); + } else { +diff --git a/src/citra_qt/multiplayer/direct_connect.cpp b/src/citra_qt/multiplayer/direct_connect.cpp +index 2ce935f23e2..feaea69c945 100644 +--- a/src/citra_qt/multiplayer/direct_connect.cpp ++++ b/src/citra_qt/multiplayer/direct_connect.cpp +@@ -16,8 +16,8 @@ + #include "citra_qt/multiplayer/validation.h" + #include "citra_qt/uisettings.h" + #include "core/hle/service/cfg/cfg.h" +-#include "core/settings.h" + #include "network/network.h" ++#include "network/network_settings.h" + #include "ui_direct_connect.h" + + enum class ConnectionType : u8 { TraversalServer, IP }; +@@ -34,9 +34,9 @@ DirectConnectWindow::DirectConnectWindow(QWidget* parent) + + ui->nickname->setValidator(validation.GetNickname()); + ui->nickname->setText(UISettings::values.nickname); +- if (ui->nickname->text().isEmpty() && !Settings::values.citra_username.empty()) { ++ if (ui->nickname->text().isEmpty() && !NetSettings::values.citra_username.empty()) { + // Use Citra Web Service user name as nickname by default +- ui->nickname->setText(QString::fromStdString(Settings::values.citra_username)); ++ ui->nickname->setText(QString::fromStdString(NetSettings::values.citra_username)); + } + ui->ip->setValidator(validation.GetIP()); + ui->ip->setText(UISettings::values.ip); +@@ -92,7 +92,6 @@ void DirectConnectWindow::Connect() { + UISettings::values.port = (ui->port->isModified() && !ui->port->text().isEmpty()) + ? ui->port->text() + : UISettings::values.port; +- Settings::Apply(); + + // attempt to connect in a different thread + QFuture f = QtConcurrent::run([&] { +diff --git a/src/citra_qt/multiplayer/host_room.cpp b/src/citra_qt/multiplayer/host_room.cpp +index 49eb5480d9b..b2905c7db51 100644 +--- a/src/citra_qt/multiplayer/host_room.cpp ++++ b/src/citra_qt/multiplayer/host_room.cpp +@@ -21,7 +21,7 @@ + #include "common/logging/log.h" + #include "core/announce_multiplayer_session.h" + #include "core/hle/service/cfg/cfg.h" +-#include "core/settings.h" ++#include "network/network_settings.h" + #include "ui_host_room.h" + #ifdef ENABLE_WEB_SERVICE + #include "web_service/verify_user_jwt.h" +@@ -53,9 +53,9 @@ HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, + + // Restore the settings: + ui->username->setText(UISettings::values.room_nickname); +- if (ui->username->text().isEmpty() && !Settings::values.citra_username.empty()) { ++ if (ui->username->text().isEmpty() && !NetSettings::values.citra_username.empty()) { + // Use Citra Web Service user name as nickname by default +- ui->username->setText(QString::fromStdString(Settings::values.citra_username)); ++ ui->username->setText(QString::fromStdString(NetSettings::values.citra_username)); + } + ui->room_name->setText(UISettings::values.room_name); + ui->port->setText(UISettings::values.room_port); +@@ -92,7 +92,8 @@ std::unique_ptr HostRoomWindow::CreateVerifyBacken + std::unique_ptr verify_backend; + if (use_validation) { + #ifdef ENABLE_WEB_SERVICE +- verify_backend = std::make_unique(Settings::values.web_api_url); ++ verify_backend = ++ std::make_unique(NetSettings::values.web_api_url); + #else + verify_backend = std::make_unique(); + #endif +@@ -144,7 +145,7 @@ void HostRoomWindow::Host() { + bool created = room->Create(ui->room_name->text().toStdString(), + ui->room_description->toPlainText().toStdString(), "", port, + password, ui->max_player->value(), +- Settings::values.citra_username, game_name.toStdString(), ++ NetSettings::values.citra_username, game_name.toStdString(), + game_id, CreateVerifyBackend(is_public), ban_list); + if (!created) { + NetworkMessage::ErrorManager::ShowError( +@@ -182,8 +183,9 @@ void HostRoomWindow::Host() { + std::string token; + #ifdef ENABLE_WEB_SERVICE + if (is_public) { +- WebService::Client client(Settings::values.web_api_url, Settings::values.citra_username, +- Settings::values.citra_token); ++ WebService::Client client(NetSettings::values.web_api_url, ++ NetSettings::values.citra_username, ++ NetSettings::values.citra_token); + if (auto room = Network::GetRoom().lock()) { + token = client.GetExternalJWT(room->GetVerifyUID()).returned_data; + } +@@ -210,7 +212,6 @@ void HostRoomWindow::Host() { + ? ui->port->text() + : QString::number(Network::DefaultRoomPort); + UISettings::values.room_description = ui->room_description->toPlainText(); +- Settings::Apply(); + ui->host->setEnabled(true); + close(); + } +diff --git a/src/citra_qt/multiplayer/lobby.cpp b/src/citra_qt/multiplayer/lobby.cpp +index d4d946da57e..40c0c1f398a 100644 +--- a/src/citra_qt/multiplayer/lobby.cpp ++++ b/src/citra_qt/multiplayer/lobby.cpp +@@ -16,8 +16,8 @@ + #include "citra_qt/uisettings.h" + #include "common/logging/log.h" + #include "core/hle/service/cfg/cfg.h" +-#include "core/settings.h" + #include "network/network.h" ++#include "network/network_settings.h" + #include "ui_lobby.h" + #ifdef ENABLE_WEB_SERVICE + #include "web_service/web_backend.h" +@@ -58,9 +58,9 @@ Lobby::Lobby(QWidget* parent, QStandardItemModel* list, + + ui->nickname->setValidator(validation.GetNickname()); + ui->nickname->setText(UISettings::values.nickname); +- if (ui->nickname->text().isEmpty() && !Settings::values.citra_username.empty()) { ++ if (ui->nickname->text().isEmpty() && !NetSettings::values.citra_username.empty()) { + // Use Citra Web Service user name as nickname by default +- ui->nickname->setText(QString::fromStdString(Settings::values.citra_username)); ++ ui->nickname->setText(QString::fromStdString(NetSettings::values.citra_username)); + } + + // UI Buttons +@@ -155,9 +155,11 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { + QFuture f = QtConcurrent::run([nickname, ip, port, password, verify_UID] { + std::string token; + #ifdef ENABLE_WEB_SERVICE +- if (!Settings::values.citra_username.empty() && !Settings::values.citra_token.empty()) { +- WebService::Client client(Settings::values.web_api_url, Settings::values.citra_username, +- Settings::values.citra_token); ++ if (!NetSettings::values.citra_username.empty() && ++ !NetSettings::values.citra_token.empty()) { ++ WebService::Client client(NetSettings::values.web_api_url, ++ NetSettings::values.citra_username, ++ NetSettings::values.citra_token); + token = client.GetExternalJWT(verify_UID).returned_data; + if (token.empty()) { + LOG_ERROR(WebService, "Could not get external JWT, verification may fail"); +@@ -179,7 +181,6 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { + UISettings::values.nickname = ui->nickname->text(); + UISettings::values.ip = proxy->data(connection_index, LobbyItemHost::HostIPRole).toString(); + UISettings::values.port = proxy->data(connection_index, LobbyItemHost::HostPortRole).toString(); +- Settings::Apply(); + } + + void Lobby::ResetModel() { +diff --git a/src/core/announce_multiplayer_session.cpp b/src/core/announce_multiplayer_session.cpp +index 38acb4bacdc..9ae373192a3 100644 +--- a/src/core/announce_multiplayer_session.cpp ++++ b/src/core/announce_multiplayer_session.cpp +@@ -8,8 +8,8 @@ + #include "announce_multiplayer_session.h" + #include "common/announce_multiplayer_room.h" + #include "common/assert.h" +-#include "core/settings.h" + #include "network/network.h" ++#include "network/network_settings.h" + + #ifdef ENABLE_WEB_SERVICE + #include "web_service/announce_room_json.h" +@@ -22,9 +22,9 @@ static constexpr std::chrono::seconds announce_time_interval(15); + + AnnounceMultiplayerSession::AnnounceMultiplayerSession() { + #ifdef ENABLE_WEB_SERVICE +- backend = std::make_unique(Settings::values.web_api_url, +- Settings::values.citra_username, +- Settings::values.citra_token); ++ backend = std::make_unique(NetSettings::values.web_api_url, ++ NetSettings::values.citra_username, ++ NetSettings::values.citra_token); + #else + backend = std::make_unique(); + #endif +@@ -155,9 +155,9 @@ void AnnounceMultiplayerSession::UpdateCredentials() { + ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); + + #ifdef ENABLE_WEB_SERVICE +- backend = std::make_unique(Settings::values.web_api_url, +- Settings::values.citra_username, +- Settings::values.citra_token); ++ backend = std::make_unique(NetSettings::values.web_api_url, ++ NetSettings::values.citra_username, ++ NetSettings::values.citra_token); + #endif + } + +diff --git a/src/core/settings.h b/src/core/settings.h +index 0876d312f56..b0101ede26d 100644 +--- a/src/core/settings.h ++++ b/src/core/settings.h +@@ -211,12 +211,6 @@ struct Values { + std::string log_filter; + std::unordered_map lle_modules; + +- // WebService +- bool enable_telemetry; +- std::string web_api_url; +- std::string citra_username; +- std::string citra_token; +- + // Video Dumping + std::string output_format; + std::string format_options; +diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp +index 6189e84eeff..5b27fa6cf22 100644 +--- a/src/core/telemetry_session.cpp ++++ b/src/core/telemetry_session.cpp +@@ -15,6 +15,7 @@ + #include "core/core.h" + #include "core/settings.h" + #include "core/telemetry_session.h" ++#include "network/network_settings.h" + + #ifdef ENABLE_WEB_SERVICE + #include "web_service/telemetry_json.h" +@@ -71,7 +72,7 @@ u64 RegenerateTelemetryId() { + + bool VerifyLogin(const std::string& username, const std::string& token) { + #ifdef ENABLE_WEB_SERVICE +- return WebService::VerifyLogin(Settings::values.web_api_url, username, token); ++ return WebService::VerifyLogin(NetSettings::values.web_api_url, username, token); + #else + return false; + #endif +@@ -87,16 +88,16 @@ TelemetrySession::~TelemetrySession() { + AddField(Telemetry::FieldType::Session, "Shutdown_Time", shutdown_time); + + #ifdef ENABLE_WEB_SERVICE +- auto backend = std::make_unique(Settings::values.web_api_url, +- Settings::values.citra_username, +- Settings::values.citra_token); ++ auto backend = std::make_unique(NetSettings::values.web_api_url, ++ NetSettings::values.citra_username, ++ NetSettings::values.citra_token); + #else + auto backend = std::make_unique(); + #endif + + // Complete the session, submitting to the web service backend if necessary + field_collection.Accept(*backend); +- if (Settings::values.enable_telemetry) { ++ if (NetSettings::values.enable_telemetry) { + backend->Complete(); + } + } +@@ -190,9 +191,9 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) { + + bool TelemetrySession::SubmitTestcase() { + #ifdef ENABLE_WEB_SERVICE +- auto backend = std::make_unique(Settings::values.web_api_url, +- Settings::values.citra_username, +- Settings::values.citra_token); ++ auto backend = std::make_unique(NetSettings::values.web_api_url, ++ NetSettings::values.citra_username, ++ NetSettings::values.citra_token); + field_collection.Accept(*backend); + return backend->SubmitTestcase(); + #else +diff --git a/src/dedicated_room/citra-room.cpp b/src/dedicated_room/citra-room.cpp +index a498b13c2fd..801249206a8 100644 +--- a/src/dedicated_room/citra-room.cpp ++++ b/src/dedicated_room/citra-room.cpp +@@ -10,7 +10,6 @@ + #include + #include + #include +-#include + + #ifdef _WIN32 + // windows.h needs to be included before shellapi.h +@@ -28,9 +27,8 @@ + #include "common/scm_rev.h" + #include "common/string_util.h" + #include "core/announce_multiplayer_session.h" +-#include "core/core.h" +-#include "core/settings.h" + #include "network/network.h" ++#include "network/network_settings.h" + #include "network/room.h" + #include "network/verify_user.h" + +@@ -170,9 +168,6 @@ int main(int argc, char** argv) { + int option_index = 0; + char* endarg; + +- // This is just to be able to link against core +- gladLoadGL(); +- + std::string room_name; + std::string room_description; + std::string password; +@@ -300,15 +295,15 @@ int main(int argc, char** argv) { + if (announce) { + if (username.empty()) { + std::cout << "Hosting a public room\n\n"; +- Settings::values.web_api_url = web_api_url; +- Settings::values.citra_username = UsernameFromDisplayToken(token); +- username = Settings::values.citra_username; +- Settings::values.citra_token = TokenFromDisplayToken(token); ++ NetSettings::values.web_api_url = web_api_url; ++ NetSettings::values.citra_username = UsernameFromDisplayToken(token); ++ username = NetSettings::values.citra_username; ++ NetSettings::values.citra_token = TokenFromDisplayToken(token); + } else { + std::cout << "Hosting a public room\n\n"; +- Settings::values.web_api_url = web_api_url; +- Settings::values.citra_username = username; +- Settings::values.citra_token = token; ++ NetSettings::values.web_api_url = web_api_url; ++ NetSettings::values.citra_username = username; ++ NetSettings::values.citra_token = token; + } + } + if (!announce && enable_citra_mods) { +@@ -327,7 +322,8 @@ int main(int argc, char** argv) { + std::unique_ptr verify_backend; + if (announce) { + #ifdef ENABLE_WEB_SERVICE +- verify_backend = std::make_unique(Settings::values.web_api_url); ++ verify_backend = ++ std::make_unique(NetSettings::values.web_api_url); + #else + std::cout + << "Citra Web Services is not available with this build: validation is disabled.\n\n"; +diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt +index 1e0eb4bc9b2..cf920d8bc4e 100644 +--- a/src/network/CMakeLists.txt ++++ b/src/network/CMakeLists.txt +@@ -1,6 +1,8 @@ + add_library(network STATIC + network.cpp + network.h ++ network_settings.cpp ++ network_settings.h + packet.cpp + packet.h + room.cpp +diff --git a/src/network/network_settings.cpp b/src/network/network_settings.cpp +new file mode 100644 +index 00000000000..62aefcc0454 +--- /dev/null ++++ b/src/network/network_settings.cpp +@@ -0,0 +1,11 @@ ++// Copyright 2020 Citra Emulator Project ++// Licensed under GPLv2 or any later version ++// Refer to the license.txt file included. ++ ++#include "network/network_settings.h" ++ ++namespace NetSettings { ++ ++Values values = {}; ++ ++} +diff --git a/src/network/network_settings.h b/src/network/network_settings.h +new file mode 100644 +index 00000000000..eed1d56b4a9 +--- /dev/null ++++ b/src/network/network_settings.h +@@ -0,0 +1,20 @@ ++// Copyright 2020 Citra Emulator Project ++// Licensed under GPLv2 or any later version ++// Refer to the license.txt file included. ++ ++#pragma once ++ ++#include ++#include "common/logging/log.h" ++ ++namespace NetSettings { ++ ++struct Values { ++ // WebService ++ bool enable_telemetry; ++ std::string web_api_url; ++ std::string citra_username; ++ std::string citra_token; ++} extern values; ++ ++} // namespace NetSettings + +From 2fb9de92a06857b627f15fe6a1824f33c1525b57 Mon Sep 17 00:00:00 2001 +From: Vitor Kiguchi +Date: Thu, 20 Aug 2020 16:54:01 -0300 +Subject: [PATCH 2/2] remove dedicated_room dependence on core + +--- + src/citra_qt/multiplayer/chat_room.cpp | 2 +- + src/citra_qt/multiplayer/chat_room.h | 2 +- + src/citra_qt/multiplayer/client_room.cpp | 2 +- + src/citra_qt/multiplayer/host_room.cpp | 4 ++-- + src/citra_qt/multiplayer/host_room.h | 6 +++--- + src/citra_qt/multiplayer/lobby.cpp | 2 +- + src/citra_qt/multiplayer/lobby.h | 6 +++--- + src/citra_qt/multiplayer/state.cpp | 2 +- + src/citra_qt/multiplayer/state.h | 4 ++-- + src/core/CMakeLists.txt | 2 -- + src/dedicated_room/CMakeLists.txt | 4 ++-- + src/dedicated_room/citra-room.cpp | 4 ++-- + src/network/CMakeLists.txt | 2 ++ + src/{core => network}/announce_multiplayer_session.cpp | 4 ++-- + src/{core => network}/announce_multiplayer_session.h | 6 ++---- + 15 files changed, 25 insertions(+), 27 deletions(-) + rename src/{core => network}/announce_multiplayer_session.cpp (99%) + rename src/{core => network}/announce_multiplayer_session.h (98%) + +diff --git a/src/citra_qt/multiplayer/chat_room.cpp b/src/citra_qt/multiplayer/chat_room.cpp +index 44073697841..6b303bc1e25 100644 +--- a/src/citra_qt/multiplayer/chat_room.cpp ++++ b/src/citra_qt/multiplayer/chat_room.cpp +@@ -20,7 +20,7 @@ + #include "citra_qt/multiplayer/chat_room.h" + #include "citra_qt/multiplayer/message.h" + #include "common/logging/log.h" +-#include "core/announce_multiplayer_session.h" ++#include "network/announce_multiplayer_session.h" + #include "ui_chat_room.h" + #ifdef ENABLE_WEB_SERVICE + #include "web_service/web_backend.h" +diff --git a/src/citra_qt/multiplayer/chat_room.h b/src/citra_qt/multiplayer/chat_room.h +index a810377f7af..d73f7cf73df 100644 +--- a/src/citra_qt/multiplayer/chat_room.h ++++ b/src/citra_qt/multiplayer/chat_room.h +@@ -16,7 +16,7 @@ namespace Ui { + class ChatRoom; + } + +-namespace Core { ++namespace Network { + class AnnounceMultiplayerSession; + } + +diff --git a/src/citra_qt/multiplayer/client_room.cpp b/src/citra_qt/multiplayer/client_room.cpp +index 9ef59c1e008..312090cbe01 100644 +--- a/src/citra_qt/multiplayer/client_room.cpp ++++ b/src/citra_qt/multiplayer/client_room.cpp +@@ -16,7 +16,7 @@ + #include "citra_qt/multiplayer/moderation_dialog.h" + #include "citra_qt/multiplayer/state.h" + #include "common/logging/log.h" +-#include "core/announce_multiplayer_session.h" ++#include "network/announce_multiplayer_session.h" + #include "ui_client_room.h" + + ClientRoomWindow::ClientRoomWindow(QWidget* parent) +diff --git a/src/citra_qt/multiplayer/host_room.cpp b/src/citra_qt/multiplayer/host_room.cpp +index b2905c7db51..498ce943b76 100644 +--- a/src/citra_qt/multiplayer/host_room.cpp ++++ b/src/citra_qt/multiplayer/host_room.cpp +@@ -19,8 +19,8 @@ + #include "citra_qt/multiplayer/validation.h" + #include "citra_qt/uisettings.h" + #include "common/logging/log.h" +-#include "core/announce_multiplayer_session.h" + #include "core/hle/service/cfg/cfg.h" ++#include "network/announce_multiplayer_session.h" + #include "network/network_settings.h" + #include "ui_host_room.h" + #ifdef ENABLE_WEB_SERVICE +@@ -28,7 +28,7 @@ + #endif + + HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, +- std::shared_ptr session) ++ std::shared_ptr session) + : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), + ui(std::make_unique()), announce_multiplayer_session(session) { + ui->setupUi(this); +diff --git a/src/citra_qt/multiplayer/host_room.h b/src/citra_qt/multiplayer/host_room.h +index 69a36b881e8..b6f84f078b6 100644 +--- a/src/citra_qt/multiplayer/host_room.h ++++ b/src/citra_qt/multiplayer/host_room.h +@@ -17,7 +17,7 @@ namespace Ui { + class HostRoom; + } + +-namespace Core { ++namespace Network { + class AnnounceMultiplayerSession; + } + +@@ -35,7 +35,7 @@ class HostRoomWindow : public QDialog { + + public: + explicit HostRoomWindow(QWidget* parent, QStandardItemModel* list, +- std::shared_ptr session); ++ std::shared_ptr session); + ~HostRoomWindow(); + + /** +@@ -50,7 +50,7 @@ class HostRoomWindow : public QDialog { + std::unique_ptr CreateVerifyBackend(bool use_validation) const; + + std::unique_ptr ui; +- std::weak_ptr announce_multiplayer_session; ++ std::weak_ptr announce_multiplayer_session; + QStandardItemModel* game_list; + ComboBoxProxyModel* proxy; + Validation validation; +diff --git a/src/citra_qt/multiplayer/lobby.cpp b/src/citra_qt/multiplayer/lobby.cpp +index 40c0c1f398a..e335d5f851d 100644 +--- a/src/citra_qt/multiplayer/lobby.cpp ++++ b/src/citra_qt/multiplayer/lobby.cpp +@@ -24,7 +24,7 @@ + #endif + + Lobby::Lobby(QWidget* parent, QStandardItemModel* list, +- std::shared_ptr session) ++ std::shared_ptr session) + : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), + ui(std::make_unique()), announce_multiplayer_session(session) { + ui->setupUi(this); +diff --git a/src/citra_qt/multiplayer/lobby.h b/src/citra_qt/multiplayer/lobby.h +index 3befb9eae3c..985b82ba714 100644 +--- a/src/citra_qt/multiplayer/lobby.h ++++ b/src/citra_qt/multiplayer/lobby.h +@@ -11,7 +11,7 @@ + #include + #include "citra_qt/multiplayer/validation.h" + #include "common/announce_multiplayer_room.h" +-#include "core/announce_multiplayer_session.h" ++#include "network/announce_multiplayer_session.h" + #include "network/network.h" + + namespace Ui { +@@ -30,7 +30,7 @@ class Lobby : public QDialog { + + public: + explicit Lobby(QWidget* parent, QStandardItemModel* list, +- std::shared_ptr session); ++ std::shared_ptr session); + ~Lobby() override; + + /** +@@ -91,7 +91,7 @@ private slots: + LobbyFilterProxyModel* proxy{}; + + QFutureWatcher room_list_watcher; +- std::weak_ptr announce_multiplayer_session; ++ std::weak_ptr announce_multiplayer_session; + QFutureWatcher* watcher; + Validation validation; + }; +diff --git a/src/citra_qt/multiplayer/state.cpp b/src/citra_qt/multiplayer/state.cpp +index 6fa6d18095b..9484a3eba17 100644 +--- a/src/citra_qt/multiplayer/state.cpp ++++ b/src/citra_qt/multiplayer/state.cpp +@@ -37,7 +37,7 @@ MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_lis + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); +- announce_multiplayer_session = std::make_shared(); ++ announce_multiplayer_session = std::make_shared(); + announce_multiplayer_session->BindErrorCallback( + [this](const Common::WebResult& result) { emit AnnounceFailed(result); }); + connect(this, &MultiplayerState::AnnounceFailed, this, &MultiplayerState::OnAnnounceFailed); +diff --git a/src/citra_qt/multiplayer/state.h b/src/citra_qt/multiplayer/state.h +index 707efd5a448..3607d97af72 100644 +--- a/src/citra_qt/multiplayer/state.h ++++ b/src/citra_qt/multiplayer/state.h +@@ -5,7 +5,7 @@ + #pragma once + + #include +-#include "core/announce_multiplayer_session.h" ++#include "network/announce_multiplayer_session.h" + #include "network/network.h" + + class QStandardItemModel; +@@ -80,7 +80,7 @@ public slots: + QStandardItemModel* game_list_model = nullptr; + QAction* leave_room; + QAction* show_room; +- std::shared_ptr announce_multiplayer_session; ++ std::shared_ptr announce_multiplayer_session; + Network::RoomMember::State current_state = Network::RoomMember::State::Uninitialized; + bool has_mod_perms = false; + Network::RoomMember::CallbackHandle state_callback_handle; +diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt +index 133a33ef2c9..03638659029 100644 +--- a/src/core/CMakeLists.txt ++++ b/src/core/CMakeLists.txt +@@ -1,7 +1,5 @@ + add_library(core STATIC + 3ds.h +- announce_multiplayer_session.cpp +- announce_multiplayer_session.h + arm/arm_interface.h + arm/dyncom/arm_dyncom.cpp + arm/dyncom/arm_dyncom.h +diff --git a/src/dedicated_room/CMakeLists.txt b/src/dedicated_room/CMakeLists.txt +index 2b91daa705f..9dbb6784caa 100644 +--- a/src/dedicated_room/CMakeLists.txt ++++ b/src/dedicated_room/CMakeLists.txt +@@ -7,13 +7,13 @@ add_executable(citra-room + + create_target_directory_groups(citra-room) + +-target_link_libraries(citra-room PRIVATE common core network) ++target_link_libraries(citra-room PRIVATE common network) + if (ENABLE_WEB_SERVICE) + target_compile_definitions(citra-room PRIVATE -DENABLE_WEB_SERVICE) + target_link_libraries(citra-room PRIVATE web_service) + endif() + +-target_link_libraries(citra-room PRIVATE cryptopp glad) ++target_link_libraries(citra-room PRIVATE cryptopp) + if (MSVC) + target_link_libraries(citra-room PRIVATE getopt) + endif() +diff --git a/src/dedicated_room/citra-room.cpp b/src/dedicated_room/citra-room.cpp +index 801249206a8..fe0da34c6d2 100644 +--- a/src/dedicated_room/citra-room.cpp ++++ b/src/dedicated_room/citra-room.cpp +@@ -26,7 +26,7 @@ + #include "common/logging/log.h" + #include "common/scm_rev.h" + #include "common/string_util.h" +-#include "core/announce_multiplayer_session.h" ++#include "network/announce_multiplayer_session.h" + #include "network/network.h" + #include "network/network_settings.h" + #include "network/room.h" +@@ -342,7 +342,7 @@ int main(int argc, char** argv) { + return -1; + } + std::cout << "Room is open. Close with Q+Enter...\n\n"; +- auto announce_session = std::make_unique(); ++ auto announce_session = std::make_unique(); + if (announce) { + announce_session->Start(); + } +diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt +index cf920d8bc4e..1a9dfe836f6 100644 +--- a/src/network/CMakeLists.txt ++++ b/src/network/CMakeLists.txt +@@ -1,4 +1,6 @@ + add_library(network STATIC ++ announce_multiplayer_session.cpp ++ announce_multiplayer_session.h + network.cpp + network.h + network_settings.cpp +diff --git a/src/core/announce_multiplayer_session.cpp b/src/network/announce_multiplayer_session.cpp +similarity index 99% +rename from src/core/announce_multiplayer_session.cpp +rename to src/network/announce_multiplayer_session.cpp +index 9ae373192a3..56c02a041f7 100644 +--- a/src/core/announce_multiplayer_session.cpp ++++ b/src/network/announce_multiplayer_session.cpp +@@ -15,7 +15,7 @@ + #include "web_service/announce_room_json.h" + #endif + +-namespace Core { ++namespace Network { + + // Time between room is announced to web_service + static constexpr std::chrono::seconds announce_time_interval(15); +@@ -161,4 +161,4 @@ void AnnounceMultiplayerSession::UpdateCredentials() { + #endif + } + +-} // namespace Core ++} // namespace Network +diff --git a/src/core/announce_multiplayer_session.h b/src/network/announce_multiplayer_session.h +similarity index 98% +rename from src/core/announce_multiplayer_session.h +rename to src/network/announce_multiplayer_session.h +index 5647972d0d8..97fd1e5b38f 100644 +--- a/src/core/announce_multiplayer_session.h ++++ b/src/network/announce_multiplayer_session.h +@@ -15,10 +15,8 @@ + #include "common/thread.h" + + namespace Network { +-class Room; +-} + +-namespace Core { ++class Room; + + /** + * Instruments AnnounceMultiplayerRoom::Backend. +@@ -93,4 +91,4 @@ class AnnounceMultiplayerSession : NonCopyable { + void AnnounceMultiplayerLoop(); + }; + +-} // namespace Core ++} // namespace Network diff --git a/patches/0002-partial-revert-pr-5759.patch b/patches/0002-partial-revert-pr-5759.patch new file mode 100644 index 0000000..3d4fd16 --- /dev/null +++ b/patches/0002-partial-revert-pr-5759.patch @@ -0,0 +1,27 @@ +diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp +index 46401bc19..218a0a519 100644 +--- a/src/common/file_util.cpp ++++ b/src/common/file_util.cpp +@@ -12,7 +12,6 @@ + #include "common/common_paths.h" + #include "common/file_util.h" + #include "common/logging/log.h" +-#include "core/settings.h" + + #ifdef _WIN32 + #include +@@ -718,12 +717,8 @@ void SetUserPath(const std::string& path) { + #endif + } + +- g_paths.emplace(UserPath::SDMCDir, !Settings::values.sdmc_dir.empty() +- ? Settings::values.sdmc_dir +- : user_path + SDMC_DIR DIR_SEP); +- g_paths.emplace(UserPath::NANDDir, !Settings::values.nand_dir.empty() +- ? Settings::values.nand_dir +- : user_path + NAND_DIR DIR_SEP); ++ g_paths.emplace(UserPath::SDMCDir, user_path + SDMC_DIR DIR_SEP); ++ g_paths.emplace(UserPath::NANDDir, user_path + NAND_DIR DIR_SEP); + g_paths.emplace(UserPath::SysDataDir, user_path + SYSDATA_DIR DIR_SEP); + // TODO: Put the logs in a better location for each OS + g_paths.emplace(UserPath::LogDir, user_path + LOG_DIR DIR_SEP);