diff --git a/backends/libircclient-qt/session.cpp b/backends/libircclient-qt/session.cpp index 50b854fa..9662ac3e 100644 --- a/backends/libircclient-qt/session.cpp +++ b/backends/libircclient-qt/session.cpp @@ -131,9 +131,10 @@ void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, con np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::Online, ""); } -void MyIrcBuffer::on_topicChanged(const QString& origin, const QString& topic) -{ - qDebug() << "topic changed:" << receiver() << origin << topic; +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()); } void MyIrcBuffer::on_invited(const QString& origin, const QString& receiver, const QString& channel) @@ -180,6 +181,12 @@ void MyIrcBuffer::on_ctcpActionReceived(const QString& origin, const QString& ac void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, const QStringList& params) { switch (code) { + case 332: + m_topicData = params.value(2).toStdString(); + break; + case 333: + np->handleSubject(user, params.value(1).toStdString(), m_topicData, params.value(2).toStdString()); + break; case 353: QString channel = params.value(2); QStringList members = params.value(3).split(" "); diff --git a/backends/libircclient-qt/session.h b/backends/libircclient-qt/session.h index 250e78a6..e621c70a 100644 --- a/backends/libircclient-qt/session.h +++ b/backends/libircclient-qt/session.h @@ -47,6 +47,7 @@ public: NetworkPlugin *np; std::string user; MyIrcSession *p; + std::string m_topicData; protected Q_SLOTS: void on_receiverChanged(const QString& receiver); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index e18b9921..50722a40 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -50,6 +50,8 @@ class NetworkPlugin { void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); + void handleSubject(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); + void handleRoomChanged(const std::string &user, const std::string &room, const std::string &nickname); virtual void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) = 0; diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 7644314e..05f99c61 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -54,7 +54,7 @@ class NetworkPluginServer { void handleConnectedPayload(const std::string &payload); void handleDisconnectedPayload(const std::string &payload); void handleBuddyChangedPayload(const std::string &payload); - void handleConvMessagePayload(const std::string &payload); + void handleConvMessagePayload(const std::string &payload, bool subject = false); void handleParticipantChangedPayload(const std::string &payload); void handleRoomChangedPayload(const std::string &payload); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 6367209d..26f8c242 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -71,6 +71,22 @@ void NetworkPlugin::handleMessage(const std::string &user, const std::string &le send(message); } +void NetworkPlugin::handleSubject(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname) { + pbnetwork::ConversationMessage m; + m.set_username(user); + m.set_buddyname(legacyName); + m.set_message(msg); + m.set_nickname(nickname); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED); +// std::cout << "SENDING MESSAGE\n"; + + send(message); +} + void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::string &buddyName, const std::string &alias, const std::string &groups, int status, const std::string &statusMessage, const std::string &iconHash) { pbnetwork::Buddy buddy; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 94ea146b..8ece5f56 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -243,7 +243,7 @@ void NetworkPluginServer::handleRoomChangedPayload(const std::string &data) { conv->setNickname(payload.nickname()); } -void NetworkPluginServer::handleConvMessagePayload(const std::string &data) { +void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool subject) { pbnetwork::ConversationMessage payload; // std::cout << "payload...\n"; if (payload.ParseFromString(data) == false) { @@ -256,7 +256,12 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data) { return; boost::shared_ptr msg(new Swift::Message()); - msg->setBody(payload.message()); + if (subject) { + msg->setSubject(payload.message()); + } + else { + msg->setBody(payload.message()); + } NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); if (!conv) { @@ -306,6 +311,9 @@ void NetworkPluginServer::handleDataRead(boost::shared_ptr c, case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE: handleConvMessagePayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED: + handleConvMessagePayload(wrapper.payload(), true); + break; case pbnetwork::WrapperMessage_Type_TYPE_PONG: m_pongReceived = true; break; diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 4a50f3e9..8ca0ecad 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -72,6 +72,7 @@ message WrapperMessage { TYPE_LEAVE_ROOM = 12; TYPE_PARTICIPANT_CHANGED = 13; TYPE_ROOM_NICKNAME_CHANGED = 14; + TYPE_ROOM_SUBJECT_CHANGED = 15; } required Type type = 1; optional bytes payload = 2;