diff options
author | George Hazan <ghazan@miranda.im> | 2019-12-18 21:00:41 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2019-12-18 21:00:41 +0300 |
commit | d8d4adb545e20fee19caf5270b1b70e7c826f6f9 (patch) | |
tree | 51f32be23bc314fa01a07267b6b451e42d62cf70 | |
parent | fe77d2543f2822b6637c4090887bf349fc4ccb75 (diff) |
Facebook: subscribe & unsubscribe support
-rw-r--r-- | protocols/Facebook/src/mqtt.cpp | 46 | ||||
-rw-r--r-- | protocols/Facebook/src/proto.h | 2 | ||||
-rw-r--r-- | protocols/Facebook/src/server.cpp | 3 | ||||
-rw-r--r-- | protocols/Facebook/src/stdafx.h | 3 |
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> |