diff --git a/backends/libircclient-qt/ircnetworkplugin.cpp b/backends/libircclient-qt/ircnetworkplugin.cpp index 70dc58d0..4f0c9e52 100644 --- a/backends/libircclient-qt/ircnetworkplugin.cpp +++ b/backends/libircclient-qt/ircnetworkplugin.cpp @@ -22,12 +22,18 @@ void IRCNetworkPlugin::sendData(const std::string &string) { } void IRCNetworkPlugin::handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { - MyIrcSession *session = new MyIrcSession(user, this); - std::string h = user.substr(0, user.find("@")); - session->setNick(QString::fromStdString(h.substr(0, h.find("%")))); - session->connectToServer(QString::fromStdString(h.substr(h.find("%") + 1)), 6667); - std::cout << "CONNECTING IRC NETWORK " << h.substr(h.find("%") + 1) << "\n"; - m_sessions[user] = session; + // Server is in server-mode, so user is JID of server when we want to connect + if (CONFIG_BOOL(config, "service.server_mode")) { + MyIrcSession *session = new MyIrcSession(user, this); + std::string h = user.substr(0, user.find("@")); + session->setNick(QString::fromStdString(h.substr(0, h.find("%")))); + session->connectToServer(QString::fromStdString(h.substr(h.find("%") + 1)), 6667); + std::cout << "CONNECTING IRC NETWORK " << h.substr(h.find("%") + 1) << "\n"; + m_sessions[user] = session; + } + else { + handleConnected(user); + } } void IRCNetworkPlugin::handleLogoutRequest(const std::string &user, const std::string &legacyName) { @@ -38,27 +44,54 @@ 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::cout << "MESSAGE " << user << " " << legacyName << "\n"; if (m_sessions[user] == NULL) return; - m_sessions[user]->message(QString::fromStdString(legacyName), QString::fromStdString(message)); + + std::string r = legacyName; + if (!CONFIG_BOOL(config, "service.server_mode")) { + r = legacyName.substr(0, r.find("@")); + } + std::cout << "MESSAGE " << user << " " << r << "\n"; + m_sessions[user]->message(QString::fromStdString(r), QString::fromStdString(message)); std::cout << "SENT\n"; } void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std::string &room, const std::string &nickname, const std::string &password) { std::cout << "JOIN\n"; - if (m_sessions[user] == NULL) - return; - m_sessions[user]->addAutoJoinChannel(QString::fromStdString(room)); - m_sessions[user]->join(QString::fromStdString(room), QString::fromStdString(password)); + std::string r = room; + if (m_sessions[user] == NULL) { + // in gateway mode we want to login this user to network according to legacyName + 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("%"))); + 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"; + m_sessions[user] = session; + r = room.substr(0, room.find("%")); + std::cout << "room=" << r << "\n"; + } + else { + return; + } + } + m_sessions[user]->addAutoJoinChannel(QString::fromStdString(r)); + m_sessions[user]->join(QString::fromStdString(r), QString::fromStdString(password)); // update nickname, because we have nickname per session, no nickname per room. - handleRoomNicknameChanged(user, room, m_sessions[user]->nick().toStdString()); + handleRoomNicknameChanged(user, r, m_sessions[user]->nick().toStdString()); } void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std::string &room) { std::cout << "PART\n"; if (m_sessions[user] == NULL) return; - m_sessions[user]->part(QString::fromStdString(room)); - m_sessions[user]->removeAutoJoinChannel(QString::fromStdString(room)); + + std::string r = room; + if (!CONFIG_BOOL(config, "service.server_mode")) { + r = room.substr(0, room.find("%")); + } + + m_sessions[user]->part(QString::fromStdString(r)); + m_sessions[user]->removeAutoJoinChannel(QString::fromStdString(r)); } diff --git a/backends/libircclient-qt/session.cpp b/backends/libircclient-qt/session.cpp index ed2b1674..ceb30ee5 100644 --- a/backends/libircclient-qt/session.cpp +++ b/backends/libircclient-qt/session.cpp @@ -13,10 +13,11 @@ #include #include "Swiften/Elements/StatusShow.h" -MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent) : Irc::Session(parent) +MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, const std::string &suffix, QObject* parent) : Irc::Session(parent) { this->np = np; this->user = user; + this->suffix = suffix; connect(this, SIGNAL(disconnected()), SLOT(on_disconnected())); } @@ -26,8 +27,9 @@ void MyIrcSession::on_connected(){ void MyIrcSession::on_disconnected() { - std::cout << "disconnected:\n"; - np->handleDisconnected(user, 0, ""); + std::cout << "disconnected:\n"; + if (suffix.empty()) + np->handleDisconnected(user, 0, ""); } void MyIrcSession::on_bufferAdded(Irc::Buffer* buffer) @@ -42,14 +44,15 @@ void MyIrcSession::on_bufferRemoved(Irc::Buffer* buffer) Irc::Buffer* MyIrcSession::createBuffer(const QString& receiver) { - return new MyIrcBuffer(receiver, user, np, this); + return new MyIrcBuffer(receiver, user, np, suffix, this); } -MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent) +MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, const std::string &suffix, Irc::Session* parent) : Irc::Buffer(receiver, parent) { this->np = np; this->user = user; + this->suffix = suffix; p = (MyIrcSession *) parent; connect(this, SIGNAL(receiverChanged(QString)), SLOT(on_receiverChanged(QString))); connect(this, SIGNAL(joined(QString)), SLOT(on_joined(QString))); @@ -94,7 +97,7 @@ void MyIrcBuffer::on_joined(const QString& origin) { bool flags = 0; std::string nickname = origin.toStdString(); flags = correctNickname(nickname); - np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), (int) flags, pbnetwork::STATUS_ONLINE); + np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString() + suffix, (int) flags, pbnetwork::STATUS_ONLINE); } void MyIrcBuffer::on_parted(const QString& origin, const QString& message) { @@ -102,7 +105,7 @@ void MyIrcBuffer::on_parted(const QString& origin, const QString& message) { bool flags = 0; std::string nickname = origin.toStdString(); flags = correctNickname(nickname); - np->handleParticipantChanged(user, nickname, receiver().toStdString(),(int) flags, pbnetwork::STATUS_NONE, message.toStdString()); + np->handleParticipantChanged(user, nickname, receiver().toStdString() + suffix,(int) flags, pbnetwork::STATUS_NONE, message.toStdString()); } void MyIrcBuffer::on_quit(const QString& origin, const QString& message) @@ -116,7 +119,7 @@ void MyIrcBuffer::on_nickChanged(const QString& origin, const QString& nick) { std::string nickname = origin.toStdString(); bool flags = p->m_modes[receiver().toStdString() + nickname]; // std::cout << receiver().toStdString() + nickname << " " << flags << "\n"; - np->handleParticipantChanged(user, nickname, receiver().toStdString(),(int) flags, pbnetwork::STATUS_ONLINE, "", nick.toStdString()); + np->handleParticipantChanged(user, nickname, receiver().toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", nick.toStdString()); } void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, const QString& args) { @@ -132,13 +135,13 @@ void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, con p->m_modes[receiver().toStdString() + nickname] = 0; } bool flags = p->m_modes[receiver().toStdString() + nickname]; - np->handleParticipantChanged(user, nickname, receiver().toStdString(),(int) flags, pbnetwork::STATUS_ONLINE, ""); + np->handleParticipantChanged(user, nickname, receiver().toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE, ""); } void MyIrcBuffer::on_topicChanged(const QString& origin, const QString& topic) { //topic changed: "#testik" "HanzZ" "test" qDebug() << "topic changed:" << receiver() << origin << topic; - np->handleSubject(user, receiver().toStdString(), topic.toStdString(), origin.toStdString()); + np->handleSubject(user, receiver().toStdString() + suffix, topic.toStdString(), origin.toStdString()); } void MyIrcBuffer::on_invited(const QString& origin, const QString& receiver, const QString& channel) @@ -155,7 +158,11 @@ void MyIrcBuffer::on_messageReceived(const QString& origin, const QString& messa qDebug() << "message received:" << receiver() << origin << message << (flags & Irc::Buffer::IdentifiedFlag ? "(identified!)" : "(not identified)"); if (!receiver().startsWith("#") && (flags & Irc::Buffer::EchoFlag)) return; - np->handleMessage(user, receiver().toStdString(), message.toStdString(), origin.toStdString()); + std::string r = receiver().toStdString(); +// if (!suffix.empty()) { +// r = receiver().replace('@', '%').toStdString(); +// } + np->handleMessage(user, r + suffix, message.toStdString(), origin.toStdString()); } void MyIrcBuffer::on_noticeReceived(const QString& origin, const QString& notice, Irc::Buffer::MessageFlags flags) @@ -186,13 +193,14 @@ void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, co { switch (code) { case 251: - np->handleConnected(user); + if (suffix.empty()) + np->handleConnected(user); break; case 332: m_topicData = params.value(2).toStdString(); break; case 333: - np->handleSubject(user, params.value(1).toStdString(), m_topicData, params.value(2).toStdString()); + np->handleSubject(user, params.value(1).toStdString() + suffix, m_topicData, params.value(2).toStdString()); break; case 353: QString channel = params.value(2); @@ -203,12 +211,12 @@ void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, co std::string nickname = members.at(i).toStdString(); flags = correctNickname(nickname); p->m_modes[channel.toStdString() + nickname] = flags; -// std::cout << channel.toStdString() + nickname << " " << flags << "\n"; - np->handleParticipantChanged(user, nickname, channel.toStdString(),(int) flags, pbnetwork::STATUS_ONLINE); + std::cout << channel.toStdString() + suffix << " " << flags << "\n"; + np->handleParticipantChanged(user, nickname, channel.toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE); } break; } - qDebug() << "numeric message received:" << receiver() << origin << code << params; + qDebug() << "numeric message received:" << receiver() << origin << code << params; } void MyIrcBuffer::on_unknownMessageReceived(const QString& origin, const QStringList& params) diff --git a/backends/libircclient-qt/session.h b/backends/libircclient-qt/session.h index 1f9e021d..b782c7c5 100644 --- a/backends/libircclient-qt/session.h +++ b/backends/libircclient-qt/session.h @@ -22,8 +22,9 @@ class MyIrcSession : public Irc::Session Q_OBJECT public: - MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent = 0); + MyIrcSession(const std::string &user, NetworkPlugin *np, const std::string &suffix = "", QObject* parent = 0); std::map m_modes; + std::string suffix; protected Q_SLOTS: void on_connected(); @@ -35,6 +36,7 @@ protected Q_SLOTS: protected: NetworkPlugin *np; std::string user; + virtual Irc::Buffer* createBuffer(const QString& receiver); }; @@ -43,11 +45,12 @@ class MyIrcBuffer : public Irc::Buffer Q_OBJECT public: - MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent); + MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, const std::string &suffix, Irc::Session* parent); NetworkPlugin *np; std::string user; MyIrcSession *p; std::string m_topicData; + std::string suffix; protected Q_SLOTS: void on_receiverChanged(const QString& receiver);