File indexing completed on 2024-12-01 10:39:41

0001 /*
0002    SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "avatarmanager.h"
0008 #include "rocketchataccount.h"
0009 #include "ruqola_debug.h"
0010 #include <QTimer>
0011 #include <chrono>
0012 using namespace std::chrono_literals;
0013 
0014 AvatarManager::AvatarManager(RocketChatAccount *account, QObject *parent)
0015     : QObject(parent)
0016     , mAccount(account)
0017     , mTimer(new QTimer(this))
0018 {
0019     mTimer->setSingleShot(true);
0020     // increase interval otherwise we can have some error
0021     mTimer->setInterval(2s);
0022     connect(mTimer, &QTimer::timeout, this, &AvatarManager::slotLoadNextAvatar);
0023 }
0024 
0025 AvatarManager::~AvatarManager() = default;
0026 
0027 void AvatarManager::slotLoadNextAvatar()
0028 {
0029     const Utils::AvatarInfo info = mAvatarDownloadIdentifer.constFirst();
0030     const QUrl url = Utils::avatarUrl(mAccount->serverUrl(), info);
0031     // qDebug() << " url " << url;
0032     if (url.isEmpty()) {
0033         return;
0034     }
0035     slotInsertAvatarUrl(info, url);
0036 }
0037 
0038 void AvatarManager::slotRescheduleDownload()
0039 {
0040     // if problem we need to reschedule after several seconds
0041     QTimer::singleShot(20s, this, &AvatarManager::slotLoadNextAvatar);
0042 }
0043 
0044 void AvatarManager::insertInDownloadQueue(const Utils::AvatarInfo &info)
0045 {
0046     if (!info.isValid()) {
0047         qCWarning(RUQOLA_LOG) << "AvatarManager::insertInDownloadQueue info is not valid!" << info;
0048         return;
0049     }
0050     bool startDownload = false;
0051     if (mAvatarDownloadIdentifer.isEmpty()) {
0052         startDownload = true;
0053     }
0054     if (!mAvatarDownloadIdentifer.contains(info)) {
0055         mAvatarDownloadIdentifer.append(info);
0056     }
0057     if (startDownload) {
0058         mTimer->start();
0059     }
0060 }
0061 
0062 RocketChatAccount *AvatarManager::account() const
0063 {
0064     return mAccount;
0065 }
0066 
0067 void AvatarManager::slotInsertAvatarUrl(const Utils::AvatarInfo &info, const QUrl &url)
0068 {
0069     const QString identifier = info.generateAvatarIdentifier();
0070     qDebug() << "AvatarManager::slotInsertAvatarUrl: identifier " << identifier;
0071     // Use etag in identifier ?
0072     if (!url.isEmpty()) {
0073         Q_EMIT insertAvatarUrl(identifier, url);
0074     } // Else error for downloading => don't redownload it + continue.
0075 
0076     mAvatarDownloadIdentifer.removeAll(info);
0077     // qDebug() << " mAvatarDownloadUserIds" << mAvatarDownloadUserIds;
0078     if (!mAvatarDownloadIdentifer.isEmpty()) {
0079         mTimer->start();
0080     }
0081 }
0082 
0083 #include "moc_avatarmanager.cpp"