Reflect messages to XMPP only when they are actually sent

This commit is contained in:
louiz’
2018-07-24 23:16:14 +02:00
parent a43fb352c8
commit 7a4cea426d
4 changed files with 46 additions and 26 deletions
+14 -7
View File
@@ -398,8 +398,10 @@ void IrcClient::parse_in_buffer(const size_t)
}
}
void IrcClient::actual_send(const IrcMessage& message)
void IrcClient::actual_send(std::pair<IrcMessage, MessageCallback> message_pair)
{
const IrcMessage& message = message_pair.first;
const MessageCallback& callback = message_pair.second;
log_debug("IRC SENDING: (", this->get_hostname(), ") ", message);
std::string res;
if (!message.prefix.empty())
@@ -417,14 +419,18 @@ void IrcClient::actual_send(const IrcMessage& message)
}
res += "\r\n";
this->send_data(std::move(res));
if (callback)
callback(this, message);
}
void IrcClient::send_message(IrcMessage message, bool throttle)
void IrcClient::send_message(IrcMessage message, MessageCallback callback, bool throttle)
{
auto message_pair = std::make_pair(std::move(message), std::move(callback));
if (this->tokens_bucket.use_token() || !throttle)
this->actual_send(message);
this->actual_send(std::move(message_pair));
else
message_queue.push_back(std::move(message));
message_queue.push_back(std::move(message_pair));
}
void IrcClient::send_raw(const std::string& txt)
@@ -475,7 +481,7 @@ void IrcClient::send_topic_command(const std::string& chan_name, const std::stri
void IrcClient::send_quit_command(const std::string& reason)
{
this->send_message(IrcMessage("QUIT", {reason}), false);
this->send_message(IrcMessage("QUIT", {reason}), {}, false);
}
void IrcClient::send_join_command(const std::string& chan_name, const std::string& password)
@@ -494,7 +500,8 @@ void IrcClient::send_join_command(const std::string& chan_name, const std::strin
this->start();
}
bool IrcClient::send_channel_message(const std::string& chan_name, const std::string& body)
bool IrcClient::send_channel_message(const std::string& chan_name, const std::string& body,
MessageCallback callback)
{
IrcChannel* channel = this->get_channel(chan_name);
if (!channel->joined)
@@ -517,7 +524,7 @@ bool IrcClient::send_channel_message(const std::string& chan_name, const std::st
::strlen(":!@ PRIVMSG ") - chan_name.length() - ::strlen(" :\r\n");
const auto lines = cut(body, line_size);
for (const auto& line: lines)
this->send_message(IrcMessage("PRIVMSG", {chan_name, line}));
this->send_message(IrcMessage("PRIVMSG", {chan_name, line}), callback);
return true;
}
+9 -4
View File
@@ -21,6 +21,10 @@
#include <set>
#include <utils/tokens_bucket.hpp>
class IrcClient;
using MessageCallback = std::function<void(const IrcClient*, const IrcMessage&)>;
class Bridge;
/**
@@ -86,9 +90,9 @@ public:
* (actually, into our out_buf and signal the poller that we want to wach
* for send events to be ready)
*/
void send_message(IrcMessage message, bool throttle=true);
void send_message(IrcMessage message, MessageCallback callback={}, bool throttle=true);
void send_raw(const std::string& txt);
void actual_send(const IrcMessage& message);
void actual_send(std::pair<IrcMessage, MessageCallback> message_pair);
/**
* Send the PONG irc command
*/
@@ -117,7 +121,8 @@ public:
* Send a PRIVMSG command for a channel
* 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,
MessageCallback callback);
/**
* Send a PRIVMSG command for an user
*/
@@ -336,7 +341,7 @@ private:
/**
* Where messaged are stored when they are throttled.
*/
std::deque<IrcMessage> message_queue{};
std::deque<std::pair<IrcMessage, MessageCallback>> message_queue{};
/**
* The list of joined channels, indexed by name
*/