Commit 1aa2c2d8 authored by louiz’'s avatar louiz’

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
parent 84aafab6
......@@ -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
......
......@@ -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())
......
......@@ -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.
......
......@@ -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({"", "", "", ""}),
......
......@@ -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
......
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