parse filename, display username
This commit is contained in:
parent
94f4903786
commit
797eecc487
|
@ -77,7 +77,7 @@ int main(int argc, const char** argv) {
|
||||||
if(c == 'y' || c == 'Y') {
|
if(c == 'y' || c == 'Y') {
|
||||||
//print results
|
//print results
|
||||||
for(const Message* m : results) {
|
for(const Message* m : results) {
|
||||||
Log::info << search->getShortChatname(m->chatid) << ": (" << m->messageid << ") " << m->text;
|
Log::info << search->getShortChatname(m->senderid) << "@" << search->getShortChatname(m->chatid) << "> (" << m->messageid << ") " << m->text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,10 @@ bool Message::operator<(const Message& m) const {
|
||||||
return (messageid < m.messageid);
|
return (messageid < m.messageid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Message::hasFile() const {
|
||||||
|
return !filename.empty();
|
||||||
|
}
|
||||||
|
|
||||||
Searchflags operator|=(Searchflags& lhs, const Searchflags sf) {
|
Searchflags operator|=(Searchflags& lhs, const Searchflags sf) {
|
||||||
lhs = (Searchflags) ((uint32_t) lhs | (uint32_t) sf);
|
lhs = (Searchflags) ((uint32_t) lhs | (uint32_t) sf);
|
||||||
return lhs;
|
return lhs;
|
||||||
|
@ -103,14 +107,14 @@ void Search::addFile(const std::string& file) {
|
||||||
|
|
||||||
//multi chat export
|
//multi chat export
|
||||||
if(j.contains("chats")) {
|
if(j.contains("chats")) {
|
||||||
const json& chatlist = j["chats"]["list"];
|
const json& chatlist = j["chats"]["list"]; //asume that list exists
|
||||||
if(chatlist.is_null()) {
|
if(chatlist.is_null()) {
|
||||||
Log::error << "File does not contain a chatlist";
|
Log::error << "File does not contain a chatlist";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const json& chat : chatlist) {
|
for(const json& chat : chatlist) {
|
||||||
uint64_t id = chat["id"];
|
int64_t id = chat["id"];
|
||||||
std::string name = "";
|
std::string name = "";
|
||||||
if(chat.contains("name") && !chat["name"].is_null())
|
if(chat.contains("name") && !chat["name"].is_null())
|
||||||
name = chat.value("name", "");
|
name = chat.value("name", "");
|
||||||
|
@ -123,6 +127,16 @@ void Search::addFile(const std::string& file) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//get contact list
|
||||||
|
if(j.contains("frequent_contacts")) {
|
||||||
|
const json& contacts = j["frequent_contacts"]["list"];//asume that list exists
|
||||||
|
for(const json& contact : contacts) {
|
||||||
|
int64_t id = contact["id"];
|
||||||
|
std::string name = contact["name"];
|
||||||
|
chatnames.insert({id, name});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log::warn << "File " << file << " could not be parsed! Export as json!";
|
Log::warn << "File " << file << " could not be parsed! Export as json!";
|
||||||
} catch (nlohmann::detail::parse_error& e) {
|
} catch (nlohmann::detail::parse_error& e) {
|
||||||
Log::error << "Could not load File: " << e.what();
|
Log::error << "Could not load File: " << e.what();
|
||||||
|
@ -157,7 +171,7 @@ std::list<const Message*> Search::search(std::string text, Searchflags flags) co
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Search::getChatname(uint64_t id) const {
|
const std::string& Search::getChatname(int64_t id) const {
|
||||||
static const std::string UNKOWNCHAT = "<unknownchat>";
|
static const std::string UNKOWNCHAT = "<unknownchat>";
|
||||||
auto it = chatnames.find(id);
|
auto it = chatnames.find(id);
|
||||||
if(it == chatnames.end()) return UNKOWNCHAT;
|
if(it == chatnames.end()) return UNKOWNCHAT;
|
||||||
|
@ -165,7 +179,7 @@ const std::string& Search::getChatname(uint64_t id) const {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Search::getShortChatname(uint64_t id) const {
|
std::string Search::getShortChatname(int64_t id) const {
|
||||||
std::string chatname = getChatname(id);
|
std::string chatname = getChatname(id);
|
||||||
if(chatname.size() > 14) {
|
if(chatname.size() > 14) {
|
||||||
return chatname.substr(0, 14);
|
return chatname.substr(0, 14);
|
||||||
|
@ -213,14 +227,24 @@ static void readText(const json& t, std::string& out) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Search::loadMessages(const json& j, uint64_t chatid) {
|
void Search::loadMessages(const json& j, int64_t chatid) {
|
||||||
uint32_t failed = 0;
|
uint32_t failed = 0;
|
||||||
for(const json& m : j) {
|
for(const json& m : j) {
|
||||||
try {
|
try {
|
||||||
if(m.contains("text")) {
|
if(m.contains("text")) {
|
||||||
std::string text;
|
std::string text;
|
||||||
readText(m["text"], text);
|
readText(m["text"], text);
|
||||||
deduplicate.insert({text, chatid, m["id"]});
|
std::string file = "";
|
||||||
|
if(m.contains("file"))
|
||||||
|
file = m["file"];
|
||||||
|
else if(m.contains("photo"))
|
||||||
|
file = m["photo"];
|
||||||
|
|
||||||
|
int64_t sender = 0;
|
||||||
|
if(m.contains("from_id") && m["from_id"].is_number_unsigned())
|
||||||
|
sender = m["from_id"];
|
||||||
|
|
||||||
|
deduplicate.insert({chatid, m["id"], sender, text, file, m.contains("reply_to_message_id")});
|
||||||
} else {
|
} else {
|
||||||
Log::warn << "text less message: " << m;
|
Log::warn << "text less message: " << m;
|
||||||
}
|
}
|
||||||
|
|
18
src/search.h
18
src/search.h
|
@ -11,13 +11,17 @@
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
struct Message {
|
struct Message {
|
||||||
|
int64_t chatid;
|
||||||
|
int64_t messageid;
|
||||||
|
int64_t senderid;
|
||||||
std::string text;
|
std::string text;
|
||||||
uint64_t chatid;
|
std::string filename = ""; //empty filename = no file
|
||||||
uint64_t messageid;
|
bool isreply = false;
|
||||||
|
|
||||||
bool operator==(const Message& m) const;
|
bool operator==(const Message& m) const;
|
||||||
bool operator!=(const Message& m) const;
|
bool operator!=(const Message& m) const;
|
||||||
bool operator<(const Message& m) const;
|
bool operator<(const Message& m) const;
|
||||||
|
bool hasFile() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Searchflags {
|
enum class Searchflags {
|
||||||
|
@ -25,7 +29,7 @@ enum class Searchflags {
|
||||||
IGNORECASE = 1,
|
IGNORECASE = 1,
|
||||||
REGEX = 2,
|
REGEX = 2,
|
||||||
|
|
||||||
//ideen: nach sender filtern, nur nachrichten mit medien, nur nachrichten ohne medien, medien Dateinamen, nach datum filtern
|
//ideen: nach sender filtern, nur nachrichten mit medien, nur nachrichten ohne medien, medien Dateinamen, nach datum filtern, service messages? (joined, kicked, invited,...), inverted (not conatain)
|
||||||
};
|
};
|
||||||
|
|
||||||
Searchflags operator|=(Searchflags& lhs, const Searchflags sf);
|
Searchflags operator|=(Searchflags& lhs, const Searchflags sf);
|
||||||
|
@ -45,8 +49,8 @@ public:
|
||||||
void finalize(); //stop adding files and finalize deduplication, could be called twice, but then a deduplication is not guaranteed
|
void finalize(); //stop adding files and finalize deduplication, could be called twice, but then a deduplication is not guaranteed
|
||||||
|
|
||||||
std::list<const Message*> search(std::string text, Searchflags flags = Searchflags::NONE) const;
|
std::list<const Message*> search(std::string text, Searchflags flags = Searchflags::NONE) const;
|
||||||
const std::string& getChatname(uint64_t id) const;
|
const std::string& getChatname(int64_t id) const;
|
||||||
std::string getShortChatname(uint64_t id) const;
|
std::string getShortChatname(int64_t id) const;
|
||||||
|
|
||||||
uint32_t getChatCount() const;
|
uint32_t getChatCount() const;
|
||||||
uint64_t getMessageCount() const;
|
uint64_t getMessageCount() const;
|
||||||
|
@ -56,9 +60,9 @@ private:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void runsearch(T st, bool (*checker)(const std::string& msg, T text), std::list<const Message*>& out) const;
|
void runsearch(T st, bool (*checker)(const std::string& msg, T text), std::list<const Message*>& out) const;
|
||||||
|
|
||||||
void loadMessages(const json& j, uint64_t chatid);
|
void loadMessages(const json& j, int64_t chatid);
|
||||||
|
|
||||||
std::vector<Message> msgs;
|
std::vector<Message> msgs;
|
||||||
std::set<Message> deduplicate; //intermediate store, for reading files and deduplicate them
|
std::set<Message> deduplicate; //intermediate store, for reading files and deduplicate them
|
||||||
std::map<uint64_t, std::string> chatnames;
|
std::map<int64_t, std::string> chatnames;
|
||||||
};
|
};
|
Loading…
Reference in New Issue