The complete source code of IdealIRC
http://www.idealirc.org/
143 lines
3.2 KiB
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;
|
|
}
|
|
|