diff --git a/backends/libcommuni/session.cpp b/backends/libcommuni/session.cpp index c8b271f624203517e1e7d1c075cc14d09a5ffc21..c13297ff73cabc7df41022f85a9cc60d4b4690e3 100644 --- a/backends/libcommuni/session.cpp +++ b/backends/libcommuni/session.cpp @@ -86,6 +86,9 @@ bool MyIrcSession::correctNickname(std::string &nickname) { switch(nickname.at(0)) { case '@': nickname = nickname.substr(1); flags = 1; break; case '+': nickname = nickname.substr(1); break; + case '~': nickname = nickname.substr(1); break; + case '&': nickname = nickname.substr(1); break; + case '%': nickname = nickname.substr(1); break; default: break; } return flags; @@ -96,9 +99,9 @@ void MyIrcSession::on_joined(IrcMessage *message) { bool op = 0; std::string nickname = TO_UTF8(m->sender().name()); op = correctNickname(nickname); - getIRCBuddy(TO_UTF8(m->channel()), nickname).setOp(op); - np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel()) + suffix, op, pbnetwork::STATUS_ONLINE); - LOG4CXX_INFO(logger, user << ": " << nickname << " joined " << TO_UTF8(m->channel()) + suffix); + getIRCBuddy(TO_UTF8(m->channel().toLower()), nickname).setOp(op); + np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel().toLower()) + suffix, op, pbnetwork::STATUS_ONLINE); + LOG4CXX_INFO(logger, user << ": " << nickname << " joined " << TO_UTF8(m->channel().toLower()) + suffix); } @@ -107,9 +110,9 @@ void MyIrcSession::on_parted(IrcMessage *message) { bool op = 0; std::string nickname = TO_UTF8(m->sender().name()); op = correctNickname(nickname); - removeIRCBuddy(TO_UTF8(m->channel()), nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << TO_UTF8(m->channel()) + suffix); - np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel()) + suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); + removeIRCBuddy(TO_UTF8(m->channel().toLower()), nickname); + LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << TO_UTF8(m->channel().toLower()) + suffix); + np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel().toLower()) + suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); } void MyIrcSession::on_quit(IrcMessage *message) { @@ -172,7 +175,7 @@ void MyIrcSession::on_topicChanged(IrcMessage *message) { correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << TO_UTF8(m->topic())); - np->handleSubject(user, TO_UTF8(m->channel()) + suffix, TO_UTF8(m->topic()), nickname); + np->handleSubject(user, TO_UTF8(m->channel().toLower()) + suffix, TO_UTF8(m->topic()), nickname); } void MyIrcSession::on_messageReceived(IrcMessage *message) { @@ -190,7 +193,7 @@ void MyIrcSession::on_messageReceived(IrcMessage *message) { msg = QString("/me ") + msg; } - std::string target = TO_UTF8(m->target()); + std::string target = TO_UTF8(m->target().toLower()); LOG4CXX_INFO(logger, user << ": Message from " << target); if (target.find("#") == 0) { std::string nickname = TO_UTF8(m->sender().name()); @@ -229,10 +232,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { if (nick.find("/") != std::string::npos) { nick = nick.substr(0, nick.find("/")); } - np->handleSubject(user, TO_UTF8(parameters[1]) + suffix, m_topicData, nick); + np->handleSubject(user, TO_UTF8(parameters[1].toLower()) + suffix, m_topicData, nick); break; case 352: { - channel = parameters[1]; + channel = parameters[1].toLower(); nick = TO_UTF8(parameters[5]); IRCBuddy &buddy = getIRCBuddy(TO_UTF8(channel), nick); @@ -249,7 +252,7 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { break; } case 353: - channel = parameters[2]; + channel = parameters[2].toLower(); members = parameters[3].split(" "); LOG4CXX_INFO(logger, user << ": Received members for " << TO_UTF8(channel) << suffix); @@ -265,13 +268,33 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { break; case 366: // ask /who to get away states - channel = parameters[1]; + channel = parameters[1].toLower(); LOG4CXX_INFO(logger, user << "Asking /who for channel " << TO_UTF8(channel)); sendCommand(IrcCommand::createWho(channel)); break; case 432: np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Erroneous Nickname"); break; + case 433: + for(AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { + np->handleParticipantChanged(user, TO_UTF8(nickName()), it->second->getChannel() + suffix, pbnetwork::PARTICIPANT_FLAG_CONFLICT); + } + if (suffix.empty()) { + np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Nickname is already in use"); + } + break; + case 436: + for(AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { + np->handleParticipantChanged(user, TO_UTF8(nickName()), it->second->getChannel() + suffix, pbnetwork::PARTICIPANT_FLAG_CONFLICT); + } + np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Nickname collision KILL"); + case 464: + for(AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { + np->handleParticipantChanged(user, TO_UTF8(nickName()), it->second->getChannel() + suffix, pbnetwork::PARTICIPANT_FLAG_NOT_AUTHORIZED); + } + if (suffix.empty()) { + np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Password incorrect"); + } case 321: m_rooms.clear(); m_names.clear(); @@ -287,6 +310,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { break; } + if (m->code() >= 400 && m->code() < 500) { + LOG4CXX_INFO(logger, user << ": Error message received: " << message->toData().data()); + } + //qDebug() << "numeric message received:" << receiver() << origin << code << params; }