~singpolyma/biboumi

ref: 0391f17f999618decffaf3c9261024ab04a33f63 biboumi/src/irc/iid.cpp -rw-r--r-- 2.4 KiB
0391f17f — Emmanuel Gil Peyrot Add XEP-0106 support to the bridge 7 years ago
                                                                                
7c1a3899 Florent Le Coz
2df0ebf2 Florent Le Coz
7c1a3899 Florent Le Coz
bf7b05ef Florent Le Coz
0391f17f Emmanuel Gil Peyrot
7c1a3899 Florent Le Coz
bf7b05ef Florent Le Coz
2df0ebf2 Florent Le Coz
7c1a3899 Florent Le Coz
bf7b05ef Florent Le Coz
7c1a3899 Florent Le Coz
bf7b05ef Florent Le Coz
7c1a3899 Florent Le Coz
2df0ebf2 Florent Le Coz
c307df85 Florent Le Coz
2df0ebf2 Florent Le Coz
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
0391f17f Emmanuel Gil Peyrot
2df0ebf2 Florent Le Coz
0391f17f Emmanuel Gil Peyrot
2df0ebf2 Florent Le Coz
0391f17f Emmanuel Gil Peyrot
2df0ebf2 Florent Le Coz
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
#include <utils/tolower.hpp>
#include <config/config.hpp>

#include <irc/iid.hpp>

#include <utils/encoding.hpp>

Iid::Iid(const std::string& iid):
  is_channel(false),
  is_user(false)
{
  const std::string fixed_irc_server = Config::get("fixed_irc_server", "");
  if (fixed_irc_server.empty())
    this->init(iid);
  else
    this->init_with_fixed_server(iid, fixed_irc_server);
}


void Iid::init(const std::string& iid)
{
  const std::string::size_type sep = iid.find_first_of("%!");
  if (sep != std::string::npos)
    {
      if (iid[sep] == '%')
        this->is_channel = true;
      else
        this->is_user = true;
      this->set_local(iid.substr(0, sep));
      this->set_server(iid.substr(sep + 1));
    }
  else
    this->set_server(iid);
}

void Iid::init_with_fixed_server(const std::string& iid, const std::string& hostname)
{
  this->set_server(hostname);

  const std::string::size_type sep = iid.find("!");

  // Without any separator, we consider that it's a channel
  if (sep == std::string::npos)
    {
      this->is_channel = true;
      this->set_local(iid);
    }
  else // A separator can be present to differenciate a channel from a user,
       // but the part behind it (the hostname) is ignored
    {
      this->set_local(iid.substr(0, sep));
        this->is_user = true;
    }
}

Iid::Iid():
  is_channel(false),
  is_user(false)
{
}

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;
}

std::string Iid::get_sep() const
{
  if (this->is_channel)
    return "%";
  else if (this->is_user)
    return "!";
  return "";
}

namespace std {
  const std::string to_string(const Iid& iid)
  {
    if (Config::get("fixed_irc_server", "").empty())
      return iid.get_encoded_local() + iid.get_sep() + iid.get_server();
    else
      {
        if (iid.get_sep() == "!")
          return iid.get_encoded_local() + iid.get_sep();
        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());
}