From 2e118e2aadaf0f7407a703f04ccc5be880574ee0 Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Fri, 3 Jan 2025 04:31:09 +0100 Subject: [PATCH 1/4] network(fix): Add null check for verify_backend `HandleJoinRequest` --- src/network/room.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/room.cpp b/src/network/room.cpp index 4623b31d4..ca3bb634a 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -371,7 +371,9 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { std::lock_guard lock(verify_UID_mutex); uid = verify_UID; } - member.user_data = verify_backend->LoadUserData(uid, token); + + if (verify_backend != nullptr) + member.user_data = verify_backend->LoadUserData(uid, token); std::string ip; { From c14206640b6f90213708478553b276c43ce1a0d9 Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Fri, 3 Jan 2025 04:49:08 +0100 Subject: [PATCH 2/4] network: Grant private room hosts moderator privileges --- src/citra_qt/multiplayer/host_room.cpp | 4 ++-- src/network/room.cpp | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/citra_qt/multiplayer/host_room.cpp b/src/citra_qt/multiplayer/host_room.cpp index 339e7155a..2f27ee099 100644 --- a/src/citra_qt/multiplayer/host_room.cpp +++ b/src/citra_qt/multiplayer/host_room.cpp @@ -144,8 +144,8 @@ void HostRoomWindow::Host() { bool created = room->Create(ui->room_name->text().toStdString(), ui->room_description->toPlainText().toStdString(), "", static_cast(port), password, ui->max_player->value(), - NetSettings::values.citra_username, game_name.toStdString(), - game_id, CreateVerifyBackend(is_public), ban_list); + ui->username->text().toStdString(),, game_name.toStdString(), + game_id, CreateVerifyBackend(is_public), ban_list, true); if (!created) { NetworkMessage::ErrorManager::ShowError( NetworkMessage::ErrorManager::COULD_NOT_CREATE_ROOM); diff --git a/src/network/room.cpp b/src/network/room.cpp index ca3bb634a..9ca3f54ed 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -375,6 +375,13 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { if (verify_backend != nullptr) member.user_data = verify_backend->LoadUserData(uid, token); + + if (nickname == room_information.host_username) { + member.user_data.moderator = true; + LOG_INFO(Network, "User {} is a moderator", std::string(room_information.host_username)); + } + + std::string ip; { std::lock_guard lock(ban_list_mutex); From d63c7948ba23b78e25f53d40afd3d57f1090244a Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Fri, 3 Jan 2025 05:16:18 +0100 Subject: [PATCH 3/4] qt: Update moderation UI visibility in chat room --- src/citra_qt/multiplayer/chat_room.cpp | 5 ++++- src/citra_qt/multiplayer/client_room.cpp | 6 +----- src/citra_qt/multiplayer/client_room.ui | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/citra_qt/multiplayer/chat_room.cpp b/src/citra_qt/multiplayer/chat_room.cpp index 5fae89045..7329bf86b 100644 --- a/src/citra_qt/multiplayer/chat_room.cpp +++ b/src/citra_qt/multiplayer/chat_room.cpp @@ -459,12 +459,15 @@ void ChatRoom::PopupContextMenu(const QPoint& menu_location) { }); } - if (has_mod_perms && nickname != cur_nickname) { // You can't kick or ban yourself + if (nickname != cur_nickname) { // You can't kick or ban yourself context_menu.addSeparator(); QAction* kick_action = context_menu.addAction(tr("Kick")); QAction* ban_action = context_menu.addAction(tr("Ban")); + kick_action->setEnabled(has_mod_perms); + ban_action->setEnabled(has_mod_perms); + connect(kick_action, &QAction::triggered, [this, nickname] { QMessageBox::StandardButton result = QMessageBox::question(this, tr("Kick Player"), diff --git a/src/citra_qt/multiplayer/client_room.cpp b/src/citra_qt/multiplayer/client_room.cpp index 312090cbe..1806b0511 100644 --- a/src/citra_qt/multiplayer/client_room.cpp +++ b/src/citra_qt/multiplayer/client_room.cpp @@ -47,8 +47,6 @@ ClientRoomWindow::ClientRoomWindow(QWidget* parent) ModerationDialog dialog(this); dialog.exec(); }); - ui->moderation->setDefault(false); - ui->moderation->setAutoDefault(false); connect(ui->chat, &ChatRoom::UserPinged, this, &ClientRoomWindow::ShowNotification); UpdateView(); } @@ -57,9 +55,7 @@ ClientRoomWindow::~ClientRoomWindow() = default; void ClientRoomWindow::SetModPerms(bool is_mod) { ui->chat->SetModPerms(is_mod); - ui->moderation->setVisible(is_mod); - ui->moderation->setDefault(false); - ui->moderation->setAutoDefault(false); + ui->moderation->setEnabled(is_mod); } void ClientRoomWindow::RetranslateUi() { diff --git a/src/citra_qt/multiplayer/client_room.ui b/src/citra_qt/multiplayer/client_room.ui index 97e88b502..76118d6e4 100644 --- a/src/citra_qt/multiplayer/client_room.ui +++ b/src/citra_qt/multiplayer/client_room.ui @@ -47,7 +47,7 @@ Moderation... - false + true From 0bcdc7b4220df640e1eb937ac7a9fab1f8e03b29 Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Fri, 7 Mar 2025 19:40:27 +0100 Subject: [PATCH 4/4] network: Remove optional room flag moderation flag Simplifies room moderation by removing the optional Lime3DS room moderator flag Moderator status is now determined solely by the user's moderator flag --- src/citra_qt/multiplayer/host_room.cpp | 4 ++-- src/citra_room/citra_room.cpp | 11 +---------- src/network/room.cpp | 8 ++------ src/network/room.h | 3 +-- 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/citra_qt/multiplayer/host_room.cpp b/src/citra_qt/multiplayer/host_room.cpp index 2f27ee099..5f29eed2d 100644 --- a/src/citra_qt/multiplayer/host_room.cpp +++ b/src/citra_qt/multiplayer/host_room.cpp @@ -144,8 +144,8 @@ void HostRoomWindow::Host() { bool created = room->Create(ui->room_name->text().toStdString(), ui->room_description->toPlainText().toStdString(), "", static_cast(port), password, ui->max_player->value(), - ui->username->text().toStdString(),, game_name.toStdString(), - game_id, CreateVerifyBackend(is_public), ban_list, true); + ui->username->text().toStdString(), game_name.toStdString(), + game_id, CreateVerifyBackend(is_public), ban_list); if (!created) { NetworkMessage::ErrorManager::ShowError( NetworkMessage::ErrorManager::COULD_NOT_CREATE_ROOM); diff --git a/src/citra_room/citra_room.cpp b/src/citra_room/citra_room.cpp index defd4d956..40866c008 100644 --- a/src/citra_room/citra_room.cpp +++ b/src/citra_room/citra_room.cpp @@ -178,7 +178,6 @@ int main(int argc, char** argv) { u64 preferred_game_id = 0; u16 port = Network::DefaultRoomPort; u32 max_members = 16; - bool enable_citra_mods = false; static struct option long_options[] = { {"room-name", required_argument, 0, 'n'}, @@ -243,9 +242,6 @@ int main(int argc, char** argv) { case 'l': log_file.assign(optarg); break; - case 'e': - enable_citra_mods = true; - break; case 'h': PrintHelp(argv[0]); return 0; @@ -317,10 +313,6 @@ int main(int argc, char** argv) { NetSettings::values.citra_token = token; } } - if (!announce && enable_citra_mods) { - enable_citra_mods = false; - std::cout << "Can not enable Citra Moderators for private rooms\n\n"; - } InitializeLogging(log_file); @@ -347,8 +339,7 @@ int main(int argc, char** argv) { Network::Init(); if (std::shared_ptr room = Network::GetRoom().lock()) { if (!room->Create(room_name, room_description, "", port, password, max_members, username, - preferred_game, preferred_game_id, std::move(verify_backend), ban_list, - enable_citra_mods)) { + preferred_game, preferred_game_id, std::move(verify_backend), ban_list)) { std::cout << "Failed to create room: \n\n"; return -1; } diff --git a/src/network/room.cpp b/src/network/room.cpp index 9ca3f54ed..2830bd287 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -375,13 +375,11 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { if (verify_backend != nullptr) member.user_data = verify_backend->LoadUserData(uid, token); - if (nickname == room_information.host_username) { member.user_data.moderator = true; LOG_INFO(Network, "User {} is a moderator", std::string(room_information.host_username)); } - std::string ip; { std::lock_guard lock(ban_list_mutex); @@ -607,8 +605,7 @@ bool Room::RoomImpl::HasModPermission(const ENetPeer* client) const { if (sending_member == members.end()) { return false; } - if (room_information.enable_citra_mods && - sending_member->user_data.moderator) { // Community moderator + if (sending_member->user_data.moderator) { // Community moderator return true; } @@ -1022,7 +1019,7 @@ bool Room::Create(const std::string& name, const std::string& description, const u32 max_connections, const std::string& host_username, const std::string& preferred_game, u64 preferred_game_id, std::unique_ptr verify_backend, - const Room::BanList& ban_list, bool enable_citra_mods) { + const Room::BanList& ban_list) { ENetAddress address; address.host = ENET_HOST_ANY; if (!server_address.empty()) { @@ -1045,7 +1042,6 @@ bool Room::Create(const std::string& name, const std::string& description, room_impl->room_information.preferred_game = preferred_game; room_impl->room_information.preferred_game_id = preferred_game_id; room_impl->room_information.host_username = host_username; - room_impl->room_information.enable_citra_mods = enable_citra_mods; room_impl->password = password; room_impl->verify_backend = std::move(verify_backend); room_impl->username_ban_list = ban_list.first; diff --git a/src/network/room.h b/src/network/room.h index a67984837..5781631d7 100644 --- a/src/network/room.h +++ b/src/network/room.h @@ -32,7 +32,6 @@ struct RoomInformation { std::string preferred_game; ///< Game to advertise that you want to play u64 preferred_game_id; ///< Title ID for the advertised game std::string host_username; ///< Forum username of the host - bool enable_citra_mods; ///< Allow Citra Moderators to moderate on this room }; struct GameInfo { @@ -148,7 +147,7 @@ public: const std::string& host_username = "", const std::string& preferred_game = "", u64 preferred_game_id = 0, std::unique_ptr verify_backend = nullptr, - const BanList& ban_list = {}, bool enable_citra_mods = false); + const BanList& ban_list = {}); /** * Sets the verification GUID of the room.