diff --git a/backends/libircclient-qt/main.cpp b/backends/libircclient-qt/main.cpp index 346fd4ad..2815cb4a 100644 --- a/backends/libircclient-qt/main.cpp +++ b/backends/libircclient-qt/main.cpp @@ -52,6 +52,8 @@ class IRCNetworkPlugin : public NetworkPlugin { return; m_sessions[user]->addAutoJoinChannel(QString::fromStdString(room)); m_sessions[user]->join(QString::fromStdString(room), QString::fromStdString(password)); + // update nickname, because we have nickname per session, no nickname per room. + handleRoomChanged(user, room, m_sessions[user]->nick().toStdString()); } std::map m_sessions; diff --git a/docs/Doxyfile b/docs/Doxyfile index 45a29656..8b58ca9b 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -1445,7 +1445,7 @@ DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. -DOT_PATH = "/usr/bin" +DOT_PATH = "" # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 54523923..67365153 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); + 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; virtual void handleLogoutRequest(const std::string &user, const std::string &legacyName) = 0; virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) = 0; diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 2e3663e8..81959971 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -56,6 +56,7 @@ class NetworkPluginServer { void handleBuddyChangedPayload(const std::string &payload); void handleConvMessagePayload(const std::string &payload); void handleParticipantChangedPayload(const std::string &payload); + void handleRoomChangedPayload(const std::string &payload); void handleUserCreated(User *user); void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password); diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 9494e4f0..c02142fa 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -1,5 +1,5 @@ [service] -jid = icq.localhost +jid = localhost password = secret server = 127.0.0.1 port = 5222 diff --git a/src/conversation.cpp b/src/conversation.cpp index 4a41add2..a8bf2e05 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -53,7 +53,11 @@ void Conversation::handleMessage(boost::shared_ptr &message) { } } -void Conversation::handleParticipantChanged(const std::string &nickname, int flag) { +void Conversation::handleParticipantChanged(const std::string &nick, int flag) { + 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()); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 79b22571..7a1c4516 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -119,6 +119,21 @@ void NetworkPlugin::handleParticipantChanged(const std::string &user, const std: send(message); } +void NetworkPlugin::handleRoomChanged(const std::string &user, const std::string &r, const std::string &nickname) { + pbnetwork::Room room; + room.set_username(user); + room.set_nickname(nickname); + room.set_room(r); + room.set_password(""); + + std::string message; + room.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_NICKNAME_CHANGED); + + send(message); +} + void NetworkPlugin::handleConnected(bool error) { if (error) { std::cout << "Connecting error\n"; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index ad9ce5de..3c088ba2 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -225,6 +225,24 @@ void NetworkPluginServer::handleParticipantChangedPayload(const std::string &dat std::cout << payload.nickname() << "\n"; } +void NetworkPluginServer::handleRoomChangedPayload(const std::string &data) { + pbnetwork::Room payload; + if (payload.ParseFromString(data) == false) { + return; + } + + User *user = m_userManager->getUser(payload.username()); + if (!user) + return; + + NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.room()); + if (!conv) { + return; + } + + conv->setNickname(payload.nickname()); +} + void NetworkPluginServer::handleConvMessagePayload(const std::string &data) { pbnetwork::ConversationMessage payload; // std::cout << "payload...\n"; @@ -292,6 +310,9 @@ void NetworkPluginServer::handleDataRead(boost::shared_ptr c, case pbnetwork::WrapperMessage_Type_TYPE_PARTICIPANT_CHANGED: handleParticipantChangedPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_ROOM_NICKNAME_CHANGED: + handleRoomChangedPayload(wrapper.payload()); + break; default: return; } diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 78803eb1..99478b20 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -68,6 +68,7 @@ message WrapperMessage { TYPE_PART_ROOM = 12; TYPE_PARTICIPANT_CHANGED = 13; TYPE_PARTICIPANT_LEFT = 14; + TYPE_ROOM_NICKNAME_CHANGED = 15; } required Type type = 1; optional bytes payload = 2;