Implement the roster presences from IRC servers
This commit is contained in:
@@ -1081,6 +1081,16 @@ void Bridge::send_xmpp_invitation(const Iid& iid, const std::string& author)
|
|||||||
this->xmpp.send_invitation(std::to_string(iid), this->user_jid + "/" + resource, author);
|
this->xmpp.send_invitation(std::to_string(iid), this->user_jid + "/" + resource, author);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Bridge::on_irc_client_connected(const std::string& hostname)
|
||||||
|
{
|
||||||
|
this->xmpp.on_irc_client_connected(hostname, this->user_jid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Bridge::on_irc_client_disconnected(const std::string& hostname)
|
||||||
|
{
|
||||||
|
this->xmpp.on_irc_client_disconnected(hostname, this->user_jid);
|
||||||
|
}
|
||||||
|
|
||||||
void Bridge::set_preferred_from_jid(const std::string& nick, const std::string& full_jid)
|
void Bridge::set_preferred_from_jid(const std::string& nick, const std::string& full_jid)
|
||||||
{
|
{
|
||||||
auto it = this->preferred_user_from.find(nick);
|
auto it = this->preferred_user_from.find(nick);
|
||||||
|
|||||||
@@ -201,6 +201,8 @@ public:
|
|||||||
void send_xmpp_ping_request(const std::string& nick, const std::string& hostname,
|
void send_xmpp_ping_request(const std::string& nick, const std::string& hostname,
|
||||||
const std::string& id);
|
const std::string& id);
|
||||||
void send_xmpp_invitation(const Iid& iid, const std::string& author);
|
void send_xmpp_invitation(const Iid& iid, const std::string& author);
|
||||||
|
void on_irc_client_connected(const std::string& hostname);
|
||||||
|
void on_irc_client_disconnected(const std::string& hostname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Misc
|
* Misc
|
||||||
@@ -301,8 +303,8 @@ private:
|
|||||||
using ChannelKey = std::tuple<ChannelName, IrcHostname>;
|
using ChannelKey = std::tuple<ChannelName, IrcHostname>;
|
||||||
public:
|
public:
|
||||||
std::map<ChannelKey, std::set<Resource>> resources_in_chan;
|
std::map<ChannelKey, std::set<Resource>> resources_in_chan;
|
||||||
private:
|
|
||||||
std::map<IrcHostname, std::set<Resource>> resources_in_server;
|
std::map<IrcHostname, std::set<Resource>> resources_in_server;
|
||||||
|
private:
|
||||||
/**
|
/**
|
||||||
* Manage which resource is in which channel
|
* Manage which resource is in which channel
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -297,6 +297,7 @@ void IrcClient::on_connected()
|
|||||||
#endif
|
#endif
|
||||||
this->send_gateway_message("Connected to IRC server"s + (this->use_tls ? " (encrypted)": "") + ".");
|
this->send_gateway_message("Connected to IRC server"s + (this->use_tls ? " (encrypted)": "") + ".");
|
||||||
this->send_pending_data();
|
this->send_pending_data();
|
||||||
|
this->bridge.on_irc_client_connected(this->get_hostname());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IrcClient::on_connection_close(const std::string& error_msg)
|
void IrcClient::on_connection_close(const std::string& error_msg)
|
||||||
@@ -309,6 +310,7 @@ void IrcClient::on_connection_close(const std::string& error_msg)
|
|||||||
const IrcMessage error{"ERROR", {message}};
|
const IrcMessage error{"ERROR", {message}};
|
||||||
this->on_error(error);
|
this->on_error(error);
|
||||||
log_warning(message);
|
log_warning(message);
|
||||||
|
this->bridge.on_irc_client_disconnected(this->get_hostname());
|
||||||
}
|
}
|
||||||
|
|
||||||
IrcChannel* IrcClient::get_channel(const std::string& n)
|
IrcChannel* IrcClient::get_channel(const std::string& n)
|
||||||
|
|||||||
@@ -84,8 +84,7 @@ void BiboumiComponent::shutdown()
|
|||||||
for (auto& pair: this->bridges)
|
for (auto& pair: this->bridges)
|
||||||
pair.second->shutdown("Gateway shutdown");
|
pair.second->shutdown("Gateway shutdown");
|
||||||
#ifdef USE_DATABASE
|
#ifdef USE_DATABASE
|
||||||
const auto full_roster = Database::get_full_roster();
|
for (const Database::RosterItem& roster_item: Database::get_full_roster())
|
||||||
for (const Database::RosterItem& roster_item: full_roster)
|
|
||||||
{
|
{
|
||||||
this->send_presence_to_contact(roster_item.col<Database::LocalJid>(),
|
this->send_presence_to_contact(roster_item.col<Database::LocalJid>(),
|
||||||
roster_item.col<Database::RemoteJid>(),
|
roster_item.col<Database::RemoteJid>(),
|
||||||
@@ -170,7 +169,7 @@ void BiboumiComponent::handle_presence(const Stanza& stanza)
|
|||||||
if (type == "subscribe")
|
if (type == "subscribe")
|
||||||
{ // Auto-accept any subscription request for an IRC server
|
{ // Auto-accept any subscription request for an IRC server
|
||||||
this->send_presence_to_contact(to_str, from.bare(), "subscribed", id);
|
this->send_presence_to_contact(to_str, from.bare(), "subscribed", id);
|
||||||
if (iid.type == Iid::Type::None)
|
if (iid.type == Iid::Type::None || bridge->find_irc_client(iid.get_server()))
|
||||||
this->send_presence_to_contact(to_str, from.bare(), "");
|
this->send_presence_to_contact(to_str, from.bare(), "");
|
||||||
this->send_presence_to_contact(to_str, from.bare(), "subscribe");
|
this->send_presence_to_contact(to_str, from.bare(), "subscribe");
|
||||||
#ifdef USE_DATABASE
|
#ifdef USE_DATABASE
|
||||||
@@ -192,7 +191,8 @@ void BiboumiComponent::handle_presence(const Stanza& stanza)
|
|||||||
else if (type.empty())
|
else if (type.empty())
|
||||||
{ // We just receive a presence from someone (as the result of a probe,
|
{ // We just receive a presence from someone (as the result of a probe,
|
||||||
// or a directed presence, or a normal presence change)
|
// or a directed presence, or a normal presence change)
|
||||||
this->send_presence_to_contact(to_str, from.bare(), "");
|
if (iid.type == Iid::Type::None)
|
||||||
|
this->send_presence_to_contact(to_str, from.bare(), "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1023,6 +1023,16 @@ void BiboumiComponent::send_presence_to_contact(const std::string& from, const s
|
|||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BiboumiComponent::on_irc_client_connected(const std::string& irc_hostname, const std::string& jid)
|
||||||
|
{
|
||||||
|
this->send_presence_to_contact(irc_hostname + "@" + this->served_hostname, jid, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
void BiboumiComponent::on_irc_client_disconnected(const std::string& irc_hostname, const std::string& jid)
|
||||||
|
{
|
||||||
|
this->send_presence_to_contact(irc_hostname + "@" + this->served_hostname, jid, "unavailable");
|
||||||
|
}
|
||||||
|
|
||||||
void BiboumiComponent::after_handshake()
|
void BiboumiComponent::after_handshake()
|
||||||
{
|
{
|
||||||
XmppComponent::after_handshake();
|
XmppComponent::after_handshake();
|
||||||
|
|||||||
@@ -90,6 +90,9 @@ public:
|
|||||||
void accept_subscription(const std::string& from, const std::string& to);
|
void accept_subscription(const std::string& from, const std::string& to);
|
||||||
void ask_subscription(const std::string& from, const std::string& to);
|
void ask_subscription(const std::string& from, const std::string& to);
|
||||||
void send_presence_to_contact(const std::string& from, const std::string& to, const std::string& type, const std::string& id="");
|
void send_presence_to_contact(const std::string& from, const std::string& to, const std::string& type, const std::string& id="");
|
||||||
|
void on_irc_client_connected(const std::string& irc_hostname, const std::string& jid);
|
||||||
|
void on_irc_client_disconnected(const std::string& irc_hostname, const std::string& jid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the various stanza types
|
* Handle the various stanza types
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user