summaryrefslogtreecommitdiff
path: root/src/irc
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2016-06-21 23:15:25 +0100
committerEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2016-06-21 23:15:25 +0100
commit0391f17f999618decffaf3c9261024ab04a33f63 (patch)
treede11883022c2342200cbdf5593b8da5acff97a3e /src/irc
parent350d48a5bf2412f5eee347fc832d9257b2ba3fbc (diff)
downloadbiboumi-0391f17f999618decffaf3c9261024ab04a33f63.tar.gz
biboumi-0391f17f999618decffaf3c9261024ab04a33f63.tar.bz2
biboumi-0391f17f999618decffaf3c9261024ab04a33f63.tar.xz
biboumi-0391f17f999618decffaf3c9261024ab04a33f63.zip
Add XEP-0106 support to the bridge
This allows the user to join channels containing forbidden characters in the local part, like #r&d or #group/project.
Diffstat (limited to 'src/irc')
-rw-r--r--src/irc/iid.cpp19
-rw-r--r--src/irc/iid.hpp1
2 files changed, 16 insertions, 4 deletions
diff --git a/src/irc/iid.cpp b/src/irc/iid.cpp
index 66b66b7..0e2841e 100644
--- a/src/irc/iid.cpp
+++ b/src/irc/iid.cpp
@@ -3,6 +3,8 @@
#include <irc/iid.hpp>
+#include <utils/encoding.hpp>
+
Iid::Iid(const std::string& iid):
is_channel(false),
is_user(false)
@@ -59,7 +61,9 @@ Iid::Iid():
void Iid::set_local(const std::string& loc)
{
- this->local = utils::tolower(loc);
+ std::string local(utils::tolower(loc));
+ xep0106::decode(local);
+ this->local = local;
}
void Iid::set_server(const std::string& serv)
@@ -72,6 +76,13 @@ 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;
@@ -90,13 +101,13 @@ namespace std {
const std::string to_string(const Iid& iid)
{
if (Config::get("fixed_irc_server", "").empty())
- return iid.get_local() + iid.get_sep() + iid.get_server();
+ return iid.get_encoded_local() + iid.get_sep() + iid.get_server();
else
{
if (iid.get_sep() == "!")
- return iid.get_local() + iid.get_sep();
+ return iid.get_encoded_local() + iid.get_sep();
else
- return iid.get_local();
+ return iid.get_encoded_local();
}
}
}
diff --git a/src/irc/iid.hpp b/src/irc/iid.hpp
index 9747595..a55ae21 100644
--- a/src/irc/iid.hpp
+++ b/src/irc/iid.hpp
@@ -53,6 +53,7 @@ public:
void set_local(const std::string& loc);
void set_server(const std::string& serv);
const std::string& get_local() const;
+ const std::string get_encoded_local() const;
const std::string& get_server() const;
bool is_channel;