Map irc commands to callbacks, in a clean way
This commit is contained in:
+5
-25
@@ -74,31 +74,11 @@ void IrcClient::parse_in_buffer()
|
|||||||
IrcMessage message(this->in_buf.substr(0, pos));
|
IrcMessage message(this->in_buf.substr(0, pos));
|
||||||
this->in_buf = this->in_buf.substr(pos + 2, std::string::npos);
|
this->in_buf = this->in_buf.substr(pos + 2, std::string::npos);
|
||||||
std::cout << message << std::endl;
|
std::cout << message << std::endl;
|
||||||
// TODO map function and command name properly
|
auto cb = irc_callbacks.find(message.command);
|
||||||
if (message.command == "PING")
|
if (cb != irc_callbacks.end())
|
||||||
this->send_pong_command(message);
|
(this->*(cb->second))(message);
|
||||||
else if (message.command == "NOTICE" ||
|
else
|
||||||
message.command == "375" ||
|
std::cout << "No handler for command " << message.command << std::endl;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-1
@@ -167,11 +167,33 @@ private:
|
|||||||
*/
|
*/
|
||||||
std::vector<std::string> channels_to_join;
|
std::vector<std::string> channels_to_join;
|
||||||
bool welcomed;
|
bool welcomed;
|
||||||
|
|
||||||
IrcClient(const IrcClient&) = delete;
|
IrcClient(const IrcClient&) = delete;
|
||||||
IrcClient(IrcClient&&) = delete;
|
IrcClient(IrcClient&&) = delete;
|
||||||
IrcClient& operator=(const IrcClient&) = delete;
|
IrcClient& operator=(const IrcClient&) = delete;
|
||||||
IrcClient& operator=(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
|
#endif // IRC_CLIENT_INCLUDED
|
||||||
|
|||||||
Reference in New Issue
Block a user