From 913cc27e3a74640c749b25de5f5cd2f5b018be06 Mon Sep 17 00:00:00 2001 From: vampiric_x Date: Fri, 17 Jan 2025 19:03:31 +0100 Subject: [PATCH] feat(network): Ip input field for multiplayer room creation --- src/citron/multiplayer/host_room.cpp | 34 ++++++++++++- src/citron/multiplayer/host_room.h | 2 + src/citron/multiplayer/host_room.ui | 71 ++++++++++++++++++---------- 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/src/citron/multiplayer/host_room.cpp b/src/citron/multiplayer/host_room.cpp index 7651082df..89fe5d94d 100644 --- a/src/citron/multiplayer/host_room.cpp +++ b/src/citron/multiplayer/host_room.cpp @@ -10,6 +10,10 @@ #include #include #include +#include +#include +#include +#include #include "common/logging/log.h" #include "common/settings.h" #include "core/core.h" @@ -53,6 +57,7 @@ HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, // Connect all the widgets to the appropriate events connect(ui->host, &QPushButton::clicked, this, &HostRoomWindow::Host); + connect(ui->copy_ip_button, &QPushButton::clicked, this, &HostRoomWindow::CopyIPToClipboard); // Restore the settings: ui->username->setText( @@ -76,6 +81,8 @@ HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, } ui->room_description->setText( QString::fromStdString(UISettings::values.multiplayer_room_description.GetValue())); + + SetLocalIPAddress(); } HostRoomWindow::~HostRoomWindow() = default; @@ -148,6 +155,7 @@ void HostRoomWindow::Host() { } } ui->host->setDisabled(true); + std::string ip_address = ui->server_address_box->text().toStdString(); const AnnounceMultiplayerRoom::GameInfo game{ .name = ui->game_list->currentData(Qt::DisplayRole).toString().toStdString(), @@ -164,7 +172,7 @@ void HostRoomWindow::Host() { if (auto room = room_network.GetRoom().lock()) { const bool created = room->Create(ui->room_name->text().toStdString(), - ui->room_description->toPlainText().toStdString(), "", port, password, + ui->room_description->toPlainText().toStdString(), ip_address, port, password, ui->max_player->value(), Settings::values.citron_username.GetValue(), game, CreateVerifyBackend(is_public), ban_list); if (!created) { @@ -216,7 +224,7 @@ void HostRoomWindow::Host() { } #endif // TODO: Check what to do with this - member->Join(ui->username->text().toStdString(), "127.0.0.1", port, 0, + member->Join(ui->username->text().toStdString(), ip_address.c_str(), port, 0, Network::NoPreferredIP, password, token); // Store settings @@ -261,3 +269,25 @@ bool ComboBoxProxyModel::lessThan(const QModelIndex& left, const QModelIndex& ri auto rightData = right.data(GameListItemPath::TitleRole).toString(); return leftData.compare(rightData) < 0; } + +void HostRoomWindow::SetLocalIPAddress() { + QString local_ip; + + foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) { + if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) { + local_ip = address.toString(); + break; + } + } + + if (!local_ip.isEmpty()) { + ui->server_address_box->setText(local_ip); + } else { + ui->server_address_box->setPlaceholderText(tr("Enter Server Address")); + } +} + +void HostRoomWindow::CopyIPToClipboard() { + QClipboard* clipboard = QApplication::clipboard(); + clipboard->setText(ui->server_address_box->text()); +} diff --git a/src/citron/multiplayer/host_room.h b/src/citron/multiplayer/host_room.h index 49208ee3f..ff4ce20f6 100644 --- a/src/citron/multiplayer/host_room.h +++ b/src/citron/multiplayer/host_room.h @@ -51,6 +51,8 @@ signals: private: void Host(); + void SetLocalIPAddress(); + void CopyIPToClipboard(); std::unique_ptr CreateVerifyBackend(bool use_validation) const; std::unique_ptr ui; diff --git a/src/citron/multiplayer/host_room.ui b/src/citron/multiplayer/host_room.ui index d54cf49c6..6e100ba85 100644 --- a/src/citron/multiplayer/host_room.ui +++ b/src/citron/multiplayer/host_room.ui @@ -7,13 +7,34 @@ 0 0 607 - 211 + 236 Create Room - + + + + + + + Server Address: + + + + + + + + + + Copy + + + + + @@ -31,38 +52,38 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + Room Name - + 50 - + Preferred Game - + - + Max Players - + 2 @@ -82,9 +103,6 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - @@ -92,6 +110,16 @@ + + + + + + + Password + + + @@ -102,6 +130,13 @@ + + + + Port + + + @@ -112,20 +147,6 @@ - - - - Password - - - - - - - Port - - -