network, citra_qt: Give moderation permission to community mods
Based on the `roles` payload in the JWT, the rooms will now give mod permission to Citra Community Moderators. To notify the client of its permissions, a new response, IdJoinSuccessAsMod is added, and there's now a new RoomMember::State called Moderator.
This commit is contained in:
@@ -306,7 +306,9 @@ void ChatRoom::OnStatusMessageReceive(const Network::StatusMessageEntry& status_
|
||||
|
||||
void ChatRoom::OnSendChat() {
|
||||
if (auto room = Network::GetRoomMember().lock()) {
|
||||
if (room->GetState() != Network::RoomMember::State::Joined) {
|
||||
if (room->GetState() != Network::RoomMember::State::Joined &&
|
||||
room->GetState() != Network::RoomMember::State::Moderator) {
|
||||
|
||||
return;
|
||||
}
|
||||
auto message = ui->chat_message->text().toStdString();
|
||||
|
@@ -72,9 +72,12 @@ void ClientRoomWindow::OnRoomUpdate(const Network::RoomInformation& info) {
|
||||
}
|
||||
|
||||
void ClientRoomWindow::OnStateChange(const Network::RoomMember::State& state) {
|
||||
if (state == Network::RoomMember::State::Joined) {
|
||||
if (state == Network::RoomMember::State::Joined ||
|
||||
state == Network::RoomMember::State::Moderator) {
|
||||
|
||||
ui->chat->Clear();
|
||||
ui->chat->AppendStatusMessage(tr("Connected"));
|
||||
SetModPerms(state == Network::RoomMember::State::Moderator);
|
||||
}
|
||||
UpdateView();
|
||||
}
|
||||
|
@@ -18,7 +18,6 @@ public:
|
||||
~ClientRoomWindow();
|
||||
|
||||
void RetranslateUi();
|
||||
void SetModPerms(bool is_mod);
|
||||
|
||||
public slots:
|
||||
void OnRoomUpdate(const Network::RoomInformation&);
|
||||
@@ -32,6 +31,7 @@ signals:
|
||||
private:
|
||||
void Disconnect();
|
||||
void UpdateView();
|
||||
void SetModPerms(bool is_mod);
|
||||
|
||||
QStandardItemModel* player_list;
|
||||
std::unique_ptr<Ui::ClientRoom> ui;
|
||||
|
@@ -63,7 +63,7 @@ void DirectConnectWindow::Connect() {
|
||||
// Prevent the user from trying to join a room while they are already joining.
|
||||
if (member->GetState() == Network::RoomMember::State::Joining) {
|
||||
return;
|
||||
} else if (member->GetState() == Network::RoomMember::State::Joined) {
|
||||
} else if (member->IsConnected()) {
|
||||
// And ask if they want to leave the room if they are already in one.
|
||||
if (!NetworkMessage::WarnDisconnect()) {
|
||||
return;
|
||||
@@ -122,7 +122,9 @@ void DirectConnectWindow::OnConnection() {
|
||||
EndConnecting();
|
||||
|
||||
if (auto room_member = Network::GetRoomMember().lock()) {
|
||||
if (room_member->GetState() == Network::RoomMember::State::Joined) {
|
||||
if (room_member->GetState() == Network::RoomMember::State::Joined ||
|
||||
room_member->GetState() == Network::RoomMember::State::Moderator) {
|
||||
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
@@ -113,7 +113,7 @@ void HostRoomWindow::Host() {
|
||||
if (auto member = Network::GetRoomMember().lock()) {
|
||||
if (member->GetState() == Network::RoomMember::State::Joining) {
|
||||
return;
|
||||
} else if (member->GetState() == Network::RoomMember::State::Joined) {
|
||||
} else if (member->IsConnected()) {
|
||||
auto parent = static_cast<MultiplayerState*>(parentWidget());
|
||||
if (!parent->OnCloseRoom()) {
|
||||
close();
|
||||
|
@@ -109,7 +109,7 @@ void Lobby::OnJoinRoom(const QModelIndex& source) {
|
||||
// Prevent the user from trying to join a room while they are already joining.
|
||||
if (member->GetState() == Network::RoomMember::State::Joining) {
|
||||
return;
|
||||
} else if (member->GetState() == Network::RoomMember::State::Joined) {
|
||||
} else if (member->IsConnected()) {
|
||||
// And ask if they want to leave the room if they are already in one.
|
||||
if (!NetworkMessage::WarnDisconnect()) {
|
||||
return;
|
||||
|
@@ -89,7 +89,9 @@ void MultiplayerState::retranslateUi() {
|
||||
|
||||
if (current_state == Network::RoomMember::State::Uninitialized) {
|
||||
status_text->setText(tr("Not Connected. Click here to find a room!"));
|
||||
} else if (current_state == Network::RoomMember::State::Joined) {
|
||||
} else if (current_state == Network::RoomMember::State::Joined ||
|
||||
current_state == Network::RoomMember::State::Moderator) {
|
||||
|
||||
status_text->setText(tr("Connected"));
|
||||
} else {
|
||||
status_text->setText(tr("Not Connected"));
|
||||
@@ -107,7 +109,9 @@ void MultiplayerState::retranslateUi() {
|
||||
|
||||
void MultiplayerState::OnNetworkStateChanged(const Network::RoomMember::State& state) {
|
||||
LOG_DEBUG(Frontend, "Network State: {}", Network::GetStateStr(state));
|
||||
if (state == Network::RoomMember::State::Joined) {
|
||||
if (state == Network::RoomMember::State::Joined ||
|
||||
state == Network::RoomMember::State::Moderator) {
|
||||
|
||||
OnOpenNetworkRoom();
|
||||
status_icon->setPixmap(QIcon::fromTheme("connected").pixmap(16));
|
||||
status_text->setText(tr("Connected"));
|
||||
@@ -183,7 +187,9 @@ void MultiplayerState::OnAnnounceFailed(const Common::WebResult& result) {
|
||||
void MultiplayerState::UpdateThemedIcons() {
|
||||
if (show_notification) {
|
||||
status_icon->setPixmap(QIcon::fromTheme("connected_notification").pixmap(16));
|
||||
} else if (current_state == Network::RoomMember::State::Joined) {
|
||||
} else if (current_state == Network::RoomMember::State::Joined ||
|
||||
current_state == Network::RoomMember::State::Moderator) {
|
||||
|
||||
status_icon->setPixmap(QIcon::fromTheme("connected").pixmap(16));
|
||||
} else {
|
||||
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
|
||||
@@ -258,12 +264,6 @@ void MultiplayerState::OnOpenNetworkRoom() {
|
||||
connect(client_room, &ClientRoomWindow::ShowNotification, this,
|
||||
&MultiplayerState::ShowNotification);
|
||||
}
|
||||
const std::string host_username = member->GetRoomInformation().host_username;
|
||||
if (host_username.empty()) {
|
||||
client_room->SetModPerms(false);
|
||||
} else {
|
||||
client_room->SetModPerms(member->GetUsername() == host_username);
|
||||
}
|
||||
BringWidgetToFront(client_room);
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user