@dongdev/fca-unofficial 1.0.20 → 2.0.1

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 (128) hide show
  1. package/.gitattributes +1 -0
  2. package/CHANGELOG.md +32 -29
  3. package/DOCS.md +727 -592
  4. package/README.md +94 -97
  5. package/func/logger.js +112 -0
  6. package/html.html +474 -0
  7. package/index.js +1 -379
  8. package/module/config.js +26 -0
  9. package/module/login.js +45 -0
  10. package/module/loginHelper.js +634 -0
  11. package/module/options.js +49 -0
  12. package/package.json +6 -39
  13. package/src/api/action/addExternalModule.js +25 -0
  14. package/src/api/action/changeAvatar.js +136 -0
  15. package/src/api/action/changeBio.js +76 -0
  16. package/src/api/action/getCurrentUserID.js +7 -0
  17. package/src/api/action/handleFriendRequest.js +57 -0
  18. package/src/api/action/logout.js +75 -0
  19. package/src/{refreshFb_dtsg.js → api/action/refreshFb_dtsg.js} +8 -8
  20. package/src/api/action/setPostReaction.js +107 -0
  21. package/src/api/action/unfriend.js +55 -0
  22. package/src/api/http/httpGet.js +65 -0
  23. package/src/api/http/httpPost.js +65 -0
  24. package/src/{postFormData.js → api/http/postFormData.js} +10 -10
  25. package/src/api/messaging/addUserToGroup.js +69 -0
  26. package/src/api/messaging/changeAdminStatus.js +103 -0
  27. package/src/api/messaging/changeArchivedStatus.js +55 -0
  28. package/src/api/messaging/changeBlockedStatus.js +49 -0
  29. package/src/api/messaging/changeGroupImage.js +135 -0
  30. package/src/api/messaging/changeNickname.js +59 -0
  31. package/src/api/messaging/changeThreadColor.js +65 -0
  32. package/src/api/messaging/createNewGroup.js +88 -0
  33. package/src/api/messaging/createPoll.js +70 -0
  34. package/src/api/messaging/deleteMessage.js +56 -0
  35. package/src/api/messaging/deleteThread.js +56 -0
  36. package/src/api/messaging/forwardAttachment.js +60 -0
  37. package/src/api/messaging/getEmojiUrl.js +29 -0
  38. package/src/api/messaging/getFriendsList.js +83 -0
  39. package/src/api/messaging/getMessage.js +834 -0
  40. package/src/api/messaging/getThreadHistory.js +681 -0
  41. package/src/api/messaging/handleMessageRequest.js +65 -0
  42. package/src/api/messaging/markAsDelivered.js +57 -0
  43. package/src/api/messaging/markAsRead.js +88 -0
  44. package/src/api/messaging/markAsReadAll.js +50 -0
  45. package/src/api/messaging/markAsSeen.js +61 -0
  46. package/src/api/messaging/muteThread.js +51 -0
  47. package/src/api/messaging/removeUserFromGroup.js +79 -0
  48. package/src/api/messaging/resolvePhotoUrl.js +44 -0
  49. package/src/api/messaging/searchForThread.js +53 -0
  50. package/src/api/messaging/sendMessage.js +306 -0
  51. package/src/api/messaging/sendMessageMqtt.js +321 -0
  52. package/src/api/messaging/sendTypingIndicator.js +110 -0
  53. package/src/{setMessageReaction.js → api/messaging/setMessageReaction.js} +20 -20
  54. package/src/api/messaging/setTitle.js +90 -0
  55. package/src/api/messaging/shareContact.js +51 -0
  56. package/src/api/messaging/threadColors.js +131 -0
  57. package/src/api/messaging/unsendMessage.js +44 -0
  58. package/src/api/messaging/uploadAttachment.js +93 -0
  59. package/src/api/socket/detail/buildStream.js +100 -0
  60. package/src/{listenMqtt.js → api/socket/listenMqtt.js} +122 -206
  61. package/src/api/threads/changeThreadEmoji.js +55 -0
  62. package/src/api/threads/getThreadInfo.js +572 -0
  63. package/src/{getThreadList.js → api/threads/getThreadList.js} +110 -54
  64. package/src/api/threads/getThreadPictures.js +79 -0
  65. package/src/api/users/getUserID.js +66 -0
  66. package/src/api/users/getUserInfo.js +88 -0
  67. package/src/core/sendReqMqtt.js +63 -0
  68. package/{lib → src}/database/models/index.js +12 -10
  69. package/{lib → src}/database/models/thread.js +5 -5
  70. package/{lib → src}/database/threadData.js +19 -14
  71. package/src/utils/client.js +159 -0
  72. package/src/utils/constants.js +13 -0
  73. package/src/utils/format.js +60 -0
  74. package/src/utils/headers.js +41 -0
  75. package/src/utils/index.js +1497 -0
  76. package/src/utils/request.js +147 -0
  77. package/lib/logger.js +0 -96
  78. package/src/addExternalModule.js +0 -19
  79. package/src/addUserToGroup.js +0 -113
  80. package/src/changeAdminStatus.js +0 -79
  81. package/src/changeArchivedStatus.js +0 -55
  82. package/src/changeAvatar.js +0 -126
  83. package/src/changeBio.js +0 -77
  84. package/src/changeBlockedStatus.js +0 -47
  85. package/src/changeGroupImage.js +0 -132
  86. package/src/changeNickname.js +0 -59
  87. package/src/changeThreadColor.js +0 -65
  88. package/src/changeThreadEmoji.js +0 -55
  89. package/src/createNewGroup.js +0 -86
  90. package/src/createPoll.js +0 -71
  91. package/src/deleteMessage.js +0 -56
  92. package/src/deleteThread.js +0 -56
  93. package/src/forwardAttachment.js +0 -60
  94. package/src/getCurrentUserID.js +0 -7
  95. package/src/getEmojiUrl.js +0 -29
  96. package/src/getFriendsList.js +0 -83
  97. package/src/getMessage.js +0 -796
  98. package/src/getThreadHistory.js +0 -666
  99. package/src/getThreadInfo.js +0 -535
  100. package/src/getThreadPictures.js +0 -79
  101. package/src/getUserID.js +0 -66
  102. package/src/getUserInfo.js +0 -80
  103. package/src/handleFriendRequest.js +0 -61
  104. package/src/handleMessageRequest.js +0 -65
  105. package/src/httpGet.js +0 -57
  106. package/src/httpPost.js +0 -57
  107. package/src/httpPostFormData.js +0 -63
  108. package/src/logout.js +0 -75
  109. package/src/markAsDelivered.js +0 -58
  110. package/src/markAsRead.js +0 -80
  111. package/src/markAsReadAll.js +0 -50
  112. package/src/markAsSeen.js +0 -59
  113. package/src/muteThread.js +0 -52
  114. package/src/removeUserFromGroup.js +0 -79
  115. package/src/resolvePhotoUrl.js +0 -45
  116. package/src/searchForThread.js +0 -53
  117. package/src/sendMessage.js +0 -328
  118. package/src/sendMessageMqtt.js +0 -316
  119. package/src/sendTypingIndicator.js +0 -103
  120. package/src/setPostReaction.js +0 -109
  121. package/src/setTitle.js +0 -86
  122. package/src/shareContact.js +0 -49
  123. package/src/threadColors.js +0 -131
  124. package/src/unfriend.js +0 -52
  125. package/src/unsendMessage.js +0 -49
  126. package/src/uploadAttachment.js +0 -95
  127. package/utils.js +0 -1387
  128. /package/{lib → func}/login.js +0 -0
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
- const utils = require("../utils");
2
+ const utils = require("../../utils");
3
3
  const log = require("npmlog");
