~singpolyma/biboumi

ref: 24f2511d7ba105d65c9684dd5606a57c5af95445 biboumi/src/irc/iid.cpp -rw-r--r-- 2.7 KiB
24f2511d — louiz’ In fixed mode, fix the iid type of the component JID 6 years ago
                                                                                
5402a256 louiz’
7c1a3899 Florent Le Coz
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
bf7b05ef Florent Le Coz
0391f17f Emmanuel Gil Peyrot
b2922560 louiz’
5402a256 louiz’
ccb4ee09 louiz’
5402a256 louiz’
bf7b05ef Florent Le Coz
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
7c1a3899 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
24f2511d louiz’
f653906f louiz’
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
7c1a3899 Florent Le Coz
0391f17f Emmanuel Gil Peyrot
7c1a3899 Florent Le Coz
bf7b05ef Florent Le Coz
a418b6ed Florent Le Coz
0391f17f Emmanuel Gil Peyrot
7c1a3899 Florent Le Coz
a418b6ed Florent Le Coz
7c1a3899 Florent Le Coz
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
f653906f louiz’
0d2dd71d louiz’
2df0ebf2 Florent Le Coz
0d2dd71d louiz’
7c1a3899 Florent Le Coz
a418b6ed Florent Le Coz
2d11a5f4 louiz’
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <utility>
#include <utils/tolower.hpp>
#include <config/config.hpp>
#include <bridge/bridge.hpp>
#include <irc/iid.hpp>

#include <utils/encoding.hpp>

constexpr char Iid::separator[];

Iid::Iid(std::string local, std::string server, Iid::Type type):
        type(type),
        local(std::move(local)),
        server(std::move(server))
{
}

Iid::Iid(const std::string& iid, const std::set<char>& chantypes)
{
  this->init(iid);
  this->set_type(std::set<char>(chantypes));
}

Iid::Iid(const std::string& iid, const std::initializer_list<char>& chantypes):
    Iid(iid, std::set<char>(chantypes))
{
}

Iid::Iid(const std::string& iid, const Bridge *bridge)
{
  this->init(iid);
  const auto chantypes = bridge->get_chantypes(this->server);
  this->set_type(chantypes);
}

void Iid::set_type(const std::set<char>& chantypes)
{
  if (this->local.empty() && (
      !Config::get("fixed_irc_server", "").empty() || this->server.empty()))
    this->type = Iid::Type::None;
  if (this->local.empty())
    return;
  if (chantypes.count(this->local[0]) == 1)
    this->type = Iid::Type::Channel;
  else
    this->type = Iid::Type::User;
}

void Iid::init(const std::string& iid)
{
  const std::string fixed_irc_server = Config::get("fixed_irc_server", "");

  if (fixed_irc_server.empty())
  {
    const std::string::size_type sep = iid.find('%');
    if (sep != std::string::npos)
    {
      this->set_local(iid.substr(0, sep));
      this->set_server(iid.substr(sep + 1));
      this->type = Iid::Type::Channel;
    }
    else
    {
      this->set_server(iid);
      this->type = Iid::Type::Server;
    }
  }
  else
  {
    this->set_server(fixed_irc_server);
    this->set_local(iid);
  }
}

void Iid::set_local(const std::string& loc)
{
  std::string local(utils::tolower(loc));
  xep0106::decode(local);
  this->local = local;
}

void Iid::set_server(const std::string& serv)
{
  this->server = utils::tolower(serv);
}

const std::string& Iid::get_local() const
{
  return this->local;
}

const std::string Iid::get_encoded_local() const
{
  std::string local(this->local);
  xep0106::encode(local);
  return local;
}

const std::string& Iid::get_server() const
{
  return this->server;
}

namespace std {
  const std::string to_string(const Iid& iid)
  {
    if (Config::get("fixed_irc_server", "").empty())
    {
      if (iid.type == Iid::Type::Server)
        return iid.get_server();
      else if (iid.get_local().empty() && iid.get_server().empty())
        return {};
      else
        return iid.get_encoded_local() + iid.separator + iid.get_server();
    }
    else
      return iid.get_encoded_local();
  }
}

std::tuple<std::string, std::string> Iid::to_tuple() const
{
  return std::make_tuple(this->get_local(), this->get_server());
}