React to new messages in chat

This commit is contained in:
Sebastian J. Wolf 2020-08-22 23:49:02 +02:00
parent 59a7c8381d
commit c472e70775
7 changed files with 61 additions and 13 deletions

View file

@ -151,6 +151,9 @@ Page {
onMessagesReceived: {
chatView.positionViewAtEnd();
}
onNewMessageReceived: {
chatView.positionViewAtEnd();
}
}
Timer {

View file

@ -7,6 +7,7 @@ ChatModel::ChatModel(TDLibWrapper *tdLibWrapper)
this->tdLibWrapper = tdLibWrapper;
this->inReload = false;
connect(this->tdLibWrapper, SIGNAL(messagesReceived(QVariantList)), this, SLOT(handleMessagesReceived(QVariantList)));
connect(this->tdLibWrapper, SIGNAL(newMessageReceived(QString, QVariantMap)), this, SLOT(handleNewMessageReceived(QString, QVariantMap)));
}
ChatModel::~ChatModel()
@ -65,6 +66,7 @@ void ChatModel::handleMessagesReceived(const QVariantList &messages)
{
qDebug() << "[ChatModel] Receiving new messages :)";
this->messagesMutex.lock();
this->messagesToBeAdded.clear();
QListIterator<QVariant> messagesIterator(messages);
while (messagesIterator.hasNext()) {
@ -74,6 +76,39 @@ void ChatModel::handleMessagesReceived(const QVariantList &messages)
}
}
std::sort(this->messagesToBeAdded.begin(), this->messagesToBeAdded.end(), compareMessages);
this->insertMessages();
this->messagesMutex.unlock();
// First call only returns one message, we need to get a little more than that...
if (this->messagesToBeAdded.size() == 1 && !this->inReload) {
qDebug() << "[ChatModel] Only one message received in first call, loading more...";
this->inReload = true;
this->tdLibWrapper->getChatHistory(this->chatId, this->messagesToBeAdded.first().toMap().value("id").toLongLong());
} else {
qDebug() << "[ChatModel] Messages loaded, notifying chat UI...";
this->inReload = false;
emit messagesReceived();
}
}
void ChatModel::handleNewMessageReceived(const QString &chatId, const QVariantMap &message)
{
if (chatId == this->chatId) {
qDebug() << "[ChatModel] New message received for this chat";
this->messagesMutex.lock();
this->messagesToBeAdded.clear();
this->messagesToBeAdded.append(message);
this->insertMessages();
this->messagesMutex.unlock();
emit newMessageReceived();
}
}
void ChatModel::insertMessages()
{
if (this->messages.isEmpty()) {
beginResetModel();
this->messages.append(this->messagesToBeAdded);
@ -88,16 +123,4 @@ void ChatModel::handleMessagesReceived(const QVariantList &messages)
this->insertRows(0, this->messagesToBeAdded.size());
}
}
this->messagesMutex.unlock();
// First call only returns one message, we need to get a little more than that...
if (this->messagesToBeAdded.size() == 1 && !this->inReload) {
qDebug() << "[ChatModel] Only one message received in first call, loading more...";
this->inReload = true;
this->tdLibWrapper->getChatHistory(this->chatId, this->messagesToBeAdded.first().toMap().value("id").toLongLong());
} else {
qDebug() << "[ChatModel] Messages loaded, notifying chat UI...";
this->inReload = false;
emit messagesReceived();
}
}

View file

@ -21,9 +21,11 @@ public:
signals:
void messagesReceived();
void newMessageReceived();
public slots:
void handleMessagesReceived(const QVariantList &messages);
void handleNewMessageReceived(const QString &chatId, const QVariantMap &message);
private:
@ -34,6 +36,8 @@ private:
QMutex messagesMutex;
QString chatId;
bool inReload;
void insertMessages();
};
#endif // CHATMODEL_H

View file