4
4
  const mqtt = require("mqtt");
5
5
  const WebSocket = require("ws");
6
6
  const HttpsProxyAgent = require("https-proxy-agent");
7
7
  const EventEmitter = require("events");
8
- const Duplexify = require("duplexify");
9
- const { Transform } = require("stream");
10
8
  var identity = function () { };
11
9
  var form = {};
12
10
  var getSeqID = function () { };
13
- const logger = require("../lib/logger.js");
11
+ const logger = require("../../../func/logger");
12
+ const { parseAndCheckLogin } = require("../../utils/client");
13
+ const { buildProxy, buildStream } = require("./detail/buildStream");
14
14
  let mqttReconnectCount = 0;
15
15
  const topics = [
16
16
  "/ls_req",
@@ -31,98 +31,8 @@ const topics = [
31
31
  "/messaging_events",
32
32
  "/orca_message_notifications",
33
33
  "/pp",
34
- "/webrtc_response",
34
+ "/webrtc_response"
35
35
  ];
36
- let WebSocket_Global;
37
- function buildProxy() {
38
- const Proxy = new Transform({
39
- objectMode: false,
40
- transform(chunk, enc, next) {
41
- if (WebSocket_Global.readyState !== WebSocket.OPEN) {
42
- return next();
43
- }
44
- const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
45
- try {
46
- WebSocket_Global.send(data);
47
- next();
48
- } catch (err) {
49
- console.error("WebSocket send error:", err);
50
- next(err);
51
- }
52
- },
53
- flush(done) {
54
- if (WebSocket_Global.readyState === WebSocket.OPEN) {
55
- WebSocket_Global.close();
56
- }
57
- done();
58
- },
59
- writev(chunks, cb) {
60
- try {
61
- for (const { chunk } of chunks) {
62
- this.push(
63
- Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8")
64
- );
65
- }
66
- cb();
67
- } catch (err) {
68
- console.error("Writev error:", err);
69
- cb(err);
70
- }
71
- },
72
- });
73
-
74
- return Proxy;
75
- }
76
- function buildStream(options, WebSocket, Proxy) {
77
- const Stream = Duplexify(undefined, undefined, options);
78
- Stream.socket = WebSocket;
79
- let pingInterval;
80
- let reconnectTimeout;
81
- const clearTimers = () => {
82
- clearInterval(pingInterval);
83
- clearTimeout(reconnectTimeout);
84
- };
85
- WebSocket.onclose = () => {
86
- clearTimers();
87
- Stream.end();
88
- Stream.destroy();
89
- };
90
- WebSocket.onerror = (err) => {
91
- clearTimers();
92
- Stream.destroy(err);
93
- };
94
- WebSocket.onmessage = (event) => {
95
- clearTimeout(reconnectTimeout);
96
- const data =
97
- event.data instanceof ArrayBuffer
98
- ? Buffer.from(event.data)
99
- : Buffer.from(event.data, "utf8");
100
- Stream.push(data);
101
- };
102
- WebSocket.onopen = () => {
103
- Stream.setReadable(Proxy);
104
- Stream.setWritable(Proxy);
105
- Stream.emit("connect");
106
- pingInterval = setInterval(() => {
107
- if (WebSocket.readyState === WebSocket.OPEN) {
108
- WebSocket.ping();
109
- }
110
- }, 30000);
111
- reconnectTimeout = setTimeout(() => {
112
- if (WebSocket.readyState === WebSocket.OPEN) {
113
- WebSocket.close();
114
- Stream.end();
115
- Stream.destroy();
116
- }
117
- }, 60000);
118
- };
119
- WebSocket_Global = WebSocket;
120
- Proxy.on("close", () => {
121
- clearTimers();
122
- WebSocket.close();
123
- });
124
- return Stream;
125
- }
126
36
  function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
127
37
  const chatOn = ctx.globalOptions.online;
128
38
  const foreground = false;
@@ -149,12 +59,12 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
149
59
  p: null,
150
60
  php_override: ""
151
61
  };
