~singpolyma/biboumi

a38b17692e0297cbd5d719f059bd0a1b6ef39fe4 — Florent Le Coz 6 years ago dfcb0a6
Support multi-prefix

See http://ircv3.net/specs/extensions/multi-prefix-3.1.html
ref #3103
3 files changed, 26 insertions(+), 5 deletions(-)

M src/irc/irc_client.cpp
M src/irc/irc_user.cpp
M tests/iid.cpp
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
 */