@ -70,6 +70,7 @@ void TDLibReceiver::processReceivedDocument(const QJsonDocument &receivedJsonDoc
if (objectTypeName == "updateSupergroup") { this->processUpdateSuperGroup(receivedInformation); }
if (objectTypeName == "updateChatOnlineMemberCount") { this->processChatOnlineMemberCountUpdated(receivedInformation); }
if (objectTypeName == "messages") { this->processMessages(receivedInformation); }
if (objectTypeName == "updateNewMessage") { this->processUpdateNewMessage(receivedInformation); }
}
void TDLibReceiver::processUpdateOption(const QVariantMap &receivedInformation)
@ -194,6 +195,13 @@ void TDLibReceiver::processChatOnlineMemberCountUpdated(const QVariantMap &recei
void TDLibReceiver::processMessages(const QVariantMap &receivedInformation)
{
qDebug() << "[TDLibReceiver] Received new messages..." << receivedInformation.value("total_count").toString();
qDebug() << "[TDLibReceiver] Received new messages, amount: " << receivedInformation.value("total_count").toString();
emit messagesReceived(receivedInformation.value("messages").toList());
}
void TDLibReceiver::processUpdateNewMessage(const QVariantMap &receivedInformation)
{
QString chatId = receivedInformation.value("message").toMap().value("chat_id").toString();
qDebug() << "[TDLibReceiver] Received new message for chat " << chatId;
emit newMessageReceived(chatId, receivedInformation.value("message").toMap());
}

View file

@ -53,6 +53,7 @@ signals:
void superGroupUpdated(const QString &groupId, const QVariantMap &groupInformation);
void chatOnlineMemberCountUpdated(const QString &chatId, const int &onlineMemberCount);
void messagesReceived(const QVariantList &messages);
void newMessageReceived(const QString &chatId, const QVariantMap &message);
private:
void *tdLibClient;
@ -76,6 +77,7 @@ private:
void processUpdateSuperGroup(const QVariantMap &receivedInformation);
void processChatOnlineMemberCountUpdated(const QVariantMap &receivedInformation);
void processMessages(const QVariantMap &receivedInformation);
void processUpdateNewMessage(const QVariantMap &receivedInformation);
};
#endif // TDLIBRECEIVER_H

View file

@ -53,6 +53,7 @@ TDLibWrapper::TDLibWrapper(QObject *parent) : QObject(parent)
connect(this->tdLibReceiver, SIGNAL(superGroupUpdated(QString, QVariantMap)), this, SLOT(handleSuperGroupUpdated(QString, QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(chatOnlineMemberCountUpdated(QString, int)), this, SLOT(handleChatOnlineMemberCountUpdated(QString, int)));
connect(this->tdLibReceiver, SIGNAL(messagesReceived(QVariantList)), this, SLOT(handleMessagesReceived(QVariantList)));
connect(this->tdLibReceiver, SIGNAL(newMessageReceived(QString, QVariantMap)), this, SLOT(handleNewMessageReceived(QString, QVariantMap)));
this->tdLibReceiver->start();
@ -390,6 +391,11 @@ void TDLibWrapper::handleMessagesReceived(const QVariantList &messages)
emit messagesReceived(messages);
}
void TDLibWrapper::handleNewMessageReceived(const QString &chatId, const QVariantMap &message)
{
emit newMessageReceived(chatId, message);
}
void TDLibWrapper::setInitialParameters()
{
qDebug() << "[TDLibWrapper] Sending initial parameters to TD Lib";

View file

@ -97,6 +97,7 @@ signals:
void superGroupUpdated(const QString &groupId, const QVariantMap &groupInformation);
void chatOnlineMemberCountUpdated(const QString &chatId, const int &onlineMemberCount);
void messagesReceived(const QVariantList &messages);
void newMessageReceived(const QString &chatId, const QVariantMap &message);
public slots:
void handleVersionDetected(const QString &version);
@ -116,6 +117,7 @@ public slots:
void handleSuperGroupUpdated(const QString &groupId, const QVariantMap &groupInformation);
void handleChatOnlineMemberCountUpdated(const QString &chatId, const int &onlineMemberCount);
void handleMessagesReceived(const QVariantList &messages);
void handleNewMessageReceived(const QString &chatId, const QVariantMap &message);
private:
void *tdLibClient;