From 619c991a691a455efee2baa4e1fe96e64d27ff64 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?louiz=E2=80=99?= <louiz@louiz.org>
Date: Mon, 19 Mar 2018 20:08:35 +0100
Subject: Add a nick field in the IRC server configuration form

fix #3317
---
 src/bridge/bridge.cpp               |  7 ++++++-
 src/bridge/bridge.hpp               |  2 +-
 src/database/database.hpp           |  2 +-
 src/xmpp/biboumi_adhoc_commands.cpp | 16 ++++++++++++++++
 4 files changed, 24 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp
index aba2f05..bff86b9 100644
--- a/src/bridge/bridge.cpp
+++ b/src/bridge/bridge.cpp
@@ -166,10 +166,15 @@ IrcClient* Bridge::find_irc_client(const std::string& hostname) const
     }
 }
 
-bool Bridge::join_irc_channel(const Iid& iid, const std::string& nickname, const std::string& password,
+bool Bridge::join_irc_channel(const Iid& iid, std::string nickname, const std::string& password,
                               const std::string& resource, HistoryLimit history_limit)
 {
   const auto& hostname = iid.get_server();
+#ifdef USE_DATABASE
+  auto soptions = Database::get_irc_server_options(this->get_bare_jid(), hostname);
+  if (!soptions.col<Database::Nick>().empty())
+    nickname = soptions.col<Database::Nick>();
+#endif
   IrcClient* irc = this->make_irc_client(hostname, nickname);
   irc->history_limit = history_limit;
   this->add_resource_to_server(hostname, resource);
diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp
index 3798465..a4ee693 100644
--- a/src/bridge/bridge.hpp
+++ b/src/bridge/bridge.hpp
@@ -75,7 +75,7 @@ public:
    * Try to join an irc_channel, does nothing and return true if the channel
    * was already joined.
    */
-  bool join_irc_channel(const Iid& iid, const std::string& nickname, const std::string& password, const std::string& resource, HistoryLimit history_limit);
+  bool join_irc_channel(const Iid& iid, std::string nickname, const std::string& password, const std::string& resource, HistoryLimit history_limit);
 
   void send_channel_message(const Iid& iid, const std::string& body, std::string id);
   void send_private_message(const Iid& iid, const std::string& body, const std::string& type="PRIVMSG");
diff --git a/src/database/database.hpp b/src/database/database.hpp
index 5dde447..d986ecc 100644
--- a/src/database/database.hpp
+++ b/src/database/database.hpp
@@ -92,7 +92,7 @@ class Database
   using GlobalOptionsTable = Table<Id, Owner, MaxHistoryLength, RecordHistory, GlobalPersistent>;
   using GlobalOptions = GlobalOptionsTable::RowType;
 
-  using IrcServerOptionsTable = Table<Id, Owner, Server, Pass, TlsPorts, Ports, Username, Realname, VerifyCert, TrustedFingerprint, EncodingOut, EncodingIn, MaxHistoryLength, Address>;
+  using IrcServerOptionsTable = Table<Id, Owner, Server, Pass, TlsPorts, Ports, Username, Realname, VerifyCert, TrustedFingerprint, EncodingOut, EncodingIn, MaxHistoryLength, Address, Nick>;
   using IrcServerOptions = IrcServerOptionsTable::RowType;
 
   using IrcChannelOptionsTable = Table<Id, Owner, Server, Channel, EncodingOut, EncodingIn, MaxHistoryLength, Persistent, RecordHistoryOptional>;
diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp
index d773ec3..66298d4 100644
--- a/src/xmpp/biboumi_adhoc_commands.cpp
+++ b/src/xmpp/biboumi_adhoc_commands.cpp
@@ -293,6 +293,20 @@ void ConfigureIrcServerStep1(XmppComponent&, AdhocSession& session, XmlNode& com
       }
   }
 #endif
+
+  {
+    XmlSubNode field(x, "field");
+    field["var"] = "nick";
+    field["type"] = "text-single";
+    field["label"] = "Nickname";
+    field["desc"] = "If set, will override the nickname provided in the initial presence sent to join the first server channel";
+    if (!options.col<Database::Nick>().empty())
+      {
+        XmlSubNode value(field, "value");
+        value.set_inner(options.col<Database::Nick>());
+      }
+  }
+
   {
     XmlSubNode pass(x, "field");
     pass["var"] = "pass";
@@ -427,6 +441,8 @@ void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& com
 
 #endif // BOTAN_FOUND
 
+          else if (field->get_tag("var") == "nick" && value)
+            options.col<Database::Nick>() = value->get_inner();
           else if (field->get_tag("var") == "pass" && value)
             options.col<Database::Pass>() = value->get_inner();
 
-- 
cgit v1.2.3