@dongdev/fca-unofficial 1.0.19 → 2.0.0
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.
- package/.gitattributes +1 -0
- package/CHANGELOG.md +30 -27
- package/DOCS.md +727 -592
- package/README.md +94 -97
- package/func/logger.js +112 -0
- package/html.html +474 -0
- package/index.js +1 -379
- package/module/config.js +26 -0
- package/module/login.js +45 -0
- package/module/loginHelper.js +634 -0
- package/module/options.js +49 -0
- package/package.json +6 -39
- package/src/api/action/addExternalModule.js +25 -0
- package/src/api/action/changeAvatar.js +136 -0
- package/src/api/action/changeBio.js +76 -0
- package/src/api/action/getCurrentUserID.js +7 -0
- package/src/api/action/handleFriendRequest.js +57 -0
- package/src/api/action/logout.js +75 -0
- package/src/{refreshFb_dtsg.js → api/action/refreshFb_dtsg.js} +8 -8
- package/src/api/action/setPostReaction.js +107 -0
- package/src/api/action/unfriend.js +55 -0
- package/src/api/http/httpGet.js +65 -0
- package/src/api/http/httpPost.js +65 -0
- package/src/{postFormData.js → api/http/postFormData.js} +10 -10
- package/src/api/messaging/addUserToGroup.js +69 -0
- package/src/api/messaging/changeAdminStatus.js +103 -0
- package/src/api/messaging/changeArchivedStatus.js +55 -0
- package/src/api/messaging/changeBlockedStatus.js +49 -0
- package/src/api/messaging/changeGroupImage.js +135 -0
- package/src/api/messaging/changeNickname.js +59 -0
- package/src/api/messaging/changeThreadColor.js +65 -0
- package/src/api/messaging/createNewGroup.js +88 -0
- package/src/api/messaging/createPoll.js +70 -0
- package/src/api/messaging/deleteMessage.js +56 -0
- package/src/api/messaging/deleteThread.js +56 -0
- package/src/api/messaging/forwardAttachment.js +60 -0
- package/src/api/messaging/getEmojiUrl.js +29 -0
- package/src/api/messaging/getFriendsList.js +83 -0
- package/src/api/messaging/getMessage.js +834 -0
- package/src/api/messaging/getThreadHistory.js +681 -0
- package/src/api/messaging/handleMessageRequest.js +65 -0
- package/src/api/messaging/markAsDelivered.js +57 -0
- package/src/api/messaging/markAsRead.js +88 -0
- package/src/api/messaging/markAsReadAll.js +50 -0
- package/src/api/messaging/markAsSeen.js +61 -0
- package/src/api/messaging/muteThread.js +51 -0
- package/src/api/messaging/removeUserFromGroup.js +79 -0
- package/src/api/messaging/resolvePhotoUrl.js +44 -0
- package/src/api/messaging/searchForThread.js +53 -0
- package/src/api/messaging/sendMessage.js +306 -0
- package/src/api/messaging/sendMessageMqtt.js +321 -0
- package/src/api/messaging/sendTypingIndicator.js +110 -0
- package/src/{setMessageReaction.js → api/messaging/setMessageReaction.js} +20 -20
- package/src/api/messaging/setTitle.js +90 -0
- package/src/api/messaging/shareContact.js +51 -0
- package/src/api/messaging/threadColors.js +131 -0
- package/src/api/messaging/unsendMessage.js +44 -0
- package/src/api/messaging/uploadAttachment.js +93 -0
- package/src/api/socket/detail/buildStream.js +100 -0
- package/src/{listenMqtt.js → api/socket/listenMqtt.js} +172 -256
- package/src/api/threads/changeThreadEmoji.js +55 -0
- package/src/api/threads/getThreadInfo.js +572 -0
- package/src/{getThreadList.js → api/threads/getThreadList.js} +110 -54
- package/src/api/threads/getThreadPictures.js +79 -0
- package/src/api/users/getUserID.js +66 -0
- package/src/api/users/getUserInfo.js +88 -0
- package/src/core/sendReqMqtt.js +63 -0
- package/{lib → src}/database/models/index.js +12 -10
- package/{lib → src}/database/models/thread.js +5 -5
- package/{lib → src}/database/threadData.js +19 -14
- package/src/utils/client.js +159 -0
- package/src/utils/constants.js +13 -0
- package/src/utils/format.js +60 -0
- package/src/utils/headers.js +41 -0
- package/src/utils/index.js +1497 -0
- package/src/utils/request.js +147 -0
- package/lib/logger.js +0 -96
- package/src/addExternalModule.js +0 -19
- package/src/addUserToGroup.js +0 -113
- package/src/changeAdminStatus.js +0 -79
- package/src/changeArchivedStatus.js +0 -55
- package/src/changeAvatar.js +0 -126
- package/src/changeBio.js +0 -77
- package/src/changeBlockedStatus.js +0 -47
- package/src/changeGroupImage.js +0 -132
- package/src/changeNickname.js +0 -59
- package/src/changeThreadColor.js +0 -65
- package/src/changeThreadEmoji.js +0 -55
- package/src/createNewGroup.js +0 -86
- package/src/createPoll.js +0 -71
- package/src/deleteMessage.js +0 -56
- package/src/deleteThread.js +0 -56
- package/src/forwardAttachment.js +0 -60
- package/src/getCurrentUserID.js +0 -7
- package/src/getEmojiUrl.js +0 -29
- package/src/getFriendsList.js +0 -83
- package/src/getMessage.js +0 -796
- package/src/getThreadHistory.js +0 -666
- package/src/getThreadInfo.js +0 -535
- package/src/getThreadPictures.js +0 -79
- package/src/getUserID.js +0 -66
- package/src/getUserInfo.js +0 -80
- package/src/handleFriendRequest.js +0 -61
- package/src/handleMessageRequest.js +0 -65
- package/src/httpGet.js +0 -57
- package/src/httpPost.js +0 -57
- package/src/httpPostFormData.js +0 -63
- package/src/logout.js +0 -75
- package/src/markAsDelivered.js +0 -58
- package/src/markAsRead.js +0 -80
- package/src/markAsReadAll.js +0 -50
- package/src/markAsSeen.js +0 -59
- package/src/muteThread.js +0 -52
- package/src/removeUserFromGroup.js +0 -79
- package/src/resolvePhotoUrl.js +0 -45
- package/src/searchForThread.js +0 -53
- package/src/sendMessage.js +0 -328
- package/src/sendMessageMqtt.js +0 -316
- package/src/sendTypingIndicator.js +0 -103
- package/src/setPostReaction.js +0 -109
- package/src/setTitle.js +0 -86
- package/src/shareContact.js +0 -49
- package/src/threadColors.js +0 -131
- package/src/unfriend.js +0 -52
- package/src/unsendMessage.js +0 -49
- package/src/uploadAttachment.js +0 -95
- package/utils.js +0 -1387
- /package/{lib → func}/login.js +0 -0
@@ -1,16 +1,16 @@
|
|
1
1
|
"use strict";
|
2
|
-
const utils = require("
|
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("
|
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 =
|
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=${
|
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,83 +116,91 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
207
116
|
);
|
208
117
|
const mqttClient = ctx.mqttClient;
|
209
118
|
global.mqttClient = mqttClient;
|
210
|
-
mqttClient.on(
|
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
|
125
|
+
utils
|
126
|
+
.checkLiveCookie(ctx, defaultFuncs)
|
217
127
|
.then(res => {
|
218
|
-
globalCallback(
|
219
|
-
|
220
|
-
|
221
|
-
|
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
|
-
|
226
|
-
|
227
|
-
|
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
|
});
|
231
148
|
mqttClient.on("connect", function () {
|
232
|
-
let StopProcessing = true;
|
233
|
-
mqttReconnectCount = 0;
|
234
|
-
setInterval(() => {
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
}, 60 * 60 * 1000);
|
149
|
+
// let StopProcessing = true;
|
150
|
+
// mqttReconnectCount = 0;
|
151
|
+
// setInterval(() => {
|
152
|
+
// console.log('Đang chuẩn bị ngắt kết nối MQTT...');
|
153
|
+
// StopProcessing = true;
|
154
|
+
// if (ctx.mqttClient) {
|
155
|
+
// topics.forEach((topic) => {
|
156
|
+
// try {
|
157
|
+
// ctx.mqttClient.unsubscribe(topic);
|
158
|
+
// } catch (e) { }
|
159
|
+
// });
|
160
|
+
// try {
|
161
|
+
// ctx.mqttClient.publish("/browser_close", "{}");
|
162
|
+
// } catch (e) { }
|
163
|
+
// ctx.mqttClient.removeAllListeners();
|
164
|
+
// console.log('Ngắt Kết Nối MQTT...');
|
165
|
+
// let connectionClosed = false;
|
166
|
+
// const afterConnectionClosed = () => {
|
167
|
+
// if (connectionClosed) return;
|
168
|
+
// connectionClosed = true;
|
169
|
+
// ctx.lastSeqId = null;
|
170
|
+
// ctx.syncToken = undefined;
|
171
|
+
// ctx.t_mqttCalled = false;
|
172
|
+
// mqttReconnectCount = 0;
|
173
|
+
// StopProcessing = false;
|
174
|
+
// console.log('Đang Kết Nối Lại MQTT...');
|
175
|
+
// setTimeout(() => {
|
176
|
+
// getSeqID();
|
177
|
+
// console.log('Kết Nối Lại MQTT Thành Công');
|
178
|
+
// }, 1000);
|
179
|
+
// };
|
180
|
+
// try {
|
181
|
+
// ctx.mqttClient.end(false, afterConnectionClosed);
|
182
|
+
// setTimeout(() => {
|
183
|
+
// if (!connectionClosed) {
|
184
|
+
// console.warn('Đóng kết nối MQTT bằng timeout');
|
185
|
+
// ctx.mqttClient = undefined;
|
186
|
+
// afterConnectionClosed();
|
187
|
+
// }
|
188
|
+
// }, 5000);
|
189
|
+
// } catch (e) {
|
190
|
+
// console.error('Lỗi khi đóng kết nối MQTT:', e);
|
191
|
+
// ctx.mqttClient = undefined;
|
192
|
+
// afterConnectionClosed();
|
193
|
+
// }
|
194
|
+
// } else {
|
195
|
+
// getSeqID();
|
196
|
+
// console.log('Kết Nối Lại MQTT Thành Công');
|
197
|
+
// }
|
198
|
+
// }, 60 * 60 * 1000);
|
282
199
|
if (process.env.OnStatus === undefined) {
|
283
200
|
logger("fca-unoffcial premium", "info");
|
284
201
|
process.env.OnStatus = true;
|
285
202
|
}
|
286
|
-
topics.forEach(
|
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(
|
413
|
-
|
414
|
-
|
415
|
-
|
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 =
|
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(
|
535
|
-
const m_offset = mdata.map(
|
536
|
-
const m_length = mdata.map(
|
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(
|
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(
|
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
|
-
|
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(
|
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(
|
601
|
-
const m_offset = mdata.map(
|
602
|
-
const m_length = mdata.map(
|
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(
|
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(
|
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
|
-
|
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(
|
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(
|
677
|
-
.then(
|
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(
|
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(
|
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(
|
820
|
-
.then(
|
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:
|
878
|
-
.legacy_attachment_id,
|
879
|
-
url:
|
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(
|
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 =
|
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,
|
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,
|
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(
|
1005
|
-
.then(
|
1006
|
-
if (utils.getType(resData) !== "Array")
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
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(
|
1025
|
-
|
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(
|
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
|
+
};
|