xbot/self_thread.cpp

153 lines
3.3 KiB
C++
Raw Normal View History

2023-11-26 16:48:21 -08:00
#include "self_thread.hpp"
#include "connection.hpp"
2024-03-03 12:53:59 -08:00
auto SelfThread::on_welcome(IrcMsg const& irc) -> void
{
nickname_ = irc.args[0];
}
auto SelfThread::on_nick(IrcMsg const& irc) -> void
{
if (is_my_mask(irc.source))
{
nickname_ = irc.args[0];
}
}
auto SelfThread::on_umodeis(IrcMsg const& irc) -> void
{
mode_ = irc.args[1];
}
auto SelfThread::on_join(IrcMsg const& irc) -> void
{
if (is_my_mask(irc.source))
{
channels_.insert(std::string{irc.args[0]});
}
}
auto SelfThread::on_kick(IrcMsg const& irc) -> void
{
if (is_my_nick(irc.args[1]))
{
channels_.erase(std::string{irc.args[0]});
}
}
auto SelfThread::on_part(IrcMsg const& irc) -> void
{
if (is_my_mask(irc.source))
{
channels_.erase(std::string{irc.args[0]});
}
}
auto SelfThread::on_mode(IrcMsg const& irc) -> void
{
if (is_my_nick(irc.args[0]))
{
auto polarity = true;
for (char const c : irc.args[1])
{
switch (c)
{
case '+':
polarity = true;
break;
case '-':
polarity = false;
break;
default:
if (polarity)
{
mode_ += c;
}
else
{
auto const ix = mode_.find(c);
if (ix != std::string::npos)
{
mode_.erase(ix, 1);
}
}
break;
}
}
}
}
2023-11-26 16:48:21 -08:00
auto SelfThread::start(Connection& connection) -> std::shared_ptr<SelfThread>
{
auto thread = std::make_shared<SelfThread>(connection);
2025-01-22 23:49:48 -08:00
connection.sig_ircmsg.connect([thread](auto cmd, auto& msg)
2023-11-26 16:48:21 -08:00
{
2025-01-22 23:49:48 -08:00
switch (cmd)
2023-11-26 16:48:21 -08:00
{
// Learn nickname from 001
case IrcCommand::RPL_WELCOME:
2025-01-22 23:49:48 -08:00
thread->on_welcome(msg);
2023-11-26 16:48:21 -08:00
break;
2024-03-03 12:53:59 -08:00
2023-11-26 16:48:21 -08:00
// Track changes to our nickname
case IrcCommand::NICK:
2025-01-22 23:49:48 -08:00
thread->on_nick(msg);
2023-11-26 16:48:21 -08:00
break;
// Re-establish user modes
case IrcCommand::RPL_UMODEIS:
2025-01-22 23:49:48 -08:00
thread->on_umodeis(msg);
2023-11-26 16:48:21 -08:00
break;
2024-03-03 12:27:36 -08:00
2024-03-03 12:53:59 -08:00
case IrcCommand::JOIN:
2025-01-22 23:49:48 -08:00
thread->on_join(msg);
2024-03-03 12:27:36 -08:00
break;
2024-03-03 12:53:59 -08:00
case IrcCommand::KICK:
2025-01-22 23:49:48 -08:00
thread->on_kick(msg);
2024-03-03 12:27:36 -08:00
break;
2024-03-03 12:53:59 -08:00
case IrcCommand::PART:
2025-01-22 23:49:48 -08:00
thread->on_part(msg);
2024-03-03 12:27:36 -08:00
break;
2024-03-03 12:53:59 -08:00
2023-11-26 16:48:21 -08:00
// Interpret self mode changes
case IrcCommand::MODE:
2025-01-22 23:49:48 -08:00
thread->on_mode(msg);
2024-03-03 12:53:59 -08:00
break;
2024-03-03 12:27:36 -08:00
2023-11-26 16:48:21 -08:00
default: break;
}
});
return thread;
}
2024-03-03 12:27:36 -08:00
auto SelfThread::get_my_nickname() const -> std::string const&
{
return nickname_;
}
auto SelfThread::get_my_mode() const -> std::string const&
{
return mode_;
}
auto SelfThread::get_my_channels() const -> std::unordered_set<std::string> const&
{
return channels_;
}
auto SelfThread::is_my_nick(std::string_view nick) const -> bool
{
return nick == nickname_;
}
auto SelfThread::is_my_mask(std::string_view mask) const -> bool
{
auto const bang = mask.find('!');
return bang != std::string_view::npos && nickname_ == mask.substr(0, bang);
}