#include #include #include #include #include #include "readlog.h" #include "linecount.h" #include "relations.h" #include "output.h" bool relation::operator<(const struct relation &other) const { if (this->referrer < other.referrer) return true; else if (this->referrer > other.referrer) return false; else return this->referred < other.referred; } bool cmp_caseinsensitive(char c1, char c2) { return toupper(c1) == toupper(c2); } std::string::size_type findi(std::string haystack, std::string needle) { std::string::const_iterator pos; pos = search(haystack.begin(), haystack.end(), needle.begin(), needle.end(), cmp_caseinsensitive); if (pos == haystack.end()) { return std::string::npos; } else { return pos - haystack.begin(); } } void get_simple_relations(std::map &relations, const std::set &usenicks, const std::vector &lines, const struct graphparam &pars) { struct relation cur; struct person speaker; std::vector::const_iterator lineiter; std::set::const_iterator worditer; for (lineiter = lines.begin(); lineiter != lines.end(); lineiter++) { speaker.nick = lineiter->nick; if (usenicks.find(speaker) == usenicks.end()) continue; for (worditer = pars.words.begin(); worditer != pars.words.end(); worditer++) { if (findi(lineiter->message, *worditer) == std::string::npos) continue; // Not found cur.referrer = lineiter->nick; cur.referred = *worditer; relations[cur] += 1; } } } void get_relations(std::map &relations, const std::set &usenicks, const std::vector &lines, const struct graphparam &pars) { struct logline prevline = {0, normal, "", ""}; struct relation cur; struct person speaker; std::vector::const_iterator lineiter; std::set::const_iterator nickiter; std::string::size_type pos; for (lineiter = lines.begin(); lineiter != lines.end(); lineiter++) { speaker.nick = lineiter->nick; if (usenicks.find(speaker) == usenicks.end()) continue; for (nickiter = usenicks.begin(); nickiter != usenicks.end(); nickiter++) { if (nickiter->nick == lineiter->nick) continue; pos = findi(lineiter->message, nickiter->nick); if (pos == std::string::npos) continue; cur.referrer = lineiter->nick; cur.referred = nickiter->nick; if (pos < 3) // add more for hilighting in the beginning of the line relations[cur] += 10; else relations[cur] += 3; } if (pars.context) { if (abs(prevline.timestamp - lineiter->timestamp) < 120 && lineiter->nick != prevline.nick) { cur.referrer = lineiter->nick; cur.referred = prevline.nick; relations[cur] += 1; } } prevline = *lineiter; } }