Implement room discovery using the LIST irc command

ref #2472
This commit is contained in:
Florent Le Coz
2015-02-26 05:02:08 +01:00
parent 6a2240f593
commit c01befb054
7 changed files with 108 additions and 0 deletions
+38
View File
@@ -1,5 +1,6 @@
#include <bridge/bridge.hpp>
#include <bridge/colors.hpp>
#include <bridge/list_element.hpp>
#include <xmpp/xmpp_component.hpp>
#include <xmpp/xmpp_stanza.hpp>
#include <irc/irc_message.hpp>
@@ -285,6 +286,43 @@ void Bridge::send_irc_nick_change(const Iid& iid, const std::string& new_nick)
irc->send_nick_command(new_nick);
}
void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq_id,
const std::string& to_jid)
{
IrcClient* irc = this->get_irc_client(iid.get_server());
if (!irc)
return;
irc->send_list_command();
irc_responder_callback_t cb = [this, iid, iq_id, to_jid](const std::string& irc_hostname,
const IrcMessage& message) -> bool
{
static std::vector<ListElement> list;
if (irc_hostname != iid.get_server())
return false;
if (message.command == "263" || message.command == "RPL_TRYAGAIN")
{ // TODO send an error iq
return true;
}
else if (message.command == "322" || message.command == "RPL_LIST")
{ // Add element to list
if (message.arguments.size() == 4)
list.emplace_back(message.arguments[1], message.arguments[2],
message.arguments[3]);
return false;
}
else if (message.command == "323" || message.command == "RPL_LISTEND")
{ // Send the iq response with the content of the list
this->xmpp->send_iq_room_list_result(iq_id, to_jid, std::to_string(iid), list);
return true;
}
return false;
};
this->add_waiting_irc(std::move(cb));
}
void Bridge::send_irc_kick(const Iid& iid, const std::string& target, const std::string& reason,
const std::string& iq_id, const std::string& to_jid)
{
+2
View File
@@ -72,6 +72,8 @@ public:
void send_irc_version_request(const std::string& irc_hostname, const std::string& target,
const std::string& iq_id, const std::string& to_jid,
const std::string& from_jid);
void send_irc_channel_list_request(const Iid& iid, const std::string& iq_id,
const std::string& to_jid);
void forward_affiliation_role_change(const Iid& iid, const std::string& nick,
const std::string& affiliation, const std::string& role);
/**
+19
View File
@@ -0,0 +1,19 @@
#ifndef LIST_ELEMENT_HPP_INCLUDED
#define LIST_ELEMENT_HPP_INCLUDED
#include <string>
struct ListElement
{
ListElement(const std::string& channel, const std::string& nb_users,
const std::string& topic):
channel(channel),
nb_users(nb_users),
topic(topic){}
std::string channel;
std::string nb_users;
std::string topic;
};
#endif /* LIST_ELEMENT_HPP_INCLUDED */