~singpolyma/biboumi

c2311b2893f3db755b67c43e5ad60cef66b10ab2 — Florent Le Coz 8 years ago 5c9d2c2
Send (every 240s) a PING command to all connected irc servers

fix #2452
4 files changed, 25 insertions(+), 0 deletions(-)

M src/bridge/bridge.cpp
M src/bridge/bridge.hpp
M src/irc/irc_client.cpp
M src/irc/irc_client.hpp
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +5 -0
@@ 63,6 63,11 @@ void Bridge::clean()
  }
}

const std::string& Bridge::get_jid() const
{
  return this->user_jid;
}

Xmpp::body Bridge::make_xmpp_body(const std::string& str)
{
  std::string res;

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +4 -0
@@ 32,6 32,10 @@ public:
   * Remove all inactive IrcClients
   */
  void clean();
  /**
   * Return the jid of the XMPP user using this bridge
   */
  const std::string& get_jid() const;

  static Xmpp::body make_xmpp_body(const std::string& str);
  /***

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +15 -0
@@ 1,3 1,4 @@
#include <utils/timed_events.hpp>
#include <irc/irc_message.hpp>
#include <irc/irc_client.hpp>
#include <bridge/bridge.hpp>


@@ 10,8 11,11 @@
#include <iostream>
#include <stdexcept>

#include <chrono>
#include <string>

using namespace std::string_literals;
using namespace std::chrono_literals;

IrcClient::IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname, const std::string& username, Bridge* bridge):
  SocketHandler(poller),


@@ 35,6 39,9 @@ IrcClient::IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname

IrcClient::~IrcClient()
{
  // This event may or may not exist (if we never got connected, it
  // doesn't), but it's ok
  TimedEventsManager::instance().cancel("PING"s + this->hostname + this->bridge->get_jid());
}

void IrcClient::start()


@@ 238,6 245,11 @@ void IrcClient::send_pong_command(const IrcMessage& message)
  this->send_message(IrcMessage("PONG", {id}));
}

void IrcClient::send_ping_command()
{
  this->send_message(IrcMessage("PING", {"biboumi"}));
}

void IrcClient::forward_server_message(const IrcMessage& message)
{
  const std::string from = message.prefix;


@@ 447,6 459,9 @@ void IrcClient::on_welcome_message(const IrcMessage& message)
{
  this->current_nick = message.arguments[0];
  this->welcomed = true;
  // Install a repeated events to regularly send a PING
  TimedEventsManager::instance().add_event(TimedEvent(240s, std::bind(&IrcClient::send_ping_command, this),
                                                      "PING"s + this->hostname + this->bridge->get_jid()));
  for (const std::string& chan_name: this->channels_to_join)
    this->send_join_command(chan_name);
  this->channels_to_join.clear();

M src/irc/irc_client.hpp => src/irc/irc_client.hpp +1 -0
@@ 70,6 70,7 @@ public:
   * Send the PONG irc command
   */
  void send_pong_command(const IrcMessage& message);
  void send_ping_command();
  /**
   * Send the USER irc command
   */