void ServerHistoryManager::handleGotHistory () { auto reply = qobject_cast<QNetworkReply*> (sender ()); reply->deleteLater (); const auto& reqContext = MsgRequestState_.take (reply); const auto& data = reply->readAll (); bool ok = true; const auto& varmap = QJson::Parser {}.parse (data).toMap (); if (!ok) { qWarning () << Q_FUNC_INFO << "cannot parse reply" << data; return; } SrvHistMessages_t messages; for (const auto& var : varmap ["response"].toList ()) { const auto& map = var.toMap (); if (map.isEmpty ()) continue; const auto dir = map ["out"].toInt () ? IMessage::Direction::Out : IMessage::Direction::In; const auto& username = dir == IMessage::Direction::In ? reqContext.Index_.data (CustomHistRole::UserName).toString () : Acc_->GetSelf ()->GetEntryName (); messages.append ({ dir, {}, username, map ["body"].toString (), QDateTime::fromTime_t (map ["date"].toULongLong ()), {} }); } for (int i = 0; i < messages.size (); ++i) messages [i].ID_ = QByteArray::number (reqContext.Offset_ + i); std::reverse (messages.begin (), messages.end ()); emit serverHistoryFetched (reqContext.Index_, QByteArray::number (reqContext.Offset_), messages); }
void ServerHistoryWidget::handleFetched (const QModelIndex& index, const QByteArray& startId, const SrvHistMessages_t& messages) { if (index.row () != ContactsFilter_->mapToSource (Ui_.ContactsView_->currentIndex ()).row ()) return; if (FirstMsgCount_ == -1) FirstMsgCount_ = messages.size (); CurrentID_ = startId; Ui_.MessagesView_->clear (); const auto& bgColor = palette ().color (QPalette::Base); const auto& colors = Core::Instance ().GenerateColors ("hash", bgColor); QString preNick = XmlSettingsManager::Instance ().property ("PreNickText").toString (); QString postNick = XmlSettingsManager::Instance ().property ("PostNickText").toString (); preNick.replace ('<', "<"); postNick.replace ('<', "<"); for (const auto& message : messages) { const auto& color = Core::Instance ().GetNickColor (message.Nick_, colors); auto msgText = message.RichBody_; if (msgText.isEmpty ()) { msgText = Qt::escape (message.Body_); ProxyObject {}.FormatLinks (msgText); msgText.replace ('\n', "<br/>"); } QString html = "[" + message.TS_.toString () + "] " + preNick; html += "<font color='" + color + "'>" + message.Nick_ + "</font> "; html += postNick + ' ' + msgText; html.prepend (QString ("<font color='#") + (message.Dir_ == IMessage::DIn ? "0000dd" : "dd0000") + "'>"); html += "</font>"; Ui_.MessagesView_->append (html); } MaxID_ = messages.value (0).ID_; }