summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Facebook/res/facebook.rc23
-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
7 files changed, 89 insertions, 8 deletions
diff --git a/protocols/Facebook/res/facebook.rc b/protocols/Facebook/res/facebook.rc
index 41d5e87fb3..825fea836d 100644
--- a/protocols/Facebook/res/facebook.rc
+++ b/protocols/Facebook/res/facebook.rc
@@ -68,7 +68,8 @@ BEGIN
EDITTEXT IDC_UN,56,0,122,12,ES_AUTOHSCROLL
LTEXT "Password:",IDC_STATIC,6,18,46,10,0,WS_EX_RIGHT
EDITTEXT IDC_PW,56,16,122,12,ES_PASSWORD | ES_AUTOHSCROLL
- CONTROL "Create a new Facebook account", IDC_NEWACCOUNTLINK, "Hyperlink", WS_TABSTOP, 6, 40, 172, 12
+ CONTROL "Create a new Facebook account",IDC_NEWACCOUNTLINK,
+ "Hyperlink",WS_TABSTOP,6,40,172,12
END
IDD_OPTIONS DIALOGEX 0, 0, 305, 195
@@ -83,11 +84,16 @@ BEGIN
EDITTEXT IDC_PW,84,34,123,13,ES_PASSWORD | ES_AUTOHSCROLL
CONTROL "Create a new Facebook account",IDC_NEWACCOUNTLINK,
"Hyperlink",WS_TABSTOP,84,53,189,10
- GROUPBOX "Contacts",IDC_STATIC,7,77,291,103
- LTEXT "Default group:",IDC_STATIC,17,91,61,8,0,WS_EX_RIGHT
- EDITTEXT IDC_GROUP,84,89,123,13,ES_AUTOHSCROLL
+ GROUPBOX "Contacts",IDC_STATIC,7,70,291,31
+ LTEXT "Default group:",IDC_STATIC,17,84,61,8,0,WS_EX_RIGHT
+ EDITTEXT IDC_GROUP,84,82,123,13,ES_AUTOHSCROLL
+ GROUPBOX "Group chats",IDC_STATIC,7,103,291,44
+ CONTROL "Enable group chats",IDC_ENABLECHATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,117,277,10
+ CONTROL "Do not open chat windows on creation",IDC_HIDECHATS,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,130,277,10
END
+
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
@@ -99,6 +105,10 @@ BEGIN
IDD_FACEBOOKACCOUNT, DIALOG
BEGIN
END
+
+ IDD_OPTIONS, DIALOG
+ BEGIN
+ END
END
#endif // APSTUDIO_INVOKED
@@ -113,6 +123,11 @@ BEGIN
0
END
+IDD_OPTIONS AFX_DIALOG_LAYOUT
+BEGIN
+ 0
+END
+
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
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>