#include #include #include #include #include IrcMessage::IrcMessage(std::stringstream ss) { if (ss.peek() == '@') { std::string raw_tags; ss.ignore(); ss >> raw_tags; std::vector tags = utils::split(raw_tags, ';', false); for (auto &tag: tags) { auto pos = tag.find('='); if (pos == std::string::npos) this->tags[tag] = {}; else this->tags[tag.substr(0, pos)] = tag.substr(pos+1); } ss.ignore(); } if (ss.peek() == ':') { ss.ignore(); ss >> this->prefix; } ss >> this->command; while (ss >> std::ws) { std::string arg; if (ss.peek() == ':') { ss.ignore(); std::getline(ss, arg); } else { ss >> arg; if (arg.empty()) break; } this->arguments.push_back(std::move(arg)); } } IrcMessage::IrcMessage(std::string&& prefix, std::string&& command, std::vector&& args): tags(), prefix(std::move(prefix)), command(std::move(command)), arguments(std::move(args)) { } IrcMessage::IrcMessage(std::string&& command, std::vector&& args): tags(), prefix(), command(std::move(command)), arguments(std::move(args)) { } IrcMessage::IrcMessage(std::unordered_map>&& tags, std::string&& prefix, std::string&& command, std::vector&& args): tags(std::move(tags)), prefix(std::move(prefix)), command(std::move(command)), arguments(std::move(args)) { } std::ostream& operator<<(std::ostream& os, const IrcMessage& message) { os << "IrcMessage"; os << "{"; for (auto& tag: message.tags) { os << tag.first; if (tag.second.has_value()) os << "=" << tag.second.value(); os << ";"; } os << "}[" << message.command << "]"; for (const std::string& arg: message.arguments) { os << "{" << arg << "}"; } if (!message.prefix.empty()) os << "(from: " << message.prefix << ")"; return os; }