Typing notification from legacy network -> XMPP
This commit is contained in:
parent
bdc94b1042
commit
bf5cc016f8
6 changed files with 113 additions and 6 deletions
|
@ -645,6 +645,30 @@ static PurpleDebugUiOps debugUiOps =
|
|||
NULL
|
||||
};
|
||||
|
||||
static void buddyTyping(PurpleAccount *account, const char *who, gpointer null) {
|
||||
std::string w = who;
|
||||
size_t pos = w.find("/");
|
||||
if (pos != std::string::npos)
|
||||
w.erase((int) pos, w.length() - (int) pos);
|
||||
np->handleBuddyTyping(np->m_accounts[account], w);
|
||||
}
|
||||
|
||||
static void buddyTyped(PurpleAccount *account, const char *who, gpointer null) {
|
||||
std::string w = who;
|
||||
size_t pos = w.find("/");
|
||||
if (pos != std::string::npos)
|
||||
w.erase((int) pos, w.length() - (int) pos);
|
||||
np->handleBuddyTyped(np->m_accounts[account], w);
|
||||
}
|
||||
|
||||
static void buddyTypingStopped(PurpleAccount *account, const char *who, gpointer null){
|
||||
std::string w = who;
|
||||
size_t pos = w.find("/");
|
||||
if (pos != std::string::npos)
|
||||
w.erase((int) pos, w.length() - (int) pos);
|
||||
np->handleBuddyStoppedTyping(np->m_accounts[account], w);
|
||||
}
|
||||
|
||||
static bool initPurple(Config &cfg) {
|
||||
bool ret;
|
||||
|
||||
|
@ -661,6 +685,7 @@ static bool initPurple(Config &cfg) {
|
|||
ret = purple_core_init("spectrum");
|
||||
if (ret) {
|
||||
static int blist_handle;
|
||||
static int conversation_handle;
|
||||
|
||||
purple_set_blist(purple_blist_new());
|
||||
purple_blist_load();
|
||||
|
@ -686,9 +711,9 @@ static bool initPurple(Config &cfg) {
|
|||
|
||||
|
||||
// purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", &conversation_handle, PURPLE_CALLBACK(newMessageReceived), NULL);
|
||||
// purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", &conversation_handle, PURPLE_CALLBACK(buddyTyping), NULL);
|
||||
// purple_signal_connect(purple_conversations_get_handle(), "buddy-typed", &conversation_handle, PURPLE_CALLBACK(buddyTyped), NULL);
|
||||
// purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL);
|
||||
purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", &conversation_handle, PURPLE_CALLBACK(buddyTyping), NULL);
|
||||
purple_signal_connect(purple_conversations_get_handle(), "buddy-typed", &conversation_handle, PURPLE_CALLBACK(buddyTyped), NULL);
|
||||
purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL);
|
||||
purple_signal_connect(purple_connections_get_handle(), "signed-on", &blist_handle,PURPLE_CALLBACK(signed_on), NULL);
|
||||
// purple_signal_connect(purple_blist_get_handle(), "buddy-removed", &blist_handle,PURPLE_CALLBACK(buddyRemoved), NULL);
|
||||
// purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL);
|
||||
|
|
|
@ -58,6 +58,12 @@ class NetworkPlugin {
|
|||
|
||||
void handleVCard(const std::string &user, unsigned int id, const std::string &legacyName, const std::string &fullName, const std::string &nickname, const std::string &photo);
|
||||
|
||||
void handleBuddyTyping(const std::string &user, const std::string &buddyName);
|
||||
|
||||
void handleBuddyTyped(const std::string &user, const std::string &buddyName);
|
||||
|
||||
void handleBuddyStoppedTyping(const std::string &user, const std::string &buddyName);
|
||||
|
||||
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;
|
||||
|
|
|
@ -67,6 +67,7 @@ class NetworkPluginServer {
|
|||
void handleParticipantChangedPayload(const std::string &payload);
|
||||
void handleRoomChangedPayload(const std::string &payload);
|
||||
void handleVCardPayload(const std::string &payload);
|
||||
void handleChatStatePayload(const std::string &payload, Swift::ChatState::ChatStateType type);
|
||||
|
||||
void handleUserCreated(User *user);
|
||||
void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password);
|
||||
|
|
|
@ -123,6 +123,45 @@ void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::strin
|
|||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleBuddyTyping(const std::string &user, const std::string &buddyName) {
|
||||
pbnetwork::Buddy buddy;
|
||||
buddy.set_username(user);
|
||||
buddy.set_buddyname(buddyName);
|
||||
|
||||
std::string message;
|
||||
buddy.SerializeToString(&message);
|
||||
|
||||
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING);
|
||||
|
||||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleBuddyTyped(const std::string &user, const std::string &buddyName) {
|
||||
pbnetwork::Buddy buddy;
|
||||
buddy.set_username(user);
|
||||
buddy.set_buddyname(buddyName);
|
||||
|
||||
std::string message;
|
||||
buddy.SerializeToString(&message);
|
||||
|
||||
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED);
|
||||
|
||||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleBuddyStoppedTyping(const std::string &user, const std::string &buddyName) {
|
||||
pbnetwork::Buddy buddy;
|
||||
buddy.set_username(user);
|
||||
buddy.set_buddyname(buddyName);
|
||||
|
||||
std::string message;
|
||||
buddy.SerializeToString(&message);
|
||||
|
||||
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING);
|
||||
|
||||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleConnected(const std::string &user) {
|
||||
std::cout << "LOGIN SENT\n";
|
||||
pbnetwork::Connected d;
|
||||
|
|
|
@ -223,6 +223,30 @@ void NetworkPluginServer::handleVCardPayload(const std::string &data) {
|
|||
m_vcardResponder->sendVCard(payload.id(), vcard);
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleChatStatePayload(const std::string &data, Swift::ChatState::ChatStateType type) {
|
||||
pbnetwork::Buddy payload;
|
||||
if (payload.ParseFromString(data) == false) {
|
||||
// TODO: ERROR
|
||||
return;
|
||||
}
|
||||
|
||||
User *user = m_userManager->getUser(payload.username());
|
||||
if (!user)
|
||||
return;
|
||||
|
||||
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname());
|
||||
if (!conv) {
|
||||
std::cout << "handling chatstate: NO conv with buddyname=" << payload.buddyname() << "\n";
|
||||
return;
|
||||
}
|
||||
|
||||
boost::shared_ptr<Swift::Message> msg(new Swift::Message());
|
||||
msg->addPayload(boost::make_shared<Swift::ChatState>(type));
|
||||
|
||||
conv->handleMessage(msg);
|
||||
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) {
|
||||
pbnetwork::Buddy payload;
|
||||
if (payload.ParseFromString(data) == false) {
|
||||
|
@ -375,6 +399,15 @@ void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray &
|
|||
case pbnetwork::WrapperMessage_Type_TYPE_VCARD:
|
||||
handleVCardPayload(wrapper.payload());
|
||||
break;
|
||||
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING:
|
||||
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Composing);
|
||||
break;
|
||||
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED:
|
||||
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Paused);
|
||||
break;
|
||||
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING:
|
||||
handleChatStatePayload(wrapper.payload(), Swift::ChatState::Active);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -25,9 +25,9 @@ message Logout {
|
|||
message Buddy {
|
||||
required string userName = 1;
|
||||
required string buddyName = 2;
|
||||
required string alias = 3;
|
||||
required string groups = 4;
|
||||
required int32 status = 5;
|
||||
optional string alias = 3;
|
||||
optional string groups = 4;
|
||||
optional int32 status = 5;
|
||||
optional string statusMessage = 6;
|
||||
optional string iconHash = 7;
|
||||
}
|
||||
|
@ -89,6 +89,9 @@ message WrapperMessage {
|
|||
TYPE_ROOM_SUBJECT_CHANGED = 15;
|
||||
TYPE_VCARD = 16;
|
||||
TYPE_STATUS_CHANGED = 17;
|
||||
TYPE_BUDDY_TYPING = 18;
|
||||
TYPE_BUDDY_STOPPED_TYPING = 19;
|
||||
TYPE_BUDDY_TYPED = 20;
|
||||
}
|
||||
required Type type = 1;
|
||||
optional bytes payload = 2;
|
||||
|
|
Loading…
Add table
Reference in a new issue