summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar FearlessTobi2022-08-27 03:31:17 +0200
committerGravatar FearlessTobi2022-08-27 03:31:17 +0200
commit839e1faf491776f4e2348c46773c248644e260ba (patch)
treedab0425ff7e8f6817d0c363c59107adb39785ef2
parentnetwork: Use lower timeout for enet_host_service (diff)
downloadyuzu-839e1faf491776f4e2348c46773c248644e260ba.tar.gz
yuzu-839e1faf491776f4e2348c46773c248644e260ba.tar.xz
yuzu-839e1faf491776f4e2348c46773c248644e260ba.zip
yuzu: Display current game version in multiplayer room
Makes it easier for users to recognize connection errors caused by different game versions.
-rw-r--r--src/common/announce_multiplayer_room.h1
-rw-r--r--src/core/core.cpp9
-rw-r--r--src/network/room.cpp12
-rw-r--r--src/network/room_member.cpp4
-rw-r--r--src/network/room_member.h2
-rw-r--r--src/yuzu/multiplayer/chat_room.cpp21
6 files changed, 38 insertions, 11 deletions
diff --git a/src/common/announce_multiplayer_room.h b/src/common/announce_multiplayer_room.h
index cb004e0eb..4a3100fa4 100644
--- a/src/common/announce_multiplayer_room.h
+++ b/src/common/announce_multiplayer_room.h
@@ -16,6 +16,7 @@ namespace AnnounceMultiplayerRoom {
16struct GameInfo { 16struct GameInfo {
17 std::string name{""}; 17 std::string name{""};
18 u64 id{0}; 18 u64 id{0};
19 std::string version{""};
19}; 20};
20 21
21struct Member { 22struct Member {
diff --git a/src/core/core.cpp b/src/core/core.cpp
index ea32a4a8d..e651ce100 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -319,10 +319,19 @@ struct System::Impl {
319 if (app_loader->ReadTitle(name) != Loader::ResultStatus::Success) { 319 if (app_loader->ReadTitle(name) != Loader::ResultStatus::Success) {
320 LOG_ERROR(Core, "Failed to read title for ROM (Error {})", load_result); 320 LOG_ERROR(Core, "Failed to read title for ROM (Error {})", load_result);
321 } 321 }
322
323 std::string title_version;
324 const FileSys::PatchManager pm(program_id, system.GetFileSystemController(),
325 system.GetContentProvider());
326 const auto metadata = pm.GetControlMetadata();
327 if (metadata.first != nullptr) {
328 title_version = metadata.first->GetVersionString();
329 }
322 if (auto room_member = room_network.GetRoomMember().lock()) { 330 if (auto room_member = room_network.GetRoomMember().lock()) {
323 Network::GameInfo game_info; 331 Network::GameInfo game_info;
324 game_info.name = name; 332 game_info.name = name;
325 game_info.id = program_id; 333 game_info.id = program_id;
334 game_info.version = title_version;
326 room_member->SendGameInfo(game_info); 335 room_member->SendGameInfo(game_info);
327 } 336 }
328 337
diff --git a/src/network/room.cpp b/src/network/room.cpp
index 34298f010..8c63b255b 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -221,7 +221,7 @@ public:
221 * Extracts the game name from a received ENet packet and broadcasts it. 221 * Extracts the game name from a received ENet packet and broadcasts it.
222 * @param event The ENet event that was received. 222 * @param event The ENet event that was received.
223 */ 223 */
224 void HandleGameNamePacket(const ENetEvent* event); 224 void HandleGameInfoPacket(const ENetEvent* event);
225 225
226 /** 226 /**
227 * Removes the client from the members list if it was in it and announces the change 227 * Removes the client from the members list if it was in it and announces the change
@@ -242,7 +242,7 @@ void Room::RoomImpl::ServerLoop() {
242 HandleJoinRequest(&event); 242 HandleJoinRequest(&event);
243 break; 243 break;
244 case IdSetGameInfo: 244 case IdSetGameInfo:
245 HandleGameNamePacket(&event); 245 HandleGameInfoPacket(&event);
246 break; 246 break;
247 case IdProxyPacket: 247 case IdProxyPacket:
248 HandleProxyPacket(&event); 248 HandleProxyPacket(&event);
@@ -778,6 +778,7 @@ void Room::RoomImpl::BroadcastRoomInformation() {
778 packet.Write(member.fake_ip); 778 packet.Write(member.fake_ip);
779 packet.Write(member.game_info.name); 779 packet.Write(member.game_info.name);
780 packet.Write(member.game_info.id); 780 packet.Write(member.game_info.id);
781 packet.Write(member.game_info.version);
781 packet.Write(member.user_data.username); 782 packet.Write(member.user_data.username);
782 packet.Write(member.user_data.display_name); 783 packet.Write(member.user_data.display_name);
783 packet.Write(member.user_data.avatar_url); 784 packet.Write(member.user_data.avatar_url);
@@ -817,6 +818,7 @@ void Room::RoomImpl::HandleProxyPacket(const ENetEvent* event) {
817 in_packet.IgnoreBytes(sizeof(u16)); // Port 818 in_packet.IgnoreBytes(sizeof(u16)); // Port
818 819
819 in_packet.IgnoreBytes(sizeof(u8)); // Protocol 820 in_packet.IgnoreBytes(sizeof(u8)); // Protocol
821
820 bool broadcast; 822 bool broadcast;
821 in_packet.Read(broadcast); // Broadcast 823 in_packet.Read(broadcast); // Broadcast
822 824
@@ -909,7 +911,7 @@ void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) {
909 } 911 }
910} 912}
911 913
912void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) { 914void Room::RoomImpl::HandleGameInfoPacket(const ENetEvent* event) {
913 Packet in_packet; 915 Packet in_packet;
914 in_packet.Append(event->packet->data, event->packet->dataLength); 916 in_packet.Append(event->packet->data, event->packet->dataLength);
915 917
@@ -917,6 +919,7 @@ void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) {
917 GameInfo game_info; 919 GameInfo game_info;
918 in_packet.Read(game_info.name); 920 in_packet.Read(game_info.name);
919 in_packet.Read(game_info.id); 921 in_packet.Read(game_info.id);
922 in_packet.Read(game_info.version);
920 923
921 { 924 {
922 std::lock_guard lock(member_mutex); 925 std::lock_guard lock(member_mutex);
@@ -935,7 +938,8 @@ void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) {
935 if (game_info.name.empty()) { 938 if (game_info.name.empty()) {
936 LOG_INFO(Network, "{} is not playing", display_name); 939 LOG_INFO(Network, "{} is not playing", display_name);
937 } else { 940 } else {
938 LOG_INFO(Network, "{} is playing {}", display_name, game_info.name); 941 LOG_INFO(Network, "{} is playing {} ({})", display_name, game_info.name,
942 game_info.version);
939 } 943 }
940 } 944 }
941 } 945 }
diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp
index 367bf377f..06818af78 100644
--- a/src/network/room_member.cpp
+++ b/src/network/room_member.cpp
@@ -103,7 +103,7 @@ public:
103 103
104 /** 104 /**
105 * Extracts a ProxyPacket from a received ENet packet. 105 * Extracts a ProxyPacket from a received ENet packet.
106 * @param event The ENet event that was received. 106 * @param event The ENet event that was received.
107 */ 107 */
108 void HandleProxyPackets(const ENetEvent* event); 108 void HandleProxyPackets(const ENetEvent* event);
109 109
@@ -315,6 +315,7 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev
315 packet.Read(member.fake_ip); 315 packet.Read(member.fake_ip);
316 packet.Read(member.game_info.name); 316 packet.Read(member.game_info.name);
317 packet.Read(member.game_info.id); 317 packet.Read(member.game_info.id);
318 packet.Read(member.game_info.version);
318 packet.Read(member.username); 319 packet.Read(member.username);
319 packet.Read(member.display_name); 320 packet.Read(member.display_name);
320 packet.Read(member.avatar_url); 321 packet.Read(member.avatar_url);
@@ -622,6 +623,7 @@ void RoomMember::SendGameInfo(const GameInfo& game_info) {
622 packet.Write(static_cast<u8>(IdSetGameInfo)); 623 packet.Write(static_cast<u8>(IdSetGameInfo));
623 packet.Write(game_info.name); 624 packet.Write(game_info.name);
624 packet.Write(game_info.id); 625 packet.Write(game_info.id);
626 packet.Write(game_info.version);
625 room_member_impl->Send(std::move(packet)); 627 room_member_impl->Send(std::move(packet));
626} 628}
627 629
diff --git a/src/network/room_member.h b/src/network/room_member.h
index 4252b7146..f578f7f6a 100644
--- a/src/network/room_member.h
+++ b/src/network/room_member.h
@@ -146,7 +146,7 @@ public:
146 const std::string& password = "", const std::string& token = ""); 146 const std::string& password = "", const std::string& token = "");
147 147
148 /** 148 /**
149 * Sends a WiFi packet to the room. 149 * Sends a Proxy packet to the room.
150 * @param packet The WiFi packet to send. 150 * @param packet The WiFi packet to send.
151 */ 151 */
152 void SendProxyPacket(const ProxyPacket& packet); 152 void SendProxyPacket(const ProxyPacket& packet);
diff --git a/src/yuzu/multiplayer/chat_room.cpp b/src/yuzu/multiplayer/chat_room.cpp
index 51ece1f21..21582b3d6 100644
--- a/src/yuzu/multiplayer/chat_room.cpp
+++ b/src/yuzu/multiplayer/chat_room.cpp
@@ -122,19 +122,22 @@ public:
122 static const int UsernameRole = Qt::UserRole + 2; 122 static const int UsernameRole = Qt::UserRole + 2;
123 static const int AvatarUrlRole = Qt::UserRole + 3; 123 static const int AvatarUrlRole = Qt::UserRole + 3;
124 static const int GameNameRole = Qt::UserRole + 4; 124 static const int GameNameRole = Qt::UserRole + 4;
125 static const int GameVersionRole = Qt::UserRole + 5;
125 126
126 PlayerListItem() = default; 127 PlayerListItem() = default;
127 explicit PlayerListItem(const std::string& nickname, const std::string& username, 128 explicit PlayerListItem(const std::string& nickname, const std::string& username,
128 const std::string& avatar_url, const std::string& game_name) { 129 const std::string& avatar_url,
130 const AnnounceMultiplayerRoom::GameInfo& game_info) {
129 setEditable(false); 131 setEditable(false);
130 setData(QString::fromStdString(nickname), NicknameRole); 132 setData(QString::fromStdString(nickname), NicknameRole);
131 setData(QString::fromStdString(username), UsernameRole); 133 setData(QString::fromStdString(username), UsernameRole);
132 setData(QString::fromStdString(avatar_url), AvatarUrlRole); 134 setData(QString::fromStdString(avatar_url), AvatarUrlRole);
133 if (game_name.empty()) { 135 if (game_info.name.empty()) {
134 setData(QObject::tr("Not playing a game"), GameNameRole); 136 setData(QObject::tr("Not playing a game"), GameNameRole);
135 } else { 137 } else {
136 setData(QString::fromStdString(game_name), GameNameRole); 138 setData(QString::fromStdString(game_info.name), GameNameRole);
137 } 139 }
140 setData(QString::fromStdString(game_info.version), GameVersionRole);
138 } 141 }
139 142
140 QVariant data(int role) const override { 143 QVariant data(int role) const override {
@@ -149,7 +152,15 @@ public:
149 } else { 152 } else {
150 name = QStringLiteral("%1 (%2)").arg(nickname, username); 153 name = QStringLiteral("%1 (%2)").arg(nickname, username);
151 } 154 }
152 return QStringLiteral("%1\n %2").arg(name, data(GameNameRole).toString()); 155 const QString version = data(GameVersionRole).toString();
156 QString version_string;
157 if (version.isEmpty()) {
158 version_string = QString{};
159 } else {
160 version_string = QStringLiteral("(%1)").arg(version);
161 }
162 return QStringLiteral("%1\n %2 %3")
163 .arg(name, data(GameNameRole).toString(), version_string);
153 } 164 }
154}; 165};
155 166
@@ -366,7 +377,7 @@ void ChatRoom::SetPlayerList(const Network::RoomMember::MemberList& member_list)
366 if (member.nickname.empty()) 377 if (member.nickname.empty())
367 continue; 378 continue;
368 QStandardItem* name_item = new PlayerListItem(member.nickname, member.username, 379 QStandardItem* name_item = new PlayerListItem(member.nickname, member.username,
369 member.avatar_url, member.game_info.name); 380 member.avatar_url, member.game_info);
370 381
371#ifdef ENABLE_WEB_SERVICE 382#ifdef ENABLE_WEB_SERVICE
372 if (!icon_cache.count(member.avatar_url) && !member.avatar_url.empty()) { 383 if (!icon_cache.count(member.avatar_url) && !member.avatar_url.empty()) {