~singpolyma/biboumi

ref: bb596582bd2d8b9aab3fe08e76a7d24d82bf614a biboumi/src/irc/irc_channel.cpp -rw-r--r-- 1.5 KiB
bb596582 — louiz’ Add a <item/> node in the presence of a leaving participant 4 years ago
                                                                                
bf7b05ef Florent Le Coz
2d11a5f4 louiz’
bf7b05ef Florent Le Coz
3079c38d louiz’
bf7b05ef Florent Le Coz
3079c38d louiz’
bf7b05ef Florent Le Coz
acf769d8 Florent Le Coz
720e31a5 Florent Le Coz
bf7b05ef Florent Le Coz
3079c38d louiz’
bf7b05ef Florent Le Coz
3079c38d louiz’
bf7b05ef Florent Le Coz
7c671499 Florent Le Coz
e840704b Florent Le Coz
7c671499 Florent Le Coz
bb596582 louiz’
7c671499 Florent Le Coz
bb596582 louiz’
57263961 louiz’
3079c38d louiz’
57263961 louiz’
3079c38d louiz’
bb596582 louiz’
3079c38d louiz’
7c671499 Florent Le Coz
020325db Florent Le Coz
5739d418 Florent Le Coz
3079c38d louiz’
bb596582 louiz’
5739d418 Florent Le Coz
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
#include <irc/irc_channel.hpp>
#include <algorithm>

void IrcChannel::set_self(IrcUser* user)
{
  this->self = user;
}

IrcUser* IrcChannel::add_user(const std::string& name,
                              const std::map<char, char>& prefix_to_mode)
{
  auto new_user = std::make_unique<IrcUser>(name, prefix_to_mode);
  auto old_user = this->find_user(new_user->nick);
  if (old_user)
    return old_user;
  this->users.emplace_back(std::move(new_user));
  return this->users.back().get();
}

IrcUser* IrcChannel::get_self() const
{
  return this->self;
}

IrcUser* IrcChannel::find_user(const std::string& name) const
{
  IrcUser user(name);
  for (const auto& u: this->users)
    {
      if (u->nick == user.nick)
        return u.get();
    }
  return nullptr;
}

std::unique_ptr<IrcUser> IrcChannel::remove_user(const IrcUser* user)
{
  std::unique_ptr<IrcUser> result{};
  const auto nick = user->nick;
  const bool is_self = (user == this->self);
  const auto it = std::find_if(this->users.begin(), this->users.end(),
                               [nick](const std::unique_ptr<IrcUser>& u)
                               {
                                 return nick == u->nick;
                               });
  if (it != this->users.end())
    {
      result = std::move(*it);
      this->users.erase(it);
      if (is_self)
        {
          this->self = nullptr;
          this->joined = false;
        }
    }
}

void IrcChannel::remove_all_users()
{
  this->users.clear();
  this->self = nullptr;
  return result;
}