~singpolyma/biboumi

fef9c8193ddf8cdf81978874be788af9441e2286 — Florent Le Coz 10 years ago 7701c90
Also set the role and affiliation of users already in the chan
3 files changed, 34 insertions(+), 35 deletions(-)

M src/bridge/bridge.cpp
M src/bridge/bridge.hpp
M src/irc/irc_client.cpp
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +24 -32
@@ 6,6 6,7 @@
#include <logger/logger.hpp>
#include <utils/split.hpp>
#include <iostream>
#include <tuple>

static const char* action_prefix = "\01ACTION ";
static const size_t action_prefix_len = 8;


@@ 21,6 22,22 @@ Bridge::~Bridge()
{
}

/**
 * Return the role and affiliation, corresponding to the given irc mode */
static std::tuple<std::string, std::string> get_role_affiliation_from_irc_mode(const char mode)
{
  if (mode == 'a' || mode == 'q')
    return std::make_tuple("moderator", "owner");
  else if (mode == 'o')
    return std::make_tuple("moderator", "admin");
  else if (mode == 'h')
    return std::make_tuple("moderator", "member");
  else if (mode == 'v')
    return std::make_tuple("participant", "member");
  else
    return std::make_tuple("participant", "none");
}

void Bridge::shutdown()
{
  for (auto it = this->irc_clients.begin(); it != this->irc_clients.end(); ++it)


@@ 197,15 214,13 @@ void Bridge::send_xmpp_message(const std::string& from, const std::string& autho
void Bridge::send_user_join(const std::string& hostname,
                            const std::string& chan_name,
                            const IrcUser* user,
                            const char user_mode,
                            const bool self)
{
  std::string affiliation = "participant";
  std::string role = "none";
  if (user->modes.find('o') != user->modes.end())
    {
      affiliation = "admin";
      role = "moderator";
    }
  std::string affiliation;
  std::string role;
  std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(user_mode);

  this->xmpp->send_user_join(chan_name + "%" + hostname, user->nick, user->host,
                             affiliation, role, this->user_jid, self);
}


@@ 237,30 252,7 @@ void Bridge::send_affiliation_role_change(const Iid& iid, const std::string& tar
{
  std::string role;
  std::string affiliation;
  if (mode == 0)
    {
      role = "participant";
      affiliation = "none";
    }
  else if (mode == 'a')
    {
      role = "moderator";
      affiliation = "owner";
    }
  else if (mode == 'o')
    {
      role = "moderator";
      affiliation = "admin";
    }
  else if (mode == 'h')
    {
      role = "moderator";
      affiliation = "member";
    }
  else if (mode == 'v')
    {
      role = "participant";
      affiliation = "member";
    }

  std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(mode);
  this->xmpp->send_affiliation_role_change(iid.chan + "%" + iid.server, target, affiliation, role, this->user_jid);
}

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +1 -0
@@ 68,6 68,7 @@ public:
  void send_user_join(const std::string& hostname,
                      const std::string& chan_name,
                      const IrcUser* user,
                      const char user_mode,
                      const bool self);
  /**
   * Send the topic of the MUC to the user

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +9 -3
@@ 247,7 247,9 @@ void IrcClient::set_and_forward_user_list(const IrcMessage& message)
      if (user->nick != channel->get_self()->nick)
        {
          log_debug("Adding user [" << nick << "] to chan " << chan_name);
          this->bridge->send_user_join(this->hostname, chan_name, user, false);
          this->bridge->send_user_join(this->hostname, chan_name, user,
                                       user->get_most_significant_mode(this->sorted_user_modes),
                                       false);
        }
      else
        {


@@ 270,7 272,9 @@ void IrcClient::on_channel_join(const IrcMessage& message)
  else
    {
      const IrcUser* user = channel->add_user(nick, this->prefix_to_mode);
      this->bridge->send_user_join(this->hostname, chan_name, user, false);
      this->bridge->send_user_join(this->hostname, chan_name, user,
                                   user->get_most_significant_mode(this->sorted_user_modes),
                                   false);
    }
}



@@ 334,7 338,9 @@ void IrcClient::on_channel_completely_joined(const IrcMessage& message)
{
  const std::string chan_name = utils::tolower(message.arguments[1]);
  IrcChannel* channel = this->get_channel(chan_name);
  this->bridge->send_user_join(this->hostname, chan_name, channel->get_self(), true);
  this->bridge->send_user_join(this->hostname, chan_name, channel->get_self(),
                               channel->get_self()->get_most_significant_mode(this->sorted_user_modes),
                               true);
  this->bridge->send_topic(this->hostname, chan_name, channel->topic);
}