/
erhoof
/
telegraf
Обзор
Документация
Войти
/
erhoof
/
telegraf
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/data/chatdata.cpp
358 строк
10 KB
Nikolay Sinyov
Сделал правильный вывод кол-ва непрочитанных тем в форумах в списке чатов
14 сен 2025, 16:12
14 сен 2025, 16:12
b98158c
Код
Авторство
О чём код?
#include "../util/telegrafutils.h" #include "chatlistmodel.h" #include "chatdata.h" #include "usersmodel.h" ChatData::ChatData(const QVariantMap &data, QObject *parent) : QObject(parent), chatData(data), chatId(data.value(ID).toLongLong()), order(data.value(ORDER).toLongLong()), groupId(0), verified(false), rkn_verified(false), archived(false), memberStatus(TDLibConstants::ChatMemberStatusUnknown), secretChatState(TDLibConstants::SecretChatStateUnknown) { const QVariantMap type(data.value(TYPE).toMap()); switch (chatType = TDLibConstants::getInstance()->chatTypeFromString(type.value(_TYPE).toString())) { case TDLibConstants::ChatTypeBasicGroup: groupId = type.value(BASIC_GROUP_ID).toLongLong(); break; case TDLibConstants::ChatTypeSuperGroup: groupId = type.value(SUPERGROUP_ID).toLongLong(); break; case TDLibConstants::ChatTypeUnknown: case TDLibConstants::ChatTypePrivate: case TDLibConstants::ChatTypeSecret: case TDLibConstants::ChatTypeBot: break; } photoSmallCache = chatData.value(PHOTO).toMap().value(SMALL).toMap(); } int ChatData::compareTo(const ChatData *other) const { return senderMessageDate() < other->senderMessageDate() ? 1 : -1; } bool ChatData::setOrder(const QString &newOrder) { if (!newOrder.isEmpty()) { chatData.insert(ORDER, newOrder); order = newOrder.toLongLong(); return true; } return false; } inline const QVariant ChatData::lastMessage(const QString &key) const { return chatData.value(LAST_MESSAGE).toMap().value(key); } QString ChatData::title() const { return chatData.value(TITLE).toString(); } int ChatData::unreadCount() const { return chatData.value(UNREAD_COUNT).toInt(); } int ChatData::unreadMentionCount() const { return chatData.value(UNREAD_MENTION_COUNT).toInt(); } QVariant ChatData::availableReactions() const { return chatData.value(AVAILABLE_REACTIONS); } int ChatData::unreadReactionCount() const { return chatData.value(UNREAD_REACTION_COUNT).toInt(); } QVariantMap ChatData::photoSmall() const { return photoSmallCache; } qlonglong ChatData::lastReadInboxMessageId() const { return chatData.value(LAST_READ_INBOX_MESSAGE_ID).toLongLong(); } qlonglong ChatData::senderUserId() const { return lastMessage(SENDER_ID).toMap().value(USER_ID).toLongLong(); } qlonglong ChatData::senderChatId() const { return lastMessage(SENDER_ID).toMap().value(CHAT_ID).toLongLong(); } bool ChatData::senderIsChat() const { return lastMessage(SENDER_ID).toMap().value(_TYPE).toString() == "messageSenderChat"; } bool ChatData::lastMessageContainsUnreadMention() const { return lastMessage(CONTAINS_UNREAD_MENTION).toBool(); } qlonglong ChatData::senderMessageDate() const { return lastMessage(DATE).toLongLong(); } QString ChatData::senderMessageText() const { qlonglong myUserId = TDLibState::getInstance()->getMyUserId(); return TelegrafUtils::getMessageShortText(TDLibDataRepository::getInstance(), lastMessage(CONTENT).toMap(), isChannel(), myUserId, lastMessage(SENDER_ID).toMap() ); } QString ChatData::senderMessageStatus() const { qlonglong myUserId = TDLibState::getInstance()->getMyUserId(); if (isChannel() || myUserId != senderUserId() || myUserId == chatId) { return ""; } if (lastMessage(ID) == chatData.value(LAST_READ_OUTBOX_MESSAGE_ID)) { return " ✅"; } else { QVariantMap lastMessage = chatData.value(LAST_MESSAGE).toMap(); if (lastMessage.contains(SENDING_STATE)) { QVariantMap sendingState = lastMessage.value(SENDING_STATE).toMap(); if (sendingState.value(_TYPE).toString() == "messageSendingStatePending") { return " 🕙"; } else { return " ❌"; } } else { return " ☑️"; } } } qlonglong ChatData::draftMessageDate() const { QVariantMap draft = chatData.value(DRAFT_MESSAGE).toMap(); if(draft.isEmpty()) { return qlonglong(0); } return draft.value(DATE).toLongLong(); } QString ChatData::draftMessageText() const { QVariantMap draft = chatData.value(DRAFT_MESSAGE).toMap(); if(draft.isEmpty()) { return QString(); } return draft.value("input_message_text").toMap().value(TEXT).toMap().value(TEXT).toString(); } bool ChatData::isBasicGroup() const { return chatType == TDLibConstants::ChatTypeBasicGroup; } bool ChatData::isSuperGroup() const { return chatType == TDLibConstants::ChatTypeSuperGroup; } bool ChatData::isGroup() const { return isSuperGroup() || isBasicGroup(); } bool ChatData::isPrivate() const { return chatType == TDLibConstants::ChatTypePrivate; } qlonglong ChatData::respondentUserId() const { //NOTE: will work only for chatType = ChatTypePrivate return chatData.value(TYPE).toMap().value(USER_ID).toLongLong(); } bool ChatData::isContact() const { auto userId = respondentUserId(); if (TDLibDataRepository::getInstance()->containsUserById(userId)) { return TDLibDataRepository::getInstance()->getUserById(respondentUserId()).value("is_contact").toBool(); } return false; } bool ChatData::isBot() const { //need to refactor auto userId = respondentUserId(); if (TDLibDataRepository::getInstance()->containsUserById(userId)) { auto type = TDLibDataRepository::getInstance()->getUserById(respondentUserId()).value(TYPE).toMap().value(_TYPE).toString(); return type.contains("userTypeBot"); } return false; } bool ChatData::isMute() const { return chatData.value(NOTIFICATION_SETTINGS).toMap().value("mute_for").toULongLong() > 0; } bool ChatData::isChannel() const { return chatData.value(TYPE).toMap().value(IS_CHANNEL).toBool(); } bool ChatData::isForum() const { //return chatData.value(TYPE).toMap().value(IS_FORUM).toBool(); return chatData.value(IS_VIEW_AS_TOPICS).toBool(); } bool ChatData::isHidden() const { // Cover all enum values so that compiler warns us when/if enum gets extended switch (chatType) { case TDLibConstants::ChatTypeBasicGroup: case TDLibConstants::ChatTypeSuperGroup: switch (memberStatus) { case TDLibConstants::ChatMemberStatusLeft: case TDLibConstants::ChatMemberStatusUnknown: case TDLibConstants::ChatMemberStatusBanned: return true; case TDLibConstants::ChatMemberStatusCreator: case TDLibConstants::ChatMemberStatusAdministrator: case TDLibConstants::ChatMemberStatusMember: case TDLibConstants::ChatMemberStatusRestricted: if (chatData.value(LAST_MESSAGE).isNull()) { return true; } break; } break; case TDLibConstants::ChatTypeUnknown: return true; case TDLibConstants::ChatTypePrivate: case TDLibConstants::ChatTypeBot: if (chatData.value(LAST_MESSAGE).isNull()) { return true; } break; case TDLibConstants::ChatTypeSecret: if (secretChatState == TDLibConstants::SecretChatStateClosed) { return true; } break; } return false; } bool ChatData::isMarkedAsUnread() const { return chatData.value(IS_MARKED_AS_UNREAD).toBool(); } void ChatData::updateUnreadCount(int count) { chatData.insert(UNREAD_COUNT, count); } void ChatData::updateLastReadInboxMessageId(qlonglong messageId) { chatData.insert(LAST_READ_INBOX_MESSAGE_ID, messageId); } void ChatData::updateLastMessage(const QVariantMap &message) { chatData.insert(LAST_MESSAGE, message); } QVector<int> ChatData::updateGroup(const GroupModel *group) { QVector<int> changedRoles; if (group && groupId == group->groupId) { const TDLibConstants::ChatMemberStatus groupMemberStatus = group->chatMemberStatus(); if (memberStatus != groupMemberStatus) { memberStatus = groupMemberStatus; changedRoles.append(ChatListModel::RoleChatMemberStatus); } auto groupVerified = group->isVerified(); if(verified != groupVerified) { verified = groupVerified; changedRoles.append(ChatListModel::RoleIsVerified); } auto groupRKNVerified = group->isRKNVerified(); if(rkn_verified != groupRKNVerified) { rkn_verified = groupRKNVerified; changedRoles.append(ChatListModel::RoleIsRKNVerified); } } return changedRoles; } QVector<int> ChatData::updateSecretChat(const QVariantMap &secretChatDetails) { QVector<int> changedRoles; TDLibConstants::SecretChatState newSecretChatState = TDLibConstants::getInstance()->secretChatStateFromString(secretChatDetails.value("state").toMap().value(_TYPE).toString()); if (newSecretChatState != secretChatState) { secretChatState = newSecretChatState; changedRoles.append(ChatListModel::RoleSecretChatState); } return changedRoles; } ChatData* ChatData::clone() { QVariantMap clonedChatData; QList<QString> keys = chatData.keys(); for(int i = 0; i < keys.count(); i++) { clonedChatData.insert(keys[i], QVariant(chatData[keys[i]])); } ChatData* res = new ChatData(clonedChatData, this); res->chatId = chatId; res->order = order; res->groupId = groupId; res->verified = verified; res->archived = archived; res->chatType = chatType; res->memberStatus = memberStatus; res->secretChatState = secretChatState; return res; } QVector<int> ChatData::updateVerification() { QVector<int> changedRoles; auto _verified = UsersModel::getInstance()->isVerified(chatId); auto _rkn_verified = UsersModel::getInstance()->isRKNVerified(chatId); if(verified != _verified) { verified = _verified; changedRoles.append(ChatListModel::RoleIsVerified); } if(rkn_verified != _rkn_verified) { rkn_verified = _rkn_verified; changedRoles.append(ChatListModel::RoleIsRKNVerified); } return changedRoles; }