File indexing completed on 2024-05-12 05:01:56
0001 /* 0002 SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "customuserstatuses.h" 0008 #include "ruqola_debug.h" 0009 0010 #include <QJsonArray> 0011 #include <QJsonObject> 0012 0013 CustomUserStatuses::CustomUserStatuses() = default; 0014 0015 CustomUserStatuses::~CustomUserStatuses() = default; 0016 0017 void CustomUserStatuses::parseCustomUserStatuses(const QJsonObject &customStatusObj) 0018 { 0019 mCustomUserCount = customStatusObj[QLatin1String("count")].toInt(); 0020 mOffset = customStatusObj[QLatin1String("offset")].toInt(); 0021 mTotal = customStatusObj[QLatin1String("total")].toInt(); 0022 mCustomUserses.clear(); 0023 parseListCustomUserStatuses(customStatusObj); 0024 } 0025 0026 void CustomUserStatuses::parseListCustomUserStatuses(const QJsonObject &customStatusObj) 0027 { 0028 const QJsonArray customsUserArray = customStatusObj[QLatin1String("statuses")].toArray(); 0029 mCustomUserses.reserve(mCustomUserses.count() + customsUserArray.count()); 0030 for (const QJsonValue ¤t : customsUserArray) { 0031 if (current.type() == QJsonValue::Object) { 0032 const QJsonObject customUserObj = current.toObject(); 0033 CustomUserStatus m; 0034 m.parseCustomStatus(customUserObj); 0035 mCustomUserses.append(std::move(m)); 0036 } else { 0037 qCWarning(RUQOLA_LOG) << "Problem when parsing customStatusUser" << current; 0038 } 0039 } 0040 } 0041 0042 bool CustomUserStatuses::isEmpty() const 0043 { 0044 return mCustomUserses.isEmpty(); 0045 } 0046 0047 void CustomUserStatuses::clear() 0048 { 0049 mCustomUserses.clear(); 0050 } 0051 0052 int CustomUserStatuses::count() const 0053 { 0054 return mCustomUserses.count(); 0055 } 0056 0057 CustomUserStatus CustomUserStatuses::at(int index) const 0058 { 0059 if (index < 0 || index > mCustomUserses.count()) { 0060 qCWarning(RUQOLA_LOG) << "Invalid index " << index; 0061 return {}; 0062 } 0063 return mCustomUserses.at(index); 0064 } 0065 0066 int CustomUserStatuses::offset() const 0067 { 0068 return mOffset; 0069 } 0070 0071 void CustomUserStatuses::setOffset(int offset) 0072 { 0073 mOffset = offset; 0074 } 0075 0076 int CustomUserStatuses::total() const 0077 { 0078 return mTotal; 0079 } 0080 0081 void CustomUserStatuses::setTotal(int total) 0082 { 0083 mTotal = total; 0084 } 0085 0086 QVector<CustomUserStatus> CustomUserStatuses::customUserses() const 0087 { 0088 return mCustomUserses; 0089 } 0090 0091 void CustomUserStatuses::setCustomUserses(const QVector<CustomUserStatus> &customUserses) 0092 { 0093 mCustomUserses = customUserses; 0094 } 0095 0096 void CustomUserStatuses::deleteCustomUserStatuses(const QJsonArray &replyArray) 0097 { 0098 for (int i = 0, total = replyArray.count(); i < total; ++i) { 0099 const QJsonObject obj = replyArray.at(i).toObject(); 0100 const QJsonObject customStatusObj = obj.value(QLatin1String("userStatusData")).toObject(); 0101 if (!customStatusObj.isEmpty()) { 0102 if (customStatusObj.contains(QLatin1String("_id"))) { 0103 const QString identifier = customStatusObj.value(QLatin1String("_id")).toString(); 0104 for (const CustomUserStatus &status : std::as_const(mCustomUserses)) { 0105 if (status.identifier() == identifier) { 0106 mCustomUserses.removeOne(status); 0107 break; 0108 } 0109 } 0110 // TODO fix total ??? 0111 } else { 0112 qCWarning(RUQOLA_LOG) << "deleteCustomUser invalid QJsonObject" << customStatusObj; 0113 } 0114 } 0115 } 0116 } 0117 0118 void CustomUserStatuses::updateCustomUserStatues(const QJsonArray &replyArray) 0119 { 0120 // TODO fix total 0121 for (int i = 0; i < replyArray.count(); ++i) { 0122 const QJsonObject obj = replyArray.at(i).toObject(); 0123 const QJsonObject customStatusObj = obj.value(QLatin1String("userStatusData")).toObject(); 0124 if (!customStatusObj.isEmpty()) { 0125 if (customStatusObj.contains(QLatin1String("_id"))) { 0126 // previousStatusType 0127 // previousName 0128 //=> update otherwise add 0129 bool found = false; 0130 const QString identifier = customStatusObj.value(QLatin1String("_id")).toString(); 0131 for (CustomUserStatus &status : mCustomUserses) { 0132 if (status.identifier() == identifier) { 0133 status.parseCustomStatus(customStatusObj); 0134 found = true; 0135 break; 0136 } 0137 } 0138 if (!found) { 0139 // Parse 0140 CustomUserStatus newStatus; 0141 newStatus.parseCustomStatus(customStatusObj, false); 0142 if (newStatus.isValid()) { 0143 mCustomUserses.append(std::move(newStatus)); 0144 } 0145 } 0146 } else { 0147 // It's a bug in RC server see https://github.com/RocketChat/Rocket.Chat/issues/28542 0148 0149 qCWarning(RUQOLA_LOG) << "updateCustomUser invalid QJsonObject" << customStatusObj; 0150 } 0151 } 0152 } 0153 } 0154 0155 QDebug operator<<(QDebug d, const CustomUserStatuses &t) 0156 { 0157 d.space() << "total" << t.total(); 0158 d.space() << "offset" << t.offset(); 0159 d.space() << "customStatus Count" << t.count() << "\n"; 0160 for (int i = 0, total = t.customUserses().count(); i < total; ++i) { 0161 d.space() << t.customUserses().at(i) << "\n"; 0162 } 0163 return d; 0164 }