tdesktop/Telegram/SourceFiles/support/support_templates.h

100 lines
2.0 KiB
C++

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "base/binary_guard.h"
#include <QtNetwork/QNetworkReply>
namespace Main {
class Session;
} // namespace Main
namespace Support {
namespace details {
struct TemplatesQuestion {
QString question;
QStringList originalKeys;
QStringList normalizedKeys;
QString value;
};
struct TemplatesFile {
QString url;
std::map<QString, TemplatesQuestion> questions;
};
struct TemplatesData {
std::map<QString, TemplatesFile> files;
};
struct TemplatesIndex {
using Id = std::pair<QString, QString>; // filename, normalized question
using Term = std::pair<QString, int>; // search term, weight
std::map<QChar, std::vector<Id>> first;
std::map<Id, std::vector<Term>> full;
};
} // namespace details
class Templates : public base::has_weak_ptr {
public:
explicit Templates(not_null<Main::Session*> session);
void reload();
using Question = details::TemplatesQuestion;
std::vector<Question> query(const QString &text) const;
auto errors() const {
return _errors.events();
}
struct QuestionByKey {
Question question;
QString key;
};
std::optional<QuestionByKey> matchExact(QString text) const;
std::optional<QuestionByKey> matchFromEnd(QString text) const;
int maxKeyLength() const {
return _maxKeyLength;
}
~Templates();
private:
struct Updates;
void load();
void update();
void ensureUpdatesCreated();
void updateRequestFinished(QNetworkReply *reply);
void checkUpdateFinished();
void setData(details::TemplatesData &&data);
not_null<Main::Session*> _session;
details::TemplatesData _data;
details::TemplatesIndex _index;
rpl::event_stream<QStringList> _errors;
base::binary_guard _reading;
bool _reloadAfterRead = false;
rpl::lifetime _reloadToastSubscription;
int _maxKeyLength = 0;
std::unique_ptr<Updates> _updates;
rpl::lifetime _lifetime;
};
} // namespace Support