~singpolyma/biboumi

1aa2c2d857037f3274297527ca3971a75203d39c — Florent Le Coz 7 years ago 84aafab
Introduce the realname_from_jid option

When set to true, the realname and username are extracted (by default) from
the user’s JID

fix #3136
M doc/biboumi.1.md => doc/biboumi.1.md +13 -0
@@ 83,6 83,19 @@ The configuration file uses a simple format of the form
 able to use the ad-hoc commands that lets them configure their realname and
 username.

`realname_from_jid`

 If this option is set to “true”, the realname and username of each biboumi
 user will be extracted from their JID.  The realname is their bare JID, and
 the username is the node-part of their JID.  Note that if
 `realname_customization` is “true”, each user will still be able to
 customize their realname and username, this option just decides the default
 realname and username.

 If this option is set to “false” (the default value), the realname and
 username of each user will be set to the nick they used to connect to the
 IRC server.

`log_file`

  A filename into which logs are written.  If none is provided, the logs are

M src/bridge/bridge.cpp => src/bridge/bridge.cpp +15 -4
@@ 90,7 90,7 @@ Xmpp::body Bridge::make_xmpp_body(const std::string& str)
  return irc_format_to_xhtmlim(res);
}

IrcClient* Bridge::get_irc_client(const std::string& hostname, const std::string& username)
IrcClient* Bridge::make_irc_client(const std::string& hostname, const std::string& nickname)
{
  try
    {


@@ 98,7 98,18 @@ IrcClient* Bridge::get_irc_client(const std::string& hostname, const std::string
    }
  catch (const std::out_of_range& exception)
    {
      this->irc_clients.emplace(hostname, std::make_shared<IrcClient>(this->poller, hostname, username, this));
      auto username = nickname;
      auto realname = nickname;
      if (Config::get("realname_from_jid", "false") == "true")
        {
          Jid jid(this->user_jid);
          username = jid.local;
          realname = this->get_bare_jid();
        }
      this->irc_clients.emplace(hostname,
                                std::make_shared<IrcClient>(this->poller, hostname,
                                                            nickname, username,
                                                            realname, this));
      std::shared_ptr<IrcClient> irc = this->irc_clients.at(hostname);
      return irc.get();
    }


@@ 128,9 139,9 @@ IrcClient* Bridge::find_irc_client(const std::string& hostname)
    }
}

bool Bridge::join_irc_channel(const Iid& iid, const std::string& username, const std::string& password)
bool Bridge::join_irc_channel(const Iid& iid, const std::string& nickname, const std::string& password)
{
  IrcClient* irc = this->get_irc_client(iid.get_server(), username);
  IrcClient* irc = this->make_irc_client(iid.get_server(), nickname);
  if (iid.get_local().empty())
    { // Join the dummy channel
      if (irc->is_welcomed())

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +3 -2
@@ 60,7 60,8 @@ 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& username, const std::string& password);
  bool join_irc_channel(const Iid& iid, const std::string& nickname, const std::string& password);

  void send_channel_message(const Iid& iid, const std::string& body);
  void send_private_message(const Iid& iid, const std::string& body, const std::string& type="PRIVMSG");
  void send_raw_message(const std::string& hostname, const std::string& body);


@@ 193,7 194,7 @@ private:
   * username in this case) if none is found, and connect that newly-created
   * client immediately.
   */
  IrcClient* get_irc_client(const std::string& hostname, const std::string& username);
  IrcClient* make_irc_client(const std::string& hostname, const std::string& nickname);
  /**
   * This version does not create the IrcClient if it does not exist, throws
   * a IRCServerNotConnected error in that case.

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +5 -3
@@ 24,12 24,14 @@ using namespace std::string_literals;
using namespace std::chrono_literals;


IrcClient::IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname, const std::string& username, Bridge* bridge):
IrcClient::IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname,
                     const std::string& nickname, const std::string& username,
                     const std::string& realname, Bridge* bridge):
  TCPSocketHandler(poller),
  hostname(hostname),
  username(username),
  realname(username),
  current_nick(username),
  realname(realname),
  current_nick(nickname),
  bridge(bridge),
  welcomed(false),
  chanmodes({"", "", "", ""}),

M src/irc/irc_client.hpp => src/irc/irc_client.hpp +3 -1
@@ 25,7 25,9 @@ class Bridge;
class IrcClient: public TCPSocketHandler
{
public:
  explicit IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname, const std::string& username, Bridge* bridge);
  explicit IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname,
                     const std::string& nickname, const std::string& username,
                     const std::string& realname, Bridge* bridge);
  ~IrcClient();
  /**
   * Connect to the IRC server