File indexing completed on 2024-12-01 04:37:03
0001 /* 0002 SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "usersinroommenu.h" 0008 #include "dialogs/directchannelinfodialog.h" 0009 #include "rocketchataccount.h" 0010 #include "roomutil.h" 0011 #include "ruqola.h" 0012 #include <KLocalizedString> 0013 #include <KMessageBox> 0014 #include <QAction> 0015 #include <QMenu> 0016 0017 UsersInRoomMenu::UsersInRoomMenu(QObject *parent) 0018 : QObject(parent) 0019 { 0020 } 0021 0022 UsersInRoomMenu::~UsersInRoomMenu() = default; 0023 0024 void UsersInRoomMenu::slotOpenConversation() 0025 { 0026 Q_EMIT Ruqola::self()->rocketChatAccount()->openLinkRequested(RoomUtil::generateUserLink(mUserName)); 0027 } 0028 0029 void UsersInRoomMenu::slotBlockUser() 0030 { 0031 const bool userIsBlocked = mRoom->blocker(); 0032 if (!userIsBlocked) { 0033 if (KMessageBox::ButtonCode::SecondaryAction 0034 == KMessageBox::questionTwoActions(mParentWidget, 0035 i18n("Do you want to block this user?"), 0036 i18nc("@title", "Block User"), 0037 KGuiItem(i18nc("@action:button", "Block User"), QStringLiteral("dialog-ok")), 0038 KStandardGuiItem::cancel())) { 0039 return; 0040 } 0041 } 0042 Ruqola::self()->rocketChatAccount()->blockUser(mRoom->roomId(), !userIsBlocked); 0043 } 0044 0045 void UsersInRoomMenu::slotIgnoreUser() 0046 { 0047 const bool userIsIgnored = mRoom->userIsIgnored(mUserId); 0048 if (!userIsIgnored) { 0049 if (KMessageBox::ButtonCode::SecondaryAction 0050 == KMessageBox::questionTwoActions(mParentWidget, 0051 i18n("Do you want to ignore this user?"), 0052 i18nc("@title", "Ignore User"), 0053 KGuiItem(i18nc("@action:button", "Ignore User"), QStringLiteral("dialog-ok")), 0054 KStandardGuiItem::cancel())) { 0055 return; 0056 } 0057 } 0058 Ruqola::self()->rocketChatAccount()->ignoreUser(mRoom->roomId(), mUserId, !userIsIgnored); 0059 } 0060 0061 void UsersInRoomMenu::slotRemoveFromRoom() 0062 { 0063 Ruqola::self()->rocketChatAccount()->kickUser(mRoom->roomId(), mUserId, mRoom->channelType()); 0064 } 0065 0066 void UsersInRoomMenu::slotCustomContextMenuRequested(const QPoint &pos) 0067 { 0068 const bool canManageUsersInRoom = mRoom->canChangeRoles(); 0069 const bool isAdministrator = Ruqola::self()->rocketChatAccount()->ownUser().isAdministrator(); 0070 auto account = Ruqola::self()->rocketChatAccount(); 0071 const QString ownUserId = account->userId(); 0072 const bool isAdirectChannel = mRoom->channelType() == Room::RoomType::Direct; 0073 const bool isNotMe = mUserId != ownUserId; 0074 QMenu menu(mParentWidget); 0075 0076 if (account->hasPermission(QStringLiteral("create-d"))) { 0077 if (isNotMe && !isAdirectChannel) { 0078 auto conversationAction = new QAction(i18n("Start Conversation"), &menu); 0079 connect(conversationAction, &QAction::triggered, this, &UsersInRoomMenu::slotOpenConversation); 0080 menu.addAction(conversationAction); 0081 } 0082 } 0083 if (!menu.isEmpty()) { 0084 menu.addSeparator(); 0085 } 0086 auto userInfoAction = new QAction(QIcon::fromTheme(QStringLiteral("documentinfo")), i18n("User Info"), &menu); 0087 connect(userInfoAction, &QAction::triggered, this, &UsersInRoomMenu::slotUserInfo); 0088 menu.addAction(userInfoAction); 0089 if ((isAdministrator || canManageUsersInRoom) && !isAdirectChannel) { 0090 if (!menu.isEmpty()) { 0091 menu.addSeparator(); 0092 } 0093 if (isAdministrator || mRoom->hasPermission(QStringLiteral("set-owner"))) { 0094 const bool hasOwnerRole = mRoom->userHasOwnerRole(mUserId); 0095 auto removeAsOwner = new QAction(hasOwnerRole ? i18n("Remove as Owner") : i18n("Add as Owner"), &menu); 0096 connect(removeAsOwner, &QAction::triggered, this, [this, hasOwnerRole, account]() { 0097 account->changeRoles(mRoom->roomId(), 0098 mUserId, 0099 mRoom->channelType(), 0100 hasOwnerRole ? RocketChatAccount::RemoveOwner : RocketChatAccount::AddOwner); 0101 }); 0102 0103 menu.addAction(removeAsOwner); 0104 } 0105 0106 if (isAdministrator || mRoom->hasPermission(QStringLiteral("set-leader"))) { 0107 const bool hasLeaderRole = mRoom->userHasLeaderRole(mUserId); 0108 auto removeAsLeader = new QAction(hasLeaderRole ? i18n("Remove as Leader") : i18n("Add as Leader"), &menu); 0109 connect(removeAsLeader, &QAction::triggered, this, [this, hasLeaderRole, account]() { 0110 account->changeRoles(mRoom->roomId(), 0111 mUserId, 0112 mRoom->channelType(), 0113 hasLeaderRole ? RocketChatAccount::RemoveLeader : RocketChatAccount::AddLeader); 0114 }); 0115 menu.addAction(removeAsLeader); 0116 } 0117 0118 if (isAdministrator || mRoom->hasPermission(QStringLiteral("set-moderator"))) { 0119 const bool hasModeratorRole = mRoom->userHasModeratorRole(mUserId); 0120 auto removeAsModerator = new QAction(hasModeratorRole ? i18n("Remove as Moderator") : i18n("Add as Moderator"), &menu); 0121 connect(removeAsModerator, &QAction::triggered, this, [this, hasModeratorRole, account]() { 0122 account->changeRoles(mRoom->roomId(), 0123 mUserId, 0124 mRoom->channelType(), 0125 hasModeratorRole ? RocketChatAccount::RemoveModerator : RocketChatAccount::AddModerator); 0126 }); 0127 menu.addAction(removeAsModerator); 0128 } 0129 if (isAdministrator || mRoom->hasPermission(QStringLiteral("remove-user"))) { 0130 menu.addSeparator(); 0131 auto removeFromRoom = new QAction(i18n("Remove from Room"), &menu); 0132 connect(removeFromRoom, &QAction::triggered, this, &UsersInRoomMenu::slotRemoveFromRoom); 0133 menu.addAction(removeFromRoom); 0134 } 0135 } 0136 if (isNotMe) { 0137 if (isAdirectChannel) { 0138 if (!menu.isEmpty()) { 0139 menu.addSeparator(); 0140 } 0141 const bool userIsBlocked = mRoom->blocker(); 0142 auto blockAction = new QAction(userIsBlocked ? i18n("Unblock User") : i18n("Block User"), &menu); 0143 connect(blockAction, &QAction::triggered, this, &UsersInRoomMenu::slotBlockUser); 0144 menu.addAction(blockAction); 0145 } else { 0146 if (!menu.isEmpty()) { 0147 menu.addSeparator(); 0148 } 0149 0150 const bool userIsIgnored = mRoom->userIsIgnored(mUserId); 0151 auto ignoreAction = new QAction(userIsIgnored ? i18n("Unignore") : i18n("Ignore"), &menu); 0152 connect(ignoreAction, &QAction::triggered, this, &UsersInRoomMenu::slotIgnoreUser); 0153 menu.addAction(ignoreAction); 0154 } 0155 } 0156 menu.exec(mParentWidget->mapToGlobal(pos)); 0157 } 0158 0159 void UsersInRoomMenu::slotUserInfo() 0160 { 0161 auto rcAccount = Ruqola::self()->rocketChatAccount(); 0162 DirectChannelInfoDialog dlg(rcAccount, mParentWidget); 0163 dlg.setUserName(mUserName); 0164 dlg.setRoles(rcAccount->roleInfo()); 0165 dlg.exec(); 0166 } 0167 0168 void UsersInRoomMenu::setParentWidget(QWidget *parentWidget) 0169 { 0170 mParentWidget = parentWidget; 0171 } 0172 0173 void UsersInRoomMenu::setUserId(const QString &userId) 0174 { 0175 mUserId = userId; 0176 } 0177 0178 void UsersInRoomMenu::setUserName(const QString &userName) 0179 { 0180 mUserName = userName; 0181 } 0182 0183 void UsersInRoomMenu::setRoom(Room *room) 0184 { 0185 mRoom = room; 0186 } 0187 0188 #include "moc_usersinroommenu.cpp"