~singpolyma/biboumi

a075517824da7e82e1be7b67d615834851482861 — Florent Le Coz 9 years ago 43cc60e
Basic isupport support

CHANMODES and PREFIX only
2 files changed, 49 insertions(+), 1 deletions(-)

M src/irc/irc_client.cpp
M src/irc/irc_client.hpp
M src/irc/irc_client.cpp => src/irc/irc_client.cpp +28 -1
@@ 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);

M src/irc/irc_client.hpp => src/irc/irc_client.hpp +21 -0
@@ 8,7 8,9 @@
#include <network/socket_handler.hpp>

#include <unordered_map>
#include <vector>
#include <string>
#include <map>

class Bridge;



@@ 110,6 112,11 @@ public:
   */
  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
   */
  void empty_motd(const IrcMessage& message);


@@ 209,10 216,23 @@ private:
  std::vector<std::string> 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<std::string> 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<char, char> prefix_to_mode;

  IrcClient(const IrcClient&) = delete;
  IrcClient(IrcClient&&) = delete;
  IrcClient& operator=(const IrcClient&) = delete;


@@ 229,6 249,7 @@ static const std::unordered_map<std::string, irc_callback_t> 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},