From 8c529dbabbbc337e0d97240a1070cd7e7abfb86d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 25 Oct 2011 20:29:58 +0200 Subject: [PATCH] semi-working PMs in muc --- backends/libircclient-qt/ircnetworkplugin.cpp | 33 ++++++++++++------- include/transport/conversation.h | 4 +-- src/conversation.cpp | 19 +++++++++-- src/user.cpp | 6 ++-- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/backends/libircclient-qt/ircnetworkplugin.cpp b/backends/libircclient-qt/ircnetworkplugin.cpp index 3899fa35..2ebe91d9 100644 --- a/backends/libircclient-qt/ircnetworkplugin.cpp +++ b/backends/libircclient-qt/ircnetworkplugin.cpp @@ -46,15 +46,26 @@ void IRCNetworkPlugin::handleLogoutRequest(const std::string &user, const std::s void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/) { std::string u = user; + std::cout << "AAAAA " << legacyName << "\n"; if (!CONFIG_BOOL(config, "service.server_mode")) { u = user + legacyName.substr(legacyName.find("@") + 1); + if (u.find("/") != std::string::npos) { + u = u.substr(0, u.find("/")); + } } - if (m_sessions[u] == NULL) + if (m_sessions[u] == NULL) { + std::cout << "No session for " << u << "\n"; return; + } std::string r = legacyName; if (!CONFIG_BOOL(config, "service.server_mode")) { - r = legacyName.substr(0, r.find("@")); + if (legacyName.find("/") == std::string::npos) { + r = legacyName.substr(0, r.find("@")); + } + else { + r = legacyName.substr(legacyName.find("/") + 1); + } } std::cout << "MESSAGE " << u << " " << r << "\n"; m_sessions[u]->message(QString::fromStdString(r), QString::fromStdString(message)); @@ -66,18 +77,18 @@ void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std: std::string r = room; std::string u = user; if (!CONFIG_BOOL(config, "service.server_mode")) { - u = user + room.substr(room.find("%") + 1); - r = room.substr(0, room.find("%")); + u = user + room.substr(room.find("@") + 1); + r = room.substr(0, room.find("@")); } if (m_sessions[u] == NULL) { // in gateway mode we want to login this user to network according to legacyName - if (room.find("%") != std::string::npos) { + if (room.find("@") != std::string::npos) { // suffix is %irc.freenode.net to let MyIrcSession return #room%irc.freenode.net - MyIrcSession *session = new MyIrcSession(user, this, room.substr(room.find("%"))); + MyIrcSession *session = new MyIrcSession(user, this, room.substr(room.find("@"))); session->setNick(QString::fromStdString(nickname)); - session->connectToServer(QString::fromStdString(room.substr(room.find("%") + 1)), 6667); - std::cout << "CONNECTING IRC NETWORK " << room.substr(room.find("%") + 1) << "\n"; - std::cout << "SUFFIX " << room.substr(room.find("%")) << "\n"; + session->connectToServer(QString::fromStdString(room.substr(room.find("@") + 1)), 6667); + std::cout << "CONNECTING IRC NETWORK " << room.substr(room.find("@") + 1) << "\n"; + std::cout << "SUFFIX " << room.substr(room.find("@")) << "\n"; m_sessions[u] = session; } else { @@ -96,8 +107,8 @@ void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std std::string r = room; std::string u = user; if (!CONFIG_BOOL(config, "service.server_mode")) { - r = room.substr(0, room.find("%")); - u = user + room.substr(room.find("%") + 1); + r = room.substr(0, room.find("@")); + u = user + room.substr(room.find("@") + 1); } if (m_sessions[u] == NULL) diff --git a/include/transport/conversation.h b/include/transport/conversation.h index 82a35b0c..8af86993 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -97,9 +97,7 @@ class Conversation { /// This is used to detect Private messages associated with particular room. /// \param room room name associated with this Conversation. - void setRoom(const std::string &room) { - m_room = room; - } + void setRoom(const std::string &room); /// Returns room name associated with this Conversation. diff --git a/src/conversation.cpp b/src/conversation.cpp index 238fe4c8..81b1654d 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -42,6 +42,11 @@ Conversation::Conversation(ConversationManager *conversationManager, const std:: Conversation::~Conversation() { } +void Conversation::setRoom(const std::string &room) { + m_room = room; + m_legacyName = m_room + "/" + m_legacyName; +} + void Conversation::handleMessage(boost::shared_ptr &message, const std::string &nickname) { if (m_muc) { message->setType(Swift::Message::Groupchat); @@ -74,8 +79,12 @@ void Conversation::handleMessage(boost::shared_ptr &message, con m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message); } else { + std::string legacyName = m_legacyName; + if (legacyName.find_last_of("@") != std::string::npos) { + legacyName.replace(legacyName.find_last_of("@"), 1, "%"); // OK + } message->setTo(m_conversationManager->getUser()->getJID().toString()); - message->setFrom(Swift::JID(m_legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); + message->setFrom(Swift::JID(legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message); } } @@ -83,7 +92,13 @@ void Conversation::handleMessage(boost::shared_ptr &message, con void Conversation::handleParticipantChanged(const std::string &nick, int flag, int status, const std::string &statusMessage, const std::string &newname) { std::string nickname = nick; Swift::Presence::ref presence = Swift::Presence::create(); - presence->setFrom(Swift::JID(m_legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); + std::string legacyName = m_legacyName; + if (m_muc) { + if (legacyName.find_last_of("@") != std::string::npos) { + legacyName.replace(legacyName.find_last_of("@"), 1, "%"); // OK + } + } + presence->setFrom(Swift::JID(legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); presence->setTo(m_conversationManager->getUser()->getJID().toString()); presence->setType(Swift::Presence::Available); diff --git a/src/user.cpp b/src/user.cpp index bd4c2726..53056d40 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -194,7 +194,8 @@ void User::handlePresence(Swift::Presence::ref presence) { if (isMUC) { if (presence->getType() == Swift::Presence::Unavailable) { LOG4CXX_INFO(logger, m_jid.toString() << ": Going to left room " << presence->getTo().getNode()); - onRoomLeft(presence->getTo().getNode()); + std::string room = Buddy::JIDToLegacyName(presence->getTo()); + onRoomLeft(room); } else { // force connection to legacy network to let backend to handle auto-join on connect. @@ -204,7 +205,8 @@ void User::handlePresence(Swift::Presence::ref presence) { onReadyToConnect(); } LOG4CXX_INFO(logger, m_jid.toString() << ": Going to join room " << presence->getTo().getNode() << " as " << presence->getTo().getResource()); - onRoomJoined(presence->getTo().getNode(), presence->getTo().getResource(), ""); + std::string room = Buddy::JIDToLegacyName(presence->getTo()); + onRoomJoined(room, presence->getTo().getResource(), ""); } return; }