Forward presence to legacy network

This commit is contained in:
HanzZ 2011-06-12 12:27:57 +02:00
parent cdb464dd99
commit bdc94b1042
10 changed files with 104 additions and 4 deletions

View file

@ -7,4 +7,6 @@ if (PROTOBUF_FOUND)
ADD_SUBDIRECTORY(libircclient-qt)
endif()
ADD_SUBDIRECTORY(libmsn)
endif()

View file

@ -139,6 +139,58 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
}
}
void handleStatusChangeRequest(const std::string &user, int status, const std::string &statusMessage) {
PurpleAccount *account = m_sessions[user];
if (account) {
int st;
switch(status) {
case Swift::StatusShow::Away: {
st = PURPLE_STATUS_AWAY;
if (!purple_account_get_status_type_with_primitive(account, PURPLE_STATUS_AWAY))
st = PURPLE_STATUS_EXTENDED_AWAY;
else
st = PURPLE_STATUS_AWAY;
break;
}
case Swift::StatusShow::DND: {
st = PURPLE_STATUS_UNAVAILABLE;
break;
}
case Swift::StatusShow::XA: {
if (!purple_account_get_status_type_with_primitive(account, PURPLE_STATUS_EXTENDED_AWAY))
st = PURPLE_STATUS_AWAY;
else
st = PURPLE_STATUS_EXTENDED_AWAY;
break;
}
case Swift::StatusShow::None: {
st = PURPLE_STATUS_OFFLINE;
break;
}
default:
st = PURPLE_STATUS_AVAILABLE;
break;
}
gchar *_markup = purple_markup_escape_text(statusMessage.c_str(), -1);
std::string markup(_markup);
g_free(_markup);
std::cout << st << " < STATUS\n";
// we are already connected so we have to change status
const PurpleStatusType *status_type = purple_account_get_status_type_with_primitive(account, (PurpleStatusPrimitive) st);
if (status_type != NULL) {
// send presence to legacy network
if (!markup.empty()) {
purple_account_set_status(account, purple_status_type_get_id(status_type), TRUE, "message", markup.c_str(), NULL);
}
else {
purple_account_set_status(account, purple_status_type_get_id(status_type), TRUE, NULL);
}
}
}
}
void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) {
PurpleAccount *account = m_sessions[user];
if (account) {

View file

@ -64,6 +64,7 @@ class NetworkPlugin {
virtual void handleVCardRequest(const std::string &/*user*/, const std::string &/*legacyName*/, unsigned int /*id*/) {}
virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {}
virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {}
virtual void handleStatusChangeRequest(const std::string &/*user*/, int status, const std::string &statusMessage) {}
virtual void handleBuddyUpdatedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*alias*/, const std::string &/*groups*/) {}
virtual void handleBuddyRemovedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*groups*/) {}
@ -72,6 +73,7 @@ class NetworkPlugin {
void connect();
void handleLoginPayload(const std::string &payload);
void handleLogoutPayload(const std::string &payload);
void handleStatusChangedPayload(const std::string &payload);
void handleConvMessagePayload(const std::string &payload);
void handleJoinRoomPayload(const std::string &payload);
void handleLeaveRoomPayload(const std::string &payload);

View file

@ -72,6 +72,7 @@ class NetworkPluginServer {
void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password);
void handleRoomLeft(User *user, const std::string &room);
void handleUserReadyToConnect(User *user);
void handleUserPresenceChanged(User *user, Swift::Presence::ref presence);
void handleUserDestroyed(User *user);
void handleBuddyUpdated(Buddy *buddy, const Swift::RosterItemPayload &item);

View file

@ -77,6 +77,7 @@ class User {
void handleDisconnected(const std::string &error);
boost::signal<void ()> onReadyToConnect;
boost::signal<void (Swift::Presence::ref presence)> onPresenceChanged;
boost::signal<void (const std::string &room, const std::string &nickname, const std::string &password)> onRoomJoined;
boost::signal<void (const std::string &room)> onRoomLeft;
boost::signal<void ()> onDisconnected;

View file

@ -6,9 +6,9 @@ port = 5222
server_mode = 1
backend=../../backends/libpurple/libpurple_backend
#backend=../../backends/libircclient-qt/libircclient-qt_backend
#protocol=prpl-jabber
protocol=prpl-jabber
#protocol=prpl-msn
protocol=prpl-icq
#protocol=prpl-icq
[database]
database = test.sql

View file

@ -225,6 +225,16 @@ void NetworkPlugin::handleLogoutPayload(const std::string &data) {
handleLogoutRequest(payload.user(), payload.legacyname());
}
void NetworkPlugin::handleStatusChangedPayload(const std::string &data) {
pbnetwork::Status payload;
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
handleStatusChangeRequest(payload.username(), payload.status(), payload.statusmessage());
}
void NetworkPlugin::handleConvMessagePayload(const std::string &data) {
pbnetwork::ConversationMessage payload;
if (payload.ParseFromString(data) == false) {
@ -336,6 +346,9 @@ void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) {
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_REMOVED:
handleBuddyRemovedPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_STATUS_CHANGED:
handleStatusChangedPayload(wrapper.payload());
break;
default:
return;
}

View file

@ -411,6 +411,7 @@ void NetworkPluginServer::handleUserCreated(User *user) {
// UserInfo userInfo = user->getUserInfo();
user->onReadyToConnect.connect(boost::bind(&NetworkPluginServer::handleUserReadyToConnect, this, user));
user->onPresenceChanged.connect(boost::bind(&NetworkPluginServer::handleUserPresenceChanged, this, user, _1));
user->onRoomJoined.connect(boost::bind(&NetworkPluginServer::handleRoomJoined, this, user, _1, _2, _3));
user->onRoomLeft.connect(boost::bind(&NetworkPluginServer::handleRoomLeft, this, user, _1));
}
@ -432,6 +433,26 @@ void NetworkPluginServer::handleUserReadyToConnect(User *user) {
send(c->connection, message);
}
void NetworkPluginServer::handleUserPresenceChanged(User *user, Swift::Presence::ref presence) {
if (presence->getShow() == Swift::StatusShow::None)
return;
UserInfo userInfo = user->getUserInfo();
pbnetwork::Status status;
status.set_username(user->getJID().toBare());
status.set_status((int) presence->getShow());
status.set_statusmessage(presence->getStatus());
std::string message;
status.SerializeToString(&message);
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_STATUS_CHANGED);
Client *c = (Client *) user->getData();
send(c->connection, message);
}
void NetworkPluginServer::handleRoomJoined(User *user, const std::string &r, const std::string &nickname, const std::string &password) {
UserInfo userInfo = user->getUserInfo();

View file

@ -65,6 +65,12 @@ message VCard {
optional bytes photo = 6;
}
message Status {
required string userName = 1;
required int32 status = 3;
optional string statusMessage = 4;
}
message WrapperMessage {
enum Type {
TYPE_CONNECTED = 1;
@ -81,7 +87,8 @@ message WrapperMessage {
TYPE_PARTICIPANT_CHANGED = 13;
TYPE_ROOM_NICKNAME_CHANGED = 14;
TYPE_ROOM_SUBJECT_CHANGED = 15;
TYPE_VCARD = 16;
TYPE_VCARD = 16;
TYPE_STATUS_CHANGED = 17;
}
required Type type = 1;
optional bytes payload = 2;

View file

@ -104,11 +104,11 @@ void User::handlePresence(Swift::Presence::ref presence) {
return;
}
if (highest) {
highest->setTo(presence->getFrom().toBare());
highest->setFrom(m_component->getJID());
m_component->getStanzaChannel()->sendPresence(highest);
onPresenceChanged(highest);
}
else {
Swift::Presence::ref response = Swift::Presence::create();
@ -116,6 +116,7 @@ void User::handlePresence(Swift::Presence::ref presence) {
response->setFrom(m_component->getJID());
response->setType(Swift::Presence::Unavailable);
m_component->getStanzaChannel()->sendPresence(response);
onPresenceChanged(response);
}
}