152
- const cookies = ctx.jar.getCookies("https://www.facebook.com").join("; ");
62
+ const cookies = api.getCookies();
153
63
  let host;
154
64
  if (ctx.mqttEndpoint) {
155
65
  host = `${ctx.mqttEndpoint}&sid=${sessionID}&cid=${GUID}`;
156
66
  } else if (ctx.region) {
157
- host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}&cid=${GUID}`;
67
+ host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}&cid=${ctx.clientId}`;
158
68
  } else {
159
69
  host = `wss://edge-chat.facebook.com/chat?sid=${sessionID}&cid=${GUID}`;
160
70
  }
@@ -180,17 +90,16 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
180
90
  "Sec-WebSocket-Version": "13",
181
91
  "Accept-Encoding": "gzip, deflate, br",
182
92
  "Accept-Language": "vi,en;q=0.9",
183
- "Sec-WebSocket-Extensions":
184
- "permessage-deflate; client_max_window_bits",
93
+ "Sec-WebSocket-Extensions": "permessage-deflate; client_max_window_bits"
185
94
  },
186
95
  origin: "https://www.facebook.com",
187
96
  protocolVersion: 13,
188
- binaryType: "arraybuffer",
97
+ binaryType: "arraybuffer"
189
98
  },
190
99
  keepalive: 30,
