From a075517824da7e82e1be7b67d615834851482861 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Fri, 27 Dec 2013 17:42:48 +0100 Subject: Basic isupport support CHANMODES and PREFIX only --- src/irc/irc_client.cpp | 29 ++++++++++++++++++++++++++++- src/irc/irc_client.hpp | 21 +++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index 10a5b12..912ee45 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -16,7 +16,8 @@ IrcClient::IrcClient(const std::string& hostname, const std::string& username, B username(username), current_nick(username), bridge(bridge), - welcomed(false) + welcomed(false), + chanmodes({"", "", "", ""}) { } @@ -196,6 +197,32 @@ void IrcClient::forward_server_message(const IrcMessage& message) this->bridge->send_xmpp_message(this->hostname, from, body); } +void IrcClient::on_isupport_message(const IrcMessage& message) +{ + const size_t len = message.arguments.size(); + for (size_t i = 1; i < len; ++i) + { + const std::string token = message.arguments[i]; + if (token.substr(0, 10) == "CHANMODES=") + { + this->chanmodes = utils::split(token.substr(11), ','); + // make sure we have 4 strings + this->chanmodes.resize(4); + } + else if (token.substr(0, 7) == "PREFIX=") + { + size_t i = 8; // jump PREFIX=( + size_t j = 9; + // Find the ) char + while (j < token.size() && token[j] != ')') + j++; + j++; + while (j < token.size() && token[i] != ')') + this->prefix_to_mode[token[j++]] = token[i++]; + } + } +} + void IrcClient::send_gateway_message(const std::string& message, const std::string& from) { this->bridge->send_xmpp_message(this->hostname, from, message); diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp index eced4b6..a0258ee 100644 --- a/src/irc/irc_client.hpp +++ b/src/irc/irc_client.hpp @@ -8,7 +8,9 @@ #include #include +#include #include +#include class Bridge; @@ -109,6 +111,11 @@ public: * Forward the server message received from IRC to the XMPP component */ void forward_server_message(const IrcMessage& message); + /** + * When receiving the isupport informations. See + * http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt + */ + void on_isupport_message(const IrcMessage& message); /** * Just empty the motd we kept as a string */ @@ -208,11 +215,24 @@ private: */ std::vector channels_to_join; bool welcomed; + /** + * See http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt section 3.3 + * We store the possible chanmodes in this object. + * chanmodes[0] contains modes of type A, [1] of type B etc + */ + std::vector chanmodes; /** * Each motd line received is appended to this string, which we send when * the motd is completely received */ std::string motd; + /** + * See http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt section 3.14 + * The example given would be transformed into + * modes_to_prefix = {{'a', '&'}, {'b', '*'}} + */ + std::map prefix_to_mode; + IrcClient(const IrcClient&) = delete; IrcClient(IrcClient&&) = delete; IrcClient& operator=(const IrcClient&) = delete; @@ -229,6 +249,7 @@ static const std::unordered_map irc_callbacks = { {"NOTICE", &IrcClient::forward_server_message}, {"002", &IrcClient::forward_server_message}, {"003", &IrcClient::forward_server_message}, + {"005", &IrcClient::on_isupport_message}, {"RPL_MOTDSTART", &IrcClient::empty_motd}, {"375", &IrcClient::empty_motd}, {"RPL_MOTD", &IrcClient::on_motd_line}, -- cgit v1.2.3