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