From 8e03fbec47013e3a36db04d194a4b9c1b407ef5b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 19 May 2011 08:26:09 +0200 Subject: [PATCH] Working part, moderators resending --- backends/libircclient-qt/main.cpp | 1 + backends/libircclient-qt/session.cpp | 57 ++++++++++++++++++++++------ backends/libircclient-qt/session.h | 4 ++ include/transport/conversation.h | 4 +- include/transport/networkplugin.h | 2 +- src/conversation.cpp | 24 ++++++++++-- src/networkplugin.cpp | 4 +- src/networkpluginserver.cpp | 2 +- src/pbnetwork.proto | 7 ++-- src/user.cpp | 5 +++ 10 files changed, 88 insertions(+), 22 deletions(-) diff --git a/backends/libircclient-qt/main.cpp b/backends/libircclient-qt/main.cpp index 01b9e32d..b021bf3c 100644 --- a/backends/libircclient-qt/main.cpp +++ b/backends/libircclient-qt/main.cpp @@ -65,6 +65,7 @@ class IRCNetworkPlugin : public NetworkPlugin { if (m_sessions[user] == NULL) return; m_sessions[user]->part(QString::fromStdString(room)); + m_sessions[user]->removeAutoJoinChannel(QString::fromStdString(room)); } std::map m_sessions; diff --git a/backends/libircclient-qt/session.cpp b/backends/libircclient-qt/session.cpp index d4724dc2..50b854fa 100644 --- a/backends/libircclient-qt/session.cpp +++ b/backends/libircclient-qt/session.cpp @@ -11,6 +11,7 @@ #include "session.h" #include #include +#include "Swiften/Elements/StatusShow.h" MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent) : Irc::Session(parent) { @@ -48,6 +49,7 @@ MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, Netwo { this->np = np; this->user = user; + p = (MyIrcSession *) parent; connect(this, SIGNAL(receiverChanged(QString)), SLOT(on_receiverChanged(QString))); connect(this, SIGNAL(joined(QString)), SLOT(on_joined(QString))); connect(this, SIGNAL(parted(QString, QString)), SLOT(on_parted(QString, QString))); @@ -76,14 +78,30 @@ void MyIrcBuffer::on_receiverChanged(const QString& receiver) qDebug() << "receiver changed:" << receiver; } -void MyIrcBuffer::on_joined(const QString& origin) { - qDebug() << "joined:" << receiver() << origin; - np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), 0); +int MyIrcBuffer::correctNickname(std::string &nickname) { + int 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 MyIrcBuffer::on_parted(const QString& origin, const QString& message) -{ - qDebug() << "parted:" << receiver() << origin << message; +void MyIrcBuffer::on_joined(const QString& origin) { + qDebug() << "joined:" << receiver() << origin; + int flags = 0; + std::string nickname = origin.toStdString(); + flags = correctNickname(nickname); + np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), flags, Swift::StatusShow::Online); +} + +void MyIrcBuffer::on_parted(const QString& origin, const QString& message) { + qDebug() << "parted:" << receiver() << origin << message; + int flags = 0; + std::string nickname = origin.toStdString(); + flags = correctNickname(nickname); + np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::None, message.toStdString()); } void MyIrcBuffer::on_quit(const QString& origin, const QString& message) @@ -93,12 +111,24 @@ void MyIrcBuffer::on_quit(const QString& origin, const QString& message) void MyIrcBuffer::on_nickChanged(const QString& origin, const QString& nick) { qDebug() << "nick changed:" << receiver() << origin << nick; - np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), 0, nick.toStdString()); + std::string nickname = origin.toStdString(); + int flags = p->m_modes[receiver().toStdString() + nickname]; + std::cout << receiver().toStdString() + nickname << " " << flags << "\n"; + np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::Online, "", nick.toStdString()); } -void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, const QString& args) -{ - qDebug() << "mode changed:" << receiver() << origin << mode << args; +void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, const QString& args) { + // mode changed: "#testik" "HanzZ" "+o" "hanzz_k" + qDebug() << "mode changed:" << receiver() << origin << mode << args; + std::string nickname = args.toStdString(); + if (mode == "+o") { + p->m_modes[receiver().toStdString() + nickname] = 1; + } + else { + p->m_modes[receiver().toStdString() + nickname] = 0; + } + int flags = p->m_modes[receiver().toStdString() + nickname]; + np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::Online, ""); } void MyIrcBuffer::on_topicChanged(const QString& origin, const QString& topic) @@ -155,7 +185,12 @@ void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, co QStringList members = params.value(3).split(" "); for (int i = 0; i < members.size(); i++) { - np->handleParticipantChanged(user, members.at(i).toStdString(), channel.toStdString(), 0); + int flags = 0; + 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(), flags, Swift::StatusShow::Online); } break; } diff --git a/backends/libircclient-qt/session.h b/backends/libircclient-qt/session.h index cf2a201c..250e78a6 100644 --- a/backends/libircclient-qt/session.h +++ b/backends/libircclient-qt/session.h @@ -23,6 +23,7 @@ class MyIrcSession : public Irc::Session public: MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent = 0); + std::map m_modes; protected Q_SLOTS: void on_connected(); @@ -45,6 +46,7 @@ public: MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent); NetworkPlugin *np; std::string user; + MyIrcSession *p; protected Q_SLOTS: void on_receiverChanged(const QString& receiver); @@ -63,6 +65,8 @@ protected Q_SLOTS: void on_ctcpActionReceived(const QString& origin, const QString& action, Irc::Buffer::MessageFlags flags); void on_numericMessageReceived(const QString& origin, uint code, const QStringList& params); void on_unknownMessageReceived(const QString& origin, const QStringList& params); + + int correctNickname(std::string &nickname); }; #endif // SESSION_H diff --git a/include/transport/conversation.h b/include/transport/conversation.h index c6157ac8..17de85f0 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -33,6 +33,8 @@ class ConversationManager; class Conversation { public: + enum ParticipantFlag {None, Moderator}; + /// Constructor. Conversation(ConversationManager *conversationManager, const std::string &legacyName, bool m_muc = false); @@ -42,7 +44,7 @@ class Conversation { const std::string &getLegacyName() { return m_legacyName; } void handleMessage(boost::shared_ptr &message, const std::string &nickname = ""); - void handleParticipantChanged(const std::string &nickname, int flag, const std::string &newname = ""); + void handleParticipantChanged(const std::string &nickname, int flag, int status = Swift::StatusShow::None, const std::string &statusMessage = "", const std::string &newname = ""); void setNickname(const std::string &nickname) { m_nickname = nickname; } diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index f1427891..e18b9921 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -44,7 +44,7 @@ class NetworkPlugin { const std::string &groups, int status, const std::string &statusMessage = "", const std::string &iconHash = "" ); - void handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, const std::string &newname = ""); + void handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, int status = Swift::StatusShow::None, const std::string &statusMessage = "", const std::string &newname = ""); void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message); diff --git a/src/conversation.cpp b/src/conversation.cpp index f028e88f..64c40093 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -78,16 +78,22 @@ void Conversation::handleMessage(boost::shared_ptr &message, con } } -void Conversation::handleParticipantChanged(const std::string &nick, int flag, const std::string &newname) { +void Conversation::handleParticipantChanged(const std::string &nick, int flag, int status, const std::string &statusMessage, const std::string &newname) { std::string nickname = nick; - if (nickname.find("@") == 0) { - nickname = nickname.substr(1); - } Swift::Presence::ref presence = Swift::Presence::create(); presence->setFrom(Swift::JID(m_legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); presence->setTo(m_conversationManager->getUser()->getJID().toString()); presence->setType(Swift::Presence::Available); + if (!statusMessage.empty()) + presence->setStatus(statusMessage); + + Swift::StatusShow s((Swift::StatusShow::Type) status); + + if (s.getType() == Swift::StatusShow::None) + presence->setType(Swift::Presence::Unavailable); + presence->setShow(s.getType()); + Swift::MUCUserPayload *p = new Swift::MUCUserPayload (); if (m_nickname == nickname) { Swift::MUCUserPayload::StatusCode c; @@ -95,18 +101,28 @@ void Conversation::handleParticipantChanged(const std::string &nick, int flag, c p->addStatusCode(c); } + Swift::MUCUserPayload::Item item(Swift::MUCOccupant::Member, Swift::MUCOccupant::Participant); + + if (flag & Moderator) { + item = Swift::MUCUserPayload::Item(Swift::MUCOccupant::Admin, Swift::MUCOccupant::Moderator); + } + if (!newname.empty()) { item.nick = newname; Swift::MUCUserPayload::StatusCode c; c.code = 303; p->addStatusCode(c); + presence->setType(Swift::Presence::Unavailable); } p->addItem(item); presence->addPayload(boost::shared_ptr(p)); m_conversationManager->getComponent()->getStanzaChannel()->sendPresence(presence); + if (!newname.empty()) { + handleParticipantChanged(newname, flag, status, statusMessage); + } } } diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index f6cfd15f..6367209d 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -105,13 +105,15 @@ void NetworkPlugin::handleDisconnected(const std::string &user, const std::strin send(message); } -void NetworkPlugin::handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, const std::string &newname) { +void NetworkPlugin::handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, int status, const std::string &statusMessage, const std::string &newname) { pbnetwork::Participant d; d.set_username(user); d.set_nickname(nickname); d.set_room(room); d.set_flag(flags); d.set_newname(newname); + d.set_status(status); + d.set_statusmessage(statusMessage); std::string message; d.SerializeToString(&message); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index aada58ec..94ea146b 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -210,7 +210,7 @@ void NetworkPluginServer::handleParticipantChangedPayload(const std::string &dat return; } - conv->handleParticipantChanged(payload.nickname(), payload.flag(), payload.newname()); + conv->handleParticipantChanged(payload.nickname(), payload.flag(), payload.status(), payload.statusmessage(), payload.newname()); // LocalBuddy *buddy = (LocalBuddy *) user->getRosterManager()->getBuddy(payload.buddyname()); // if (buddy) { diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 4fc7bf19..4a50f3e9 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -52,7 +52,9 @@ message Participant { required string room = 2; required string nickname = 3; required int32 flag = 4; - optional string newname = 5; + required int32 status = 5; + optional string statusMessage = 6; + optional string newname = 7; } message WrapperMessage { @@ -69,8 +71,7 @@ message WrapperMessage { TYPE_JOIN_ROOM = 11; TYPE_LEAVE_ROOM = 12; TYPE_PARTICIPANT_CHANGED = 13; - TYPE_PARTICIPANT_LEFT = 14; - TYPE_ROOM_NICKNAME_CHANGED = 15; + TYPE_ROOM_NICKNAME_CHANGED = 14; } required Type type = 1; optional bytes payload = 2; diff --git a/src/user.cpp b/src/user.cpp index 045fd2eb..6691ae20 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -90,6 +90,11 @@ void User::handlePresence(Swift::Presence::ref presence) { onRoomLeft(presence->getTo().getNode()); } else { + // force connection to legacy network to let backend to handle auto-join on connect. + if (!m_readyForConnect) { + m_readyForConnect = true; + onReadyToConnect(); + } onRoomJoined(presence->getTo().getNode(), presence->getTo().getResource(), ""); } return;