The complete source code of IdealIRC http://www.idealirc.org/
 
 
 
 
idealirc/IRCClient/Private/parseIncoming.cpp

143 lines
3.2 KiB

/*
* IdealIRC Core - Internet Relay Chat API
* Copyright (C) 2021 Tom-Andre Barstad.
* This software is licensed under the Software Attribution License.
* See LICENSE for more information.
*/
#include "../IRCBase.h"
#include "../IRCBasePriv.h"
#include "../Commands.h"
#include <fmt/format.h>
#include <iostream> // Needs better logger, spdlog :)
void IRCBasePriv::parseIncoming(const std::string& line)
{
using namespace Command::IRC;
/*
* Do NOT EVER do an "early return" from this function.
* Make sure it always reaches the end!
* No throwing from any of the message handler functions either.
*/
IRCMessage ircmessage(IRCPrefix(hostname), line);
currentMessage = &ircmessage;
if constexpr (DumpReadData) {
std::cout << "[RCV] ";
std::cout << fmt::format("tagc={} ", ircmessage.getTags().size());
int c = 0;
for (const auto& tag : ircmessage.getTags()) {
std::cout << fmt::format("tag({})=\"{}\" ", c, tag);
++c;
}
std::cout << fmt::format(R"(from="{}" cmd="{}" msg="{}" argc={} )", ircmessage.getSender().composite(), ircmessage.getCommand(), ircmessage.getMessage(), ircmessage.getArgs().size());
c = 0;
for (const auto& arg : ircmessage.getArgs()) {
std::cout << fmt::format("arg({})=\"{}\" ", c, arg);
++c;
}
std::cout << std::endl;
}
using namespace Command::IRC;
using namespace Numeric;
/*
* Numeric reply
*/
if (ircmessage.isNumeric()) {
handleNumeric(ircmessage);
}
else if (ircmessage == NICK) {
cmdNick(ircmessage);
}
else if (ircmessage == MODE) {
cmdMode(ircmessage);
}
else if (ircmessage == QUIT) {
cmdQuit(ircmessage);
}
else if (ircmessage == JOIN) {
cmdJoin(ircmessage);
}
else if (ircmessage == PART) {
cmdPart(ircmessage);
}
else if (ircmessage == TOPIC) {
cmdTopic(ircmessage);
}
else if (ircmessage == INVITE) {
cmdInvite(ircmessage);
}
else if (ircmessage == KICK) {
cmdKick(ircmessage);
}
else if (ircmessage == PRIVMSG) {
cmdPrivmsg(ircmessage);
}
else if (ircmessage == NOTICE) {
cmdNotice(ircmessage);
}
else if (ircmessage == KILL) {
cmdKill(ircmessage);
}
else if (ircmessage == PING) {
cmdPing(ircmessage);
}
else if (ircmessage == PONG) {
cmdPong(ircmessage);
}
else if (ircmessage == ERROR_) {
cmdError(ircmessage);
}
else if (ircmessage == WALLOPS) {
cmdWallops(ircmessage);
}
else if (ircmessage == Command::IRCv3::CAP && !isOnline) {
cmdV3Cap(ircmessage);
}
/* IRCv3 capability "away-notify" */
else if (ircmessage == Command::IRC::AWAY) {
cmdV3Away(ircmessage);
}
/* IRCv3 capability "account-notify" */
else if (ircmessage == Command::Extension::ACCOUNT) {
cmdV3Account(ircmessage);
}
/* IRCv3 capability "sasl" */
else if (ircmessage == Command::Extension::AUTHENTICATE) {
cmdV3Authenticate(ircmessage);
}
else {
handleUnhandled(ircmessage);
}
currentMessage = nullptr;
}