alicezetion 1.6.6 → 1.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -1
  2. package/.cache/replit/nix/env.json +1 -1
  3. package/index.js +804 -381
  4. package/leiamnash/addExternalModule.js +19 -19
  5. package/leiamnash/addUserToGroup.js +113 -113
  6. package/leiamnash/changeAdminStatus.js +79 -79
  7. package/leiamnash/changeApprovalMode.js +80 -0
  8. package/leiamnash/changeArchivedStatus.js +55 -55
  9. package/leiamnash/changeBio.js +77 -77
  10. package/leiamnash/changeBlockedStatus.js +47 -47
  11. package/leiamnash/changeGroupImage.js +129 -129
  12. package/leiamnash/changeNickname.js +59 -59
  13. package/leiamnash/changeThreadColor.js +71 -71
  14. package/leiamnash/changeThreadEmoji.js +55 -55
  15. package/leiamnash/chat.js +447 -459
  16. package/leiamnash/createNewGroup.js +86 -86
  17. package/leiamnash/createPoll.js +71 -71
  18. package/leiamnash/deleteMessage.js +56 -56
  19. package/leiamnash/deleteThread.js +56 -56
  20. package/leiamnash/forwardAttachment.js +60 -60
  21. package/leiamnash/getCurrentUserID.js +7 -7
  22. package/leiamnash/getEmojiUrl.js +29 -29
  23. package/leiamnash/getFriendsList.js +84 -84
  24. package/leiamnash/getThreadHistory.js +645 -645
  25. package/leiamnash/getThreadHistoryDeprecated.js +93 -93
  26. package/leiamnash/getThreadInfo.js +212 -206
  27. package/leiamnash/getThreadInfoDeprecated.js +80 -80
  28. package/leiamnash/getThreadList.js +238 -238
  29. package/leiamnash/getThreadListDeprecated.js +75 -75
  30. package/leiamnash/getThreadPictures.js +79 -79
  31. package/leiamnash/getUserID.js +66 -66
  32. package/leiamnash/getUserInfo.js +72 -72
  33. package/leiamnash/handleFriendRequest.js +61 -61
  34. package/leiamnash/handleMessageRequest.js +65 -65
  35. package/leiamnash/httpGet.js +52 -52
  36. package/leiamnash/httpPost.js +52 -52
  37. package/leiamnash/listenMqtt.js +1129 -789
  38. package/leiamnash/logout.js +75 -75
  39. package/leiamnash/markAsDelivered.js +58 -58
  40. package/leiamnash/markAsRead.js +80 -80
  41. package/leiamnash/markAsReadAll.js +49 -49
  42. package/leiamnash/markAsSeen.js +59 -59
  43. package/leiamnash/muteThread.js +52 -52
  44. package/leiamnash/removeUserFromGroup.js +79 -79
  45. package/leiamnash/resolvePhotoUrl.js +45 -45
  46. package/leiamnash/searchForThread.js +53 -53
  47. package/leiamnash/sendTypingIndicator.js +103 -103
  48. package/leiamnash/setMessageReaction.js +117 -117
  49. package/leiamnash/setPostReaction.js +76 -76
  50. package/leiamnash/setTitle.js +86 -86
  51. package/leiamnash/threadColors.js +57 -57
  52. package/leiamnash/unfriend.js +52 -52
  53. package/leiamnash/unsendMessage.js +49 -49
  54. package/package.json +72 -72
  55. package/replit.nix +3 -0
  56. package/utils.js +196 -71
  57. package/leiamnash/listen.js +0 -553
