// Smart ISON // // Douglas Thrift // // $Id$ #include #include #include #include #include #include "foreach.hpp" #pragma GCC diagnostic ignored "-Wshadow" namespace __gnu_cxx { template <> struct hash { size_t operator()(const CString &x) const { return __stl_hash_string(x.c_str()); } }; } namespace ext { using namespace __gnu_cxx; } class CSmartISON : public CModule { CString online_; public: MODCONSTRUCTOR(CSmartISON) {} virtual ~CSmartISON() {} virtual EModRet OnRaw(CString &line) { DEBUG("smart_ison: OnRaw() " << line.Token(1)); return CONTINUE; } virtual EModRet OnUserRaw(CString &line) { if (line.Token(0).Equals("ISON")) { ext::hash_set known; _foreach (std::vector, channel, GetUser()->GetChans()) { typedef std::map NickMap; _foreach (NickMap, nick, (*channel)->GetNicks()) known.insert(nick->first); } VCString nicks; line.Token(1, true).TrimLeft_n(":").Split(" ", nicks, false); CString online, unknown("ISON"); _foreach (VCString, nick, nicks) ((known.find(*nick) != known.end()) ? online : unknown) += " " + *nick; online_ = online.TrimLeft_n(" "); if (unknown != "ISON") line = unknown; } return CONTINUE; } }; MODULEDEFS(CSmartISON, "Smart ISON");