diff options
| author | 2022-07-22 16:31:13 +0200 | |
|---|---|---|
| committer | 2022-07-25 21:59:31 +0200 | |
| commit | 7d82e57b91dee30e0fe6fed36550ea7cc9eb778e (patch) | |
| tree | 4a58f4874083783026dabc0de6a7fb09195cf95b | |
| parent | common: multiplayer: Use GameInfo type (diff) | |
| download | yuzu-7d82e57b91dee30e0fe6fed36550ea7cc9eb778e.tar.gz yuzu-7d82e57b91dee30e0fe6fed36550ea7cc9eb778e.tar.xz yuzu-7d82e57b91dee30e0fe6fed36550ea7cc9eb778e.zip | |
network: Move global state into a seperate class
Co-Authored-By: Narr the Reg <5944268+german77@users.noreply.github.com>
| -rw-r--r-- | src/core/announce_multiplayer_session.cpp | 7 | ||||
| -rw-r--r-- | src/core/announce_multiplayer_session.h | 11 | ||||
| -rw-r--r-- | src/core/core.cpp | 16 | ||||
| -rw-r--r-- | src/core/core.h | 10 | ||||
| -rw-r--r-- | src/network/network.cpp | 15 | ||||
| -rw-r--r-- | src/network/network.h | 25 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 6 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/chat_room.cpp | 44 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/chat_room.h | 2 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/client_room.cpp | 11 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/client_room.h | 3 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/direct_connect.cpp | 10 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/direct_connect.h | 3 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/host_room.cpp | 14 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/host_room.h | 4 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/lobby.cpp | 12 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/lobby.h | 4 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/moderation_dialog.cpp | 14 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/moderation_dialog.h | 4 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/state.cpp | 28 | ||||
| -rw-r--r-- | src/yuzu/multiplayer/state.h | 3 |
21 files changed, 150 insertions, 96 deletions
diff --git a/src/core/announce_multiplayer_session.cpp b/src/core/announce_multiplayer_session.cpp index db9eaeac8..8f96b4ee8 100644 --- a/src/core/announce_multiplayer_session.cpp +++ b/src/core/announce_multiplayer_session.cpp | |||
| @@ -20,7 +20,8 @@ namespace Core { | |||
| 20 | // Time between room is announced to web_service | 20 | // Time between room is announced to web_service |
| 21 | static constexpr std::chrono::seconds announce_time_interval(15); | 21 | static constexpr std::chrono::seconds announce_time_interval(15); |
| 22 | 22 | ||
| 23 | AnnounceMultiplayerSession::AnnounceMultiplayerSession() { | 23 | AnnounceMultiplayerSession::AnnounceMultiplayerSession(Network::RoomNetwork& room_network_) |
| 24 | : room_network{room_network_} { | ||
| 24 | #ifdef ENABLE_WEB_SERVICE | 25 | #ifdef ENABLE_WEB_SERVICE |
| 25 | backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(), | 26 | backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(), |
| 26 | Settings::values.yuzu_username.GetValue(), | 27 | Settings::values.yuzu_username.GetValue(), |
| @@ -31,7 +32,7 @@ AnnounceMultiplayerSession::AnnounceMultiplayerSession() { | |||
| 31 | } | 32 | } |
| 32 | 33 | ||
| 33 | WebService::WebResult AnnounceMultiplayerSession::Register() { | 34 | WebService::WebResult AnnounceMultiplayerSession::Register() { |
| 34 | std::shared_ptr<Network::Room> room = Network::GetRoom().lock(); | 35 | std::shared_ptr<Network::Room> room = room_network.GetRoom().lock(); |
| 35 | if (!room) { | 36 | if (!room) { |
| 36 | return WebService::WebResult{WebService::WebResult::Code::LibError, | 37 | return WebService::WebResult{WebService::WebResult::Code::LibError, |
| 37 | "Network is not initialized", ""}; | 38 | "Network is not initialized", ""}; |
| @@ -120,7 +121,7 @@ void AnnounceMultiplayerSession::AnnounceMultiplayerLoop() { | |||
| 120 | std::future<WebService::WebResult> future; | 121 | std::future<WebService::WebResult> future; |
| 121 | while (!shutdown_event.WaitUntil(update_time)) { | 122 | while (!shutdown_event.WaitUntil(update_time)) { |
| 122 | update_time += announce_time_interval; | 123 | update_time += announce_time_interval; |
| 123 | std::shared_ptr<Network::Room> room = Network::GetRoom().lock(); | 124 | std::shared_ptr<Network::Room> room = room_network.GetRoom().lock(); |
| 124 | if (!room) { | 125 | if (!room) { |
| 125 | break; | 126 | break; |
| 126 | } | 127 | } |
diff --git a/src/core/announce_multiplayer_session.h b/src/core/announce_multiplayer_session.h index 2aaf55017..5da3c1f8d 100644 --- a/src/core/announce_multiplayer_session.h +++ b/src/core/announce_multiplayer_session.h | |||
| @@ -16,7 +16,8 @@ | |||
| 16 | 16 | ||
| 17 | namespace Network { | 17 | namespace Network { |
| 18 | class Room; | 18 | class Room; |
| 19 | } | 19 | class RoomNetwork; |
| 20 | } // namespace Network | ||
| 20 | 21 | ||
| 21 | namespace Core { | 22 | namespace Core { |
| 22 | 23 | ||
| @@ -28,7 +29,7 @@ namespace Core { | |||
| 28 | class AnnounceMultiplayerSession { | 29 | class AnnounceMultiplayerSession { |
| 29 | public: | 30 | public: |
| 30 | using CallbackHandle = std::shared_ptr<std::function<void(const WebService::WebResult&)>>; | 31 | using CallbackHandle = std::shared_ptr<std::function<void(const WebService::WebResult&)>>; |
| 31 | AnnounceMultiplayerSession(); | 32 | AnnounceMultiplayerSession(Network::RoomNetwork& room_network_); |
| 32 | ~AnnounceMultiplayerSession(); | 33 | ~AnnounceMultiplayerSession(); |
| 33 | 34 | ||
| 34 | /** | 35 | /** |
| @@ -79,6 +80,9 @@ public: | |||
| 79 | void UpdateCredentials(); | 80 | void UpdateCredentials(); |
| 80 | 81 | ||
| 81 | private: | 82 | private: |
| 83 | void UpdateBackendData(std::shared_ptr<Network::Room> room); | ||
| 84 | void AnnounceMultiplayerLoop(); | ||
| 85 | |||
| 82 | Common::Event shutdown_event; | 86 | Common::Event shutdown_event; |
| 83 | std::mutex callback_mutex; | 87 | std::mutex callback_mutex; |
| 84 | std::set<CallbackHandle> error_callbacks; | 88 | std::set<CallbackHandle> error_callbacks; |
| @@ -89,8 +93,7 @@ private: | |||
| 89 | 93 | ||
| 90 | std::atomic_bool registered = false; ///< Whether the room has been registered | 94 | std::atomic_bool registered = false; ///< Whether the room has been registered |
| 91 | 95 | ||
| 92 | void UpdateBackendData(std::shared_ptr<Network::Room> room); | 96 | Network::RoomNetwork& room_network; |
| 93 | void AnnounceMultiplayerLoop(); | ||
| 94 | }; | 97 | }; |
| 95 | 98 | ||
| 96 | } // namespace Core | 99 | } // namespace Core |
diff --git a/src/core/core.cpp b/src/core/core.cpp index 98fe6d39c..95791a07f 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -131,7 +131,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | |||
| 131 | 131 | ||
| 132 | struct System::Impl { | 132 | struct System::Impl { |
| 133 | explicit Impl(System& system) | 133 | explicit Impl(System& system) |
| 134 | : kernel{system}, fs_controller{system}, memory{system}, hid_core{}, | 134 | : kernel{system}, fs_controller{system}, memory{system}, hid_core{}, room_network{}, |
| 135 | cpu_manager{system}, reporter{system}, applet_manager{system}, time_manager{system} {} | 135 | cpu_manager{system}, reporter{system}, applet_manager{system}, time_manager{system} {} |
| 136 | 136 | ||
| 137 | SystemResultStatus Run() { | 137 | SystemResultStatus Run() { |
| @@ -320,7 +320,7 @@ struct System::Impl { | |||
| 320 | if (app_loader->ReadTitle(name) != Loader::ResultStatus::Success) { | 320 | if (app_loader->ReadTitle(name) != Loader::ResultStatus::Success) { |
| 321 | LOG_ERROR(Core, "Failed to read title for ROM (Error {})", load_result); | 321 | LOG_ERROR(Core, "Failed to read title for ROM (Error {})", load_result); |
| 322 | } | 322 | } |
| 323 | if (auto room_member = Network::GetRoomMember().lock()) { | 323 | if (auto room_member = room_network.GetRoomMember().lock()) { |
| 324 | Network::GameInfo game_info; | 324 | Network::GameInfo game_info; |
| 325 | game_info.name = name; | 325 | game_info.name = name; |
| 326 | game_info.id = program_id; | 326 | game_info.id = program_id; |
| @@ -374,7 +374,7 @@ struct System::Impl { | |||
| 374 | memory.Reset(); | 374 | memory.Reset(); |
| 375 | applet_manager.ClearAll(); | 375 | applet_manager.ClearAll(); |
| 376 | 376 | ||
| 377 | if (auto room_member = Network::GetRoomMember().lock()) { | 377 | if (auto room_member = room_network.GetRoomMember().lock()) { |
| 378 | Network::GameInfo game_info{}; | 378 | Network::GameInfo game_info{}; |
| 379 | room_member->SendGameInfo(game_info); | 379 | room_member->SendGameInfo(game_info); |
| 380 | } | 380 | } |
| @@ -451,6 +451,8 @@ struct System::Impl { | |||
| 451 | std::unique_ptr<AudioCore::AudioCore> audio_core; | 451 | std::unique_ptr<AudioCore::AudioCore> audio_core; |
| 452 | Core::Memory::Memory memory; | 452 | Core::Memory::Memory memory; |
| 453 | Core::HID::HIDCore hid_core; | 453 | Core::HID::HIDCore hid_core; |
| 454 | Network::RoomNetwork room_network; | ||
| 455 | |||
| 454 | CpuManager cpu_manager; | 456 | CpuManager cpu_manager; |
| 455 | std::atomic_bool is_powered_on{}; | 457 | std::atomic_bool is_powered_on{}; |
| 456 | bool exit_lock = false; | 458 | bool exit_lock = false; |
| @@ -896,6 +898,14 @@ const Core::Debugger& System::GetDebugger() const { | |||
| 896 | return *impl->debugger; | 898 | return *impl->debugger; |
| 897 | } | 899 | } |
| 898 | 900 | ||
| 901 | Network::RoomNetwork& System::GetRoomNetwork() { | ||
| 902 | return impl->room_network; | ||
| 903 | } | ||
| 904 | |||
| 905 | const Network::RoomNetwork& System::GetRoomNetwork() const { | ||
| 906 | return impl->room_network; | ||
| 907 | } | ||
| 908 | |||
| 899 | void System::RegisterExecuteProgramCallback(ExecuteProgramCallback&& callback) { | 909 | void System::RegisterExecuteProgramCallback(ExecuteProgramCallback&& callback) { |
| 900 | impl->execute_program_callback = std::move(callback); | 910 | impl->execute_program_callback = std::move(callback); |
| 901 | } | 911 | } |
diff --git a/src/core/core.h b/src/core/core.h index a49d1214b..13122dd61 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -97,6 +97,10 @@ namespace Core::HID { | |||
| 97 | class HIDCore; | 97 | class HIDCore; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | namespace Network { | ||
| 101 | class RoomNetwork; | ||
| 102 | } | ||
| 103 | |||
| 100 | namespace Core { | 104 | namespace Core { |
| 101 | 105 | ||
| 102 | class ARM_Interface; | 106 | class ARM_Interface; |
| @@ -379,6 +383,12 @@ public: | |||
| 379 | [[nodiscard]] Core::Debugger& GetDebugger(); | 383 | [[nodiscard]] Core::Debugger& GetDebugger(); |
| 380 | [[nodiscard]] const Core::Debugger& GetDebugger() const; | 384 | [[nodiscard]] const Core::Debugger& GetDebugger() const; |
| 381 | 385 | ||
| 386 | /// Gets a mutable reference to the Room Network. | ||
| 387 | [[nodiscard]] Network::RoomNetwork& GetRoomNetwork(); | ||
| 388 | |||
| 389 | /// Gets an immutable reference to the Room Network. | ||
| 390 | [[nodiscard]] const Network::RoomNetwork& GetRoomNetwork() const; | ||
| 391 | |||
| 382 | void SetExitLock(bool locked); | 392 | void SetExitLock(bool locked); |
| 383 | [[nodiscard]] bool GetExitLock() const; | 393 | [[nodiscard]] bool GetExitLock() const; |
| 384 | 394 | ||
diff --git a/src/network/network.cpp b/src/network/network.cpp index 51b5d6a9f..e1401a403 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp | |||
| @@ -9,11 +9,12 @@ | |||
| 9 | 9 | ||
| 10 | namespace Network { | 10 | namespace Network { |
| 11 | 11 | ||
| 12 | static std::shared_ptr<RoomMember> g_room_member; ///< RoomMember (Client) for network games | 12 | RoomNetwork::RoomNetwork() { |
| 13 | static std::shared_ptr<Room> g_room; ///< Room (Server) for network games | 13 | g_room = std::make_shared<Room>(); |
| 14 | // TODO(B3N30): Put these globals into a networking class | 14 | g_room_member = std::make_shared<RoomMember>(); |
| 15 | } | ||
| 15 | 16 | ||
| 16 | bool Init() { | 17 | bool RoomNetwork::Init() { |
| 17 | if (enet_initialize() != 0) { | 18 | if (enet_initialize() != 0) { |
| 18 | LOG_ERROR(Network, "Error initalizing ENet"); | 19 | LOG_ERROR(Network, "Error initalizing ENet"); |
| 19 | return false; | 20 | return false; |
| @@ -24,15 +25,15 @@ bool Init() { | |||
| 24 | return true; | 25 | return true; |
| 25 | } | 26 | } |
| 26 | 27 | ||
| 27 | std::weak_ptr<Room> GetRoom() { | 28 | std::weak_ptr<Room> RoomNetwork::GetRoom() { |
| 28 | return g_room; | 29 | return g_room; |
| 29 | } | 30 | } |
| 30 | 31 | ||
| 31 | std::weak_ptr<RoomMember> GetRoomMember() { | 32 | std::weak_ptr<RoomMember> RoomNetwork::GetRoomMember() { |
| 32 | return g_room_member; | 33 | return g_room_member; |
| 33 | } | 34 | } |
| 34 | 35 | ||
| 35 | void Shutdown() { | 36 | void RoomNetwork::Shutdown() { |
| 36 | if (g_room_member) { | 37 | if (g_room_member) { |
| 37 | if (g_room_member->IsConnected()) | 38 | if (g_room_member->IsConnected()) |
| 38 | g_room_member->Leave(); | 39 | g_room_member->Leave(); |
diff --git a/src/network/network.h b/src/network/network.h index 6d002d693..74eb42bf5 100644 --- a/src/network/network.h +++ b/src/network/network.h | |||
| @@ -10,16 +10,25 @@ | |||
| 10 | 10 | ||
| 11 | namespace Network { | 11 | namespace Network { |
| 12 | 12 | ||
| 13 | /// Initializes and registers the network device, the room, and the room member. | 13 | class RoomNetwork { |
| 14 | bool Init(); | 14 | public: |
| 15 | RoomNetwork(); | ||
| 15 | 16 | ||
| 16 | /// Returns a pointer to the room handle | 17 | /// Initializes and registers the network device, the room, and the room member. |
| 17 | std::weak_ptr<Room> GetRoom(); | 18 | bool Init(); |
| 18 | 19 | ||
| 19 | /// Returns a pointer to the room member handle | 20 | /// Returns a pointer to the room handle |
| 20 | std::weak_ptr<RoomMember> GetRoomMember(); | 21 | std::weak_ptr<Room> GetRoom(); |
| 21 | 22 | ||
| 22 | /// Unregisters the network device, the room, and the room member and shut them down. | 23 | /// Returns a pointer to the room member handle |
| 23 | void Shutdown(); | 24 | std::weak_ptr<RoomMember> GetRoomMember(); |
| 25 | |||
| 26 | /// Unregisters the network device, the room, and the room member and shut them down. | ||
| 27 | void Shutdown(); | ||
| 28 | |||
| 29 | private: | ||
| 30 | std::shared_ptr<RoomMember> g_room_member; ///< RoomMember (Client) for network games | ||
| 31 | std::shared_ptr<Room> g_room; ///< Room (Server) for network games | ||
| 32 | }; | ||
| 24 | 33 | ||
| 25 | } // namespace Network | 34 | } // namespace Network |
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index f1cc910c0..e56fcabff 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp | |||
| @@ -273,7 +273,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) | |||
| 273 | SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); | 273 | SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); |
| 274 | discord_rpc->Update(); | 274 | discord_rpc->Update(); |
| 275 | 275 | ||
| 276 | Network::Init(); | 276 | system->GetRoomNetwork().Init(); |
| 277 | 277 | ||
| 278 | RegisterMetaTypes(); | 278 | RegisterMetaTypes(); |
| 279 | 279 | ||
| @@ -463,7 +463,7 @@ GMainWindow::~GMainWindow() { | |||
| 463 | if (render_window->parent() == nullptr) { | 463 | if (render_window->parent() == nullptr) { |
| 464 | delete render_window; | 464 | delete render_window; |
| 465 | } | 465 | } |
| 466 | Network::Shutdown(); | 466 | system->GetRoomNetwork().Shutdown(); |
| 467 | } | 467 | } |
| 468 | 468 | ||
| 469 | void GMainWindow::RegisterMetaTypes() { | 469 | void GMainWindow::RegisterMetaTypes() { |
| @@ -828,7 +828,7 @@ void GMainWindow::InitializeWidgets() { | |||
| 828 | }); | 828 | }); |
| 829 | 829 | ||
| 830 | multiplayer_state = new MultiplayerState(this, game_list->GetModel(), ui->action_Leave_Room, | 830 | multiplayer_state = new MultiplayerState(this, game_list->GetModel(), ui->action_Leave_Room, |
| 831 | ui->action_Show_Room); | 831 | ui->action_Show_Room, system->GetRoomNetwork()); |
| 832 | multiplayer_state->setVisible(false); | 832 | multiplayer_state->setVisible(false); |
| 833 | 833 | ||
| 834 | // Create status bar | 834 | // Create status bar |
diff --git a/src/yuzu/multiplayer/chat_room.cpp b/src/yuzu/multiplayer/chat_room.cpp index 7048ee1fc..9f2c57eee 100644 --- a/src/yuzu/multiplayer/chat_room.cpp +++ b/src/yuzu/multiplayer/chat_room.cpp | |||
| @@ -28,7 +28,8 @@ | |||
| 28 | 28 | ||
| 29 | class ChatMessage { | 29 | class ChatMessage { |
| 30 | public: | 30 | public: |
| 31 | explicit ChatMessage(const Network::ChatEntry& chat, QTime ts = {}) { | 31 | explicit ChatMessage(const Network::ChatEntry& chat, Network::RoomNetwork& room_network, |
| 32 | QTime ts = {}) { | ||
| 32 | /// Convert the time to their default locale defined format | 33 | /// Convert the time to their default locale defined format |
| 33 | QLocale locale; | 34 | QLocale locale; |
| 34 | timestamp = locale.toString(ts.isValid() ? ts : QTime::currentTime(), QLocale::ShortFormat); | 35 | timestamp = locale.toString(ts.isValid() ? ts : QTime::currentTime(), QLocale::ShortFormat); |
| @@ -38,7 +39,7 @@ public: | |||
| 38 | 39 | ||
| 39 | // Check for user pings | 40 | // Check for user pings |
| 40 | QString cur_nickname, cur_username; | 41 | QString cur_nickname, cur_username; |
| 41 | if (auto room = Network::GetRoomMember().lock()) { | 42 | if (auto room = room_network.GetRoomMember().lock()) { |
| 42 | cur_nickname = QString::fromStdString(room->GetNickname()); | 43 | cur_nickname = QString::fromStdString(room->GetNickname()); |
| 43 | cur_username = QString::fromStdString(room->GetUsername()); | 44 | cur_username = QString::fromStdString(room->GetUsername()); |
| 44 | } | 45 | } |
| @@ -173,8 +174,20 @@ ChatRoom::ChatRoom(QWidget* parent) : QWidget(parent), ui(std::make_unique<Ui::C | |||
| 173 | qRegisterMetaType<Network::RoomInformation>(); | 174 | qRegisterMetaType<Network::RoomInformation>(); |
| 174 | qRegisterMetaType<Network::RoomMember::State>(); | 175 | qRegisterMetaType<Network::RoomMember::State>(); |
| 175 | 176 | ||
| 177 | // Connect all the widgets to the appropriate events | ||
| 178 | connect(ui->player_view, &QTreeView::customContextMenuRequested, this, | ||
| 179 | &ChatRoom::PopupContextMenu); | ||
| 180 | connect(ui->chat_message, &QLineEdit::returnPressed, this, &ChatRoom::OnSendChat); | ||
| 181 | connect(ui->chat_message, &QLineEdit::textChanged, this, &ChatRoom::OnChatTextChanged); | ||
| 182 | connect(ui->send_message, &QPushButton::clicked, this, &ChatRoom::OnSendChat); | ||
| 183 | } | ||
| 184 | |||
| 185 | ChatRoom::~ChatRoom() = default; | ||
| 186 | |||
| 187 | void ChatRoom::Initialize(Network::RoomNetwork* room_network_) { | ||
| 188 | room_network = room_network_; | ||
| 176 | // setup the callbacks for network updates | 189 | // setup the callbacks for network updates |
| 177 | if (auto member = Network::GetRoomMember().lock()) { | 190 | if (auto member = room_network->GetRoomMember().lock()) { |
| 178 | member->BindOnChatMessageRecieved( | 191 | member->BindOnChatMessageRecieved( |
| 179 | [this](const Network::ChatEntry& chat) { emit ChatReceived(chat); }); | 192 | [this](const Network::ChatEntry& chat) { emit ChatReceived(chat); }); |
| 180 | member->BindOnStatusMessageReceived( | 193 | member->BindOnStatusMessageReceived( |
| @@ -183,20 +196,9 @@ ChatRoom::ChatRoom(QWidget* parent) : QWidget(parent), ui(std::make_unique<Ui::C | |||
| 183 | }); | 196 | }); |
| 184 | connect(this, &ChatRoom::ChatReceived, this, &ChatRoom::OnChatReceive); | 197 | connect(this, &ChatRoom::ChatReceived, this, &ChatRoom::OnChatReceive); |
| 185 | connect(this, &ChatRoom::StatusMessageReceived, this, &ChatRoom::OnStatusMessageReceive); | 198 | connect(this, &ChatRoom::StatusMessageReceived, this, &ChatRoom::OnStatusMessageReceive); |
| 186 | } else { | ||
| 187 | // TODO (jroweboy) network was not initialized? | ||
| 188 | } | 199 | } |
| 189 | |||
| 190 | // Connect all the widgets to the appropriate events | ||
| 191 | connect(ui->player_view, &QTreeView::customContextMenuRequested, this, | ||
| 192 | &ChatRoom::PopupContextMenu); | ||
| 193 | connect(ui->chat_message, &QLineEdit::returnPressed, this, &ChatRoom::OnSendChat); | ||
| 194 | connect(ui->chat_message, &QLineEdit::textChanged, this, &ChatRoom::OnChatTextChanged); | ||
| 195 | connect(ui->send_message, &QPushButton::clicked, this, &ChatRoom::OnSendChat); | ||
| 196 | } | 200 | } |
| 197 | 201 | ||
| 198 | ChatRoom::~ChatRoom() = default; | ||
| 199 | |||
| 200 | void ChatRoom::SetModPerms(bool is_mod) { | 202 | void ChatRoom::SetModPerms(bool is_mod) { |
| 201 | has_mod_perms = is_mod; | 203 | has_mod_perms = is_mod; |
| 202 | } | 204 | } |
| @@ -219,7 +221,7 @@ void ChatRoom::AppendChatMessage(const QString& msg) { | |||
| 219 | } | 221 | } |
| 220 | 222 | ||
| 221 | void ChatRoom::SendModerationRequest(Network::RoomMessageTypes type, const std::string& nickname) { | 223 | void ChatRoom::SendModerationRequest(Network::RoomMessageTypes type, const std::string& nickname) { |
| 222 | if (auto room = Network::GetRoomMember().lock()) { | 224 | if (auto room = room_network->GetRoomMember().lock()) { |
| 223 | auto members = room->GetMemberInformation(); | 225 | auto members = room->GetMemberInformation(); |
| 224 | auto it = std::find_if(members.begin(), members.end(), | 226 | auto it = std::find_if(members.begin(), members.end(), |
| 225 | [&nickname](const Network::RoomMember::MemberInformation& member) { | 227 | [&nickname](const Network::RoomMember::MemberInformation& member) { |
| @@ -239,7 +241,7 @@ bool ChatRoom::ValidateMessage(const std::string& msg) { | |||
| 239 | 241 | ||
| 240 | void ChatRoom::OnRoomUpdate(const Network::RoomInformation& info) { | 242 | void ChatRoom::OnRoomUpdate(const Network::RoomInformation& info) { |
| 241 | // TODO(B3N30): change title | 243 | // TODO(B3N30): change title |
| 242 | if (auto room_member = Network::GetRoomMember().lock()) { | 244 | if (auto room_member = room_network->GetRoomMember().lock()) { |
| 243 | SetPlayerList(room_member->GetMemberInformation()); | 245 | SetPlayerList(room_member->GetMemberInformation()); |
| 244 | } | 246 | } |
| 245 | } | 247 | } |
| @@ -258,7 +260,7 @@ void ChatRoom::OnChatReceive(const Network::ChatEntry& chat) { | |||
| 258 | if (!ValidateMessage(chat.message)) { | 260 | if (!ValidateMessage(chat.message)) { |
| 259 | return; | 261 | return; |
| 260 | } | 262 | } |
| 261 | if (auto room = Network::GetRoomMember().lock()) { | 263 | if (auto room = room_network->GetRoomMember().lock()) { |
| 262 | // get the id of the player | 264 | // get the id of the player |
| 263 | auto members = room->GetMemberInformation(); | 265 | auto members = room->GetMemberInformation(); |
| 264 | auto it = std::find_if(members.begin(), members.end(), | 266 | auto it = std::find_if(members.begin(), members.end(), |
| @@ -276,7 +278,7 @@ void ChatRoom::OnChatReceive(const Network::ChatEntry& chat) { | |||
| 276 | return; | 278 | return; |
| 277 | } | 279 | } |
| 278 | auto player = std::distance(members.begin(), it); | 280 | auto player = std::distance(members.begin(), it); |
| 279 | ChatMessage m(chat); | 281 | ChatMessage m(chat, *room_network); |
| 280 | if (m.ContainsPing()) { | 282 | if (m.ContainsPing()) { |
| 281 | emit UserPinged(); | 283 | emit UserPinged(); |
| 282 | } | 284 | } |
| @@ -315,7 +317,7 @@ void ChatRoom::OnStatusMessageReceive(const Network::StatusMessageEntry& status_ | |||
| 315 | } | 317 | } |
| 316 | 318 | ||
| 317 | void ChatRoom::OnSendChat() { | 319 | void ChatRoom::OnSendChat() { |
| 318 | if (auto room = Network::GetRoomMember().lock()) { | 320 | if (auto room = room_network->GetRoomMember().lock()) { |
| 319 | if (room->GetState() != Network::RoomMember::State::Joined && | 321 | if (room->GetState() != Network::RoomMember::State::Joined && |
| 320 | room->GetState() != Network::RoomMember::State::Moderator) { | 322 | room->GetState() != Network::RoomMember::State::Moderator) { |
| 321 | 323 | ||
| @@ -339,7 +341,7 @@ void ChatRoom::OnSendChat() { | |||
| 339 | LOG_INFO(Network, "Cannot find self in the player list when sending a message."); | 341 | LOG_INFO(Network, "Cannot find self in the player list when sending a message."); |
| 340 | } | 342 | } |
| 341 | auto player = std::distance(members.begin(), it); | 343 | auto player = std::distance(members.begin(), it); |
| 342 | ChatMessage m(chat); | 344 | ChatMessage m(chat, *room_network); |
| 343 | room->SendChatMessage(message); | 345 | room->SendChatMessage(message); |
| 344 | AppendChatMessage(m.GetPlayerChatMessage(player)); | 346 | AppendChatMessage(m.GetPlayerChatMessage(player)); |
| 345 | ui->chat_message->clear(); | 347 | ui->chat_message->clear(); |
| @@ -433,7 +435,7 @@ void ChatRoom::PopupContextMenu(const QPoint& menu_location) { | |||
| 433 | } | 435 | } |
| 434 | 436 | ||
| 435 | std::string cur_nickname; | 437 | std::string cur_nickname; |
| 436 | if (auto room = Network::GetRoomMember().lock()) { | 438 | if (auto room = room_network->GetRoomMember().lock()) { |
| 437 | cur_nickname = room->GetNickname(); | 439 | cur_nickname = room->GetNickname(); |
| 438 | } | 440 | } |
| 439 | 441 | ||
diff --git a/src/yuzu/multiplayer/chat_room.h b/src/yuzu/multiplayer/chat_room.h index a810377f7..9179d16fb 100644 --- a/src/yuzu/multiplayer/chat_room.h +++ b/src/yuzu/multiplayer/chat_room.h | |||
| @@ -30,6 +30,7 @@ class ChatRoom : public QWidget { | |||
| 30 | 30 | ||
| 31 | public: | 31 | public: |
| 32 | explicit ChatRoom(QWidget* parent); | 32 | explicit ChatRoom(QWidget* parent); |
| 33 | void Initialize(Network::RoomNetwork* room_network); | ||
| 33 | void RetranslateUi(); | 34 | void RetranslateUi(); |
| 34 | void SetPlayerList(const Network::RoomMember::MemberList& member_list); | 35 | void SetPlayerList(const Network::RoomMember::MemberList& member_list); |
| 35 | void Clear(); | 36 | void Clear(); |
| @@ -65,6 +66,7 @@ private: | |||
| 65 | std::unique_ptr<Ui::ChatRoom> ui; | 66 | std::unique_ptr<Ui::ChatRoom> ui; |
| 66 | std::unordered_set<std::string> block_list; | 67 | std::unordered_set<std::string> block_list; |
| 67 | std::unordered_map<std::string, QPixmap> icon_cache; | 68 | std::unordered_map<std::string, QPixmap> icon_cache; |
| 69 | Network::RoomNetwork* room_network; | ||
| 68 | }; | 70 | }; |
| 69 | 71 | ||
| 70 | Q_DECLARE_METATYPE(Network::ChatEntry); | 72 | Q_DECLARE_METATYPE(Network::ChatEntry); |
diff --git a/src/yuzu/multiplayer/client_room.cpp b/src/yuzu/multiplayer/client_room.cpp index 7b2e16e06..9bef9bdfc 100644 --- a/src/yuzu/multiplayer/client_room.cpp +++ b/src/yuzu/multiplayer/client_room.cpp | |||
| @@ -19,13 +19,14 @@ | |||
| 19 | #include "yuzu/multiplayer/moderation_dialog.h" | 19 | #include "yuzu/multiplayer/moderation_dialog.h" |
| 20 | #include "yuzu/multiplayer/state.h" | 20 | #include "yuzu/multiplayer/state.h" |
| 21 | 21 | ||
| 22 | ClientRoomWindow::ClientRoomWindow(QWidget* parent) | 22 | ClientRoomWindow::ClientRoomWindow(QWidget* parent, Network::RoomNetwork& room_network_) |
| 23 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | 23 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), |
| 24 | ui(std::make_unique<Ui::ClientRoom>()) { | 24 | ui(std::make_unique<Ui::ClientRoom>()), room_network{room_network_} { |
| 25 | ui->setupUi(this); | 25 | ui->setupUi(this); |
| 26 | ui->chat->Initialize(&room_network); | ||
| 26 | 27 | ||
| 27 | // setup the callbacks for network updates | 28 | // setup the callbacks for network updates |
| 28 | if (auto member = Network::GetRoomMember().lock()) { | 29 | if (auto member = room_network.GetRoomMember().lock()) { |
| 29 | member->BindOnRoomInformationChanged( | 30 | member->BindOnRoomInformationChanged( |
| 30 | [this](const Network::RoomInformation& info) { emit RoomInformationChanged(info); }); | 31 | [this](const Network::RoomInformation& info) { emit RoomInformationChanged(info); }); |
| 31 | member->BindOnStateChanged( | 32 | member->BindOnStateChanged( |
| @@ -44,7 +45,7 @@ ClientRoomWindow::ClientRoomWindow(QWidget* parent) | |||
| 44 | ui->disconnect->setDefault(false); | 45 | ui->disconnect->setDefault(false); |
| 45 | ui->disconnect->setAutoDefault(false); | 46 | ui->disconnect->setAutoDefault(false); |
| 46 | connect(ui->moderation, &QPushButton::clicked, [this] { | 47 | connect(ui->moderation, &QPushButton::clicked, [this] { |
| 47 | ModerationDialog dialog(this); | 48 | ModerationDialog dialog(room_network, this); |
| 48 | dialog.exec(); | 49 | dialog.exec(); |
| 49 | }); | 50 | }); |
| 50 | ui->moderation->setDefault(false); | 51 | ui->moderation->setDefault(false); |
| @@ -91,7 +92,7 @@ void ClientRoomWindow::Disconnect() { | |||
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | void ClientRoomWindow::UpdateView() { | 94 | void ClientRoomWindow::UpdateView() { |
| 94 | if (auto member = Network::GetRoomMember().lock()) { | 95 | if (auto member = room_network.GetRoomMember().lock()) { |
| 95 | if (member->IsConnected()) { | 96 | if (member->IsConnected()) { |
| 96 | ui->chat->Enable(); | 97 | ui->chat->Enable(); |
| 97 | ui->disconnect->setEnabled(true); | 98 | ui->disconnect->setEnabled(true); |
diff --git a/src/yuzu/multiplayer/client_room.h b/src/yuzu/multiplayer/client_room.h index 607b4073d..6303b2595 100644 --- a/src/yuzu/multiplayer/client_room.h +++ b/src/yuzu/multiplayer/client_room.h | |||
| @@ -14,7 +14,7 @@ class ClientRoomWindow : public QDialog { | |||
| 14 | Q_OBJECT | 14 | Q_OBJECT |
| 15 | 15 | ||
| 16 | public: | 16 | public: |
| 17 | explicit ClientRoomWindow(QWidget* parent); | 17 | explicit ClientRoomWindow(QWidget* parent, Network::RoomNetwork& room_network_); |
| 18 | ~ClientRoomWindow(); | 18 | ~ClientRoomWindow(); |
| 19 | 19 | ||
| 20 | void RetranslateUi(); | 20 | void RetranslateUi(); |
| @@ -36,4 +36,5 @@ private: | |||
| 36 | 36 | ||
| 37 | QStandardItemModel* player_list; | 37 | QStandardItemModel* player_list; |
| 38 | std::unique_ptr<Ui::ClientRoom> ui; | 38 | std::unique_ptr<Ui::ClientRoom> ui; |
| 39 | Network::RoomNetwork& room_network; | ||
| 39 | }; | 40 | }; |
diff --git a/src/yuzu/multiplayer/direct_connect.cpp b/src/yuzu/multiplayer/direct_connect.cpp index 837baf85c..360d66bea 100644 --- a/src/yuzu/multiplayer/direct_connect.cpp +++ b/src/yuzu/multiplayer/direct_connect.cpp | |||
| @@ -21,9 +21,9 @@ | |||
| 21 | 21 | ||
| 22 | enum class ConnectionType : u8 { TraversalServer, IP }; | 22 | enum class ConnectionType : u8 { TraversalServer, IP }; |
| 23 | 23 | ||
| 24 | DirectConnectWindow::DirectConnectWindow(QWidget* parent) | 24 | DirectConnectWindow::DirectConnectWindow(Network::RoomNetwork& room_network_, QWidget* parent) |
| 25 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | 25 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), |
| 26 | ui(std::make_unique<Ui::DirectConnect>()) { | 26 | ui(std::make_unique<Ui::DirectConnect>()), room_network{room_network_} { |
| 27 | 27 | ||
| 28 | ui->setupUi(this); | 28 | ui->setupUi(this); |
| 29 | 29 | ||
| @@ -58,7 +58,7 @@ void DirectConnectWindow::Connect() { | |||
| 58 | NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::USERNAME_NOT_VALID); | 58 | NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::USERNAME_NOT_VALID); |
| 59 | return; | 59 | return; |
| 60 | } | 60 | } |
| 61 | if (const auto member = Network::GetRoomMember().lock()) { | 61 | if (const auto member = room_network.GetRoomMember().lock()) { |
| 62 | // Prevent the user from trying to join a room while they are already joining. | 62 | // Prevent the user from trying to join a room while they are already joining. |
| 63 | if (member->GetState() == Network::RoomMember::State::Joining) { | 63 | if (member->GetState() == Network::RoomMember::State::Joining) { |
| 64 | return; | 64 | return; |
| @@ -96,7 +96,7 @@ void DirectConnectWindow::Connect() { | |||
| 96 | 96 | ||
| 97 | // attempt to connect in a different thread | 97 | // attempt to connect in a different thread |
| 98 | QFuture<void> f = QtConcurrent::run([&] { | 98 | QFuture<void> f = QtConcurrent::run([&] { |
| 99 | if (auto room_member = Network::GetRoomMember().lock()) { | 99 | if (auto room_member = room_network.GetRoomMember().lock()) { |
| 100 | auto port = UISettings::values.multiplayer_port.GetValue(); | 100 | auto port = UISettings::values.multiplayer_port.GetValue(); |
| 101 | room_member->Join(ui->nickname->text().toStdString(), "", | 101 | room_member->Join(ui->nickname->text().toStdString(), "", |
| 102 | ui->ip->text().toStdString().c_str(), port, 0, | 102 | ui->ip->text().toStdString().c_str(), port, 0, |
| @@ -121,7 +121,7 @@ void DirectConnectWindow::EndConnecting() { | |||
| 121 | void DirectConnectWindow::OnConnection() { | 121 | void DirectConnectWindow::OnConnection() { |
| 122 | EndConnecting(); | 122 | EndConnecting(); |
| 123 | 123 | ||
| 124 | if (auto room_member = Network::GetRoomMember().lock()) { | 124 | if (auto room_member = room_network.GetRoomMember().lock()) { |
| 125 | if (room_member->GetState() == Network::RoomMember::State::Joined || | 125 | if (room_member->GetState() == Network::RoomMember::State::Joined || |
| 126 | room_member->GetState() == Network::RoomMember::State::Moderator) { | 126 | room_member->GetState() == Network::RoomMember::State::Moderator) { |
| 127 | 127 | ||
diff --git a/src/yuzu/multiplayer/direct_connect.h b/src/yuzu/multiplayer/direct_connect.h index e38961ed0..719030d29 100644 --- a/src/yuzu/multiplayer/direct_connect.h +++ b/src/yuzu/multiplayer/direct_connect.h | |||
| @@ -17,7 +17,7 @@ class DirectConnectWindow : public QDialog { | |||
| 17 | Q_OBJECT | 17 | Q_OBJECT |
| 18 | 18 | ||
| 19 | public: | 19 | public: |
| 20 | explicit DirectConnectWindow(QWidget* parent = nullptr); | 20 | explicit DirectConnectWindow(Network::RoomNetwork& room_network_, QWidget* parent = nullptr); |
| 21 | ~DirectConnectWindow(); | 21 | ~DirectConnectWindow(); |
| 22 | 22 | ||
| 23 | void RetranslateUi(); | 23 | void RetranslateUi(); |
| @@ -40,4 +40,5 @@ private: | |||
| 40 | QFutureWatcher<void>* watcher; | 40 | QFutureWatcher<void>* watcher; |
| 41 | std::unique_ptr<Ui::DirectConnect> ui; | 41 | std::unique_ptr<Ui::DirectConnect> ui; |
| 42 | Validation validation; | 42 | Validation validation; |
| 43 | Network::RoomNetwork& room_network; | ||
| 43 | }; | 44 | }; |
diff --git a/src/yuzu/multiplayer/host_room.cpp b/src/yuzu/multiplayer/host_room.cpp index 053e22fe4..a48077544 100644 --- a/src/yuzu/multiplayer/host_room.cpp +++ b/src/yuzu/multiplayer/host_room.cpp | |||
| @@ -27,9 +27,11 @@ | |||
| 27 | #endif | 27 | #endif |
| 28 | 28 | ||
| 29 | HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, | 29 | HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, |
| 30 | std::shared_ptr<Core::AnnounceMultiplayerSession> session) | 30 | std::shared_ptr<Core::AnnounceMultiplayerSession> session, |
| 31 | Network::RoomNetwork& room_network_) | ||
| 31 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | 32 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), |
| 32 | ui(std::make_unique<Ui::HostRoom>()), announce_multiplayer_session(session) { | 33 | ui(std::make_unique<Ui::HostRoom>()), |
| 34 | announce_multiplayer_session(session), room_network{room_network_} { | ||
| 33 | ui->setupUi(this); | 35 | ui->setupUi(this); |
| 34 | 36 | ||
| 35 | // set up validation for all of the fields | 37 | // set up validation for all of the fields |
| @@ -120,7 +122,7 @@ void HostRoomWindow::Host() { | |||
| 120 | NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::GAME_NOT_SELECTED); | 122 | NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::GAME_NOT_SELECTED); |
| 121 | return; | 123 | return; |
| 122 | } | 124 | } |
| 123 | if (auto member = Network::GetRoomMember().lock()) { | 125 | if (auto member = room_network.GetRoomMember().lock()) { |
| 124 | if (member->GetState() == Network::RoomMember::State::Joining) { | 126 | if (member->GetState() == Network::RoomMember::State::Joining) { |
| 125 | return; | 127 | return; |
| 126 | } else if (member->IsConnected()) { | 128 | } else if (member->IsConnected()) { |
| @@ -144,7 +146,7 @@ void HostRoomWindow::Host() { | |||
| 144 | if (ui->load_ban_list->isChecked()) { | 146 | if (ui->load_ban_list->isChecked()) { |
| 145 | ban_list = UISettings::values.multiplayer_ban_list; | 147 | ban_list = UISettings::values.multiplayer_ban_list; |
| 146 | } | 148 | } |
| 147 | if (auto room = Network::GetRoom().lock()) { | 149 | if (auto room = room_network.GetRoom().lock()) { |
| 148 | const bool created = | 150 | const bool created = |
| 149 | room->Create(ui->room_name->text().toStdString(), | 151 | room->Create(ui->room_name->text().toStdString(), |
| 150 | ui->room_description->toPlainText().toStdString(), "", port, password, | 152 | ui->room_description->toPlainText().toStdString(), "", port, password, |
| @@ -173,7 +175,7 @@ void HostRoomWindow::Host() { | |||
| 173 | QString::fromStdString(result.result_string), | 175 | QString::fromStdString(result.result_string), |
| 174 | QMessageBox::Ok); | 176 | QMessageBox::Ok); |
| 175 | ui->host->setEnabled(true); | 177 | ui->host->setEnabled(true); |
| 176 | if (auto room = Network::GetRoom().lock()) { | 178 | if (auto room = room_network.GetRoom().lock()) { |
| 177 | room->Destroy(); | 179 | room->Destroy(); |
| 178 | } | 180 | } |
| 179 | return; | 181 | return; |
| @@ -189,7 +191,7 @@ void HostRoomWindow::Host() { | |||
| 189 | WebService::Client client(Settings::values.web_api_url.GetValue(), | 191 | WebService::Client client(Settings::values.web_api_url.GetValue(), |
| 190 | Settings::values.yuzu_username.GetValue(), | 192 | Settings::values.yuzu_username.GetValue(), |
| 191 | Settings::values.yuzu_token.GetValue()); | 193 | Settings::values.yuzu_token.GetValue()); |
| 192 | if (auto room = Network::GetRoom().lock()) { | 194 | if (auto room = room_network.GetRoom().lock()) { |
| 193 | token = client.GetExternalJWT(room->GetVerifyUID()).returned_data; | 195 | token = client.GetExternalJWT(room->GetVerifyUID()).returned_data; |
| 194 | } | 196 | } |
| 195 | if (token.empty()) { | 197 | if (token.empty()) { |
diff --git a/src/yuzu/multiplayer/host_room.h b/src/yuzu/multiplayer/host_room.h index d84f93ffd..98a56458f 100644 --- a/src/yuzu/multiplayer/host_room.h +++ b/src/yuzu/multiplayer/host_room.h | |||
| @@ -35,7 +35,8 @@ class HostRoomWindow : public QDialog { | |||
| 35 | 35 | ||
| 36 | public: | 36 | public: |
| 37 | explicit HostRoomWindow(QWidget* parent, QStandardItemModel* list, | 37 | explicit HostRoomWindow(QWidget* parent, QStandardItemModel* list, |
| 38 | std::shared_ptr<Core::AnnounceMultiplayerSession> session); | 38 | std::shared_ptr<Core::AnnounceMultiplayerSession> session, |
| 39 | Network::RoomNetwork& room_network_); | ||
| 39 | ~HostRoomWindow(); | 40 | ~HostRoomWindow(); |
| 40 | 41 | ||
| 41 | /** | 42 | /** |
| @@ -54,6 +55,7 @@ private: | |||
| 54 | QStandardItemModel* game_list; | 55 | QStandardItemModel* game_list; |
| 55 | ComboBoxProxyModel* proxy; | 56 | ComboBoxProxyModel* proxy; |
| 56 | Validation validation; | 57 | Validation validation; |
| 58 | Network::RoomNetwork& room_network; | ||
| 57 | }; | 59 | }; |
| 58 | 60 | ||
| 59 | /** | 61 | /** |
diff --git a/src/yuzu/multiplayer/lobby.cpp b/src/yuzu/multiplayer/lobby.cpp index 1b6b782d9..0c6648ab5 100644 --- a/src/yuzu/multiplayer/lobby.cpp +++ b/src/yuzu/multiplayer/lobby.cpp | |||
| @@ -23,9 +23,11 @@ | |||
| 23 | #endif | 23 | #endif |
| 24 | 24 | ||
| 25 | Lobby::Lobby(QWidget* parent, QStandardItemModel* list, | 25 | Lobby::Lobby(QWidget* parent, QStandardItemModel* list, |
| 26 | std::shared_ptr<Core::AnnounceMultiplayerSession> session) | 26 | std::shared_ptr<Core::AnnounceMultiplayerSession> session, |
| 27 | Network::RoomNetwork& room_network_) | ||
| 27 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | 28 | : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), |
| 28 | ui(std::make_unique<Ui::Lobby>()), announce_multiplayer_session(session) { | 29 | ui(std::make_unique<Ui::Lobby>()), |
| 30 | announce_multiplayer_session(session), room_network{room_network_} { | ||
| 29 | ui->setupUi(this); | 31 | ui->setupUi(this); |
| 30 | 32 | ||
| 31 | // setup the watcher for background connections | 33 | // setup the watcher for background connections |
| @@ -113,7 +115,7 @@ void Lobby::OnExpandRoom(const QModelIndex& index) { | |||
| 113 | } | 115 | } |
| 114 | 116 | ||
| 115 | void Lobby::OnJoinRoom(const QModelIndex& source) { | 117 | void Lobby::OnJoinRoom(const QModelIndex& source) { |
| 116 | if (const auto member = Network::GetRoomMember().lock()) { | 118 | if (const auto member = room_network.GetRoomMember().lock()) { |
| 117 | // Prevent the user from trying to join a room while they are already joining. | 119 | // Prevent the user from trying to join a room while they are already joining. |
| 118 | if (member->GetState() == Network::RoomMember::State::Joining) { | 120 | if (member->GetState() == Network::RoomMember::State::Joining) { |
| 119 | return; | 121 | return; |
| @@ -151,7 +153,7 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { | |||
| 151 | proxy->data(connection_index, LobbyItemHost::HostVerifyUIDRole).toString().toStdString(); | 153 | proxy->data(connection_index, LobbyItemHost::HostVerifyUIDRole).toString().toStdString(); |
| 152 | 154 | ||
| 153 | // attempt to connect in a different thread | 155 | // attempt to connect in a different thread |
| 154 | QFuture<void> f = QtConcurrent::run([nickname, ip, port, password, verify_UID] { | 156 | QFuture<void> f = QtConcurrent::run([nickname, ip, port, password, verify_UID, this] { |
| 155 | std::string token; | 157 | std::string token; |
| 156 | #ifdef ENABLE_WEB_SERVICE | 158 | #ifdef ENABLE_WEB_SERVICE |
| 157 | if (!Settings::values.yuzu_username.GetValue().empty() && | 159 | if (!Settings::values.yuzu_username.GetValue().empty() && |
| @@ -167,7 +169,7 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { | |||
| 167 | } | 169 | } |
| 168 | } | 170 | } |
| 169 | #endif | 171 | #endif |
| 170 | if (auto room_member = Network::GetRoomMember().lock()) { | 172 | if (auto room_member = room_network.GetRoomMember().lock()) { |
| 171 | room_member->Join(nickname, "", ip.c_str(), port, 0, Network::NoPreferredMac, password, | 173 | room_member->Join(nickname, "", ip.c_str(), port, 0, Network::NoPreferredMac, password, |
| 172 | token); | 174 | token); |
| 173 | } | 175 | } |
diff --git a/src/yuzu/multiplayer/lobby.h b/src/yuzu/multiplayer/lobby.h index aea4a0e4e..ec6ec2662 100644 --- a/src/yuzu/multiplayer/lobby.h +++ b/src/yuzu/multiplayer/lobby.h | |||
| @@ -30,7 +30,8 @@ class Lobby : public QDialog { | |||
| 30 | 30 | ||
| 31 | public: | 31 | public: |
| 32 | explicit Lobby(QWidget* parent, QStandardItemModel* list, | 32 | explicit Lobby(QWidget* parent, QStandardItemModel* list, |
| 33 | std::shared_ptr<Core::AnnounceMultiplayerSession> session); | 33 | std::shared_ptr<Core::AnnounceMultiplayerSession> session, |
| 34 | Network::RoomNetwork& room_network_); | ||
| 34 | ~Lobby() override; | 35 | ~Lobby() override; |
| 35 | 36 | ||
| 36 | /** | 37 | /** |
| @@ -94,6 +95,7 @@ private: | |||
| 94 | std::weak_ptr<Core::AnnounceMultiplayerSession> announce_multiplayer_session; | 95 | std::weak_ptr<Core::AnnounceMultiplayerSession> announce_multiplayer_session; |
| 95 | QFutureWatcher<void>* watcher; | 96 | QFutureWatcher<void>* watcher; |
| 96 | Validation validation; | 97 | Validation validation; |
| 98 | Network::RoomNetwork& room_network; | ||
| 97 | }; | 99 | }; |
| 98 | 100 | ||
| 99 | /** | 101 | /** |
diff --git a/src/yuzu/multiplayer/moderation_dialog.cpp b/src/yuzu/multiplayer/moderation_dialog.cpp index e97f30ee5..fc3f36c57 100644 --- a/src/yuzu/multiplayer/moderation_dialog.cpp +++ b/src/yuzu/multiplayer/moderation_dialog.cpp | |||
| @@ -17,13 +17,13 @@ enum { | |||
| 17 | }; | 17 | }; |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | ModerationDialog::ModerationDialog(QWidget* parent) | 20 | ModerationDialog::ModerationDialog(Network::RoomNetwork& room_network_, QWidget* parent) |
| 21 | : QDialog(parent), ui(std::make_unique<Ui::ModerationDialog>()) { | 21 | : QDialog(parent), ui(std::make_unique<Ui::ModerationDialog>()), room_network{room_network_} { |
| 22 | ui->setupUi(this); | 22 | ui->setupUi(this); |
| 23 | 23 | ||
| 24 | qRegisterMetaType<Network::Room::BanList>(); | 24 | qRegisterMetaType<Network::Room::BanList>(); |
| 25 | 25 | ||
| 26 | if (auto member = Network::GetRoomMember().lock()) { | 26 | if (auto member = room_network.GetRoomMember().lock()) { |
| 27 | callback_handle_status_message = member->BindOnStatusMessageReceived( | 27 | callback_handle_status_message = member->BindOnStatusMessageReceived( |
| 28 | [this](const Network::StatusMessageEntry& status_message) { | 28 | [this](const Network::StatusMessageEntry& status_message) { |
| 29 | emit StatusMessageReceived(status_message); | 29 | emit StatusMessageReceived(status_message); |
| @@ -56,20 +56,20 @@ ModerationDialog::ModerationDialog(QWidget* parent) | |||
| 56 | 56 | ||
| 57 | ModerationDialog::~ModerationDialog() { | 57 | ModerationDialog::~ModerationDialog() { |
| 58 | if (callback_handle_status_message) { | 58 | if (callback_handle_status_message) { |
| 59 | if (auto room = Network::GetRoomMember().lock()) { | 59 | if (auto room = room_network.GetRoomMember().lock()) { |
| 60 | room->Unbind(callback_handle_status_message); | 60 | room->Unbind(callback_handle_status_message); |
| 61 | } | 61 | } |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | if (callback_handle_ban_list) { | 64 | if (callback_handle_ban_list) { |
| 65 | if (auto room = Network::GetRoomMember().lock()) { | 65 | if (auto room = room_network.GetRoomMember().lock()) { |
| 66 | room->Unbind(callback_handle_ban_list); | 66 | room->Unbind(callback_handle_ban_list); |
| 67 | } | 67 | } |
| 68 | } | 68 | } |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | void ModerationDialog::LoadBanList() { | 71 | void ModerationDialog::LoadBanList() { |
| 72 | if (auto room = Network::GetRoomMember().lock()) { | 72 | if (auto room = room_network.GetRoomMember().lock()) { |
| 73 | ui->refresh->setEnabled(false); | 73 | ui->refresh->setEnabled(false); |
| 74 | ui->refresh->setText(tr("Refreshing")); | 74 | ui->refresh->setText(tr("Refreshing")); |
| 75 | ui->unban->setEnabled(false); | 75 | ui->unban->setEnabled(false); |
| @@ -98,7 +98,7 @@ void ModerationDialog::PopulateBanList(const Network::Room::BanList& ban_list) { | |||
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | void ModerationDialog::SendUnbanRequest(const QString& subject) { | 100 | void ModerationDialog::SendUnbanRequest(const QString& subject) { |
| 101 | if (auto room = Network::GetRoomMember().lock()) { | 101 | if (auto room = room_network.GetRoomMember().lock()) { |
| 102 | room->SendModerationRequest(Network::IdModUnban, subject.toStdString()); | 102 | room->SendModerationRequest(Network::IdModUnban, subject.toStdString()); |
| 103 | } | 103 | } |
| 104 | } | 104 | } |
diff --git a/src/yuzu/multiplayer/moderation_dialog.h b/src/yuzu/multiplayer/moderation_dialog.h index d10083d5b..8adec0cd8 100644 --- a/src/yuzu/multiplayer/moderation_dialog.h +++ b/src/yuzu/multiplayer/moderation_dialog.h | |||
| @@ -20,7 +20,7 @@ class ModerationDialog : public QDialog { | |||
| 20 | Q_OBJECT | 20 | Q_OBJECT |
| 21 | 21 | ||
| 22 | public: | 22 | public: |
| 23 | explicit ModerationDialog(QWidget* parent = nullptr); | 23 | explicit ModerationDialog(Network::RoomNetwork& room_network_, QWidget* parent = nullptr); |
| 24 | ~ModerationDialog(); | 24 | ~ModerationDialog(); |
| 25 | 25 | ||
| 26 | signals: | 26 | signals: |
| @@ -37,6 +37,8 @@ private: | |||
| 37 | QStandardItemModel* model; | 37 | QStandardItemModel* model; |
| 38 | Network::RoomMember::CallbackHandle<Network::StatusMessageEntry> callback_handle_status_message; | 38 | Network::RoomMember::CallbackHandle<Network::StatusMessageEntry> callback_handle_status_message; |
| 39 | Network::RoomMember::CallbackHandle<Network::Room::BanList> callback_handle_ban_list; | 39 | Network::RoomMember::CallbackHandle<Network::Room::BanList> callback_handle_ban_list; |
| 40 | |||
| 41 | Network::RoomNetwork& room_network; | ||
| 40 | }; | 42 | }; |
| 41 | 43 | ||
| 42 | Q_DECLARE_METATYPE(Network::Room::BanList); | 44 | Q_DECLARE_METATYPE(Network::Room::BanList); |
diff --git a/src/yuzu/multiplayer/state.cpp b/src/yuzu/multiplayer/state.cpp index ee138739b..de25225dd 100644 --- a/src/yuzu/multiplayer/state.cpp +++ b/src/yuzu/multiplayer/state.cpp | |||
| @@ -20,10 +20,11 @@ | |||
| 20 | #include "yuzu/util/clickable_label.h" | 20 | #include "yuzu/util/clickable_label.h" |
| 21 | 21 | ||
| 22 | MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_list_model_, | 22 | MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_list_model_, |
| 23 | QAction* leave_room_, QAction* show_room_) | 23 | QAction* leave_room_, QAction* show_room_, |
| 24 | Network::RoomNetwork& room_network_) | ||
| 24 | : QWidget(parent), game_list_model(game_list_model_), leave_room(leave_room_), | 25 | : QWidget(parent), game_list_model(game_list_model_), leave_room(leave_room_), |
| 25 | show_room(show_room_) { | 26 | show_room(show_room_), room_network{room_network_} { |
| 26 | if (auto member = Network::GetRoomMember().lock()) { | 27 | if (auto member = room_network.GetRoomMember().lock()) { |
| 27 | // register the network structs to use in slots and signals | 28 | // register the network structs to use in slots and signals |
| 28 | state_callback_handle = member->BindOnStateChanged( | 29 | state_callback_handle = member->BindOnStateChanged( |
| 29 | [this](const Network::RoomMember::State& state) { emit NetworkStateChanged(state); }); | 30 | [this](const Network::RoomMember::State& state) { emit NetworkStateChanged(state); }); |
| @@ -37,7 +38,7 @@ MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_lis | |||
| 37 | qRegisterMetaType<Network::RoomMember::State>(); | 38 | qRegisterMetaType<Network::RoomMember::State>(); |
| 38 | qRegisterMetaType<Network::RoomMember::Error>(); | 39 | qRegisterMetaType<Network::RoomMember::Error>(); |
| 39 | qRegisterMetaType<WebService::WebResult>(); | 40 | qRegisterMetaType<WebService::WebResult>(); |
| 40 | announce_multiplayer_session = std::make_shared<Core::AnnounceMultiplayerSession>(); | 41 | announce_multiplayer_session = std::make_shared<Core::AnnounceMultiplayerSession>(room_network); |
| 41 | announce_multiplayer_session->BindErrorCallback( | 42 | announce_multiplayer_session->BindErrorCallback( |
| 42 | [this](const WebService::WebResult& result) { emit AnnounceFailed(result); }); | 43 | [this](const WebService::WebResult& result) { emit AnnounceFailed(result); }); |
| 43 | connect(this, &MultiplayerState::AnnounceFailed, this, &MultiplayerState::OnAnnounceFailed); | 44 | connect(this, &MultiplayerState::AnnounceFailed, this, &MultiplayerState::OnAnnounceFailed); |
| @@ -61,13 +62,13 @@ MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_lis | |||
| 61 | 62 | ||
| 62 | MultiplayerState::~MultiplayerState() { | 63 | MultiplayerState::~MultiplayerState() { |
| 63 | if (state_callback_handle) { | 64 | if (state_callback_handle) { |
| 64 | if (auto member = Network::GetRoomMember().lock()) { | 65 | if (auto member = room_network.GetRoomMember().lock()) { |
| 65 | member->Unbind(state_callback_handle); | 66 | member->Unbind(state_callback_handle); |
| 66 | } | 67 | } |
| 67 | } | 68 | } |
| 68 | 69 | ||
| 69 | if (error_callback_handle) { | 70 | if (error_callback_handle) { |
| 70 | if (auto member = Network::GetRoomMember().lock()) { | 71 | if (auto member = room_network.GetRoomMember().lock()) { |
| 71 | member->Unbind(error_callback_handle); | 72 | member->Unbind(error_callback_handle); |
| 72 | } | 73 | } |
| 73 | } | 74 | } |
| @@ -205,14 +206,15 @@ static void BringWidgetToFront(QWidget* widget) { | |||
| 205 | 206 | ||
| 206 | void MultiplayerState::OnViewLobby() { | 207 | void MultiplayerState::OnViewLobby() { |
| 207 | if (lobby == nullptr) { | 208 | if (lobby == nullptr) { |
| 208 | lobby = new Lobby(this, game_list_model, announce_multiplayer_session); | 209 | lobby = new Lobby(this, game_list_model, announce_multiplayer_session, room_network); |
| 209 | } | 210 | } |
| 210 | BringWidgetToFront(lobby); | 211 | BringWidgetToFront(lobby); |
| 211 | } | 212 | } |
| 212 | 213 | ||
| 213 | void MultiplayerState::OnCreateRoom() { | 214 | void MultiplayerState::OnCreateRoom() { |
| 214 | if (host_room == nullptr) { | 215 | if (host_room == nullptr) { |
| 215 | host_room = new HostRoomWindow(this, game_list_model, announce_multiplayer_session); | 216 | host_room = |
| 217 | new HostRoomWindow(this, game_list_model, announce_multiplayer_session, room_network); | ||
| 216 | } | 218 | } |
| 217 | BringWidgetToFront(host_room); | 219 | BringWidgetToFront(host_room); |
| 218 | } | 220 | } |
| @@ -220,9 +222,9 @@ void MultiplayerState::OnCreateRoom() { | |||
| 220 | bool MultiplayerState::OnCloseRoom() { | 222 | bool MultiplayerState::OnCloseRoom() { |
| 221 | if (!NetworkMessage::WarnCloseRoom()) | 223 | if (!NetworkMessage::WarnCloseRoom()) |
| 222 | return false; | 224 | return false; |
| 223 | if (auto room = Network::GetRoom().lock()) { | 225 | if (auto room = room_network.GetRoom().lock()) { |
| 224 | // if you are in a room, leave it | 226 | // if you are in a room, leave it |
| 225 | if (auto member = Network::GetRoomMember().lock()) { | 227 | if (auto member = room_network.GetRoomMember().lock()) { |
| 226 | member->Leave(); | 228 | member->Leave(); |
| 227 | LOG_DEBUG(Frontend, "Left the room (as a client)"); | 229 | LOG_DEBUG(Frontend, "Left the room (as a client)"); |
| 228 | } | 230 | } |
| @@ -257,10 +259,10 @@ void MultiplayerState::HideNotification() { | |||
| 257 | } | 259 | } |
| 258 | 260 | ||
| 259 | void MultiplayerState::OnOpenNetworkRoom() { | 261 | void MultiplayerState::OnOpenNetworkRoom() { |
| 260 | if (auto member = Network::GetRoomMember().lock()) { | 262 | if (auto member = room_network.GetRoomMember().lock()) { |
| 261 | if (member->IsConnected()) { | 263 | if (member->IsConnected()) { |
| 262 | if (client_room == nullptr) { | 264 | if (client_room == nullptr) { |
| 263 | client_room = new ClientRoomWindow(this); | 265 | client_room = new ClientRoomWindow(this, room_network); |
| 264 | connect(client_room, &ClientRoomWindow::ShowNotification, this, | 266 | connect(client_room, &ClientRoomWindow::ShowNotification, this, |
| 265 | &MultiplayerState::ShowNotification); | 267 | &MultiplayerState::ShowNotification); |
| 266 | } | 268 | } |
| @@ -275,7 +277,7 @@ void MultiplayerState::OnOpenNetworkRoom() { | |||
| 275 | 277 | ||
| 276 | void MultiplayerState::OnDirectConnectToRoom() { | 278 | void MultiplayerState::OnDirectConnectToRoom() { |
| 277 | if (direct_connect == nullptr) { | 279 | if (direct_connect == nullptr) { |
| 278 | direct_connect = new DirectConnectWindow(this); | 280 | direct_connect = new DirectConnectWindow(room_network, this); |
| 279 | } | 281 | } |
| 280 | BringWidgetToFront(direct_connect); | 282 | BringWidgetToFront(direct_connect); |
| 281 | } | 283 | } |
diff --git a/src/yuzu/multiplayer/state.h b/src/yuzu/multiplayer/state.h index 414454acb..bdd5cc954 100644 --- a/src/yuzu/multiplayer/state.h +++ b/src/yuzu/multiplayer/state.h | |||
| @@ -20,7 +20,7 @@ class MultiplayerState : public QWidget { | |||
| 20 | 20 | ||
| 21 | public: | 21 | public: |
| 22 | explicit MultiplayerState(QWidget* parent, QStandardItemModel* game_list, QAction* leave_room, | 22 | explicit MultiplayerState(QWidget* parent, QStandardItemModel* game_list, QAction* leave_room, |
| 23 | QAction* show_room); | 23 | QAction* show_room, Network::RoomNetwork& room_network_); |
| 24 | ~MultiplayerState(); | 24 | ~MultiplayerState(); |
| 25 | 25 | ||
| 26 | /** | 26 | /** |
| @@ -87,6 +87,7 @@ private: | |||
| 87 | Network::RoomMember::CallbackHandle<Network::RoomMember::Error> error_callback_handle; | 87 | Network::RoomMember::CallbackHandle<Network::RoomMember::Error> error_callback_handle; |
| 88 | 88 | ||
| 89 | bool show_notification = false; | 89 | bool show_notification = false; |
| 90 | Network::RoomNetwork& room_network; | ||
| 90 | }; | 91 | }; |
| 91 | 92 | ||
| 92 | Q_DECLARE_METATYPE(WebService::WebResult); | 93 | Q_DECLARE_METATYPE(WebService::WebResult); |