@@ -1,93 +1,93 @@
1
- "use strict";
2
-
3
- var utils = require("../utils");
4
- var log = require("npmlog");
5
-
6
- module.exports = function(defaultFuncs, api, ctx) {
7
- return function getThreadHistory(threadID, amount, timestamp, callback) {
8
- var resolveFunc = function(){};
9
- var rejectFunc = function(){};
10
- var returnPromise = new Promise(function (resolve, reject) {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
-
15
- if (!callback) {
16
- callback = function (err, friendList) {
17
- if (err) {
18
- return rejectFunc(err);
19
- }
20
- resolveFunc(friendList);
21
- };
22
- }
23
-
24
- if (!callback) {
25
- throw { error: "getThreadHistory: need callback" };
26
- }
27
-
28
- var form = {
29
- client: "mercury"
30
- };
31
-
32
- api.getUserInfo(threadID, function(err, res) {
33
- if (err) {
34
- return callback(err);
35
- }
36
- var key = Object.keys(res).length > 0 ? "user_ids" : "thread_fbids";
37
- form["messages[" + key + "][" + threadID + "][offset]"] = 0;
38
- form["messages[" + key + "][" + threadID + "][timestamp]"] = timestamp;
39
- form["messages[" + key + "][" + threadID + "][limit]"] = amount;
40
-
41
- if (ctx.globalOptions.pageID)
42
- form.request_user_id = ctx.globalOptions.pageID;
43
-
44
- defaultFuncs
45
- .post(
46
- "https://www.facebook.com/ajax/mercury/thread_info.php",
47
- ctx.jar,
48
- form
49
- )
50
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
51
- .then(function(resData) {
52
- if (resData.error) {
53
- throw resData;
54
- } else if (!resData.payload) {
55
- throw { error: "Could not retrieve thread history." };
56
- }
57
-
58
- // Asking for message history from a thread with no message history
59
- // will return undefined for actions here
60
- if (!resData.payload.actions) {
61
- resData.payload.actions = [];
62
- }
63
-
64
- var userIDs = {};
65
- resData.payload.actions.forEach(function(v) {
66
- userIDs[v.author.split(":").pop()] = "";
67
- });
68
-
69
- api.getUserInfo(Object.keys(userIDs), function(err, data) {
70
- if (err) return callback(err); //callback({error: "Could not retrieve user information in getThreadHistory."});
71
-
72
- resData.payload.actions.forEach(function(v) {
73
- var sender = data[v.author.split(":").pop()];
74
- if (sender) v.sender_name = sender.name;
75
- else v.sender_name = "Facebook User";
76
- v.sender_fbid = v.author;
77
- delete v.author;
78
- });
79
-
80
- callback(
81
- null,
82
- resData.payload.actions.map(utils.formatHistoryMessage)
83
- );
84
- });
85
- })
86
- .catch(function(err) {
87
- log.error("getThreadHistory", err);
88
- return callback(err);
89
- });
90
- });
91
- return returnPromise;
92
- };
93
- };
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function getThreadHistory(threadID, amount, timestamp, callback) {
8
+ var resolveFunc = function(){};
9
+ var rejectFunc = function(){};
10
+ var returnPromise = new Promise(function (resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ callback = function (err, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
21
+ };
22
+ }
23
+
24
+ if (!callback) {
25
+ throw { error: "getThreadHistory: need callback" };
26
+ }
27
+
28
+ var form = {
29
+ client: "mercury"
30
+ };
31
+
32
+ api.getUserInfo(threadID, function(err, res) {
33
+ if (err) {
34
+ return callback(err);
35
+ }
36
+ var key = Object.keys(res).length > 0 ? "user_ids" : "thread_fbids";
37
+ form["messages[" + key + "][" + threadID + "][offset]"] = 0;
38
+ form["messages[" + key + "][" + threadID + "][timestamp]"] = timestamp;
39
+ form["messages[" + key + "][" + threadID + "][limit]"] = amount;
40
+
41
+ if (ctx.globalOptions.pageID)
42
+ form.request_user_id = ctx.globalOptions.pageID;
43
+
44
+ defaultFuncs
45
+ .post(
46
+ "https://www.facebook.com/ajax/mercury/thread_info.php",
47
+ ctx.jar,
48
+ form
49
+ )
50
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
51
+ .then(function(resData) {
52
+ if (resData.error) {
53
+ throw resData;
54
+ } else if (!resData.payload) {
55
+ throw { error: "Could not retrieve thread history." };
56
+ }
57
+
58
+ // Asking for message history from a thread with no message history
59
+ // will return undefined for actions here
60
+ if (!resData.payload.actions) {
61
+ resData.payload.actions = [];
62
+ }
63
+
64
+ var userIDs = {};
65
+ resData.payload.actions.forEach(function(v) {
66
+ userIDs[v.author.split(":").pop()] = "";
67
+ });
68
+
69
+ api.getUserInfo(Object.keys(userIDs), function(err, data) {
70
+ if (err) return callback(err); //callback({error: "Could not retrieve user information in getThreadHistory."});
71
+
72
+ resData.payload.actions.forEach(function(v) {
73
+ var sender = data[v.author.split(":").pop()];
74
+ if (sender) v.sender_name = sender.name;
75
+ else v.sender_name = "Facebook User";
76
+ v.sender_fbid = v.author;
77
+ delete v.author;
78
+ });
79
+
80
+ callback(
81
+ null,
82
+ resData.payload.actions.map(utils.formatHistoryMessage)
83
+ );
84
+ });
85
+ })
86
+ .catch(function(err) {
87
+ log.error("getThreadHistory", err);
88
+ return callback(err);
89
+ });
90
+ });
91
+ return returnPromise;
92
+ };
93
+ };
@@ -1,206 +1,212 @@
1
- "use strict";
2
-
3
- var utils = require("../utils");
4
- var log = require("npmlog");
5
-
6
- function formatEventReminders(reminder) {
7
- return {
8
- reminderID: reminder.id,
9
- eventCreatorID: reminder.lightweight_event_creator.id,
10
- time: reminder.time,
11
- eventType: reminder.lightweight_event_type.toLowerCase(),
12
- locationName: reminder.location_name,
13
- // @TODO verify this
14
- locationCoordinates: reminder.location_coordinates,
15
- locationPage: reminder.location_page,
16
- eventStatus: reminder.lightweight_event_status.toLowerCase(),
17
- note: reminder.note,
18
- repeatMode: reminder.repeat_mode.toLowerCase(),
19
- eventTitle: reminder.event_title,
20
- triggerMessage: reminder.trigger_message,
21
- secondsToNotifyBefore: reminder.seconds_to_notify_before,
22
- allowsRsvp: reminder.allows_rsvp,
23
- relatedEvent: reminder.related_event,
24
- members: reminder.event_reminder_members.edges.map(function(member) {
25
- return {
26
- memberID: member.node.id,
27
- state: member.guest_list_state.toLowerCase()
28
- };
29
- })
30
- };
31
- }
32
-
33
- function formatThreadGraphQLResponse(data) {
34
- try{
35
- var messageThread = data.o0.data.message_thread;
36
- } catch (err){
37
- console.error("GetThreadInfoGraphQL", "Can't get this thread info!");
38
- return {err: err};
39
- }
40
- var threadID = messageThread.thread_key.thread_fbid
41
- ? messageThread.thread_key.thread_fbid
42
- : messageThread.thread_key.other_user_id;
43
-
44
- // Remove me
45
- var lastM = messageThread.last_message;
46
- var snippetID =
47
- lastM &&
48
- lastM.nodes &&
49
- lastM.nodes[0] &&
50
- lastM.nodes[0].message_sender &&
51
- lastM.nodes[0].message_sender.messaging_actor
52
- ? lastM.nodes[0].message_sender.messaging_actor.id
53
- : null;
54
- var snippetText =
55
- lastM && lastM.nodes && lastM.nodes[0] ? lastM.nodes[0].snippet : null;
56
- var lastR = messageThread.last_read_receipt;
57
- var lastReadTimestamp =
58
- lastR && lastR.nodes && lastR.nodes[0] && lastR.nodes[0].timestamp_precise
59
- ? lastR.nodes[0].timestamp_precise
60
- : null;
61
-
62
- return {
63
- threadID: threadID,
64
- threadName: messageThread.name,
65
- participantIDs: messageThread.all_participants.edges.map(d => d.node.messaging_actor.id),
66
- userInfo: messageThread.all_participants.edges.map(d => ({
67
- id: d.node.messaging_actor.id,
68
- name: d.node.messaging_actor.name,
69
- firstName: d.node.messaging_actor.short_name,
70
- vanity: d.node.messaging_actor.username,
71
- thumbSrc: d.node.messaging_actor.big_image_src.uri,
72
- profileUrl: d.node.messaging_actor.big_image_src.uri,
73
- gender: d.node.messaging_actor.gender,
74
- type: d.node.messaging_actor.__typename,
75
- isFriend: d.node.messaging_actor.is_viewer_friend,
76
- isBirthday: !!d.node.messaging_actor.is_birthday //not sure?
77
- })),
78
- unreadCount: messageThread.unread_count,
79
- messageCount: messageThread.messages_count,
80
- timestamp: messageThread.updated_time_precise,
81
- muteUntil: messageThread.mute_until,
82
- isGroup: messageThread.thread_type == "GROUP",
83
- isSubscribed: messageThread.is_viewer_subscribed,
84
- isArchived: messageThread.has_viewer_archived,
85
- folder: messageThread.folder,
86
- cannotReplyReason: messageThread.cannot_reply_reason,
87
- eventReminders: messageThread.event_reminders
88
- ? messageThread.event_reminders.nodes.map(formatEventReminders)
89
- : null,
90
- emoji: messageThread.customization_info
91
- ? messageThread.customization_info.emoji
92
- : null,
93
- color:
94
- messageThread.customization_info &&
95
- messageThread.customization_info.outgoing_bubble_color
96
- ? messageThread.customization_info.outgoing_bubble_color.slice(2)
97
- : null,
98
- nicknames:
99
- messageThread.customization_info &&
100
- messageThread.customization_info.participant_customizations
101
- ? messageThread.customization_info.participant_customizations.reduce(
102
- function(res, val) {
103
- if (val.nickname) res[val.participant_id] = val.nickname;
104
- return res;
105
- },
106
- {}
107
- )
108
- : {},
109
- adminIDs: messageThread.thread_admins,
110
- approvalMode: Boolean(messageThread.approval_mode),
111
- approvalQueue: messageThread.group_approval_queue.nodes.map(a => ({
112
- inviterID: a.inviter.id,
113
- requesterID: a.requester.id,
114
- timestamp: a.request_timestamp,
115
- request_source: a.request_source // @Undocumented
116
- })),
117
-
118
- // @Undocumented
119
- reactionsMuteMode: messageThread.reactions_mute_mode.toLowerCase(),
120
- mentionsMuteMode: messageThread.mentions_mute_mode.toLowerCase(),
121
- isPinProtected: messageThread.is_pin_protected,
122
- relatedPageThread: messageThread.related_page_thread,
123
-
124
- // @Legacy
125
- name: messageThread.name,
126
- snippet: snippetText,
127
- snippetSender: snippetID,
128
- snippetAttachments: [],
129
- serverTimestamp: messageThread.updated_time_precise,
130
- imageSrc: messageThread.image ? messageThread.image.uri : null,
131
- isCanonicalUser: messageThread.is_canonical_neo_user,
132
- isCanonical: messageThread.thread_type != "GROUP",
133
- recipientsLoadable: true,
134
- hasEmailParticipant: false,
135
- readOnly: false,
136
- canReply: messageThread.cannot_reply_reason == null,
137
- lastMessageTimestamp: messageThread.last_message
138
- ? messageThread.last_message.timestamp_precise
139
- : null,
140
- lastMessageType: "message",
141
- lastReadTimestamp: lastReadTimestamp,
142
- threadType: messageThread.thread_type == "GROUP" ? 2 : 1
143
- };
144
- }
145
-
146
- module.exports = function(defaultFuncs, api, ctx) {
147
- return function getThreadInfoGraphQL(threadID, callback) {
148
- var resolveFunc = function(){};
149
- var rejectFunc = function(){};
150
- var returnPromise = new Promise(function (resolve, reject) {
151
- resolveFunc = resolve;
152
- rejectFunc = reject;
153
- });
154
-
155
- if (utils.getType(callback) != "Function" && utils.getType(callback) != "AsyncFunction") {
156
- callback = function (err, data) {
157
- if (err) {
158
- return rejectFunc(err);
159
- }
160
- resolveFunc(data);
161
- };
162
- }
163
-
164
- // `queries` has to be a string. I couldn't tell from the dev console. This
165
- // took me a really long time to figure out. I deserve a cookie for this.
166
- var form = {
167
- queries: JSON.stringify({
168
- o0: {
169
- // This doc_id is valid as of July 20th, 2020
170
- doc_id: "3449967031715030",
171
- query_params: {
172
- id: threadID,
173
- message_limit: 0,
174
- load_messages: false,
175
- load_read_receipts: false,
176
- before: null
177
- }
178
- }
179
- }),
180
- batch_name: "MessengerGraphQLThreadFetcher"
181
- };
182
-
183
- defaultFuncs
184
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
185
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
186
- .then(function(resData) {
187
- if (resData.error) {
188
- throw resData;
189
- }
190
- // This returns us an array of things. The last one is the success /
191
- // failure one.
192
- // @TODO What do we do in this case?
193
- if (resData[resData.length - 1].error_results !== 0) {
194
- console.error("GetThreadInfo", "Well darn there was an error_result");
195
- }
196
-
197
- callback(null, formatThreadGraphQLResponse(resData[0]));
198
- })
199
- .catch(function(err) {
200
- log.error("getThreadInfoGraphQL", err);
201
- return callback(err);
202
- });
203
-
204
- return returnPromise;
205
- };
206
- };
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ function formatEventReminders(reminder) {
7
+ return {
8
+ reminderID: reminder.id,
9
+ eventCreatorID: reminder.lightweight_event_creator.id,
10
+ time: reminder.time,
11
+ eventType: reminder.lightweight_event_type.toLowerCase(),
12
+ locationName: reminder.location_name,
13
+ // @TODO verify this
14
+ locationCoordinates: reminder.location_coordinates,
15
+ locationPage: reminder.location_page,
16
+ eventStatus: reminder.lightweight_event_status.toLowerCase(),
17
+ note: reminder.note,
18
+ repeatMode: reminder.repeat_mode.toLowerCase(),
19
+ eventTitle: reminder.event_title,
20
+ triggerMessage: reminder.trigger_message,
21
+ secondsToNotifyBefore: reminder.seconds_to_notify_before,
22
+ allowsRsvp: reminder.allows_rsvp,
23
+ relatedEvent: reminder.related_event,
24
+ members: reminder.event_reminder_members.edges.map(function(member) {
25
+ return {
26
+ memberID: member.node.id,
27
+ state: member.guest_list_state.toLowerCase(),
28
+ };
29
+ }),
30
+ };
31
+ }
32
+
33
+ function formatThreadGraphQLResponse(data) {
34
+ var messageThread = data.o0.data.message_thread;
35
+ var threadID = messageThread.thread_key.thread_fbid
36
+ ? messageThread.thread_key.thread_fbid
37
+ : messageThread.thread_key.other_user_id;
38
+
39
+ // Remove me
40
+ var lastM = messageThread.last_message;
41
+ var snippetID =
42
+ lastM &&
43
+ lastM.nodes &&
44
+ lastM.nodes[0] &&
45
+ lastM.nodes[0].message_sender &&
46
+ lastM.nodes[0].message_sender.messaging_actor
47
+ ? lastM.nodes[0].message_sender.messaging_actor.id
48
+ : null;
49
+ var snippetText =
50
+ lastM && lastM.nodes && lastM.nodes[0] ? lastM.nodes[0].snippet : null;
51
+ var lastR = messageThread.last_read_receipt;
52
+ var lastReadTimestamp =
53
+ lastR &&
54
+ lastR.nodes &&
55
+ lastR.nodes[0] &&
56
+ lastR.nodes[0].timestamp_precise
57
+ ? lastR.nodes[0].timestamp_precise
58
+ : null;
59
+
60
+ return {
61
+ threadID: threadID,
62
+ threadName: messageThread.name,
63
+ participantIDs: messageThread.all_participants.edges.map(
64
+ (d) => d.node.messaging_actor.id
65
+ ),
66
+ userInfo: messageThread.all_participants.edges.map((d) => ({
67
+ id: d.node.messaging_actor.id,
68
+ name: d.node.messaging_actor.name,
69
+ firstName: d.node.messaging_actor.short_name,
70
+ vanity: d.node.messaging_actor.username,
71
+ thumbSrc: d.node.messaging_actor.big_image_src.uri,
72
+ profileUrl: d.node.messaging_actor.url,
73
+ gender: d.node.messaging_actor.gender,
74
+ type: d.node.messaging_actor.__typename,
75
+ isFriend: d.node.messaging_actor.is_viewer_friend,
76
+ isBirthday: !!d.node.messaging_actor.is_birthday, //not sure?
77
+ })),
78
+ unreadCount: messageThread.unread_count,
79
+ messageCount: messageThread.messages_count,
80
+ timestamp: messageThread.updated_time_precise,
81
+ muteUntil: messageThread.mute_until,
82
+ isGroup: messageThread.thread_type == "GROUP",
83
+ isSubscribed: messageThread.is_viewer_subscribed,
84
+ isArchived: messageThread.has_viewer_archived,
85
+ folder: messageThread.folder,
86
+ cannotReplyReason: messageThread.cannot_reply_reason,
87
+ eventReminders: messageThread.event_reminders
88
+ ? messageThread.event_reminders.nodes.map(formatEventReminders)
89
+ : null,
90
+ emoji: messageThread.customization_info
91
+ ? messageThread.customization_info.emoji
92
+ : null,
93
+ color:
94
+ messageThread.customization_info &&
95
+ messageThread.customization_info.outgoing_bubble_color
96
+ ? messageThread.customization_info.outgoing_bubble_color.slice(
97
+ 2
98
+ )
99
+ : null,
100
+ nicknames:
101
+ messageThread.customization_info &&
102
+ messageThread.customization_info.participant_customizations
103
+ ? messageThread.customization_info.participant_customizations.reduce(
104
+ function(res, val) {
105
+ if (val.nickname)
106
+ res[val.participant_id] = val.nickname;
107
+ return res;
108
+ },
109
+ {}
110
+ )
111
+ : {},
112
+ adminIDs: messageThread.thread_admins.map((el) => el.id),
113
+ approvalMode: Boolean(messageThread.approval_mode),
114
+ approvalQueue: messageThread.group_approval_queue.nodes.map((a) => ({
115
+ inviterID: a.inviter.id,
116
+ requesterID: a.requester.id,
117
+ timestamp: a.request_timestamp,
118
+ request_source: a.request_source, // @Undocumented
119
+ })),
120
+
121
+ // @Undocumented
122
+ reactionsMuteMode: messageThread.reactions_mute_mode.toLowerCase(),
123
+ mentionsMuteMode: messageThread.mentions_mute_mode.toLowerCase(),
124
+ isPinProtected: messageThread.is_pin_protected,
125
+ relatedPageThread: messageThread.related_page_thread,
126
+
127
+ // @Legacy
128
+ name: messageThread.name,
129
+ snippet: snippetText,
130
+ snippetSender: snippetID,
131
+ snippetAttachments: [],
132
+ serverTimestamp: messageThread.updated_time_precise,
133
+ imageSrc: messageThread.image ? messageThread.image.uri : null,
134
+ isCanonicalUser: messageThread.is_canonical_neo_user,
135
+ isCanonical: messageThread.thread_type != "GROUP",
136
+ recipientsLoadable: true,
137
+ hasEmailParticipant: false,
138
+ readOnly: false,
139
+ canReply: messageThread.cannot_reply_reason == null,
140
+ lastMessageTimestamp: messageThread.last_message
141
+ ? messageThread.last_message.timestamp_precise
142
+ : null,
143
+ lastMessageType: "message",
144
+ lastReadTimestamp: lastReadTimestamp,
145
+ threadType: messageThread.thread_type == "GROUP" ? 2 : 1,
146
+ };
147
+ }
148
+
149
+ module.exports = function(defaultFuncs, api, ctx) {
150
+ return function getThreadInfoGraphQL(threadID, callback) {
151
+ var resolveFunc = function() {};
152
+ var rejectFunc = function() {};
153
+ var returnPromise = new Promise(function(resolve, reject) {
154
+ resolveFunc = resolve;
155
+ rejectFunc = reject;
156
+ });
157
+
158
+ if (
159
+ utils.getType(callback) != "Function" &&
160
+ utils.getType(callback) != "AsyncFunction"
161
+ ) {
162
+ callback = function(err, data) {
163
+ if (err) {
164
+ return rejectFunc(err);
165
+ }
166
+ resolveFunc(data);
167
+ };
168
+ }
169
+
170
+ // `queries` has to be a string. I couldn't tell from the dev console. This
171
+ // took me a really long time to figure out. I deserve a cookie for this.
172
+ var form = {
173
+ queries: JSON.stringify({
174
+ o0: {
175
+ // This doc_id is valid as of July 20th, 2020
176
+ doc_id: "3449967031715030",
177
+ query_params: {
178
+ id: threadID,
179
+ message_limit: 0,
180
+ load_messages: false,
181
+ load_read_receipts: false,
182
+ before: null,
183
+ },
184
+ },
185
+ }),
186
+ batch_name: "MessengerGraphQLThreadFetcher",
187
+ };
188
+
189
+ defaultFuncs
190
+ .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
191
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
192
+ .then(function(resData) {
193
+ if (resData.error) {
194
+ throw resData;
195
+ }
196
+ // This returns us an array of things. The last one is the success /
197
+ // failure one.
198
+ // @TODO What do we do in this case?
199
+ if (resData[resData.length - 1].error_results !== 0) {
200
+ throw new Error("well darn there was an error_result");
201
+ }
202
+
203
+ callback(null, formatThreadGraphQLResponse(resData[0]));
204
+ })
205
+ .catch(function(err) {
206
+ log.error("getThreadInfoGraphQL", err);
207
+ return callback(err);
208
+ });
209
+
210
+ return returnPromise;
211
+ };
212
+ };