Commit 10d52871 authored by louiz’'s avatar louiz’

Handle private messages, both ways

parent 7ba2d0fb
...@@ -87,6 +87,15 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body) ...@@ -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); 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) void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message)
{ {
IrcClient* irc = this->get_irc_client(iid.server); IrcClient* irc = this->get_irc_client(iid.server);
...@@ -94,18 +103,19 @@ void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message) ...@@ -94,18 +103,19 @@ void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message)
irc->send_part_command(iid.chan, 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) if (utf8_body.substr(0, action_prefix_len) == action_prefix)
{ // Special case for ACTION (/me) messages: { // Special case for ACTION (/me) messages:
// "\01ACTION goes out\01" == "/me goes out" // "\01ACTION goes out\01" == "/me goes out"
this->xmpp->send_muc_message(iid.chan + "%" + iid.server, nick, utf8_body = std::string("/me ") +
std::string("/me ") + utf8_body.substr(action_prefix_len, utf8_body.size() - action_prefix_len - 1), utf8_body.substr(action_prefix_len, utf8_body.size() - action_prefix_len - 1);
this->user_jid);
} }
else if (muc)
this->xmpp->send_muc_message(iid.chan + "%" + iid.server, nick, utf8_body, this->user_jid); 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) void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, std::string&& message, const bool self)
......
...@@ -32,6 +32,7 @@ public: ...@@ -32,6 +32,7 @@ public:
void join_irc_channel(const Iid& iid, const std::string& username); void join_irc_channel(const Iid& iid, const std::string& username);
void send_channel_message(const Iid& iid, const std::string& body); 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); void leave_irc_channel(Iid&& iid, std::string&& status_message);
/*** /***
...@@ -60,7 +61,7 @@ public: ...@@ -60,7 +61,7 @@ public:
/** /**
* Send a MUC message from some participant * 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 * Send an unavailable presence from this participant
*/ */
......
...@@ -147,6 +147,11 @@ bool IrcClient::send_channel_message(const std::string& chan_name, const std::st ...@@ -147,6 +147,11 @@ bool IrcClient::send_channel_message(const std::string& chan_name, const std::st
return true; 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) void IrcClient::send_part_command(const std::string& chan_name, const std::string& status_message)
{ {
IrcChannel* channel = this->get_channel(chan_name); IrcChannel* channel = this->get_channel(chan_name);
...@@ -211,7 +216,13 @@ void IrcClient::on_channel_message(const IrcMessage& message) ...@@ -211,7 +216,13 @@ void IrcClient::on_channel_message(const IrcMessage& message)
iid.chan = message.arguments[0]; iid.chan = message.arguments[0];
iid.server = this->hostname; iid.server = this->hostname;
const std::string body = message.arguments[1]; 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) void IrcClient::on_topic_received(const IrcMessage& message)
......
...@@ -75,6 +75,10 @@ public: ...@@ -75,6 +75,10 @@ public:
* Return true if the message was actually sent * Return true if the message was actually sent
*/ */
bool send_channel_message(const std::string& chan_name, const std::string& body); 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 * Send the PART irc command
*/ */
......
...@@ -188,6 +188,11 @@ void XmppComponent::handle_message(const Stanza& stanza) ...@@ -188,6 +188,11 @@ void XmppComponent::handle_message(const Stanza& stanza)
if (body && !body->get_inner().empty()) if (body && !body->get_inner().empty())
bridge->send_channel_message(iid, body->get_inner()); 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) Bridge* XmppComponent::get_user_bridge(const std::string& user_jid)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment