99 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2 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
 | 
