Forward presence to legacy network
This commit is contained in:
parent
cdb464dd99
commit
bdc94b1042
10 changed files with 104 additions and 4 deletions
|
@ -7,4 +7,6 @@ if (PROTOBUF_FOUND)
|
|||
ADD_SUBDIRECTORY(libircclient-qt)
|
||||
endif()
|
||||
|
||||
ADD_SUBDIRECTORY(libmsn)
|
||||
|
||||
endif()
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue