summaryrefslogtreecommitdiff
path: root/src/citron/multiplayer
diff options
context:
space:
mode:
authorvampiric_x <vampiric_x@citron-emu.org>2025-01-17 19:03:31 +0100
committervampiric_x <vampiric_x@citron-emu.org>2025-01-17 19:03:31 +0100
commit913cc27e3a74640c749b25de5f5cd2f5b018be06 (patch)
tree270005ee0cf2c1cad2c7a0005462a996c491fcb6 /src/citron/multiplayer
parent369847897796e40cdb9eb9a467965bbdb48c7def (diff)
feat(network): Ip input field for multiplayer room creation
Diffstat (limited to 'src/citron/multiplayer')
-rw-r--r--src/citron/multiplayer/host_room.cpp34
-rw-r--r--src/citron/multiplayer/host_room.h2
-rw-r--r--src/citron/multiplayer/host_room.ui71
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 <QMetaType>
#include <QTime>
#include <QtConcurrent/QtConcurrentRun>
+#include <QHostInfo>
+#include <QNetworkInterface>
+#include <QClipboard>
+#include <QApplication>
#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<Network::VerifyUser::Backend> CreateVerifyBackend(bool use_validation) const;
std::unique_ptr<Ui::HostRoom> 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 @@
<x>0</x>
<y>0</y>
<width>607</width>
- <height>211</height>
+ <height>236</height>
</rect>
</property>
<property name="windowTitle">
<string>Create Room</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="server_address_label">
+ <property name="text">
+ <string>Server Address:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="server_address_box"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="copy_ip_button">
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
<item>
<widget class="QWidget" name="settings" native="true">
<layout class="QHBoxLayout">
@@ -31,38 +52,38 @@
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
- <item row="0" column="0">
+ <item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Room Name</string>
</property>
</widget>
</item>
- <item row="0" column="1">
+ <item row="1" column="1">
<widget class="QLineEdit" name="room_name">
<property name="maxLength">
<number>50</number>
</property>
</widget>
</item>
- <item row="1" column="0">
+ <item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Preferred Game</string>
</property>
</widget>
</item>
- <item row="1" column="1">
+ <item row="2" column="1">
<widget class="QComboBox" name="game_list"/>
</item>
- <item row="2" column="0">
+ <item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Max Players</string>
</property>
</widget>
</item>
- <item row="2" column="1">
+ <item row="3" column="1">
<widget class="QSpinBox" name="max_player">
<property name="minimum">
<number>2</number>
@@ -82,9 +103,6 @@
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
- <item row="0" column="1">
- <widget class="QLineEdit" name="username"/>
- </item>
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
@@ -92,6 +110,16 @@
</property>
</widget>
</item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="username"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
<item row="1" column="1">
<widget class="QLineEdit" name="password">
<property name="echoMode">
@@ -102,6 +130,13 @@
</property>
</widget>
</item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Port</string>
+ </property>
+ </widget>
+ </item>
<item row="2" column="1">
<widget class="QLineEdit" name="port">
<property name="inputMethodHints">
@@ -112,20 +147,6 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Password</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Port</string>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>