irc_client.hpp 1.65 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
#ifndef IRC_CLIENT_INCLUDED
# define IRC_CLIENT_INCLUDED

#include <network/socket_handler.hpp>

#include <string>

/**
 * Represent one IRC client, i.e. an endpoint connected to a single IRC
 * server, through a TCP socket, receiving and sending commands to it.
 *
 * TODO: TLS support, maybe, but that's not high priority
 */
class IrcClient: public SocketHandler
{
public:
  explicit IrcClient();
  ~IrcClient();
  /**
   * We read the data, try to parse it and generate some event if
   * one or more full message is available.
   */
  void on_recv();
  /**
   * Just write as much data as possible on the socket.
   */
  void on_send();
  socket_t get_socket() const;
  /**
   * Connect to the remote server
   */
  void connect(const std::string& address, const std::string& port);
  /**
   * Close the connection, remove us from the poller
   */
  void close();
  /**
   * Called when we detect an orderly close by the remote endpoint.
   */
  void on_connection_close();
  /**
   * Parse the data we have received so far and try to get one or more
   * complete messages from it.
   */
  void parse_in_buffer();

private:
  socket_t socket;
  /**
   * Where data read from the socket is added, until we can parse a whole
   * IRC message, the used data is then removed from that buffer.
   *
   * TODO: something more efficient than a string.
   */
  std::string in_buf;
  /**
   * Where data is added, when we want to send something to the client.
   */
  std::string out_buf;

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

#endif // IRC_CLIENT_INCLUDED