/* * Copyright (C) 2008-2009 J-P Nurmi jpnurmi@gmail.com * * This example is free, and not covered by LGPL license. There is no * restriction applied to their modification, redistribution, using and so on. * You can study them, modify them, use them in your own program - either * completely or partially. By using it you may give me some credits in your * program, but you don't have to. */ #include "session.h" #include #include #include "Swiften/Elements/StatusShow.h" #include #include #include "log4cxx/logger.h" using namespace log4cxx; static LoggerPtr logger = log4cxx::Logger::getLogger("IRCSession"); MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, const std::string &suffix, QObject* parent) : IrcSession(parent) { this->np = np; this->user = user; this->suffix = suffix; m_connected = false; rooms = 0; connect(this, SIGNAL(disconnected()), SLOT(on_disconnected())); connect(this, SIGNAL(connected()), SLOT(on_connected())); connect(this, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(onMessageReceived(IrcMessage*))); } void MyIrcSession::on_connected() { m_connected = true; if (suffix.empty()) { np->handleConnected(user); } for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { sendCommand(IrcCommand::createJoin(QString::fromStdString(*it))); } if (getIdentify().find(" ") != std::string::npos) { std::string to = getIdentify().substr(0, getIdentify().find(" ")); std::string what = getIdentify().substr(getIdentify().find(" ") + 1); sendCommand(IrcCommand::createMessage(QString::fromStdString(to), QString::fromStdString(what))); } } void MyIrcSession::on_disconnected() { if (suffix.empty()) np->handleDisconnected(user, 0, ""); m_connected = false; } bool MyIrcSession::correctNickname(std::string &nickname) { bool flags = 0; switch(nickname.at(0)) { case '@': nickname = nickname.substr(1); flags = 1; break; case '+': nickname = nickname.substr(1); break; default: break; } return flags; } void MyIrcSession::on_joined(IrcMessage *message) { IrcJoinMessage *m = (IrcJoinMessage *) message; bool flags = 0; std::string nickname = m->sender().name().toStdString(); flags = correctNickname(nickname); np->handleParticipantChanged(user, nickname, m->channel().toStdString() + suffix, (int) flags, pbnetwork::STATUS_ONLINE); LOG4CXX_INFO(logger, user << ": Joined " << m->parameters()[0].toStdString()); } void MyIrcSession::on_parted(IrcMessage *message) { IrcPartMessage *m = (IrcPartMessage *) message; bool flags = 0; std::string nickname = m->sender().name().toStdString(); flags = correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << m->channel().toStdString() + suffix); np->handleParticipantChanged(user, nickname, m->channel().toStdString() + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toStdString()); } void MyIrcSession::on_quit(IrcMessage *message) { IrcQuitMessage *m = (IrcQuitMessage *) message; for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { bool flags = 0; std::string nickname = m->sender().name().toStdString(); flags = correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " quit " << (*it) + suffix); np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toStdString()); } } void MyIrcSession::on_nickChanged(IrcMessage *message) { IrcNickMessage *m = (IrcNickMessage *) message; for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { std::string nickname = m->sender().name().toStdString(); bool flags = m_modes[(*it) + nickname]; LOG4CXX_INFO(logger, user << ": " << nickname << " changed nickname to " << m->nick().toStdString()); np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", m->nick().toStdString()); } } void MyIrcSession::on_modeChanged(IrcMessage *message) { IrcModeMessage *m = (IrcModeMessage *) message; // mode changed: "#testik" "HanzZ" "+o" "hanzz_k" std::string nickname = m->argument().toStdString(); std::string mode = m->mode().toStdString(); if (nickname.empty()) return; LOG4CXX_INFO(logger, user << ": " << nickname << " changed mode to " << mode); for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { if (mode == "+o") { m_modes[(*it) + nickname] = 1; } else { m_modes[(*it) + nickname] = 0; } bool flags = m_modes[(*it) + nickname]; np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_ONLINE, ""); } } void MyIrcSession::on_topicChanged(IrcMessage *message) { IrcTopicMessage *m = (IrcTopicMessage *) message; bool flags = 0; std::string nickname = m->sender().name().toStdString(); flags = correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << m->topic().toStdString()); np->handleSubject(user, m->channel().toStdString() + suffix, m->topic().toStdString(), nickname); } void MyIrcSession::on_messageReceived(IrcMessage *message) { IrcPrivateMessage *m = (IrcPrivateMessage *) message; std::string target = m->target().toStdString(); LOG4CXX_INFO(logger, user << ": Message from " << target); if (target.find("#") == 0) { bool flags = 0; std::string nickname = m->sender().name().toStdString(); flags = correctNickname(nickname); np->handleMessage(user, target + suffix, m->message().toStdString(), nickname); } else { bool flags = 0; std::string nickname = m->sender().name().toStdString(); flags = correctNickname(nickname); np->handleMessage(user, nickname, m->message().toStdString()); } } void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { QString channel; QStringList members; IrcNumericMessage *m = (IrcNumericMessage *) message; switch (m->code()) { case 332: m_topicData = m->parameters().value(2).toStdString(); break; case 333: np->handleSubject(user, m->parameters().value(1).toStdString() + suffix, m_topicData, m->parameters().value(2).toStdString()); break; case 353: channel = m->parameters().value(2); members = m->parameters().value(3).split(" "); for (int i = 0; i < members.size(); i++) { bool flags = 0; std::string nickname = members.at(i).toStdString(); flags = correctNickname(nickname); m_modes[channel.toStdString() + nickname] = flags; np->handleParticipantChanged(user, nickname, channel.toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE); } break; case 432: if (m_connected) { np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Erroneous Nickname"); } break; default: break; } //qDebug() << "numeric message received:" << receiver() << origin << code << params; } void MyIrcSession::onMessageReceived(IrcMessage *message) { LOG4CXX_INFO(logger, user << ": " << message->toString().toStdString()); switch (message->type()) { case IrcMessage::Join: on_joined(message); break; case IrcMessage::Part: on_parted(message); break; case IrcMessage::Quit: on_quit(message); break; case IrcMessage::Nick: on_nickChanged(message); break; case IrcMessage::Mode: on_modeChanged(message); break; case IrcMessage::Topic: on_topicChanged(message); break; case IrcMessage::Private: on_messageReceived(message); break; case IrcMessage::Numeric: on_numericMessageReceived(message); break; default:break; } }