191
100
  reschedulePings: true,
192
101
  reconnectPeriod: 1000,
193
- connectTimeout: 5000,
102
+ connectTimeout: 5000
194
103
  };
195
104
  if (ctx.globalOptions.proxy !== undefined) {
196
105
  const agent = new HttpsProxyAgent(ctx.globalOptions.proxy);
@@ -207,24 +116,32 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
207
116
  );
208
117
  const mqttClient = ctx.mqttClient;
209
118
  global.mqttClient = mqttClient;
210
- mqttClient.on('error', function (err) {
119
+ mqttClient.on("error", function (err) {
211
120
  log.error("listenMqtt", err);
212
121
  mqttClient.end();
213
122
  if (ctx.globalOptions.autoReconnect) {
214
123
  listenMqtt(defaultFuncs, api, ctx, globalCallback);
215
124
  } else {
216
- utils.checkLiveCookie(ctx, defaultFuncs)
125
+ utils
126
+ .checkLiveCookie(ctx, defaultFuncs)
217
127
  .then(res => {
218
- globalCallback({
219
- type: "stop_listen",
220
- error: "Connection refused: Server unavailable"
221
- }, null);
128
+ globalCallback(
129
+ {
130
+ type: "stop_listen",
131
+ error: "Connection refused: Server unavailable"
132
+ },
133
+ null
134
+ );
222
135
  })
223
136
  .catch(err => {
224
- globalCallback({
225
- type: "account_inactive",
226
- error: "Maybe your account is blocked by facebook, please login and check at https://facebook.com"
227
- }, null);
137
+ globalCallback(
138
+ {
139
+ type: "account_inactive",
140
+ error:
141
+ "Maybe your account is blocked by facebook, please login and check at https://facebook.com"
142
+ },
143
+ null
144
+ );
228
145
  });
229
146
  }
230
147
  });
@@ -283,7 +200,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
283
200
  logger("fca-unoffcial premium", "info");
284
201
  process.env.OnStatus = true;
285
202
  }
286
- topics.forEach((topicsub) => mqttClient.subscribe(topicsub));
203
+ topics.forEach(topicsub => mqttClient.subscribe(topicsub));
287
204
  var topic;
288
205
  const queue = {
289
206
  sync_api_version: 11,
@@ -292,7 +209,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
292
209
  encoding: "JSON",
293
210
  entity_fbid: ctx.userID,
294
211
  initial_titan_sequence_id: ctx.lastSeqId,
295
- device_params: null,
212
+ device_params: null
296
213
  };
297
214
  if (ctx.syncToken) {
298
215
  topic = "/messenger_sync_get_diffs";
@@ -323,7 +240,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
323
240
  ctx.globalOptions.emitReady
324
241
  ? globalCallback({
325
242
  type: "ready",
326
- error: null,
243
+ error: null
327
244
  })
328
245
  : "";
329
246
  delete ctx.tmsWait;
@@ -343,13 +260,13 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
343
260
  globalCallback(null, {
344
261
  type: "friend_request_received",
345
262
  actorFbId: jsonMessage.from.toString(),
346
- timestamp: Date.now().toString(),
263
+ timestamp: Date.now().toString()
347
264
  });
348
265
  } else if (jsonMessage.type === "jewel_requests_remove_old") {
349
266
  globalCallback(null, {
350
267
  type: "friend_request_cancel",
351
268
  actorFbId: jsonMessage.from.toString(),
352
- timestamp: Date.now().toString(),
269
+ timestamp: Date.now().toString()
353
270
  });
354
271
  } else if (topic === "/t_ms") {
355
272
  if (ctx.tmsWait && typeof ctx.tmsWait == "function") {
@@ -365,7 +282,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
365
282
  for (const i in jsonMessage.deltas) {
366
283
  const delta = jsonMessage.deltas[i];
367
284
  parseDelta(defaultFuncs, api, ctx, globalCallback, {
368
- delta: delta,
285
+ delta: delta
369
286
  });
370
287
  }
371
288
  } else if (
@@ -378,7 +295,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
378
295
  from: jsonMessage.sender_fbid.toString(),
379
296
  threadID: utils.formatID(
380
297
  (jsonMessage.thread || jsonMessage.sender_fbid).toString()
381
- ),
298
+ )
382
299
  };
383
300
  (function () {
384
301
  globalCallback(null, typ);
@@ -392,7 +309,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
392
309
  type: "presence",
393
310
  userID: userID.toString(),
394
311
  timestamp: data["l"] * 1000,
395
- statuses: data["p"],
312
+ statuses: data["p"]
396
313
  };
397
314
  (function () {
398
315
  globalCallback(null, presence);
@@ -409,10 +326,16 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
409
326
  if (taskRespData == null) {
410
327
  taskCallback("error", null);
411
328
  } else {
412
- taskCallback(null, Object.assign({
413
- type: taskType,
414
- reqID: reqID
415
- }, taskRespData));
329
+ taskCallback(
330
+ null,
331
+ Object.assign(
332
+ {
333
+ type: taskType,
334
+ reqID: reqID
335
+ },
336
+ taskRespData
337
+ )
338
+ );
416
339
  }
417
340
  }
418
341
  }
@@ -433,17 +356,17 @@ function getTaskResponseData(taskType, payload) {
433
356
  type: taskType,
434
357
  threadID: payload.step[1][2][2][1][2],
435
358
  messageID: payload.step[1][2][2][1][3],
436
- payload: payload.step[1][2],
359
+ payload: payload.step[1][2]
437
360
  };
438
361
  }
439
362
  case "set_message_reaction": {
440
363
  return {
441
- mid: payload.step[1][2][2][1][4],
364
+ mid: payload.step[1][2][2][1][4]
442
365
  };
443
366
  }
444
367
  case "edit_message": {
445
368
  return {
446
- mid: payload.step[1][2][2][1][2],
369
+ mid: payload.step[1][2][2][1][2]
447
370
  };
448
371
  }
449
372
  }
