54 lines
1.4 KiB
C++
54 lines
1.4 KiB
C++
#include "command_thread.hpp"
|
|
|
|
#include "connection.hpp"
|
|
#include "irc_parse_thread.hpp"
|
|
#include "ircmsg.hpp"
|
|
|
|
auto CommandThread::start(Connection& connection) -> void
|
|
{
|
|
connection.add_listener<IrcMsgEvent>([&connection](IrcMsgEvent& event)
|
|
{
|
|
if (IrcCommand::PRIVMSG != event.command) return;
|
|
auto const message = event.irc.args[1];
|
|
if (message.empty()) return;
|
|
if ('!' != message.front()) return;
|
|
|
|
CommandEvent command_event;
|
|
|
|
{
|
|
auto const cmdend = message.find(' ');
|
|
if (std::string_view::npos == cmdend)
|
|
{
|
|
command_event.command = message.substr(1);
|
|
}
|
|
else
|
|
{
|
|
command_event.command = message.substr(1, cmdend - 1);
|
|
command_event.arg = message.substr(cmdend + 1);
|
|
}
|
|
}
|
|
|
|
{
|
|
auto const nickend = event.irc.source.find('!');
|
|
if (std::string_view::npos != nickend)
|
|
{
|
|
command_event.nick = event.irc.source.substr(0, nickend);
|
|
}
|
|
}
|
|
|
|
for (auto const& [k,v] : event.irc.tags)
|
|
{
|
|
if ("solanum.chat/oper" == k)
|
|
{
|
|
command_event.oper = v;
|
|
}
|
|
else if ("account" == k)
|
|
{
|
|
command_event.account = v;
|
|
}
|
|
}
|
|
|
|
connection.dispatch(command_event);
|
|
});
|
|
}
|