#ifndef IRCCLIENT_HPP #define IRCCLIENT_HPP #include #include #include #include #include #include #include #include #include #include #include "IRCParser.hpp" #include "handler.hpp" class irc_client { public: typedef std::deque< std::string > irc_message_queue; typedef std::map > irc_callbacks; //~ typedef boost::function irc_callback; irc_client(boost::asio::io_service &service, boost::asio::ip::tcp::resolver::iterator it, const std::string& user) : _io_service(service), _socket(service), _user(user), _state(connecting), got_motd(false) { add_callback("PING", handler); add_callback("PRIVMSG", handler); add_callback("NOTICE", handler); boost::asio::ip::tcp::endpoint ep = *it; _socket.async_connect(ep, boost::bind(&irc_client::handle_connect, this, boost::asio::placeholders::error, ++it)); } void add_callback(const std::string &cmd, irc_callback f) { callbacks[cmd].push_back(f); } void privmsg(const std::string &target, const std::string &msg); void notice(const std::string &target, const std::string &msg); void ctcp_req(const std::string &target, const std::string &msg); void ctcp_reply(const std::string &target, const std::string &msg); /* send a raw message */ void write(std::string &msg); static std::string get_nick(const std::string &ident) { std::string result; size_t f; f = ident.find_first_of("@!"); if(f != std::string::npos) { result.assign(ident, 0, f); return result; } return ident; } private: enum irc_state { connecting, connected, disconnected }; void handle_connect(const boost::system::error_code &error, boost::asio::ip::tcp::resolver::iterator it); void handle_read(const boost::system::error_code &error, std::size_t bytes_transferred); void do_write(const std::string &msg); void handle_write(const boost::system::error_code &error); void do_close() { _socket.close(); } boost::asio::io_service &_io_service; boost::asio::ip::tcp::socket _socket; boost::asio::streambuf _in_msg; irc_message_queue _out_msgs; std::string _user; irc_state _state; bool got_motd; irc_callbacks callbacks; }; #endif