moderation_dialog.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <QStandardItem>
  4. #include <QStandardItemModel>
  5. #include "network/network.h"
  6. #include "network/room_member.h"
  7. #include "ui_moderation_dialog.h"
  8. #include "yuzu/multiplayer/moderation_dialog.h"
  9. namespace Column {
  10. enum {
  11. SUBJECT,
  12. TYPE,
  13. COUNT,
  14. };
  15. }
  16. ModerationDialog::ModerationDialog(Network::RoomNetwork& room_network_, QWidget* parent)
  17. : QDialog(parent), ui(std::make_unique<Ui::ModerationDialog>()), room_network{room_network_} {
  18. ui->setupUi(this);
  19. qRegisterMetaType<Network::Room::BanList>();
  20. if (auto member = room_network.GetRoomMember().lock()) {
  21. callback_handle_status_message = member->BindOnStatusMessageReceived(
  22. [this](const Network::StatusMessageEntry& status_message) {
  23. emit StatusMessageReceived(status_message);
  24. });
  25. connect(this, &ModerationDialog::StatusMessageReceived, this,
  26. &ModerationDialog::OnStatusMessageReceived);
  27. callback_handle_ban_list = member->BindOnBanListReceived(
  28. [this](const Network::Room::BanList& ban_list) { emit BanListReceived(ban_list); });
  29. connect(this, &ModerationDialog::BanListReceived, this, &ModerationDialog::PopulateBanList);
  30. }
  31. // Initialize the UI
  32. model = new QStandardItemModel(ui->ban_list_view);
  33. model->insertColumns(0, Column::COUNT);
  34. model->setHeaderData(Column::SUBJECT, Qt::Horizontal, tr("Subject"));
  35. model->setHeaderData(Column::TYPE, Qt::Horizontal, tr("Type"));
  36. ui->ban_list_view->setModel(model);
  37. // Load the ban list in background
  38. LoadBanList();
  39. connect(ui->refresh, &QPushButton::clicked, this, [this] { LoadBanList(); });
  40. connect(ui->unban, &QPushButton::clicked, this, [this] {
  41. auto index = ui->ban_list_view->currentIndex();
  42. SendUnbanRequest(model->item(index.row(), 0)->text());
  43. });
  44. connect(ui->ban_list_view, &QTreeView::clicked, [this] { ui->unban->setEnabled(true); });
  45. }
  46. ModerationDialog::~ModerationDialog() {
  47. if (callback_handle_status_message) {
  48. if (auto room = room_network.GetRoomMember().lock()) {
  49. room->Unbind(callback_handle_status_message);
  50. }
  51. }
  52. if (callback_handle_ban_list) {
  53. if (auto room = room_network.GetRoomMember().lock()) {
  54. room->Unbind(callback_handle_ban_list);
  55. }
  56. }
  57. }
  58. void ModerationDialog::LoadBanList() {
  59. if (auto room = room_network.GetRoomMember().lock()) {
  60. ui->refresh->setEnabled(false);
  61. ui->refresh->setText(tr("Refreshing"));
  62. ui->unban->setEnabled(false);
  63. room->RequestBanList();
  64. }
  65. }
  66. void ModerationDialog::PopulateBanList(const Network::Room::BanList& ban_list) {
  67. model->removeRows(0, model->rowCount());
  68. for (const auto& username : ban_list.first) {
  69. QStandardItem* subject_item = new QStandardItem(QString::fromStdString(username));
  70. QStandardItem* type_item = new QStandardItem(tr("Forum Username"));
  71. model->invisibleRootItem()->appendRow({subject_item, type_item});
  72. }
  73. for (const auto& ip : ban_list.second) {
  74. QStandardItem* subject_item = new QStandardItem(QString::fromStdString(ip));
  75. QStandardItem* type_item = new QStandardItem(tr("IP Address"));
  76. model->invisibleRootItem()->appendRow({subject_item, type_item});
  77. }
  78. for (int i = 0; i < Column::COUNT - 1; ++i) {
  79. ui->ban_list_view->resizeColumnToContents(i);
  80. }
  81. ui->refresh->setEnabled(true);
  82. ui->refresh->setText(tr("Refresh"));
  83. ui->unban->setEnabled(false);
  84. }
  85. void ModerationDialog::SendUnbanRequest(const QString& subject) {
  86. if (auto room = room_network.GetRoomMember().lock()) {
  87. room->SendModerationRequest(Network::IdModUnban, subject.toStdString());
  88. }
  89. }
  90. void ModerationDialog::OnStatusMessageReceived(const Network::StatusMessageEntry& status_message) {
  91. if (status_message.type != Network::IdMemberBanned &&
  92. status_message.type != Network::IdAddressUnbanned)
  93. return;
  94. // Update the ban list for ban/unban
  95. LoadBanList();
  96. }