From ba5c6ce41e34fdd0ea51a59441a30a6c6bbd81a3 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 17 Dec 2015 15:08:37 +0100 Subject: [PATCH] Cleanup libcommuni code a bit, fix the tests and PM receiving when it is initiated from IRC --- backends/libcommuni/ircnetworkplugin.cpp | 40 +++---- backends/libcommuni/ircnetworkplugin.h | 3 +- backends/libcommuni/main.cpp | 1 - backends/libcommuni/session.cpp | 134 ++++++++++++----------- backends/libcommuni/session.h | 6 +- spectrum/src/tests/muc_pm.py | 15 ++- 6 files changed, 104 insertions(+), 95 deletions(-) diff --git a/backends/libcommuni/ircnetworkplugin.cpp b/backends/libcommuni/ircnetworkplugin.cpp index c9c8cbfa..17b91ebf 100644 --- a/backends/libcommuni/ircnetworkplugin.cpp +++ b/backends/libcommuni/ircnetworkplugin.cpp @@ -29,27 +29,26 @@ DEFINE_LOGGER(logger, "IRCNetworkPlugin"); #define TO_UTF8(WHAT) std::string((WHAT).toUtf8().data(), (WHAT).toUtf8().size()) IRCNetworkPlugin::IRCNetworkPlugin(Config *config, Swift::QtEventLoop *loop, const std::string &host, int port) { - this->config = config; + m_config = config; m_currentServer = 0; m_firstPing = true; + m_socket = new QTcpSocket(); m_socket->connectToHost(FROM_UTF8(host), port); connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData())); - std::string server = CONFIG_STRING_DEFAULTED(config, "service.irc_server", ""); + std::string server = CONFIG_STRING_DEFAULTED(m_config, "service.irc_server", ""); if (!server.empty()) { m_servers.push_back(server); } else { - std::list list; - list = CONFIG_LIST_DEFAULTED(config, "service.irc_server", list); - + list = CONFIG_LIST_DEFAULTED(m_config, "service.irc_server", list); m_servers.insert(m_servers.begin(), list.begin(), list.end()); } - if (CONFIG_HAS_KEY(config, "service.irc_identify")) { - m_identify = CONFIG_STRING(config, "service.irc_identify"); + if (CONFIG_HAS_KEY(m_config, "service.irc_identify")) { + m_identify = CONFIG_STRING(m_config, "service.irc_identify"); } else { m_identify = "NickServ identify $name $password"; @@ -71,12 +70,9 @@ void IRCNetworkPlugin::readData() { if (m_firstPing) { m_firstPing = false; - // Users can join the network without registering if we allow - // one user to connect multiple IRC networks. + NetworkPlugin::PluginConfig cfg; -// if (m_servers.empty()) { - cfg.setNeedRegistration(false); -// } + cfg.setNeedRegistration(false); cfg.setSupportMUC(true); cfg.disableJIDEscaping(); sendConfig(cfg); @@ -125,7 +121,7 @@ void IRCNetworkPlugin::handleLoginRequest(const std::string &user, const std::st } else { // We are waiting for first room join to connect user to IRC network, because we don't know which - // network he choose... + // network he chooses... LOG4CXX_INFO(logger, user << ": Ready for connections"); handleConnected(user); } @@ -144,7 +140,7 @@ void IRCNetworkPlugin::handleLogoutRequest(const std::string &user, const std::s std::string IRCNetworkPlugin::getSessionName(const std::string &user, const std::string &legacyName) { std::string u = user; - if (!CONFIG_BOOL(config, "service.server_mode") && m_servers.empty()) { + if (!CONFIG_BOOL(m_config, "service.server_mode") && m_servers.empty()) { u = user + legacyName.substr(legacyName.find("@") + 1); if (u.find("/") != std::string::npos) { u = u.substr(0, u.find("/")); @@ -155,14 +151,12 @@ std::string IRCNetworkPlugin::getSessionName(const std::string &user, const std: std::string IRCNetworkPlugin::getTargetName(const std::string &legacyName) { std::string r = legacyName; -// if (!CONFIG_BOOL(config, "service.server_mode")) { - if (legacyName.find("/") == std::string::npos) { - r = legacyName.substr(0, r.find("@")); - } - else { - r = legacyName.substr(legacyName.find("/") + 1); - } -// } + if (legacyName.find("/") == std::string::npos) { + r = legacyName.substr(0, r.find("@")); + } + else { + r = legacyName.substr(legacyName.find("/") + 1); + } return r; } @@ -173,7 +167,6 @@ void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const s return; } - LOG4CXX_INFO(logger, user << ": XXX name: " << session << ", message to " << legacyName); std::string target = getTargetName(legacyName); // We are sending PM message. On XMPP side, user is sending PM using the particular channel, // for example #room@irc.freenode.org/hanzz. On IRC side, we are forwarding this message @@ -234,6 +227,7 @@ void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std: m_sessions[session]->addAutoJoinChannel(target, password); m_sessions[session]->sendCommand(IrcCommand::createJoin(FROM_UTF8(target), FROM_UTF8(password))); m_sessions[session]->rooms += 1; + // update nickname, because we have nickname per session, no nickname per room. handleRoomNicknameChanged(user, target, TO_UTF8(m_sessions[session]->nickName())); } diff --git a/backends/libcommuni/ircnetworkplugin.h b/backends/libcommuni/ircnetworkplugin.h index df8fb65b..23a383b5 100644 --- a/backends/libcommuni/ircnetworkplugin.h +++ b/backends/libcommuni/ircnetworkplugin.h @@ -19,6 +19,7 @@ */ #pragma once + #ifndef Q_MOC_RUN #include "transport/Config.h" #include "transport/NetworkPlugin.h" @@ -58,7 +59,7 @@ class IRCNetworkPlugin : public QObject, public NetworkPlugin { std::string getTargetName(const std::string &legacyName); private: - Config *config; + Config *m_config; QTcpSocket *m_socket; std::map m_sessions; std::vector m_servers; diff --git a/backends/libcommuni/main.cpp b/backends/libcommuni/main.cpp index 42bc0514..4a0146b3 100644 --- a/backends/libcommuni/main.cpp +++ b/backends/libcommuni/main.cpp @@ -21,7 +21,6 @@ #include "transport/Config.h" #include "transport/NetworkPlugin.h" #include "transport/Logging.h" -#include "session.h" #include #include #include "Swiften/EventLoop/Qt/QtEventLoop.h" diff --git a/backends/libcommuni/session.cpp b/backends/libcommuni/session.cpp index d6569e84..8edd2bcc 100644 --- a/backends/libcommuni/session.cpp +++ b/backends/libcommuni/session.cpp @@ -34,15 +34,16 @@ DEFINE_LOGGER(logger, "IRCConnection"); -static bool sentList; +// static bool sentList; MyIrcSession::MyIrcSession(const std::string &user, IRCNetworkPlugin *np, const std::string &suffix, QObject* parent) : IrcConnection(parent) { - this->np = np; - this->user = user; - this->suffix = suffix; + m_np = np; + m_user = user; + m_suffix = suffix; m_connected = false; rooms = 0; + connect(this, SIGNAL(disconnected()), SLOT(on_disconnected())); connect(this, SIGNAL(socketError(QAbstractSocket::SocketError)), SLOT(on_socketError(QAbstractSocket::SocketError))); connect(this, SIGNAL(connected()), SLOT(on_connected())); @@ -59,8 +60,8 @@ MyIrcSession::~MyIrcSession() { void MyIrcSession::on_connected() { m_connected = true; - if (suffix.empty()) { - np->handleConnected(user); + if (m_suffix.empty()) { + m_np->handleConnected(m_user); // if (!sentList) { // sendCommand(IrcCommand::createList("", "")); // sentList = true; @@ -76,13 +77,13 @@ void MyIrcSession::on_connected() { if (getIdentify().find(" ") != std::string::npos) { std::string to = getIdentify().substr(0, getIdentify().find(" ")); std::string what = getIdentify().substr(getIdentify().find(" ") + 1); - LOG4CXX_INFO(logger, user << ": Sending IDENTIFY message to " << to); + LOG4CXX_INFO(logger, m_user << ": Sending IDENTIFY message to " << to); sendCommand(IrcCommand::createMessage(FROM_UTF8(to), FROM_UTF8(what))); } } void MyIrcSession::addPM(const std::string &name, const std::string &room) { - LOG4CXX_INFO(logger, user << ": Adding PM " << name << " " << room); + LOG4CXX_INFO(logger, m_user << ": Adding PM conversation " << name << " " << room); m_pms[name] = room; } @@ -102,22 +103,22 @@ void MyIrcSession::on_socketError(QAbstractSocket::SocketError error) { default: reason= "Unknown error."; break; }; - if (!suffix.empty()) { + if (!m_suffix.empty()) { 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_ROOM_NOT_FOUND, pbnetwork::STATUS_NONE, reason); + m_np->handleParticipantChanged(m_user, TO_UTF8(nickName()), it->second->getChannel() + m_suffix, pbnetwork::PARTICIPANT_FLAG_ROOM_NOT_FOUND, pbnetwork::STATUS_NONE, reason); } } else { - np->handleDisconnected(user, 0, reason); - np->tryNextServer(); + m_np->handleDisconnected(m_user, 0, reason); + m_np->tryNextServer(); } m_connected = false; } void MyIrcSession::on_disconnected() { - if (suffix.empty()) { - np->handleDisconnected(user, 0, ""); - np->tryNextServer(); + if (m_suffix.empty()) { + m_np->handleDisconnected(m_user, 0, ""); + m_np->tryNextServer(); } m_connected = false; } @@ -142,8 +143,8 @@ void MyIrcSession::on_joined(IrcMessage *message) { std::string nickname = TO_UTF8(m->nick()); bool op = correctNickname(nickname); 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); + m_np->handleParticipantChanged(m_user, nickname, TO_UTF8(m->channel().toLower()) + m_suffix, op, pbnetwork::STATUS_ONLINE); + LOG4CXX_INFO(logger, m_user << ": " << nickname << " joined " << TO_UTF8(m->channel().toLower()) + m_suffix); } @@ -152,8 +153,8 @@ void MyIrcSession::on_parted(IrcMessage *message) { std::string nickname = TO_UTF8(m->nick()); bool op = correctNickname(nickname); 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())); + LOG4CXX_INFO(logger, m_user << ": " << nickname << " parted " << TO_UTF8(m->channel().toLower()) + m_suffix); + m_np->handleParticipantChanged(m_user, nickname, TO_UTF8(m->channel().toLower()) + m_suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); } void MyIrcSession::on_quit(IrcMessage *message) { @@ -166,8 +167,8 @@ void MyIrcSession::on_quit(IrcMessage *message) { continue; } removeIRCBuddy(it->second->getChannel(), nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " quit " << it->second->getChannel() + suffix); - np->handleParticipantChanged(user, nickname, it->second->getChannel() + suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); + LOG4CXX_INFO(logger, m_user << ": " << nickname << " quit " << it->second->getChannel() + m_suffix); + m_np->handleParticipantChanged(m_user, nickname, it->second->getChannel() + m_suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); } } @@ -181,8 +182,8 @@ void MyIrcSession::on_nickChanged(IrcMessage *message) { continue; } IRCBuddy &buddy = getIRCBuddy(it->second->getChannel(), nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " changed nickname to " << TO_UTF8(m->nick())); - np->handleParticipantChanged(user, nickname, it->second->getChannel() + suffix,(int) buddy.isOp(), pbnetwork::STATUS_ONLINE, "", TO_UTF8(m->nick())); + LOG4CXX_INFO(logger, m_user << ": " << nickname << " changed nickname to " << TO_UTF8(m->nick())); + m_np->handleParticipantChanged(m_user, nickname, it->second->getChannel() + m_suffix,(int) buddy.isOp(), pbnetwork::STATUS_ONLINE, "", TO_UTF8(m->nick())); } } @@ -208,9 +209,9 @@ void MyIrcSession::on_modeChanged(IrcMessage *message) { buddy.setOp(false); } - np->handleParticipantChanged(user, nickname, TO_UTF8(m->target().toLower()) + suffix,(int) buddy.isOp(), pbnetwork::STATUS_ONLINE, ""); + m_np->handleParticipantChanged(m_user, nickname, TO_UTF8(m->target().toLower()) + m_suffix,(int) buddy.isOp(), pbnetwork::STATUS_ONLINE, ""); - LOG4CXX_INFO(logger, user << ": " << nickname << " changed mode to " << mode << " in " << TO_UTF8(m->target().toLower())); + LOG4CXX_INFO(logger, m_user << ": " << nickname << " changed mode to " << mode << " in " << TO_UTF8(m->target().toLower())); } void MyIrcSession::on_topicChanged(IrcMessage *message) { @@ -219,8 +220,8 @@ void MyIrcSession::on_topicChanged(IrcMessage *message) { std::string nickname = TO_UTF8(m->nick()); correctNickname(nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << TO_UTF8(m->topic())); - np->handleSubject(user, TO_UTF8(m->channel().toLower()) + suffix, TO_UTF8(m->topic()), nickname); + LOG4CXX_INFO(logger, m_user << ": " << nickname << " topic changed to " << TO_UTF8(m->topic())); + m_np->handleSubject(m_user, TO_UTF8(m->channel().toLower()) + m_suffix, TO_UTF8(m->topic()), nickname); } void MyIrcSession::on_messageReceived(IrcMessage *message) { @@ -228,7 +229,7 @@ void MyIrcSession::on_messageReceived(IrcMessage *message) { if (m->isRequest()) { QString request = m->content().split(" ", QString::SkipEmptyParts).value(0).toUpper(); if (request == "PING" || request == "TIME" || request == "VERSION") { - LOG4CXX_INFO(logger, user << ": " << TO_UTF8(request) << " received and has been answered"); + LOG4CXX_INFO(logger, m_user << ": " << TO_UTF8(request) << " received and has been answered"); return; } } @@ -249,36 +250,39 @@ void MyIrcSession::on_messageReceived(IrcMessage *message) { // } 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->nick()); correctNickname(nickname); - np->handleMessage(user, target + suffix, TO_UTF8(msg), nickname, TO_UTF8(html)); + m_np->handleMessage(m_user, target + m_suffix, TO_UTF8(msg), nickname, TO_UTF8(html)); } else { std::string nickname = TO_UTF8(m->nick()); correctNickname(nickname); - LOG4CXX_INFO(logger, user << ": Corrected nickname " << nickname); if (m_pms.find(nickname) != m_pms.end()) { std::string room = m_pms[nickname].substr(0, m_pms[nickname].find("/")); room = room.substr(0, room.find("@")); if (hasIRCBuddy(room, nickname)) { - LOG4CXX_INFO(logger, nickname); - LOG4CXX_INFO(logger, room << " " << suffix); - np->handleMessage(user, room + suffix, TO_UTF8(msg), nickname, TO_UTF8(html), "", false, true); + m_np->handleMessage(m_user, room + m_suffix, TO_UTF8(msg), nickname, TO_UTF8(html), "", false, true); return; } else { - LOG4CXX_INFO(logger, user << ": nickname not found " << nickname); - nickname = nickname + suffix; + nickname = nickname + m_suffix; } } else { - nickname = nickname + suffix; + for (AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { + if (!hasIRCBuddy(it->second->getChannel(), nickname)) { + continue; + } + addPM(nickname, it->second->getChannel()); + m_np->handleMessage(m_user, it->second->getChannel() + m_suffix, TO_UTF8(msg), nickname, TO_UTF8(html), "", false, true); + return; + } + + nickname = nickname + m_suffix; } - LOG4CXX_INFO(logger, nickname); - np->handleMessage(user, nickname, TO_UTF8(msg), "", TO_UTF8(html)); + m_np->handleMessage(m_user, nickname, TO_UTF8(msg), "", TO_UTF8(html)); } } @@ -306,7 +310,7 @@ 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].toLower()) + suffix, m_topicData, nick); + m_np->handleSubject(m_user, TO_UTF8(parameters[1].toLower()) + m_suffix, m_topicData, nick); break; case 352: { channel = parameters[1].toLower(); @@ -316,12 +320,12 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { if (parameters[6].toUpper().startsWith("G")) { if (!buddy.isAway()) { buddy.setAway(true); - np->handleParticipantChanged(user, nick, TO_UTF8(channel) + suffix, buddy.isOp(), pbnetwork::STATUS_AWAY); + m_np->handleParticipantChanged(m_user, nick, TO_UTF8(channel) + m_suffix, buddy.isOp(), pbnetwork::STATUS_AWAY); } } else if (buddy.isAway()) { buddy.setAway(false); - np->handleParticipantChanged(user, nick, TO_UTF8(channel) + suffix, buddy.isOp(), pbnetwork::STATUS_ONLINE); + m_np->handleParticipantChanged(m_user, nick, TO_UTF8(channel) + m_suffix, buddy.isOp(), pbnetwork::STATUS_ONLINE); } break; } @@ -329,45 +333,45 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { channel = parameters[2].toLower(); members = parameters[3].split(" "); - LOG4CXX_INFO(logger, user << ": Received members for " << TO_UTF8(channel) << suffix); + LOG4CXX_INFO(logger, m_user << ": Received members for " << TO_UTF8(channel) << m_suffix); for (int i = 0; i < members.size(); i++) { bool op = 0; std::string nickname = TO_UTF8(members.at(i)); op = correctNickname(nickname); IRCBuddy &buddy = getIRCBuddy(TO_UTF8(channel), nickname); buddy.setOp(op); - np->handleParticipantChanged(user, nickname, TO_UTF8(channel) + suffix, buddy.isOp(), pbnetwork::STATUS_ONLINE); + m_np->handleParticipantChanged(m_user, nickname, TO_UTF8(channel) + m_suffix, buddy.isOp(), pbnetwork::STATUS_ONLINE); } break; case 366: // ask /who to get away states channel = parameters[1].toLower(); - LOG4CXX_INFO(logger, user << "Asking /who for channel " << TO_UTF8(channel)); + LOG4CXX_INFO(logger, m_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"); + m_np->handleDisconnected(m_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); + m_np->handleParticipantChanged(m_user, TO_UTF8(nickName()), it->second->getChannel() + m_suffix, pbnetwork::PARTICIPANT_FLAG_CONFLICT); } - if (suffix.empty()) { - np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Nickname is already in use"); + if (m_suffix.empty()) { + m_np->handleDisconnected(m_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); + m_np->handleParticipantChanged(m_user, TO_UTF8(nickName()), it->second->getChannel() + m_suffix, pbnetwork::PARTICIPANT_FLAG_CONFLICT); } - np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Nickname collision KILL"); + m_np->handleDisconnected(m_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); + m_np->handleParticipantChanged(m_user, TO_UTF8(nickName()), it->second->getChannel() + m_suffix, pbnetwork::PARTICIPANT_FLAG_NOT_AUTHORIZED); } - if (suffix.empty()) { - np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Password incorrect"); + if (m_suffix.empty()) { + m_np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Password incorrect"); } case 321: m_rooms.clear(); @@ -378,14 +382,14 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { m_names.push_back(TO_UTF8(parameters[1])); break; case 323: - np->handleRoomList("", m_rooms, m_names); + m_np->handleRoomList("", m_rooms, m_names); break; default: break; } if (m->code() >= 400 && m->code() < 500) { - LOG4CXX_INFO(logger, user << ": Error message received: " << message->toData().data()); + LOG4CXX_INFO(logger, m_user << ": Error message received: " << message->toData().data()); } } @@ -400,7 +404,7 @@ void MyIrcSession::awayTimeout() { void MyIrcSession::on_noticeMessageReceived(IrcMessage *message) { IrcNoticeMessage *m = (IrcNoticeMessage *) message; - LOG4CXX_INFO(logger, user << ": NOTICE " << TO_UTF8(m->content())); + LOG4CXX_INFO(logger, m_user << ": NOTICE " << TO_UTF8(m->content())); QString msg = m->content(); CommuniBackport::toPlainText(msg); @@ -409,7 +413,7 @@ void MyIrcSession::on_noticeMessageReceived(IrcMessage *message) { if (target.find("#") == 0) { std::string nickname = TO_UTF8(m->nick()); correctNickname(nickname); - np->handleMessage(user, target + suffix, TO_UTF8(msg), nickname); + m_np->handleMessage(m_user, target + m_suffix, TO_UTF8(msg), nickname); } else { std::string nickname = TO_UTF8(m->nick()); @@ -418,26 +422,26 @@ void MyIrcSession::on_noticeMessageReceived(IrcMessage *message) { return; } if (m_pms.find(nickname) != m_pms.end()) { - if (hasIRCBuddy(m_pms[nickname], nickname)) { - LOG4CXX_INFO(logger, nickname); - np->handleMessage(user, m_pms[nickname] + suffix, TO_UTF8(msg), nickname, "", "", false, true); + std::string room = m_pms[nickname].substr(0, m_pms[nickname].find("/")); + room = room.substr(0, room.find("@")); + if (hasIRCBuddy(room, nickname)) { + m_np->handleMessage(m_user, room + m_suffix, TO_UTF8(msg), nickname, "", "", false, true); return; } else { - nickname = nickname + suffix; + nickname = nickname + m_suffix; } } else { - nickname = nickname + suffix; + nickname = nickname + m_suffix; } LOG4CXX_INFO(logger, nickname); - np->handleMessage(user, nickname, TO_UTF8(msg), ""); + m_np->handleMessage(m_user, nickname, TO_UTF8(msg), ""); } } void MyIrcSession::onMessageReceived(IrcMessage *message) { -// LOG4CXX_INFO(logger, user << ": " << TO_UTF8(message->toString())); switch (message->type()) { case IrcMessage::Join: on_joined(message); diff --git a/backends/libcommuni/session.h b/backends/libcommuni/session.h index 3051e6bc..bf00e92e 100644 --- a/backends/libcommuni/session.h +++ b/backends/libcommuni/session.h @@ -133,7 +133,6 @@ public: void on_numericMessageReceived(IrcMessage *message); void on_noticeMessageReceived(IrcMessage *message); - std::string suffix; int rooms; protected Q_SLOTS: @@ -145,8 +144,8 @@ protected Q_SLOTS: void awayTimeout(); protected: - IRCNetworkPlugin *np; - std::string user; + IRCNetworkPlugin *m_np; + std::string m_user; std::string m_identify; AutoJoinMap m_autoJoin; std::string m_topicData; @@ -156,6 +155,7 @@ protected: std::map m_pms; IRCBuddyMap m_buddies; QTimer *m_awayTimer; + std::string m_suffix; }; #endif // SESSION_H diff --git a/spectrum/src/tests/muc_pm.py b/spectrum/src/tests/muc_pm.py index a6de97ad..bfe4b52a 100644 --- a/spectrum/src/tests/muc_pm.py +++ b/spectrum/src/tests/muc_pm.py @@ -19,9 +19,16 @@ class Responder(sleekxmpp.ClientXMPP): self.tests = {} def message(self, msg): + if msg['body'] == "abc" and msg['from'] == self.room + "/client": self.send_message(mto=self.room + "/client", mbody="echo %s" % msg['body'], mtype='chat') + elif msg['body'] == "def" and msg['from'] == self.room + "/client": + self.send_message(mto=self.room + "/client", + mbody="echo %s" % msg['body'], + mtype='chat') + else: + self.finished = True def start(self, event): self.plugin['xep_0045'].joinMUC(self.room, self.nick, wait=True) @@ -36,11 +43,15 @@ class Client(sleekxmpp.ClientXMPP): self.finished = False self.tests = {} - self.tests["echo_received"] = ["libcommuni: Send and receive private messages", False] + self.tests["echo1_received"] = ["libcommuni: Send and receive private messages - 1st msg", False] + self.tests["echo2_received"] = ["libcommuni: Send and receive private messages - 2nd msg", False] def message(self, msg): if msg['body'] == "echo abc" and msg['from'] == self.room + "/responder": - self.tests["echo_received"][1] = True + self.tests["echo1_received"][1] = True + self.send_message(mto=self.room + "/responder", mbody="def", mtype='chat') + elif msg['body'] == "echo def" and msg['from'] == self.room + "/responder": + self.tests["echo2_received"][1] = True self.finished = True def start(self, event):