M src/bridge/bridge.cpp => src/bridge/bridge.cpp +6 -0
@@ 798,6 798,12 @@ void Bridge::send_xmpp_ping_request(const std::string& nick, const std::string&
this->xmpp.send_ping_request(utils::tolower(nick) + "%" + utils::empty_if_fixed_server(hostname), this->user_jid + "/" + *resources.begin(), utils::revstr(id));
}
+void Bridge::send_xmpp_invitation(const Iid& iid, const std::string& author)
+{
+ for (const auto& resource: this->resources_in_server[iid.get_server()])
+ this->xmpp.send_invitation(std::to_string(iid), this->user_jid + "/" + resource, author);
+}
+
void Bridge::set_preferred_from_jid(const std::string& nick, const std::string& full_jid)
{
auto it = this->preferred_user_from.find(nick);
M src/bridge/bridge.hpp => src/bridge/bridge.hpp +2 -0
@@ 175,6 175,8 @@ public:
*/
void send_xmpp_ping_request(const std::string& nick, const std::string& hostname,
const std::string& id);
+ void send_xmpp_invitation(const Iid& iid, const std::string& author);
+
/**
* Misc
*/
M src/irc/irc_client.cpp => src/irc/irc_client.cpp +12 -0
@@ 75,6 75,7 @@ static const std::unordered_map<std::string,
{"PING", {&IrcClient::send_pong_command, {1, 0}}},
{"PONG", {&IrcClient::on_pong, {0, 0}}},
{"KICK", {&IrcClient::on_kick, {3, 0}}},
+ {"INVITE", {&IrcClient::on_invite, {2, 0}}},
{"401", {&IrcClient::on_generic_error, {2, 0}}},
{"402", {&IrcClient::on_generic_error, {2, 0}}},
@@ 971,6 972,17 @@ void IrcClient::on_kick(const IrcMessage& message)
this->bridge.kick_muc_user(std::move(iid), target, reason, author.nick);
}
+void IrcClient::on_invite(const IrcMessage& message)
+{
+ const std::string& author = message.arguments[0];
+ Iid iid;
+ iid.set_local(message.arguments[1]);
+ iid.set_server(this->hostname);
+ iid.type = Iid::Type::Channel;
+
+ this->bridge.send_xmpp_invitation(iid, author);
+}
+
void IrcClient::on_mode(const IrcMessage& message)
{
const std::string target = message.arguments[0];
M src/irc/irc_client.hpp => src/irc/irc_client.hpp +1 -0
@@ 249,6 249,7 @@ public:
void on_welcome_message(const IrcMessage& message);
void on_part(const IrcMessage& message);
void on_error(const IrcMessage& message);
+ void on_invite(const IrcMessage& message);
void on_nick(const IrcMessage& message);
void on_kick(const IrcMessage& message);
void on_mode(const IrcMessage& message);
M src/xmpp/biboumi_component.cpp => src/xmpp/biboumi_component.cpp +16 -0
@@ 645,3 645,19 @@ void BiboumiComponent::send_iq_room_list_result(const std::string& id,
iq.add_child(std::move(query));
this->send_stanza(iq);
}
+
+void BiboumiComponent::send_invitation(const std::string& room_target,
+ const std::string& jid_to,
+ const std::string& author_nick)
+{
+ Stanza message("message");
+ message["from"] = room_target + "@" + this->served_hostname;
+ message["to"] = jid_to;
+ XmlNode x("x");
+ x["xmlns"] = MUC_USER_NS;
+ XmlNode invite("invite");
+ invite["from"] = room_target + "@" + this->served_hostname + "/" + author_nick;
+ x.add_child(std::move(invite));
+ message.add_child(std::move(x));
+ this->send_stanza(message);
+}
M src/xmpp/biboumi_component.hpp => src/xmpp/biboumi_component.hpp +1 -0
@@ 74,6 74,7 @@ public:
void send_iq_room_list_result(const std::string& id, const std::string& to_jid,
const std::string& from,
const std::vector<ListElement>& rooms_list);
+ void send_invitation(const std::string& room_target, const std::string& jid_to, const std::string& author_nick);
/**
* Handle the various stanza types
*/