51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <list>
|
|
#include <map>
|
|
#include <cstdint>
|
|
|
|
#include <nlohmann/json_fwd.hpp>
|
|
using json = nlohmann::json;
|
|
|
|
struct Message {
|
|
std::string text;
|
|
uint64_t chatid;
|
|
uint64_t messageid;
|
|
};
|
|
|
|
enum class Searchflags {
|
|
NONE = 0,
|
|
IGNORECASE = 1,
|
|
REGEX = 2,
|
|
};
|
|
|
|
Searchflags operator|=(Searchflags& lhs, const Searchflags sf);
|
|
|
|
bool operator&(Searchflags& lhs, const Searchflags sf);
|
|
|
|
class Search {
|
|
public:
|
|
Search();
|
|
~Search();
|
|
|
|
static Searchflags fromString(const std::string&);
|
|
|
|
void addFile(const std::string& file);
|
|
|
|
std::list<const Message*> search(std::string text, Searchflags flags = Searchflags::NONE) const;
|
|
const std::string& getChatname(uint64_t id) const;
|
|
std::string getShortChatname(uint64_t id) const;
|
|
private:
|
|
void searchRegex(const std::string& text, bool ignoreCase, std::list<const Message*>& out) const;
|
|
|
|
void runsearch(const std::string& st, bool (Search::*checker)(const std::string& msg, const std::string& text) const, std::list<const Message*>& out) const;
|
|
|
|
bool matches(const std::string& msg, const std::string& text) const;
|
|
bool matchesIC(const std::string& msg, const std::string& text) const;
|
|
|
|
void loadMessages(const json& j, uint64_t chatid);
|
|
|
|
std::list<Message> msgs;
|
|
std::map<uint64_t, std::string> chatnames;
|
|
}; |