Also set the role and affiliation of users already in the chan
This commit is contained in:
+24
-32
@@ -6,6 +6,7 @@
|
|||||||
#include <logger/logger.hpp>
|
#include <logger/logger.hpp>
|
||||||
#include <utils/split.hpp>
|
#include <utils/split.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
static const char* action_prefix = "\01ACTION ";
|
static const char* action_prefix = "\01ACTION ";
|
||||||
static const size_t action_prefix_len = 8;
|
static const size_t action_prefix_len = 8;
|
||||||
@@ -21,6 +22,22 @@ Bridge::~Bridge()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the role and affiliation, corresponding to the given irc mode */
|
||||||
|
static std::tuple<std::string, std::string> get_role_affiliation_from_irc_mode(const char mode)
|
||||||
|
{
|
||||||
|
if (mode == 'a' || mode == 'q')
|
||||||
|
return std::make_tuple("moderator", "owner");
|
||||||
|
else if (mode == 'o')
|
||||||
|
return std::make_tuple("moderator", "admin");
|
||||||
|
else if (mode == 'h')
|
||||||
|
return std::make_tuple("moderator", "member");
|
||||||
|
else if (mode == 'v')
|
||||||
|
return std::make_tuple("participant", "member");
|
||||||
|
else
|
||||||
|
return std::make_tuple("participant", "none");
|
||||||
|
}
|
||||||
|
|
||||||
void Bridge::shutdown()
|
void Bridge::shutdown()
|
||||||
{
|
{
|
||||||
for (auto it = this->irc_clients.begin(); it != this->irc_clients.end(); ++it)
|
for (auto it = this->irc_clients.begin(); it != this->irc_clients.end(); ++it)
|
||||||
@@ -197,15 +214,13 @@ void Bridge::send_xmpp_message(const std::string& from, const std::string& autho
|
|||||||
void Bridge::send_user_join(const std::string& hostname,
|
void Bridge::send_user_join(const std::string& hostname,
|
||||||
const std::string& chan_name,
|
const std::string& chan_name,
|
||||||
const IrcUser* user,
|
const IrcUser* user,
|
||||||
|
const char user_mode,
|
||||||
const bool self)
|
const bool self)
|
||||||
{
|
{
|
||||||
std::string affiliation = "participant";
|
std::string affiliation;
|
||||||
std::string role = "none";
|
std::string role;
|
||||||
if (user->modes.find('o') != user->modes.end())
|
std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(user_mode);
|
||||||
{
|
|
||||||
affiliation = "admin";
|
|
||||||
role = "moderator";
|
|
||||||
}
|
|
||||||
this->xmpp->send_user_join(chan_name + "%" + hostname, user->nick, user->host,
|
this->xmpp->send_user_join(chan_name + "%" + hostname, user->nick, user->host,
|
||||||
affiliation, role, this->user_jid, self);
|
affiliation, role, this->user_jid, self);
|
||||||
}
|
}
|
||||||
@@ -237,30 +252,7 @@ void Bridge::send_affiliation_role_change(const Iid& iid, const std::string& tar
|
|||||||
{
|
{
|
||||||
std::string role;
|
std::string role;
|
||||||
std::string affiliation;
|
std::string affiliation;
|
||||||
if (mode == 0)
|
|
||||||
{
|
std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(mode);
|
||||||
role = "participant";
|
|
||||||
affiliation = "none";
|
|
||||||
}
|
|
||||||
else if (mode == 'a')
|
|
||||||
{
|
|
||||||
role = "moderator";
|
|
||||||
affiliation = "owner";
|
|
||||||
}
|
|
||||||
else if (mode == 'o')
|
|
||||||
{
|
|
||||||
role = "moderator";
|
|
||||||
affiliation = "admin";
|
|
||||||
}
|
|
||||||
else if (mode == 'h')
|
|
||||||
{
|
|
||||||
role = "moderator";
|
|
||||||
affiliation = "member";
|
|
||||||
}
|
|
||||||
else if (mode == 'v')
|
|
||||||
{
|
|
||||||
role = "participant";
|
|
||||||
affiliation = "member";
|
|
||||||
}
|
|
||||||
this->xmpp->send_affiliation_role_change(iid.chan + "%" + iid.server, target, affiliation, role, this->user_jid);
|
this->xmpp->send_affiliation_role_change(iid.chan + "%" + iid.server, target, affiliation, role, this->user_jid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ public:
|
|||||||
void send_user_join(const std::string& hostname,
|
void send_user_join(const std::string& hostname,
|
||||||
const std::string& chan_name,
|
const std::string& chan_name,
|
||||||
const IrcUser* user,
|
const IrcUser* user,
|
||||||
|
const char user_mode,
|
||||||
const bool self);
|
const bool self);
|
||||||
/**
|
/**
|
||||||
* Send the topic of the MUC to the user
|
* Send the topic of the MUC to the user
|
||||||
|
|||||||
@@ -247,7 +247,9 @@ void IrcClient::set_and_forward_user_list(const IrcMessage& message)
|
|||||||
if (user->nick != channel->get_self()->nick)
|
if (user->nick != channel->get_self()->nick)
|
||||||
{
|
{
|
||||||
log_debug("Adding user [" << nick << "] to chan " << chan_name);
|
log_debug("Adding user [" << nick << "] to chan " << chan_name);
|
||||||
this->bridge->send_user_join(this->hostname, chan_name, user, false);
|
this->bridge->send_user_join(this->hostname, chan_name, user,
|
||||||
|
user->get_most_significant_mode(this->sorted_user_modes),
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -270,7 +272,9 @@ void IrcClient::on_channel_join(const IrcMessage& message)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const IrcUser* user = channel->add_user(nick, this->prefix_to_mode);
|
const IrcUser* user = channel->add_user(nick, this->prefix_to_mode);
|
||||||
this->bridge->send_user_join(this->hostname, chan_name, user, false);
|
this->bridge->send_user_join(this->hostname, chan_name, user,
|
||||||
|
user->get_most_significant_mode(this->sorted_user_modes),
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,7 +338,9 @@ void IrcClient::on_channel_completely_joined(const IrcMessage& message)
|
|||||||
{
|
{
|
||||||
const std::string chan_name = utils::tolower(message.arguments[1]);
|
const std::string chan_name = utils::tolower(message.arguments[1]);
|
||||||
IrcChannel* channel = this->get_channel(chan_name);
|
IrcChannel* channel = this->get_channel(chan_name);
|
||||||
this->bridge->send_user_join(this->hostname, chan_name, channel->get_self(), true);
|
this->bridge->send_user_join(this->hostname, chan_name, channel->get_self(),
|
||||||
|
channel->get_self()->get_most_significant_mode(this->sorted_user_modes),
|
||||||
|
true);
|
||||||
this->bridge->send_topic(this->hostname, chan_name, channel->topic);
|
this->bridge->send_topic(this->hostname, chan_name, channel->topic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user