Handle private messages, both ways
This commit is contained in:
+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);
|
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)
|
|||||||
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:
|
|||||||
|
|
||||||
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:
|
|||||||
/**
|
/**
|
||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|||||||
+12
-1
@@ -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)
|
|||||||
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:
|
|||||||
* 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)
|
|||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user