irc_channel.hpp 2.08 KB
Newer Older
1 2 3 4 5 6 7
#ifndef IRC_CHANNEL_INCLUDED
# define IRC_CHANNEL_INCLUDED

#include <irc/irc_user.hpp>
#include <memory>
#include <string>
#include <vector>
8
#include <map>
9 10 11 12 13 14 15 16 17 18 19 20 21 22

/**
 * Keep the state of a joined channel (the list of occupants with their
 * informations (mode, etc), the modes, etc)
 */
class IrcChannel
{
public:
  explicit IrcChannel();

  bool joined;
  std::string topic;
  void set_self(const std::string& name);
  IrcUser* get_self() const;
23 24
  IrcUser* add_user(const std::string& name,
                    const std::map<char, char> prefix_to_mode);
25
  IrcUser* find_user(const std::string& name) const;
louiz’'s avatar
louiz’ committed
26
  void remove_user(const IrcUser* user);
louiz’'s avatar
louiz’ committed
27
  void remove_all_users();
28

louiz’'s avatar
louiz’ committed
29
protected:
30 31
  std::unique_ptr<IrcUser> self;
  std::vector<std::unique_ptr<IrcUser>> users;
louiz’'s avatar
louiz’ committed
32 33

private:
34 35 36 37 38 39
  IrcChannel(const IrcChannel&) = delete;
  IrcChannel(IrcChannel&&) = delete;
  IrcChannel& operator=(const IrcChannel&) = delete;
  IrcChannel& operator=(IrcChannel&&) = delete;
};

louiz’'s avatar
louiz’ committed
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 68
/**
 * A special channel that is not actually linked to any real irc
 * channel. This is just a channel representing a connection to the
 * server. If an user wants to maintain the connection to the server without
 * having to be on any irc channel of that server, he can just join this
 * dummy channel.
 * It’s not actually dummy because it’s useful and it does things, but well.
 */
class DummyIrcChannel: public IrcChannel
{
public:
  explicit DummyIrcChannel();

  /**
   * This flag is at true whenever the user wants to join this channel, but
   * he is not yet connected to the server. When the connection is made, we
   * check that flag and if it’s true, we inform the user that he has just
   * joined that channel.
   * If the user is already connected to the server when he tries to join
   * the channel, we don’t use that flag, we just join it immediately.
   */
  bool joining;
private:
  DummyIrcChannel(const DummyIrcChannel&) = delete;
  DummyIrcChannel(DummyIrcChannel&&) = delete;
  DummyIrcChannel& operator=(const DummyIrcChannel&) = delete;
  DummyIrcChannel& operator=(DummyIrcChannel&&) = delete;
};

69
#endif // IRC_CHANNEL_INCLUDED