Commit a0755178 authored by louiz’'s avatar louiz’

Basic isupport support

CHANMODES and PREFIX only
parent 43cc60e4
...@@ -16,7 +16,8 @@ IrcClient::IrcClient(const std::string& hostname, const std::string& username, B ...@@ -16,7 +16,8 @@ IrcClient::IrcClient(const std::string& hostname, const std::string& username, B
username(username), username(username),
current_nick(username), current_nick(username),
bridge(bridge), bridge(bridge),
welcomed(false) welcomed(false),
chanmodes({"", "", "", ""})
{ {
} }
...@@ -196,6 +197,32 @@ void IrcClient::forward_server_message(const IrcMessage& message) ...@@ -196,6 +197,32 @@ void IrcClient::forward_server_message(const IrcMessage& message)
this->bridge->send_xmpp_message(this->hostname, from, body); 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) void IrcClient::send_gateway_message(const std::string& message, const std::string& from)
{ {
this->bridge->send_xmpp_message(this->hostname, from, message); this->bridge->send_xmpp_message(this->hostname, from, message);
......
...@@ -8,7 +8,9 @@ ...@@ -8,7 +8,9 @@
#include <network/socket_handler.hpp> #include <network/socket_handler.hpp>
#include <unordered_map> #include <unordered_map>
#include <vector>
#include <string> #include <string>
#include <map>
class Bridge; class Bridge;
...@@ -109,6 +111,11 @@ public: ...@@ -109,6 +111,11 @@ public:
* Forward the server message received from IRC to the XMPP component * Forward the server message received from IRC to the XMPP component
*/ */
void forward_server_message(const IrcMessage& message); 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 * Just empty the motd we kept as a string
*/ */
...@@ -208,11 +215,24 @@ private: ...@@ -208,11 +215,24 @@ private:
*/ */
std::vector<std::string> channels_to_join; std::vector<std::string> channels_to_join;
bool welcomed; 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<std::string> chanmodes;
/** /**
* Each motd line received is appended to this string, which we send when * Each motd line received is appended to this string, which we send when
* the motd is completely received * the motd is completely received
*/ */
std::string motd; 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<char, char> prefix_to_mode;
IrcClient(const IrcClient&) = delete; IrcClient(const IrcClient&) = delete;
IrcClient(IrcClient&&) = delete; IrcClient(IrcClient&&) = delete;
IrcClient& operator=(const IrcClient&) = delete; IrcClient& operator=(const IrcClient&) = delete;
...@@ -229,6 +249,7 @@ static const std::unordered_map<std::string, irc_callback_t> irc_callbacks = { ...@@ -229,6 +249,7 @@ static const std::unordered_map<std::string, irc_callback_t> irc_callbacks = {
{"NOTICE", &IrcClient::forward_server_message}, {"NOTICE", &IrcClient::forward_server_message},
{"002", &IrcClient::forward_server_message}, {"002", &IrcClient::forward_server_message},
{"003", &IrcClient::forward_server_message}, {"003", &IrcClient::forward_server_message},
{"005", &IrcClient::on_isupport_message},
{"RPL_MOTDSTART", &IrcClient::empty_motd}, {"RPL_MOTDSTART", &IrcClient::empty_motd},
{"375", &IrcClient::empty_motd}, {"375", &IrcClient::empty_motd},
{"RPL_MOTD", &IrcClient::on_motd_line}, {"RPL_MOTD", &IrcClient::on_motd_line},
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment