| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /*
- 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
|