diff --git a/include/transport/protocol.proto b/include/transport/protocol.proto index 8d48386d..78a3b9af 100644 --- a/include/transport/protocol.proto +++ b/include/transport/protocol.proto @@ -63,6 +63,10 @@ message Buddy { optional bool blocked = 8; } +message Buddies { + repeated Buddy buddy = 1; +} + message ConversationMessage { required string userName = 1; required string buddyName = 2; @@ -182,6 +186,7 @@ message WrapperMessage { TYPE_ROOM_LIST = 32; TYPE_CONV_MESSAGE_ACK = 33; TYPE_RAW_XML = 34; + TYPE_BUDDIES = 35; } required Type type = 1; optional bytes payload = 2; diff --git a/plugin/python/NetworkPlugin.py b/plugin/python/NetworkPlugin.py index a9a20da2..d0357a6a 100644 --- a/plugin/python/NetworkPlugin.py +++ b/plugin/python/NetworkPlugin.py @@ -294,6 +294,14 @@ class NetworkPlugin: groups = [g for g in payload.group] self.handleBuddyRemovedRequest(payload.userName, payload.buddyName, groups); + def handleBuddiesPayload(self, data): + payload = protocol_pb2.Buddies() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + + self.handleBuddies(payload); + def handleChatStatePayload(self, data, msgType): payload = protocol_pb2.Buddy() if (payload.ParseFromString(data) == False): @@ -363,6 +371,8 @@ class NetworkPlugin: self.handleFTContinuePayload(wrapper.payload) elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_EXIT: self.handleExitRequest() + elif wrapper.type == Protocol_pb2.WrapperMessage.TYPE_BUDDIES: + self.handleBuddiesPayload() def send(self, data): @@ -424,6 +434,9 @@ class NetworkPlugin: raise NotImplementedError, "Implement me" + def handleBuddies(self, buddies): + pass + def handleLogoutRequest(self, user, legacyName): """ Called when XMPP user wants to disconnect legacy network. @@ -512,6 +525,7 @@ class NetworkPlugin: def handleFTContinueRequest(self, ftID): pass + def handleMemoryUsage(self): return (0,0) diff --git a/src/Config.cpp b/src/Config.cpp index cea8408b..60ed2a71 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -319,6 +319,7 @@ void Config::updateBackendConfig(const std::string &backendConfig) { ("features.muc", value()->default_value(false), "") ("features.rawxml", value()->default_value(false), "") ("features.disable_jid_escaping", value()->default_value(false), "") + ("features.send_buddies_on_login", value()->default_value(false), "") ; std::stringstream ifs(backendConfig); diff --git a/src/NetworkPluginServer.cpp b/src/NetworkPluginServer.cpp index 2e6a49ce..618bb6d2 100644 --- a/src/NetworkPluginServer.cpp +++ b/src/NetworkPluginServer.cpp @@ -1457,6 +1457,34 @@ void NetworkPluginServer::handleUserReadyToConnect(User *user) { return; } send(c->connection, message); + + // Send buddies + if (CONFIG_BOOL_DEFAULTED(m_config, "features.send_buddies_on_login", false)) { + pbnetwork::Buddies buddies; + + const RosterManager::BuddiesMap &roster = user->getRosterManager()->getBuddies(); + for(RosterManager::BuddiesMap::const_iterator bt = roster.begin(); bt != roster.end(); bt++) { + Buddy *b = (*bt).second; + if (!b) { + continue; + } + + pbnetwork::Buddy *buddy = buddies.add_buddy(); + buddy->set_username(user->getJID().toBare()); + buddy->set_buddyname(b->getName()); + buddy->set_alias(b->getAlias()); + BOOST_FOREACH(const std::string &g, b->getGroups()) { + buddy->add_group(g); + } + buddy->set_status(pbnetwork::STATUS_NONE); + } + + std::string msg; + buddies.SerializeToString(&msg); + + WRAP(msg, pbnetwork::WrapperMessage_Type_TYPE_BUDDIES); + send(c->connection, msg); + } } void NetworkPluginServer::handleUserPresenceChanged(User *user, Swift::Presence::ref presence) {