diff options
author | Florent Le Coz <louiz@louiz.org> | 2013-11-11 00:24:34 +0100 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2013-11-11 00:24:34 +0100 |
commit | 096a4e3bafe6e2d238e4592f57f22f19f363fcbd (patch) | |
tree | 621047f639559200903ec08683dcdfa1bc363615 /src/irc | |
parent | f0d9273da61ce154dbe460cf58c98de851d30615 (diff) | |
download | biboumi-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.cpp | 45 | ||||
-rw-r--r-- | src/irc/irc_client.hpp | 10 |
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); |