summaryrefslogtreecommitdiff
path: root/protocols/Facebook
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Facebook')
-rw-r--r--protocols/Facebook/src/proto.h3
-rw-r--r--protocols/Facebook/src/server.cpp16
2 files changed, 16 insertions, 3 deletions
diff --git a/protocols/Facebook/src/proto.h b/protocols/Facebook/src/proto.h
index 7d5bedc911..a8ba6c6d39 100644
--- a/protocols/Facebook/src/proto.h
+++ b/protocols/Facebook/src/proto.h
@@ -370,7 +370,8 @@ class FacebookProto : public PROTO<FacebookProto>
void MqttSend(const MqttMessage &payload);
void OnPublish(const char *str, const uint8_t *payLoad, size_t cbLen);
- void OnPublishP(FbThriftReader &rdr);
+ void OnPublishPresence(FbThriftReader &rdr);
+ void OnPublishUtn(FbThriftReader &rdr);
HNETLIBCONN m_mqttConn;
diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp
index 494c951ead..3d57ae2cb9 100644
--- a/protocols/Facebook/src/server.cpp
+++ b/protocols/Facebook/src/server.cpp
@@ -218,11 +218,13 @@ void FacebookProto::OnPublish(const char *topic, const uint8_t *p, size_t cbLen)
rdr.reset(cbLen, (void*)p);
if (!strcmp(topic, "/t_p"))
- OnPublishP(rdr);
+ OnPublishPresence(rdr);
+ else if (!strcmp(topic, "/orca_typing_notifications"))
+ OnPublishUtn(rdr);
}
-void FacebookProto::OnPublishP(FbThriftReader &rdr)
+void FacebookProto::OnPublishPresence(FbThriftReader &rdr)
{
char *str;
rdr.readStr(str);
@@ -284,3 +286,13 @@ void FacebookProto::OnPublishP(FbThriftReader &rdr)
rdr.readByte(fieldType);
assert(fieldType == FB_THRIFT_TYPE_STOP);
}
+
+void FacebookProto::OnPublishUtn(FbThriftReader &rdr)
+{
+ JSONNode root = JSONNode::parse((const char *)rdr.data());
+ auto *pUser = FindUser(_wtoi64(root["sender_fbid"].as_mstring()));
+ if (pUser != nullptr) {
+ int length = (root["state"].as_int() == 0) ? PROTOTYPE_CONTACTTYPING_OFF : 60;
+ CallService(MS_PROTO_CONTACTISTYPING, pUser->hContact, length);
+ }
+}