@@ -455,7 +378,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
455
378
  if (delta.class === "NewMessage") {
456
379
  if (ctx.globalOptions.pageID && ctx.globalOptions.pageID !== delta.queue)
457
380
  return;
458
- const resolveAttachmentUrl = (i) => {
381
+ const resolveAttachmentUrl = i => {
459
382
  if (
460
383
  !delta.attachments ||
461
384
  i === delta.attachments.length ||
@@ -502,7 +425,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
502
425
  messageID: delta.deltaMessageReaction.messageId,
503
426
  reaction: delta.deltaMessageReaction.reaction,
504
427
  senderID: delta.deltaMessageReaction.senderId.toString(),
505
- userID: delta.deltaMessageReaction.userId.toString(),
428
+ userID: delta.deltaMessageReaction.userId.toString()
506
429
  };
507
430
  globalCallback(null, messageReaction);
508
431
  } else if (
@@ -518,7 +441,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
518
441
  messageID: delta.deltaRecallMessageData.messageID,
519
442
  senderID: delta.deltaRecallMessageData.senderID.toString(),
520
443
  deletionTimestamp: delta.deltaRecallMessageData.deletionTimestamp,
521
- timestamp: delta.deltaRecallMessageData.timestamp,
444
+ timestamp: delta.deltaRecallMessageData.timestamp
522
445
  };
523
446
  globalCallback(null, messageUnsend);
524
447
  } else if (delta.deltaMessageReply) {
@@ -531,9 +454,9 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
531
454
  ? []
532
455
  : JSON.parse(delta.deltaMessageReply.message.data.prng);
533
456
 
534
- const m_id = mdata.map((u) => u.i);
535
- const m_offset = mdata.map((u) => u.o);
536
- const m_length = mdata.map((u) => u.l);
457
+ const m_id = mdata.map(u => u.i);
458
+ const m_offset = mdata.map(u => u.o);
459
+ const m_length = mdata.map(u => u.l);
537
460
  const mentions = {};
538
461
  for (let i = 0; i < m_id.length; i++) {
539
462
  mentions[m_id[i]] = (
@@ -551,15 +474,14 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
551
474
  ).toString(),
552
475
  messageID:
553
476
  delta.deltaMessageReply.message.messageMetadata.messageId,
554
- senderID:
555
- delta.deltaMessageReply.message.messageMetadata.actorFbId.toString(),
477
+ senderID: delta.deltaMessageReply.message.messageMetadata.actorFbId.toString(),
556
478
  attachments: (delta.deltaMessageReply.message.attachments || [])
557
- .map((att) => {
479
+ .map(att => {
558
480
  const mercury = JSON.parse(att.mercuryJSON);
559
481
  Object.assign(att, mercury);
560
482
  return att;
561
483
  })
562
- .map((att) => {
484
+ .map(att => {
563
485
  let x;
564
486
  try {
565
487
  x = utils._formatAttachment(att);
@@ -574,16 +496,15 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
574
496
  .trim()
575
497
  .split(/\s+/),
576
498
  body: delta.deltaMessageReply.message.body || "",
577
- isGroup:
578
- !!delta.deltaMessageReply.message.messageMetadata.threadKey
579
- .threadFbId,
499
+ isGroup: !!delta.deltaMessageReply.message.messageMetadata.threadKey
500
+ .threadFbId,
580
501
  mentions,
581
502
  timestamp: parseInt(
582
503
  delta.deltaMessageReply.message.messageMetadata.timestamp
583
504
  ),
584
505
  participantIDs: (
585
506
  delta.deltaMessageReply.message.participants || []
586
- ).map((e) => e.toString()),
507
+ ).map(e => e.toString())
587
508
  };
588
509
  if (delta.deltaMessageReply.repliedToMessage) {
589
510
  const mdata =
@@ -597,9 +518,9 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
597
518
  : JSON.parse(
598
519
  delta.deltaMessageReply.repliedToMessage.data.prng
599
520
  );
600
- const m_id = mdata.map((u) => u.i);
601
- const m_offset = mdata.map((u) => u.o);
602
- const m_length = mdata.map((u) => u.l);
521
+ const m_id = mdata.map(u => u.i);
522
+ const m_offset = mdata.map(u => u.o);
523
+ const m_length = mdata.map(u => u.l);
603
524
  const rmentions = {};
604
525
  for (let i = 0; i < m_id.length; i++) {
605
526
  rmentions[m_id[i]] = (
@@ -617,10 +538,9 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
617
538
  messageID:
618
539
  delta.deltaMessageReply.repliedToMessage.messageMetadata
619
540
  .messageId,
620
- senderID:
621
- delta.deltaMessageReply.repliedToMessage.messageMetadata.actorFbId.toString(),
541
+ senderID: delta.deltaMessageReply.repliedToMessage.messageMetadata.actorFbId.toString(),
622
542
  attachments: delta.deltaMessageReply.repliedToMessage.attachments
623
- .map((att) => {
543
+ .map(att => {
624
544
  let mercury;
625
545
  try {
626
546
  mercury = JSON.parse(att.mercuryJSON);
@@ -630,7 +550,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
630
550
  }
631
551
  return att;
632
552
  })
633
- .map((att) => {
553
+ .map(att => {
634
554
  let x;
635
555
  try {
636
556
  x = utils._formatAttachment(att);
@@ -645,9 +565,8 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
645
565
  .trim()
646
566
  .split(/\s+/),
647
567
  body: delta.deltaMessageReply.repliedToMessage.body || "",
648
- isGroup:
649
- !!delta.deltaMessageReply.repliedToMessage.messageMetadata
650
- .threadKey.threadFbId,
568
+ isGroup: !!delta.deltaMessageReply.repliedToMessage
569
+ .messageMetadata.threadKey.threadFbId,
651
570
  mentions: rmentions,
652
571
  timestamp: parseInt(
653
572
  delta.deltaMessageReply.repliedToMessage.messageMetadata
@@ -655,7 +574,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
655
574
  ),
656
575
  participantIDs: (
657
576
  delta.deltaMessageReply.repliedToMessage.participants || []
658
- ).map((e) => e.toString()),
577
+ ).map(e => e.toString())
659
578
  };
660
579
  } else if (delta.deltaMessageReply.replyToMessageId) {
661
580
  return defaultFuncs
@@ -667,20 +586,20 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
667
586
  query_params: {
668
587
  thread_and_message_id: {
669
588
  thread_id: callbackToReturn.threadID,
670
- message_id: delta.deltaMessageReply.replyToMessageId.id,
671
- },
672
- },
673
- },
674
- }),
589
+ message_id: delta.deltaMessageReply.replyToMessageId.id
590
+ }
591
+ }
592
+ }
593
+ })
675
594
  })
676
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
677
- .then((resData) => {
595
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
596
+ .then(resData => {
678
597
  if (resData[resData.length - 1].error_results > 0)
679
598
  throw resData[0].o0.errors;
680
599
  if (resData[resData.length - 1].successful_results === 0)
681
600
  throw {
682
601
  error: "forcedFetch: there was no successful_results",
683
- res: resData,
602
+ res: resData
684
603
  };
685
604
  const fetchData = resData[0].o0.data.message;
686
605
  const mobj = {};
@@ -697,9 +616,9 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
697
616
  threadID: callbackToReturn.threadID,
698
617
  messageID: fetchData.message_id,
699
618
  senderID: fetchData.message_sender.id.toString(),
700
- attachments: fetchData.message.blob_attachment.map((att) =>
619
+ attachments: fetchData.message.blob_attachment.map(att =>
701
620
  utils._formatAttachment({
702
- blob_attachment: att,
621
+ blob_attachment: att
703
622
  })
704
623
  ),
705
624
  args:
@@ -707,10 +626,10 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
707
626
  body: fetchData.message.text || "",
708
627
  isGroup: callbackToReturn.isGroup,
709
628
  mentions: mobj,
710
- timestamp: parseInt(fetchData.timestamp_precise),
629
+ timestamp: parseInt(fetchData.timestamp_precise)
711
630
  };
712
631
  })
713
- .catch((err) => log.error("forcedFetch", err))
632
+ .catch(err => log.error("forcedFetch", err))
714
633
  .finally(() => {
715
634
  if (ctx.globalOptions.autoMarkDelivery) {
716
635
  markDelivery(
@@ -808,22 +727,22 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
808
727
  query_params: {
809
728
  thread_and_message_id: {
810
729
  thread_id: tid.toString(),
811
- message_id: mid,
812
- },
813
- },
814
- },
815
- }),
730
+ message_id: mid
731
+ }
732
+ }
733
+ }
734
+ })
816
735
  };
817
736
  defaultFuncs
818
737
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
819
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
820
- .then((resData) => {
738
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
739
+ .then(resData => {
821
740
  if (resData[resData.length - 1].error_results > 0)
822
741
  throw resData[0].o0.errors;
823
742
  if (resData[resData.length - 1].successful_results === 0)
824
743
  throw {
825
744
  error: "forcedFetch: there was no successful_results",
826
- res: resData,
745
+ res: resData
827
746
  };
828
747
  const fetchData = resData[0].o0.data.message;
829
748
  if (utils.getType(fetchData) === "Object") {
@@ -855,12 +774,12 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
855
774
  .original_dimensions.y,
856
775
  url:
857
776
  fetchData.image_with_metadata &&
858
- fetchData.image_with_metadata.preview.uri,
859
- },
777
+ fetchData.image_with_metadata.preview.uri
778
+ }
860
779
  },
861
780
  logMessageBody: fetchData.snippet,
862
781
  timestamp: fetchData.timestamp_precise,
863
- author: fetchData.message_sender.id,
782
+ author: fetchData.message_sender.id
864
783
  });
865
784
  })();
866
785
  break;
@@ -874,10 +793,10 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
874
793
  attachments: [
875
794
  {
876
795
  type: "share",
877
- ID: fetchData.extensible_attachment
878
- .legacy_attachment_id,
879
- url: fetchData.extensible_attachment.story_attachment
880
- .url,
796
+ ID:
797
+ fetchData.extensible_attachment.legacy_attachment_id,
798
+ url:
799
+ fetchData.extensible_attachment.story_attachment.url,
881
800
  title:
882
801
  fetchData.extensible_attachment.story_attachment
883
802
  .title_with_entities.text,
@@ -919,12 +838,12 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
919
838
  fetchData.extensible_attachment.subattachments,
920
839
  properties:
921
840
  fetchData.extensible_attachment.story_attachment
922
- .properties,
923
- },
841
+ .properties
842
+ }
924
843
  ],
