~singpolyma/biboumi

10d528717723a72dd3240c634980a461cf9fa2df — Florent Le Coz 9 years ago 7ba2d0f
Handle private messages, both ways
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +16 -6
@@ 87,6 87,15 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body)
  this->xmpp->send_muc_message(iid.chan + "%" + iid.server, irc->get_own_nick(), body, this->user_jid);
}

void Bridge::send_private_message(const Iid& iid, const std::string& body)
{
  if (iid.chan.empty() || iid.server.empty())
    return ;
  IrcClient* irc = this->get_irc_client(iid.server);
  if (irc)
    irc->send_private_message(iid.chan, body);
}

void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message)
{
  IrcClient* irc = this->get_irc_client(iid.server);


@@ 94,18 103,19 @@ void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message)
    irc->send_part_command(iid.chan, status_message);
}

void Bridge::send_muc_message(const Iid& iid, const std::string& nick, const std::string& body)
void Bridge::send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc)
{
  const std::string& utf8_body = this->sanitize_for_xmpp(body);
  std::string utf8_body = this->sanitize_for_xmpp(body);
  if (utf8_body.substr(0, action_prefix_len) == action_prefix)
    { // Special case for ACTION (/me) messages:
      // "\01ACTION goes out\01" == "/me goes out"
      this->xmpp->send_muc_message(iid.chan + "%" + iid.server, nick,
        std::string("/me ") + utf8_body.substr(action_prefix_len, utf8_body.size() - action_prefix_len - 1),
        this->user_jid);
      utf8_body = std::string("/me ") +
        utf8_body.substr(action_prefix_len, utf8_body.size() - action_prefix_len - 1);
    }
  else
  if (muc)
    this->xmpp->send_muc_message(iid.chan + "%" + iid.server, nick, utf8_body, this->user_jid);
  else
    this->xmpp->send_message(iid.chan + "%" + iid.server, utf8_body, this->user_jid);
}

void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, std::string&& message, const bool self)

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +2 -1
@@ 32,6 32,7 @@ public:

  void join_irc_channel(const Iid& iid, const std::string& username);
  void send_channel_message(const Iid& iid, const std::string& body);
  void send_private_message(const Iid& iid, const std::string& body);
  void leave_irc_channel(Iid&& iid, std::string&& status_message);

  /***


@@ 60,7 61,7 @@ public:
  /**
   * Send a MUC message from some participant
   */
  void send_muc_message(const Iid& iid, const std::string& nick, const std::string& body);
  void send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc);
  /**
   * Send an unavailable presence from this participant
   */

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +12 -1
@@ 147,6 147,11 @@ bool IrcClient::send_channel_message(const std::string& chan_name, const std::st
  return true;
}

void IrcClient::send_private_message(const std::string& username, const std::string& body)
{
  this->send_message(IrcMessage("PRIVMSG", {username, body}));
}

void IrcClient::send_part_command(const std::string& chan_name, const std::string& status_message)
{
  IrcChannel* channel = this->get_channel(chan_name);


@@ 211,7 216,13 @@ void IrcClient::on_channel_message(const IrcMessage& message)
  iid.chan = message.arguments[0];
  iid.server = this->hostname;
  const std::string body = message.arguments[1];
  this->bridge->send_muc_message(iid, nick, body);
  bool muc = true;
  if (!this->get_channel(iid.chan)->joined)
    {
      iid.chan = nick;
      muc = false;
    }
  this->bridge->send_message(iid, nick, body, muc);
}

void IrcClient::on_topic_received(const IrcMessage& message)

M src/irc/irc_client.hpp => src/irc/irc_client.hpp +4 -0
@@ 76,6 76,10 @@ public:
   */
  bool send_channel_message(const std::string& chan_name, const std::string& body);
  /**
   * Send a PRIVMSG command for an user
   */
  void send_private_message(const std::string& username, const std::string& body);
  /**
   * Send the PART irc command
   */
  void send_part_command(const std::string& chan_name, const std::string& status_message);

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +5 -0
@@ 188,6 188,11 @@ void XmppComponent::handle_message(const Stanza& stanza)
        if (body && !body->get_inner().empty())
          bridge->send_channel_message(iid, body->get_inner());
    }
  else
    {
      if (body && !body->get_inner().empty())
        bridge->send_private_message(iid, body->get_inner());
    }
}

Bridge* XmppComponent::get_user_bridge(const std::string& user_jid)