summaryrefslogtreecommitdiff
path: root/src/irc
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2013-11-11 00:24:34 +0100
committerFlorent Le Coz <louiz@louiz.org>2013-11-11 00:24:34 +0100
commit096a4e3bafe6e2d238e4592f57f22f19f363fcbd (patch)
tree621047f639559200903ec08683dcdfa1bc363615 /src/irc
parentf0d9273da61ce154dbe460cf58c98de851d30615 (diff)
downloadbiboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.tar.gz
biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.tar.bz2
biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.tar.xz
biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.zip
Handle nick changes, both ways
Diffstat (limited to 'src/irc')
-rw-r--r--src/irc/irc_client.cpp45
-rw-r--r--src/irc/irc_client.hpp10
2 files changed, 48 insertions, 7 deletions
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index 71b0fe2..30b1204 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -53,6 +53,12 @@ IrcChannel* IrcClient::get_channel(const std::string& name)
}
}
+bool IrcClient::is_channel_joined(const std::string& name)
+{
+ IrcChannel* client = this->get_channel(name);
+ return client->joined;
+}
+
std::string IrcClient::get_own_nick() const
{
return this->current_nick;
@@ -91,6 +97,8 @@ void IrcClient::parse_in_buffer()
this->on_part(message);
else if (message.command == "QUIT")
this->on_quit(message);
+ else if (message.command == "NICK")
+ this->on_nick(message);
}
}
@@ -128,11 +136,9 @@ void IrcClient::send_nick_command(const std::string& nick)
void IrcClient::send_join_command(const std::string& chan_name)
{
if (this->welcomed == false)
- {
- this->channels_to_join.push_back(chan_name);
- return ;
- }
- this->send_message(IrcMessage("JOIN", {chan_name}));
+ this->channels_to_join.push_back(chan_name);
+ else
+ this->send_message(IrcMessage("JOIN", {chan_name}));
}
bool IrcClient::send_channel_message(const std::string& chan_name, const std::string& body)
@@ -288,7 +294,34 @@ void IrcClient::on_quit(const IrcMessage& message)
Iid iid;
iid.chan = chan_name;
iid.server = this->hostname;
- this->bridge->send_muc_leave(std::move(iid), std::move(nick), std::move(txt), false);
+ this->bridge->send_muc_leave(std::move(iid), std::move(nick), txt, false);
}
}
}
+
+void IrcClient::on_nick(const IrcMessage& message)
+{
+ const std::string new_nick = message.arguments[0];
+ for (auto it = this->channels.begin(); it != this->channels.end(); ++it)
+ {
+ const std::string chan_name = it->first;
+ IrcChannel* channel = it->second.get();
+ IrcUser* user = channel->find_user(message.prefix);
+ if (user)
+ {
+ std::string old_nick = user->nick;
+ Iid iid;
+ iid.chan = chan_name;
+ iid.server = this->hostname;
+ bool self = channel->get_self()->nick == old_nick;
+ this->bridge->send_nick_change(std::move(iid), old_nick, new_nick, self);
+ user->nick = new_nick;
+ if (self)
+ {
+ channel->get_self()->nick = new_nick;
+ this->current_nick = new_nick;
+ }
+ }
+ }
+}
+
diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp
index bb51a4e..d9ea069 100644
--- a/src/irc/irc_client.hpp
+++ b/src/irc/irc_client.hpp
@@ -45,6 +45,10 @@ public:
*/
IrcChannel* get_channel(const std::string& name);
/**
+ * Returns true if the channel is joined
+ */
+ bool is_channel_joined(const std::string& name);
+ /**
* Return our own nick
*/
std::string get_own_nick() const;
@@ -67,7 +71,7 @@ public:
*/
void send_nick_command(const std::string& username);
/**
- * Send the JOIN irc command
+ * Send the JOIN irc command.
*/
void send_join_command(const std::string& chan_name);
/**
@@ -119,6 +123,10 @@ public:
*/
void on_part(const IrcMessage& message);
/**
+ * When a NICK message is received
+ */
+ void on_nick(const IrcMessage& message);
+ /**
* When a QUIT message is received
*/
void on_quit(const IrcMessage& message);