Exemplo n.º 1
0
	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);
	}
Exemplo n.º 2
0
	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 ('<', "&lt;");
		postNick.replace ('<', "&lt;");

		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_;
	}