summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-12-18 21:00:41 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-12-18 21:00:41 +0300
commitd8d4adb545e20fee19caf5270b1b70e7c826f6f9 (patch)
tree51f32be23bc314fa01a07267b6b451e42d62cf70
parentfe77d2543f2822b6637c4090887bf349fc4ccb75 (diff)
Facebook: subscribe & unsubscribe support
-rw-r--r--protocols/Facebook/src/mqtt.cpp46
-rw-r--r--protocols/Facebook/src/proto.h2
-rw-r--r--protocols/Facebook/src/server.cpp3
-rw-r--r--protocols/Facebook/src/stdafx.h3
4 files changed, 51 insertions, 3 deletions
diff --git a/protocols/Facebook/src/mqtt.cpp b/protocols/Facebook/src/mqtt.cpp
index dd92795a4c..e8c3638741 100644
--- a/protocols/Facebook/src/mqtt.cpp
+++ b/protocols/Facebook/src/mqtt.cpp
@@ -198,7 +198,7 @@ void FacebookProto::MqttSend(const MqttMessage &payload)
msg << payload.m_leadingByte;
msg.writeIntV(payload.size());
msg.writeBuf(payload.data(), payload.size());
- Netlib_Send(m_mqttConn, (char*)msg.data(), msg.size());
+ Netlib_Send(m_mqttConn, (char*)msg.data(), (unsigned)msg.size());
}
void FacebookProto::MqttOpen()
@@ -266,9 +266,49 @@ void FacebookProto::MqttPublish(const char *topic, const char *value)
size_t dataSize;
mir_ptr<uint8_t> pData(doZip(strlen(value), value, dataSize));
- MqttMessage payload(FB_MQTT_MESSAGE_TYPE_PUBLISH);
+ MqttMessage payload(FB_MQTT_MESSAGE_TYPE_PUBLISH, FB_MQTT_CONNECT_FLAG_QOS1);
payload.writeStr(topic);
- payload.writeInt16(++m_mid); // timeout
+ payload.writeInt16(++m_mid);
payload.writeBuf(pData, dataSize);
MqttSend(payload);
}
+
+void FacebookProto::MqttSubscribe(const char *topic, ...)
+{
+ uint8_t zeroByte = 0;
+
+ MqttMessage payload(FB_MQTT_MESSAGE_TYPE_SUBSCRIBE, FB_MQTT_CONNECT_FLAG_QOS1);
+ payload.writeInt16(++m_mid);
+ payload.writeStr(topic);
+ payload << zeroByte;
+
+ va_list ap;
+ va_start(ap, topic);
+ while ((topic = va_arg(ap, const char *)) != nullptr) {
+ payload.writeStr(topic);
+ payload << zeroByte;
+ }
+ va_end(ap);
+
+ MqttSend(payload);
+}
+
+void FacebookProto::MqttUnsubscribe(const char *topic, ...)
+{
+ uint8_t zeroByte = 0;
+
+ MqttMessage payload(FB_MQTT_MESSAGE_TYPE_UNSUBSCRIBE, FB_MQTT_CONNECT_FLAG_QOS1);
+ payload.writeInt16(++m_mid);
+ payload.writeStr(topic);
+ payload << zeroByte;
+
+ va_list ap;
+ va_start(ap, topic);
+ while ((topic = va_arg(ap, const char *)) != nullptr) {
+ payload.writeStr(topic);
+ payload << zeroByte;
+ }
+ va_end(ap);
+
+ MqttSend(payload);
+}
diff --git a/protocols/Facebook/src/proto.h b/protocols/Facebook/src/proto.h
index f64eb5c3ea..5d43e5bab8 100644
--- a/protocols/Facebook/src/proto.h
+++ b/protocols/Facebook/src/proto.h
@@ -349,6 +349,8 @@ class FacebookProto : public PROTO<FacebookProto>
bool MqttConnect();
void MqttOpen();
void MqttPublish(const char *topic, const char *value);
+ void MqttSubscribe(const char *topic, ...);
+ void MqttUnsubscribe(const char *topic, ...);
void MqttSend(const MqttMessage &payload);
HNETLIBCONN m_mqttConn;
diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp
index 9eb13b9378..c54c46e29e 100644
--- a/protocols/Facebook/src/server.cpp
+++ b/protocols/Facebook/src/server.cpp
@@ -29,6 +29,9 @@ void FacebookProto::OnLoggedIn()
m_iStatus = m_iDesiredStatus;
// MqttPublish("/foreground_state", "{\"foreground\":\"true\", \"keepalive_timeout\":\"60\"}");
+
+ MqttSubscribe("/inbox", "/mercury", "/messaging_events", "/orca_presence", "/orca_typing_notifications", "/pp", "/t_ms", "/t_p", "/t_rtc", "/webrtc", "/webrtc_response", 0);
+ // MqttUnsubscribe("/orca_message_notifications", 0);
}
void FacebookProto::OnLoggedOut()
diff --git a/protocols/Facebook/src/stdafx.h b/protocols/Facebook/src/stdafx.h
index 871f268be3..95eb7d76a5 100644
--- a/protocols/Facebook/src/stdafx.h
+++ b/protocols/Facebook/src/stdafx.h
@@ -22,6 +22,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <windows.h>
#include <time.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
#include <win2k.h>
#include <newpluginapi.h>