~singpolyma/biboumi

3cfaab9a2debe03829b1ff26fe94e775e1d18e0a — Florent Le Coz 9 years ago 5817a95
Map irc commands to callbacks, in a clean way
2 files changed, 28 insertions(+), 26 deletions(-)

M src/irc/irc_client.cpp
M src/irc/irc_client.hpp
M src/irc/irc_client.cpp => src/irc/irc_client.cpp +5 -25
@@ 74,31 74,11 @@ void IrcClient::parse_in_buffer()
      IrcMessage message(this->in_buf.substr(0, pos));
      this->in_buf = this->in_buf.substr(pos + 2, std::string::npos);
      std::cout << message << std::endl;
      // TODO map function and command name properly
      if (message.command == "PING")
        this->send_pong_command(message);
      else if (message.command == "NOTICE" ||
               message.command == "375" ||
               message.command == "372")
        this->forward_server_message(message);
      else if (message.command == "JOIN")
        this->on_channel_join(message);
      else if (message.command == "PRIVMSG")
        this->on_channel_message(message);
      else if (message.command == "353")
        this->set_and_forward_user_list(message);
      else if (message.command == "332")
        this->on_topic_received(message);
      else if (message.command == "366")
        this->on_channel_completely_joined(message);
      else if (message.command == "001")
        this->on_welcome_message(message);
      else if (message.command == "PART")
        this->on_part(message);
      else if (message.command == "QUIT")
        this->on_quit(message);
      else if (message.command == "NICK")
        this->on_nick(message);
      auto cb = irc_callbacks.find(message.command);
      if (cb != irc_callbacks.end())
        (this->*(cb->second))(message);
      else
        std::cout << "No handler for command " << message.command << std::endl;
    }
}


M src/irc/irc_client.hpp => src/irc/irc_client.hpp +23 -1
@@ 167,11 167,33 @@ private:
   */
  std::vector<std::string> channels_to_join;
  bool welcomed;

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

/**
 * Define a map of functions to be called for each IRC command we can
 * handle.
 */
typedef void (IrcClient::*irc_callback_t)(const IrcMessage&);

static const std::unordered_map<std::string, irc_callback_t> irc_callbacks = {
  {"NOTICE", &IrcClient::forward_server_message},
  {"375", &IrcClient::forward_server_message},
  {"372", &IrcClient::forward_server_message},
  {"JOIN", &IrcClient::on_channel_join},
  {"PRIVMSG", &IrcClient::on_channel_message},
  {"353", &IrcClient::set_and_forward_user_list},
  {"332", &IrcClient::on_topic_received},
  {"366", &IrcClient::on_channel_completely_joined},
  {"001", &IrcClient::on_welcome_message},
  {"PART", &IrcClient::on_part},
  {"QUIT", &IrcClient::on_quit},
  {"NICK", &IrcClient::on_nick},
  {"MODE", &IrcClient::on_mode},
  {"PING", &IrcClient::send_pong_command},
};

#endif // IRC_CLIENT_INCLUDED