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
This commit is contained in:
Florent Le Coz
2015-10-12 17:14:29 +02:00
parent 84aafab604
commit 1aa2c2d857
5 changed files with 39 additions and 10 deletions
+13
View File
@@ -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
+15 -4
View File
@@ -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())
+3 -2
View File
@@ -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.
+5 -3
View File
@@ -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({"", "", "", ""}),
+3 -1
View File
@@ -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