925
844
  mentions: {},
926
845
  timestamp: parseInt(fetchData.timestamp_precise),
927
- isGroup: fetchData.message_sender.id !== tid.toString(),
846
+ isGroup: fetchData.message_sender.id !== tid.toString()
928
847
  };
929
848
  log.info("ff-Return", event);
930
849
  globalCallback(null, event);
@@ -937,7 +856,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
937
856
  log.error("forcedFetch", fetchData);
938
857
  }
939
858
  })
940
- .catch((err) => log.error("forcedFetch", err));
859
+ .catch(err => log.error("forcedFetch", err));
941
860
  }
942
861
  break;
943
862
  }
@@ -961,7 +880,7 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
961
880
  break;
962
881
  }
963
882
  case "NewMessage": {
964
- const hasLiveLocation = (delta) => {
883
+ const hasLiveLocation = delta => {
965
884
  const attachment =
966
885
  delta.attachments?.[0]?.mercury?.extensible_attachment;
967
886
  const storyAttachment = attachment?.story_attachment;
@@ -983,11 +902,11 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, { delta }) {
983
902
  }
984
903
  function markDelivery(ctx, api, threadID, messageID) {
985
904
  if (threadID && messageID) {
986
- api.markAsDelivered(threadID, messageID, (err) => {
905
+ api.markAsDelivered(threadID, messageID, err => {
987
906
  if (err) log.error("markAsDelivered", err);
988
907
  else {
989
908
  if (ctx.globalOptions.autoMarkRead) {
990
- api.markAsRead(threadID, (err) => {
909
+ api.markAsRead(threadID, err => {
991
910
  if (err) log.error("markAsDelivered", err);
992
911
  });
993
912
  }
@@ -1001,28 +920,25 @@ module.exports = function (defaultFuncs, api, ctx) {
1001
920
  ctx.t_mqttCalled = false;
1002
921
  defaultFuncs
1003
922
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
1004
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
1005
- .then((resData) => {
1006
- if (utils.getType(resData) !== "Array") throw { error: "Not logged in", res: resData };
1007
- if (resData && resData[resData.length - 1].error_results > 0)
1008
- throw resData[0].o0.errors;
1009
- if (resData[resData.length - 1].successful_results === 0)
1010
- throw {
1011
- error: "getSeqId: there was no successful_results",
1012
- res: resData,
1013
- };
923
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
924
+ .then(resData => {
925
+ if (utils.getType(resData) !== "Array")
926
+ throw { error: "Not logged in", res: resData };
927
+ if (!Array.isArray(resData) || !resData.length) return;
928
+ const lastRes = resData[resData.length - 1];
929
+ if (lastRes?.successful_results === 0) return;
930
+ const syncSeqId = resData[0]?.o0?.data?.viewer?.message_threads?.sync_sequence_id;
1014
931
  if (resData[0].o0.data.viewer.message_threads.sync_sequence_id) {
1015
- ctx.lastSeqId =
1016
- resData[0].o0.data.viewer.message_threads.sync_sequence_id;
932
+ ctx.lastSeqId = syncSeqId
1017
933
  listenMqtt(defaultFuncs, api, ctx, globalCallback);
1018
934
  } else
1019
935
  throw {
1020
936
  error: "getSeqId: no sync_sequence_id found.",
1021
- res: resData,
937
+ res: resData
1022
938
  };
1023
939
  })
1024
- .catch((err) => {
1025
- log.error("getSeqId", err);
940
+ .catch(err => {
941
+ // log.error("getSeqId", err);
1026
942
  if (utils.getType(err) === "Object" && err.error === "Not logged in")
1027
943
  ctx.loggedIn = false;
1028
944
  return globalCallback(err);
@@ -1045,7 +961,7 @@ module.exports = function (defaultFuncs, api, ctx) {
1045
961
  }
1046
962
  }
1047
963
  async stopListeningAsync() {
1048
- return new Promise((resolve) => {
964
+ return new Promise(resolve => {
1049
965
  this.stopListening(resolve);
1050
966
  });
1051
967
  }
@@ -1072,10 +988,10 @@ module.exports = function (defaultFuncs, api, ctx) {
1072
988
  before: null,
1073
989
  tags: ["INBOX"],
1074
990
  includeDeliveryReceipts: false,
1075
- includeSeqID: true,
1076
- },
1077
- },
1078
- }),
991
+ includeSeqID: true
992
+ }
993
+ }
994
+ })
1079
995
  };
1080
996
  if (!ctx.firstListen || !ctx.lastSeqId) {
1081
997
  getSeqID(defaultFuncs, api, ctx, globalCallback);
@@ -1086,4 +1002,4 @@ module.exports = function (defaultFuncs, api, ctx) {
1086
1002
  api.stopListeningAsync = msgEmitter.stopListeningAsync;
1087
1003
  return msgEmitter;
1088
1004
  };
1089
- };
1005
+ };