File indexing completed on 2024-12-08 10:25:49

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 "managechannels.h"
0008 
0009 #include "channelgroupbasejob.h"
0010 #include "channels/channeljoinjob.h"
0011 #include "channels/channelopenjob.h"
0012 #include "connection.h"
0013 #include "groups/groupopenjob.h"
0014 #include "ruqola.h"
0015 #include "ruqola_debug.h"
0016 
0017 ManageChannels::ManageChannels(RocketChatAccount *account, QObject *parent)
0018     : QObject(parent)
0019     , mAccount(account)
0020 {
0021 }
0022 
0023 ManageChannels::~ManageChannels() = default;
0024 
0025 ManageChannels::SearchChannelFound ManageChannels::searchOpenChannels(const QString &roomId)
0026 {
0027     ManageChannels::SearchChannelFound result = ManageChannels::SearchChannelFound::NoFound;
0028     const auto roomModel = mAccount->roomModel();
0029     for (int roomIdx = 0, nRooms = roomModel->rowCount(); roomIdx < nRooms; ++roomIdx) {
0030         const auto roomModelIndex = roomModel->index(roomIdx, 0);
0031         const auto identifier = roomModelIndex.data(RoomModel::RoomId).toString();
0032         if (identifier == roomId) {
0033             if (roomModelIndex.data(RoomModel::RoomOpen).toBool()) {
0034                 result = ManageChannels::SearchChannelFound::ChannelOpened;
0035                 Q_EMIT selectRoomByRoomIdRequested(roomId);
0036             } else {
0037                 result = ManageChannels::SearchChannelFound::ChannelHidden;
0038             }
0039             break;
0040         }
0041     }
0042     return result;
0043 }
0044 
0045 RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo ManageChannels::generateGroupInfo(const QString &roomId, RocketChatAccount::ChannelTypeInfo typeInfo)
0046 {
0047     RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo info;
0048     switch (typeInfo) {
0049     case RocketChatAccount::ChannelTypeInfo::RoomId:
0050         info.channelGroupInfoType = RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Identifier;
0051         break;
0052     case RocketChatAccount::ChannelTypeInfo::RoomName:
0053         info.channelGroupInfoType = RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Name;
0054         break;
0055     }
0056     info.identifier = roomId;
0057     return info;
0058 }
0059 
0060 void ManageChannels::channelJoin(const RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo &channelInfo, const QString &joinCode)
0061 {
0062     auto job = new RocketChatRestApi::ChannelJoinJob(this);
0063     mAccount->restApi()->initializeRestApiJob(job);
0064     job->setJoinCode(joinCode);
0065     job->setChannelGroupInfo(channelInfo);
0066     connect(job, &RocketChatRestApi::ChannelJoinJob::setChannelJoinDone, this, &ManageChannels::setChannelJoinDone);
0067     connect(job, &RocketChatRestApi::ChannelJoinJob::missingChannelPassword, this, &ManageChannels::missingChannelPassword);
0068     connect(job, &RocketChatRestApi::ChannelJoinJob::openArchivedRoom, this, &ManageChannels::openArchivedRoom);
0069     if (!job->start()) {
0070         qCDebug(RUQOLA_LOG) << "Impossible to start setChannelJoin";
0071     }
0072 }
0073 
0074 void ManageChannels::openPrivateGroup(const QString &roomId, RocketChatAccount::ChannelTypeInfo typeInfo)
0075 {
0076     const ManageChannels::SearchChannelFound result = searchOpenChannels(roomId);
0077     if (result == ManageChannels::SearchChannelFound::ChannelOpened) {
0078         return;
0079     }
0080 
0081     const RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo info = generateGroupInfo(roomId, typeInfo);
0082     qCDebug(RUQOLA_LOG) << "opening group" << roomId;
0083     switch (result) {
0084     case ManageChannels::SearchChannelFound::ChannelOpened:
0085         // Nothing
0086         break;
0087     case ManageChannels::SearchChannelFound::NoFound: {
0088         // TODO verify
0089         channelJoin(info, QString());
0090         break;
0091     }
0092     case ManageChannels::SearchChannelFound::ChannelHidden: {
0093         auto job = new RocketChatRestApi::GroupOpenJob(this);
0094         job->setChannelGroupInfo(info);
0095         mAccount->restApi()->initializeRestApiJob(job);
0096         connect(job,
0097                 &RocketChatRestApi::GroupOpenJob::groupOpenDone,
0098                 this,
0099                 [this](const QJsonObject &, const RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo &channelInfo) {
0100                     Q_EMIT selectRoomByRoomIdRequested(channelInfo.identifier);
0101                 });
0102         if (!job->start()) {
0103             qCWarning(RUQOLA_LOG) << "Impossible to start GroupOpenJob job";
0104         }
0105         break;
0106     }
0107     }
0108 }
0109 
0110 void ManageChannels::openChannel(const QString &roomId, RocketChatAccount::ChannelTypeInfo typeInfo)
0111 {
0112     const ManageChannels::SearchChannelFound result = searchOpenChannels(roomId);
0113     if (result == ManageChannels::SearchChannelFound::ChannelOpened) {
0114         return;
0115     }
0116     const RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo info = generateGroupInfo(roomId, typeInfo);
0117     qCDebug(RUQOLA_LOG) << "opening channel" << roomId;
0118     switch (result) {
0119     case ManageChannels::SearchChannelFound::ChannelOpened:
0120         // Nothing
0121         break;
0122     case ManageChannels::SearchChannelFound::NoFound: {
0123         channelJoin(info, QString());
0124         break;
0125     }
0126     case ManageChannels::SearchChannelFound::ChannelHidden: {
0127         auto job = new RocketChatRestApi::ChannelOpenJob(this);
0128         job->setChannelGroupInfo(info);
0129         mAccount->restApi()->initializeRestApiJob(job);
0130         connect(job,
0131                 &RocketChatRestApi::ChannelOpenJob::channelOpenDone,
0132                 this,
0133                 [this](const QJsonObject &, const RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo &channelInfo) {
0134                     Q_EMIT selectRoomByRoomIdRequested(channelInfo.identifier);
0135                 });
0136         if (!job->start()) {
0137             qCWarning(RUQOLA_LOG) << "Impossible to start ChannelOpenJob job";
0138         }
0139         break;
0140     }
0141     }
0142 }
0143 
0144 void ManageChannels::setChannelJoinDone(const RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo &channelInfo)
0145 {
0146     qCDebug(RUQOLA_LOG) << " setChannelJoinDone type:" << channelInfo.channelGroupInfoType << " channelInfo.identifier " << channelInfo.identifier;
0147     mAccount->ddp()->subscribeRoomMessage(channelInfo.identifier);
0148     // FIXME room is not added yet...
0149     switch (channelInfo.channelGroupInfoType) {
0150     case RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Unknown:
0151         qCWarning(RUQOLA_LOG) << "setChannelJoinDone : RocketChatRestApi::ChannelBaseJob::ChannelInfoType::Unknown";
0152         break;
0153     case RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Identifier:
0154         Q_EMIT selectRoomByRoomIdRequested(channelInfo.identifier);
0155         break;
0156     case RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Name:
0157         Q_EMIT selectRoomByRoomNameRequested(channelInfo.identifier);
0158         break;
0159     }
0160 }
0161 
0162 #include "moc_managechannels.cpp"