Commit 5d801ddc authored by louiz’'s avatar louiz’

Add a linger_time configuration option on IRC servers

parent dd129366
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
<field name="realname" type="string" length="1024" default=""/> <field name="realname" type="string" length="1024" default=""/>
<field name="verifyCert" type="boolean" default="true"/> <field name="verifyCert" type="boolean" default="true"/>
<field name="trustedFingerprint" type="string"/> <field name="trustedFingerprint" type="string"/>
<field name="lingerTime" type="integer" default="0"/>
<field name="encodingOut" type="string" default="ISO-8859-1"/> <field name="encodingOut" type="string" default="ISO-8859-1"/>
<field name="encodingIn" type="string" default="ISO-8859-1"/> <field name="encodingIn" type="string" default="ISO-8859-1"/>
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <database/database.hpp> #include <database/database.hpp>
#include "result_set_management.hpp" #include "result_set_management.hpp"
#include <algorithm> #include <algorithm>
#include <utils/timed_events.hpp>
using namespace std::string_literals; using namespace std::string_literals;
...@@ -865,7 +866,7 @@ void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& me ...@@ -865,7 +866,7 @@ void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& me
this->user_jid + "/" + res, self); this->user_jid + "/" + res, self);
IrcClient* irc = this->find_irc_client(iid.get_server()); IrcClient* irc = this->find_irc_client(iid.get_server());
if (irc && irc->number_of_joined_channels() == 0) if (irc && irc->number_of_joined_channels() == 0)
irc->send_quit_command(""); this->quit_or_start_linger_timer(iid.get_server());
} }
void Bridge::send_nick_change(Iid&& iid, void Bridge::send_nick_change(Iid&& iid,
...@@ -1212,3 +1213,22 @@ void Bridge::set_record_history(const bool val) ...@@ -1212,3 +1213,22 @@ void Bridge::set_record_history(const bool val)
this->record_history = val; this->record_history = val;
} }
#endif #endif
void Bridge::quit_or_start_linger_timer(const std::string& irc_hostname)
{
#ifdef USE_DATABASE
auto options = Database::get_irc_server_options(this->get_bare_jid(),
irc_hostname);
const auto timeout = std::chrono::seconds(options.lingerTime.value());
#else
const auto timeout = 0s;
#endif
const auto event_name = "IRCLINGER:" + irc_hostname + ".." + this->get_bare_jid();
TimedEvent event(std::chrono::steady_clock::now() + timeout, [this, irc_hostname]() {
IrcClient* irc = this->find_irc_client(irc_hostname);
if (irc)
irc->send_quit_command("");
}, event_name);
TimedEventsManager::instance().add_event(std::move(event));
}
...@@ -236,6 +236,11 @@ public: ...@@ -236,6 +236,11 @@ public:
#ifdef USE_DATABASE #ifdef USE_DATABASE
void set_record_history(const bool val); void set_record_history(const bool val);
#endif #endif
/**
* Start a timer that will send a QUIT command after the
* configured linger time is expired.
*/
void quit_or_start_linger_timer(const std::string& irc_hostname);
private: private:
/** /**
......
...@@ -329,6 +329,17 @@ void ConfigureIrcServerStep1(XmppComponent&, AdhocSession& session, XmlNode& com ...@@ -329,6 +329,17 @@ void ConfigureIrcServerStep1(XmppComponent&, AdhocSession& session, XmlNode& com
encoding_in_value.set_inner(options.encodingIn.value()); encoding_in_value.set_inner(options.encodingIn.value());
} }
encoding_in.add_child(required); encoding_in.add_child(required);
XmlSubNode linger_time(x, "field");
linger_time["var"] = "linger_time";
linger_time["type"] = "text-single";
linger_time["desc"] = "The number of seconds to wait before sending a QUIT command, after the last channel on that server has been left.";
linger_time["label"] = "Linger time";
{
XmlSubNode linger_time_value(linger_time, "value");
linger_time_value.set_inner(std::to_string(options.lingerTime.value()));
}
encoding_in.add_child(required);
} }
void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node) void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
...@@ -408,6 +419,10 @@ void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& com ...@@ -408,6 +419,10 @@ void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& com
value && !value->get_inner().empty()) value && !value->get_inner().empty())
options.encodingIn = value->get_inner(); options.encodingIn = value->get_inner();
else if (field->get_tag("var") == "linger_time" &&
value && !value->get_inner().empty())
options.lingerTime = value->get_inner();
} }
options.update(); options.update();
......
...@@ -1939,6 +1939,7 @@ if __name__ == '__main__': ...@@ -1939,6 +1939,7 @@ if __name__ == '__main__':
"/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='realname']/dataform:value[text()='realname']", "/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='realname']/dataform:value[text()='realname']",
"/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='encoding_in']/dataform:value[text()='latin-1']", "/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='encoding_in']/dataform:value[text()='latin-1']",
"/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='encoding_out']/dataform:value[text()='UTF-8']", "/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='encoding_out']/dataform:value[text()='UTF-8']",
"/iq/commands:command/dataform:x[@type='form']/dataform:field[@type='text-single'][@var='linger_time']/dataform:value[text()='0']",
"/iq/commands:command/commands:actions/commands:next", "/iq/commands:command/commands:actions/commands:next",
), ),
after = partial(save_value, "sessionid", partial(extract_attribute, "/iq[@type='result']/commands:command[@node='configure']", "sessionid")) after = partial(save_value, "sessionid", partial(extract_attribute, "/iq[@type='result']/commands:command[@node='configure']", "sessionid"))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment