M src/irc/irc_client.cpp => src/irc/irc_client.cpp +3 -0
@@ 151,6 151,9 @@ void IrcClient::on_connected()
}
}
+ this->send_message({"CAP", {"REQ", "multi-prefix"}});
+ this->send_message({"CAP", {"END"}});
+
#ifdef USE_DATABASE
auto options = Database::get_irc_server_options(this->bridge.get_bare_jid(),
this->get_hostname());
M src/irc/irc_user.cpp => src/irc/irc_user.cpp +14 -4
@@ 7,8 7,20 @@ IrcUser::IrcUser(const std::string& name,
{
if (name.empty())
return ;
- const std::map<char, char>::const_iterator prefix = prefix_to_mode.find(name[0]);
- const std::string::size_type name_begin = prefix == prefix_to_mode.end()? 0: 1;
+
+ // One or more prefix (with multi-prefix support) may come before the
+ // actual nick
+ std::string::size_type name_begin = 0;
+ while (name_begin != name.size())
+ {
+ const auto prefix = prefix_to_mode.find(name[name_begin]);
+ // This is not a prefix
+ if (prefix == prefix_to_mode.end())
+ break;
+ this->modes.insert(prefix->second);
+ name_begin++;
+ }
+
const std::string::size_type sep = name.find("!", name_begin);
if (sep == std::string::npos)
this->nick = name.substr(name_begin);
@@ 17,8 29,6 @@ IrcUser::IrcUser(const std::string& name,
this->nick = name.substr(name_begin, sep-name_begin);
this->host = name.substr(sep+1);
}
- if (prefix != prefix_to_mode.end())
- this->modes.insert(prefix->second);
}
IrcUser::IrcUser(const std::string& name):
M tests/iid.cpp => tests/iid.cpp +9 -1
@@ 8,7 8,6 @@
TEST_CASE("Irc user parsing")
{
const std::map<char, char> prefixes{{'!', 'a'}, {'@', 'o'}};
-
IrcUser user1("!nick!~some@host.bla", prefixes);
CHECK(user1.nick == "nick");
CHECK(user1.host == "~some@host.bla");
@@ 22,6 21,15 @@ TEST_CASE("Irc user parsing")
CHECK(user2.modes.find('a') == user2.modes.end());
}
+TEST_CASE("multi-prefix")
+{
+ const std::map<char, char> prefixes{{'!', 'a'}, {'@', 'o'}, {'~', 'f'}};
+ IrcUser user("!@~nick", prefixes);
+ CHECK(user.nick == "nick");
+ CHECK(user.modes.size() == 3);
+ CHECK(user.modes.find('f') != user.modes.end());
+}
+
/**
* Let Catch know how to display Iid objects
*/