diff --git a/CustomModels/messagemodel.cpp b/CustomModels/messagemodel.cpp index e5316b9e7b001d16d6878fe8e0818e71b360e991..a266eb0df0bf0fb285a6af80478aeaa744c7703d 100644 --- a/CustomModels/messagemodel.cpp +++ b/CustomModels/messagemodel.cpp @@ -182,6 +182,7 @@ void MessagesModel::setCurrent( const QString &value ) if ( mChannelMap.contains( value ) ) { auto timestampIndex = mChannelMap[value]->getMessageRepo()->timestampIndex(); duplicateCheck.clear(); + messagesOfCurrentChannel.clear(); messagesOfCurrentChannel.reserve( timestampIndex.size() ); for ( auto it = timestampIndex.begin(); it != timestampIndex.end(); it++ ) { diff --git a/repos/entities/rocketchatchannel.cpp b/repos/entities/rocketchatchannel.cpp index 61b728c69a64255541e68f0e6f4b47e8bc58ecb9..dd2cbe477f35f89f4fe6f06bbd3403389927e2bb 100755 --- a/repos/entities/rocketchatchannel.cpp +++ b/repos/entities/rocketchatchannel.cpp @@ -154,7 +154,7 @@ MessageRepository *RocketChatChannel::getMessageRepo() return &mMessages; } -void RocketChatChannel::addMessages( const QList<QSharedPointer<RocketChatMessage>> &messagesList ) +QList<QSharedPointer<RocketChatMessage>> RocketChatChannel::addMessages( const QList<QSharedPointer<RocketChatMessage>> &messagesList ) { QList<QSharedPointer<RocketChatMessage>> newMessages; @@ -165,8 +165,10 @@ void RocketChatChannel::addMessages( const QList<QSharedPointer<RocketChatMessag } } } - - emit messageAdded( getRoomId(), 0 ); + if(newMessages.count()){ + emit messageAdded( getRoomId(), 0 ); + } + return newMessages; } bool RocketChatChannel::getJoined() const @@ -340,7 +342,6 @@ QStringList RocketChatChannel::whiteList(const QList<QString> ids, const qint64 blacklist = buffer.toSet(); for(QString id : blacklist){ mMessages.remove(id); - emit messageDeleted(getRoomId(),id); } return blacklist.toList(); } @@ -350,6 +351,7 @@ void RocketChatChannel::deleteMessage(const QString id) emit messageDeleted(getRoomId(),id); if(mMessages.contains(id)){ mMessages.remove(id); + } } diff --git a/repos/entities/rocketchatchannel.h b/repos/entities/rocketchatchannel.h index d5fbc27301b14833fb7b328885c29b7a4defdf4b..9d26245a8d47cc528e9b0f4edd54b7a8d1308f98 100755 --- a/repos/entities/rocketchatchannel.h +++ b/repos/entities/rocketchatchannel.h @@ -73,7 +73,7 @@ class RocketChatChannel : public QObject void setJoined( bool pValue ); void setUnreadMessages( unsigned int pValue ); bool addUser( const QSharedPointer<RocketChatUser> &pUser ); - void addMessages( const QList<QSharedPointer<RocketChatMessage>> &pMessagesList ); + QList<QSharedPointer<RocketChatMessage>> addMessages( const QList<QSharedPointer<RocketChatMessage>> &pMessagesList ); const QHash<QString, QSharedPointer< RocketChatMessage >> &getMessages() const; const QString &getRoomId() const; @@ -151,7 +151,7 @@ class RocketChatChannel : public QObject bool mSelfMuted = false; signals: void messageListReceived( const QString &pChannelId, const QList<ChatMessage> &pMessages ); - void messageAdded( const QString &id, qint64 timestamp ); + QList<QSharedPointer<RocketChatMessage>> messageAdded( const QString &id, qint64 timestamp ); void unreadMessagesChanged( const QString &id, int number ); void channelDeleted( const QString &pId, bool deleted ); void dataChanged( const QString &id, const QString &property ); diff --git a/repos/messagerepository.cpp b/repos/messagerepository.cpp index f733971296b21cf1fa0d00815977723d64493cc7..1c88b4c61d4b2d4157ad12c5bfbd3c880da64bd6 100755 --- a/repos/messagerepository.cpp +++ b/repos/messagerepository.cpp @@ -71,6 +71,13 @@ const ChatMessage &MessageRepository::oldest() const } +void MessageRepository::remove(QString id) +{ + auto timestamp = mElements[id]->getTimestamp(); + AbstractBaseRepository::remove(id); + mTimestampIndex.remove(timestamp); +} + QVector<QSharedPointer<RocketChatMessage> > MessageRepository::messagesAsObjects() { diff --git a/repos/messagerepository.h b/repos/messagerepository.h index 9e47380ae887160e61992c604a10acd1faa34ac3..dea4e2a801708f42a39e011e72ce3532fee8d8e1 100755 --- a/repos/messagerepository.h +++ b/repos/messagerepository.h @@ -41,6 +41,7 @@ class MessageRepository : public QObject, public AbstractBaseRepository<RocketCh const ChatMessage &youngest() const; ChatMessage oldest(); const ChatMessage &oldest() const; + void remove(QString id); QVector<QSharedPointer<RocketChatMessage> > messagesAsObjects(); bool add( const QString &pId, const ChatMessage & ); const QMap<qint64, QSharedPointer<RocketChatMessage> > ×tampIndex() const; diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp index 5e0506fbd6c8a65469f00dd068e94a34726e710e..094f8a0c492037b39791592120b8e5203d76e75e 100755 --- a/rocketchatserver.cpp +++ b/rocketchatserver.cpp @@ -58,9 +58,10 @@ void RocketChatServerData::initConnections() if ( Q_LIKELY( mChannels->contains( it.key() ) && !mChannels->get( it.key() ).isNull() ) ) { MessageList messageList = messages->values( it.key() ); auto channel = mChannels->get( it.key() ); - channel->addMessages( messageList ); + QList<QSharedPointer<RocketChatMessage>> newones = channel->addMessages( messageList ); mMessageService->deleteMessagesNotInList(messages, it.key(),true); - mMessageService->persistMessages( messageList ); + if(newones.count()) + mMessageService->persistMessages( newones ); } } mStorage->askForcommit(); diff --git a/services/messageservice.cpp b/services/messageservice.cpp index 2f626a11ba980a95339de5626332db50d5aa3295..7e95daf228e560269b5bd5f40900a93c26326cbc 100644 --- a/services/messageservice.cpp +++ b/services/messageservice.cpp @@ -309,18 +309,10 @@ void MessageService::loadHistoryFromServer( const QSharedPointer<LoadHistoryRequ QJsonArray messages = result[QStringLiteral( "messages" )].toArray(); for ( auto currentMessage : messages ) { - RocketChatMessage message( currentMessage.toObject() ); - bool newMessage = true; - - if ( mServer->getChannels()->contains( message.getRoomId() ) ) { - auto channel = mServer->getChannels()->get( message.getRoomId() ); - newMessage = !channel->getMessageRepo()->contains( message.getId() ); - } auto messageObject = parseMessage( currentMessage.toObject(), true ); - if ( !messageObject.isNull() && !duplicateCheck->contains( messageObject->getId() ) - && newMessage ) { + if ( !messageObject.isNull() && !duplicateCheck->contains( messageObject->getId() )) { list->insert( messageObject->getRoomId(), messageObject ); duplicateCheck->insert( messageObject->getId() ); }