void OfflineMsgEngine::deliverOfflineMsgs() { QMutexLocker ml(&mutex); if (!Settings::getInstance().getFauxOfflineMessaging()) return; if (f->getStatus() == Status::Offline) return; if (undeliveredMsgs.size() == 0) return; QMap<int64_t, MsgPtr> msgs = undeliveredMsgs; removeAllReceipts(); undeliveredMsgs.clear(); for (auto iter = msgs.begin(); iter != msgs.end(); ++iter) { auto val = iter.value(); auto key = iter.key(); if (val.timestamp.msecsTo(QDateTime::currentDateTime()) < offlineTimeout) { registerReceipt(val.receipt, key, val.msg, val.timestamp); continue; } QString messageText = val.msg->toString(); int rec; if (val.msg->isAction()) rec = Core::getInstance()->sendAction(f->getFriendID(), messageText); else rec = Core::getInstance()->sendMessage(f->getFriendID(), messageText); registerReceipt(rec, key, val.msg); } }
void ChatForm::deliverOfflineMsgs() { if (!Settings::getInstance().getFauxOfflineMessaging()) return; QMap<int, MessageActionPtr> msgs = undeliveredMsgs; clearReciepts(); for (auto iter = msgs.begin(); iter != msgs.end(); iter++) { QString messageText = iter.value()->getRawMessage(); int rec; if (iter.value()->isAction()) rec = Core::getInstance()->sendAction(f->getFriendID(), messageText); else rec = Core::getInstance()->sendMessage(f->getFriendID(), messageText); registerReceipt(rec, iter.key(), iter.value()); } }
void ChatForm::onSendTriggered() { QString msg = msgEdit->toPlainText(); if (msg.isEmpty()) return; bool isAction = msg.startsWith("/me "); if (isAction) msg = msg = msg.right(msg.length() - 4); QList<CString> splittedMsg = Core::splitMessage(msg, TOX_MAX_MESSAGE_LENGTH); QDateTime timestamp = QDateTime::currentDateTime(); for (CString& c_msg : splittedMsg) { QString qt_msg = CString::toString(c_msg.data(), c_msg.size()); QString qt_msg_hist = qt_msg; if (isAction) qt_msg_hist = "/me " + qt_msg; bool status = !Settings::getInstance().getFauxOfflineMessaging(); int id = HistoryKeeper::getInstance()->addChatEntry(f->getToxID().publicKey, qt_msg_hist, Core::getInstance()->getSelfId().publicKey, timestamp, status); MessageActionPtr ma = addSelfMessage(qt_msg, isAction, timestamp, false); int rec; if (isAction) rec = Core::getInstance()->sendAction(f->getFriendID(), qt_msg); else rec = Core::getInstance()->sendMessage(f->getFriendID(), qt_msg); registerReceipt(rec, id, ma); } msgEdit->clear(); }
void ChatForm::loadHistory(QDateTime since, bool processUndelivered) { QDateTime now = QDateTime::currentDateTime(); if (since > now) return; if (earliestMessage) { if (*earliestMessage < since) return; if (*earliestMessage < now) { now = *earliestMessage; now = now.addMSecs(-1); } } auto msgs = HistoryKeeper::getInstance()->getChatHistory(HistoryKeeper::ctSingle, f->getToxID().publicKey, since, now); ToxID storedPrevId; std::swap(storedPrevId, previousId); QList<ChatActionPtr> historyMessages; QDate lastDate(1,0,0); for (const auto &it : msgs) { // Show the date every new day QDateTime msgDateTime = it.timestamp.toLocalTime(); QDate msgDate = msgDateTime.date(); if (msgDate > lastDate) { lastDate = msgDate; historyMessages.append(genSystemInfoAction(msgDate.toString(),"",QDateTime())); } // Show each messages ToxID msgSender = ToxID::fromString(it.sender); MessageActionPtr ca = genMessageActionAction(msgSender, it.message, false, msgDateTime); if (it.isSent || !msgSender.isMine()) { ca->markAsSent(); } else { if (processUndelivered) { int rec; if (ca->isAction()) rec = Core::getInstance()->sendAction(f->getFriendID(), ca->getRawMessage()); else rec = Core::getInstance()->sendMessage(f->getFriendID(), ca->getRawMessage()); registerReceipt(rec, it.id, ca); } } historyMessages.append(ca); } std::swap(storedPrevId, previousId); int savedSliderPos = chatWidget->verticalScrollBar()->maximum() - chatWidget->verticalScrollBar()->value(); if (earliestMessage != nullptr) *earliestMessage = since; chatWidget->insertMessagesTop(historyMessages); savedSliderPos = chatWidget->verticalScrollBar()->maximum() - savedSliderPos; chatWidget->verticalScrollBar()->setValue(savedSliderPos); }