summaryrefslogtreecommitdiff
path: root/protocols/Facebook/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-01-24 18:32:21 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-01-24 18:32:21 +0300
commit2238f08124f674c9319358f052b89ceaf5893299 (patch)
tree9aebf551c4560d773d8fdf028ab3604d44e85a1d /protocols/Facebook/src
parent74cdf1b36f3eb00106852d23d8a39f54b6640e6d (diff)
fixes #2161 (Facebook: initial group chats support)
Diffstat (limited to 'protocols/Facebook/src')
-rw-r--r--protocols/Facebook/src/options.cpp7
-rw-r--r--protocols/Facebook/src/proto.cpp9
-rw-r--r--protocols/Facebook/src/proto.h3
-rw-r--r--protocols/Facebook/src/resource.h6
-rw-r--r--protocols/Facebook/src/server.cpp47
-rw-r--r--protocols/Facebook/src/version.h2
6 files changed, 70 insertions, 4 deletions
diff --git a/protocols/Facebook/src/options.cpp b/protocols/Facebook/src/options.cpp
index 9d47fd8e09..9e9f778298 100644
--- a/protocols/Facebook/src/options.cpp
+++ b/protocols/Facebook/src/options.cpp
@@ -25,13 +25,18 @@ typedef CProtoDlgBase<FacebookProto> CFBDlgBase;
class CFacebookAccOptsDlg : public CFBDlgBase
{
CCtrlEdit edtGroup;
+ CCtrlCheck chkEnableChats, chkHideChats;
public:
CFacebookAccOptsDlg(FacebookProto *pThis) :
CFBDlgBase(pThis, IDD_OPTIONS),
- edtGroup(this, IDC_GROUP)
+ edtGroup(this, IDC_GROUP),
+ chkHideChats(this, IDC_HIDECHATS),
+ chkEnableChats(this, IDC_ENABLECHATS)
{
CreateLink(edtGroup, pThis->m_wszDefaultGroup);
+ CreateLink(chkHideChats, pThis->m_bUseGroupchats);
+ CreateLink(chkEnableChats, pThis->m_bHideGroupchats);
}
bool OnInitDialog() override
diff --git a/protocols/Facebook/src/proto.cpp b/protocols/Facebook/src/proto.cpp
index b2e97d901e..0e1697705b 100644
--- a/protocols/Facebook/src/proto.cpp
+++ b/protocols/Facebook/src/proto.cpp
@@ -42,6 +42,8 @@ FacebookProto::FacebookProto(const char *proto_name, const wchar_t *username) :
m_users(50, CompareUsers),
arOwnMessages(1, CompareMessages),
m_bUseBigAvatars(this, "UseBigAvatars", true),
+ m_bUseGroupchats(this, "UseGroupChats", true),
+ m_bHideGroupchats(this, "HideGroupChats", true),
m_wszDefaultGroup(this, "DefaultGroup", L"Facebook")
{
for (auto &cc : AccContacts()) {
@@ -108,6 +110,13 @@ FacebookProto::FacebookProto(const char *proto_name, const wchar_t *username) :
// Default group
Clist_GroupCreate(0, m_wszDefaultGroup);
+
+ // Group chats
+ GCREGISTER gcr = {};
+ gcr.dwFlags = GC_TYPNOTIF;
+ gcr.ptszDispName = m_tszUserName;
+ gcr.pszModule = m_szModuleName;
+ Chat_Register(&gcr);
}
FacebookProto::~FacebookProto()
diff --git a/protocols/Facebook/src/proto.h b/protocols/Facebook/src/proto.h
index 2157642a06..4f6923431d 100644
--- a/protocols/Facebook/src/proto.h
+++ b/protocols/Facebook/src/proto.h
@@ -453,6 +453,7 @@ class FacebookProto : public PROTO<FacebookProto>
void OnLoggedOut();
bool RefreshToken();
+ void RefreshThreads();
int RefreshContacts();
FacebookUser* AddContact(const CMStringW &wszId, bool bTemp = true);
@@ -477,6 +478,8 @@ public:
CMOption<wchar_t *> m_wszDefaultGroup; // clist group to store contacts
CMOption<BYTE> m_bUseBigAvatars; // use big or small avatars by default
+ CMOption<BYTE> m_bUseGroupchats; // do we need group chats at all?
+ CMOption<BYTE> m_bHideGroupchats; // do not open chat windows on creation
////////////////////////////////////////////////////////////////////////////////////////
// PROTO_INTERFACE
diff --git a/protocols/Facebook/src/resource.h b/protocols/Facebook/src/resource.h
index 2db5b9fc2e..86512c93e7 100644
--- a/protocols/Facebook/src/resource.h
+++ b/protocols/Facebook/src/resource.h
@@ -10,14 +10,16 @@
#define IDC_PW 1002
#define IDC_NEWACCOUNTLINK 1003
#define IDC_GROUP 1004
+#define IDC_ENABLECHATS 1005
+#define IDC_HIDECHATS 1006
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1004
+#define _APS_NEXT_CONTROL_VALUE 1006
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp
index 43c12a51c4..2dd06bab7b 100644
--- a/protocols/Facebook/src/server.cpp
+++ b/protocols/Facebook/src/server.cpp
@@ -67,6 +67,9 @@ void FacebookProto::OnLoggedIn()
// connect message queue
MqttQueueConnect();
+ // request message threads if needed
+ if (m_bUseGroupchats)
+ RefreshThreads();
}
void FacebookProto::OnLoggedOut()
@@ -157,6 +160,50 @@ int FacebookProto::RefreshContacts()
return 0;
}
+void FacebookProto::RefreshThreads()
+{
+ auto * pReq = CreateRequestGQL(FB_API_QUERY_THREADS);
+ JSONNode json; json << CHAR_PARAM("2", "true") << CHAR_PARAM("12", "false") << CHAR_PARAM("13", "false");
+ pReq << CHAR_PARAM("query_params", json.write().c_str());
+ pReq->CalcSig();
+
+ JsonReply reply(ExecuteRequest(pReq));
+ if (!reply.error()) {
+ auto &root = reply.data()["viewer"]["message_threads"];
+
+ for (auto &n : root["nodes"]) {
+ if (!n["is_group_thread"].as_bool())
+ continue;
+
+ CMStringW chatId(n["id"].as_mstring());
+ CMStringW name(n["name"].as_mstring());
+
+ auto *si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, chatId, name);
+ if (si == nullptr)
+ continue;
+
+ Chat_AddGroup(si, TranslateT("Participant"));
+
+ for (auto &u : n["all_participants"]["nodes"]) {
+ auto &ur = u["messaging_actor"];
+ CMStringW userId(ur["id"].as_mstring());
+ CMStringW userName(ur["name"].as_mstring());
+
+ GCEVENT gce = { m_szModuleName, 0, GC_EVENT_JOIN };
+ gce.pszID.w = chatId;
+ gce.pszUID.w = userId;
+ gce.pszNick.w = userName;
+ gce.bIsMe = _wtoi64(userId) == m_uid;
+ gce.time = time(0);
+ Chat_Event(&gce);
+ }
+
+ Chat_Control(m_szModuleName, chatId, m_bHideGroupchats ? WINDOW_HIDDEN : SESSION_INITDONE);
+ Chat_Control(m_szModuleName, chatId, SESSION_ONLINE);
+ }
+ }
+}
+
bool FacebookProto::RefreshToken()
{
auto *pReq = CreateRequest(FB_API_URL_AUTH, "authenticate", "auth.login");
diff --git a/protocols/Facebook/src/version.h b/protocols/Facebook/src/version.h
index 51d5c78500..4abba67d37 100644
--- a/protocols/Facebook/src/version.h
+++ b/protocols/Facebook/src/version.h
@@ -1,6 +1,6 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 0
-#define __RELEASE_NUM 1
+#define __RELEASE_NUM 2
#define __BUILD_NUM 1
#include <stdver.h>