summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--database/database.xml2
-rw-r--r--doc/biboumi.1.rst7
-rw-r--r--src/bridge/bridge.cpp19
-rw-r--r--src/bridge/bridge.hpp8
-rw-r--r--src/xmpp/biboumi_adhoc_commands.cpp32
5 files changed, 59 insertions, 9 deletions
diff --git a/database/database.xml b/database/database.xml
index 7a9d656..490bc5a 100644
--- a/database/database.xml
+++ b/database/database.xml
@@ -6,6 +6,7 @@
<field name="owner" type="string" length="3071"/>
<field name="maxHistoryLength" type="integer" default="20"/>
+ <field name="recordHistory" type="boolean" default="true"/>
</object>
<object name="IrcServerOptions">
@@ -25,7 +26,6 @@
<field name="encodingIn" type="string" default="ISO-8859-1"/>
<field name="maxHistoryLength" type="integer" default="20"/>
-
<index unique="true">
<indexfield name="owner"/>
<indexfield name="server"/>
diff --git a/doc/biboumi.1.rst b/doc/biboumi.1.rst
index 783788f..2cf771f 100644
--- a/doc/biboumi.1.rst
+++ b/doc/biboumi.1.rst
@@ -294,6 +294,13 @@ messages to other users. This means that the order of the messages
displayed in your XMPP client may not be the same than the order on other
IRC users’.
+History
+-------
+
+Public channel messages are saved into the database, unless the
+`record_history` option is set to false for that user
+`Ad-hoc commands`).
+
List channels
-------------
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp
index ad1a45e..9b91474 100644
--- a/src/bridge/bridge.cpp
+++ b/src/bridge/bridge.cpp
@@ -32,6 +32,10 @@ Bridge::Bridge(const std::string& user_jid, BiboumiComponent& xmpp, std::shared_
xmpp(xmpp),
poller(poller)
{
+#ifdef USE_DATABASE
+ const auto options = Database::get_global_options(this->user_jid);
+ this->set_record_history(options.recordHistory.value());
+#endif
}
/**
@@ -241,8 +245,9 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body)
#ifdef USE_DATABASE
const auto xmpp_body = this->make_xmpp_body(line);
- Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(),
- std::get<0>(xmpp_body), irc->get_own_nick());
+ if (this->record_history)
+ Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(),
+ std::get<0>(xmpp_body), irc->get_own_nick());
#endif
for (const auto& resource: this->resources_in_chan[iid.to_tuple()])
this->xmpp.send_muc_message(std::to_string(iid), irc->get_own_nick(),
@@ -616,7 +621,7 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
{
#ifdef USE_DATABASE
const auto xmpp_body = this->make_xmpp_body(body, encoding);
- if (!nick.empty())
+ if (!nick.empty() && this->record_history)
Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(),
std::get<0>(xmpp_body), nick);
#endif
@@ -971,7 +976,6 @@ void Bridge::generate_channel_join_for_resource(const Iid& iid, const std::strin
{
if (user->nick != self->nick)
{
- log_debug(user->nick);
this->send_user_join(iid.get_server(), iid.get_encoded_local(),
user.get(), user->get_most_significant_mode(irc->get_sorted_user_modes()),
false, resource);
@@ -982,3 +986,10 @@ void Bridge::generate_channel_join_for_resource(const Iid& iid, const std::strin
true, resource);
this->send_topic(iid.get_server(), iid.get_encoded_local(), channel->topic, channel->topic_author, resource);
}
+
+#ifdef USE_DATABASE
+void Bridge::set_record_history(const bool val)
+{
+ this->record_history = val;
+}
+#endif \ No newline at end of file
diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp
index c26995f..0e1fbf4 100644
--- a/src/bridge/bridge.hpp
+++ b/src/bridge/bridge.hpp
@@ -13,6 +13,8 @@
#include <string>
#include <memory>
+#include <biboumi.h>
+
class BiboumiComponent;
class Poller;
@@ -215,6 +217,9 @@ public:
void trigger_on_irc_message(const std::string& irc_hostname, const IrcMessage& message);
std::unordered_map<std::string, std::shared_ptr<IrcClient>>& get_irc_clients();
std::set<char> get_chantypes(const std::string& hostname) const;
+#ifdef USE_DATABASE
+ void set_record_history(const bool val);
+#endif
private:
/**
@@ -295,6 +300,9 @@ private:
* TODO: send message history
*/
void generate_channel_join_for_resource(const Iid& iid, const std::string& resource);
+#ifdef USE_DATABASE
+ bool record_history { true };
+#endif
};
struct IRCNotConnected: public std::exception
diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp
index 2050edf..64c16a9 100644
--- a/src/xmpp/biboumi_adhoc_commands.cpp
+++ b/src/xmpp/biboumi_adhoc_commands.cpp
@@ -135,16 +135,32 @@ void ConfigureGlobalStep1(XmppComponent&, AdhocSession& session, XmlNode& comman
max_histo_length["label"] = "Max history length";
max_histo_length["desc"] = "The maximum number of lines in the history that the server sends when joining a channel";
- XmlNode max_histo_length_value("value");
- max_histo_length_value.set_inner(std::to_string(options.maxHistoryLength.value()));
- max_histo_length.add_child(std::move(max_histo_length_value));
+ XmlNode value("value");
+ value.set_inner(std::to_string(options.maxHistoryLength.value()));
+ max_histo_length.add_child(std::move(value));
x.add_child(std::move(max_histo_length));
+ XmlNode record_history("field");
+ record_history["var"] = "record_history";
+ record_history["type"] = "boolean";
+ record_history["label"] = "Record history";
+ record_history["desc"] = "Whether to save the messages into the database, or not";
+
+ value.set_name("value");
+ if (options.recordHistory.value())
+ value.set_inner("true");
+ else
+ value.set_inner("false");
+ record_history.add_child(std::move(value));
+ x.add_child(std::move(record_history));
+
command_node.add_child(std::move(x));
}
-void ConfigureGlobalStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
+void ConfigureGlobalStep2(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
{
+ BiboumiComponent& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
+
const XmlNode* x = command_node.get_child("x", "jabber:x:data");
if (x)
{
@@ -157,6 +173,14 @@ void ConfigureGlobalStep2(XmppComponent&, AdhocSession& session, XmlNode& comman
if (field->get_tag("var") == "max_history_length" &&
value && !value->get_inner().empty())
options.maxHistoryLength = value->get_inner();
+ else if (field->get_tag("var") == "record_history" &&
+ value && !value->get_inner().empty())
+ {
+ options.recordHistory = to_bool(value->get_inner());
+ Bridge* bridge = biboumi_component.find_user_bridge(owner.bare());
+ if (bridge)
+ bridge->set_record_history(options.recordHistory.value());
+ }
}
options.update();