fca-arif-babu 1.0.21 → 8.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/Extra/Balancer.js +49 -0
- package/Extra/Bypass/956/index.js +234 -0
- package/Extra/Bypass/test/aaaa.json +169 -0
- package/Extra/Bypass/test/index.js +188 -0
- package/Extra/Database/index.js +469 -0
- package/Extra/ExtraAddons.js +82 -0
- package/Extra/ExtraFindUID.js +62 -0
- package/Extra/ExtraGetThread.js +365 -0
- package/Extra/ExtraScreenShot.js +430 -0
- package/Extra/ExtraUptimeRobot.js +38 -0
- package/Extra/Html/Classic/script.js +119 -0
- package/Extra/Html/Classic/style.css +8 -0
- package/Extra/Security/AES_256_GCM/index.js +1 -0
- package/Extra/Security/Base/Step_1.js +6 -0
- package/Extra/Security/Base/Step_2.js +22 -0
- package/Extra/Security/Base/Step_3.js +22 -0
- package/Extra/Security/Base/index.js +191 -0
- package/Extra/Security/Step_1.js +6 -0
- package/Extra/Security/Step_2.js +22 -0
- package/Extra/Security/Step_3.js +22 -0
- package/Extra/Security/index.js +5 -0
- package/Extra/Src/Change_Environment.js +24 -0
- package/Extra/Src/Check_Update.js +67 -0
- package/Extra/Src/History.js +115 -0
- package/Extra/Src/Instant_Update.js +65 -0
- package/Extra/Src/Last-Run.js +65 -0
- package/Extra/Src/Premium.js +81 -0
- package/Extra/Src/Release_Memory.js +160 -0
- package/Extra/Src/Websocket.js +213 -0
- package/Extra/Src/image/62518eafb0670b697788ce4f9a4f71d1.jpg +0 -0
- package/Extra/Src/test.js +28 -0
- package/Extra/Src/uuid.js +137 -0
- package/Func/AcceptAgreement.js +31 -0
- package/Func/ClearCache.js +64 -0
- package/Func/ReportV1.js +54 -0
- package/{LICENSE-MIT → LICENSE.txt} +6 -6
- package/Language/index.json +228 -0
- package/Main.js +1290 -0
- package/README.md +8 -6
- package/SECURITY.md +17 -0
- package/broadcast.js +44 -0
- package/index.js +424 -465
- package/logger.js +66 -0
- package/package.json +91 -42
- package/src/Dev_Horizon_Data.js +125 -0
- package/src/Dev_getThreadInfoOLD.js +422 -0
- package/src/Dev_shareTest2.js +68 -0
- package/src/Dev_shareTest3.js +71 -0
- package/src/Premium.js +25 -0
- package/src/Screenshot.js +83 -0
- package/src/addExternalModule.js +5 -14
- package/src/addUserToGroup.js +21 -57
- package/src/changeAdminStatus.js +22 -46
- package/src/changeArchivedStatus.js +12 -26
- package/src/{changeAvatarV2.js → changeAvt.js} +2 -3
- package/src/changeBio.js +15 -26
- package/src/changeBlockedStatus.js +9 -22
- package/src/changeGroupImage.js +26 -55
- package/src/changeNickname.js +14 -28
- package/src/changeThreadColor.js +19 -22
- package/src/changeThreadEmoji.js +12 -25
- package/src/createNewGroup.js +18 -36
- package/src/createPoll.js +17 -28
- package/src/deleteMessage.js +14 -25
- package/src/deleteThread.js +13 -26
- package/src/editMessage.js +50 -56
- package/src/forwardAttachment.js +16 -28
- package/src/getAccessToken.js +28 -0
- package/src/getCurrentUserID.js +3 -3
- package/src/getEmojiUrl.js +8 -10
- package/src/getFriendsList.js +15 -25
- package/src/getMessage.js +81 -813
- package/src/getThreadHistory.js +98 -241
- package/src/getThreadInfo.js +286 -89
- package/src/getThreadInfoOLD.js +422 -0
- package/src/getThreadList.js +158 -215
- package/src/getThreadMain.js +220 -0
- package/src/getThreadPictures.js +20 -40
- package/src/getUID.js +49 -112
- package/src/getUserID.js +14 -18
- package/src/getUserInfo.js +75 -34
- package/src/getUserInfoMain.js +65 -0
- package/src/getUserInfoV2.js +32 -0
- package/src/getUserInfoV3.js +63 -0
- package/src/getUserInfoV4.js +55 -0
- package/src/getUserInfoV5.js +61 -0
- package/src/handleFriendRequest.js +14 -25
- package/src/handleMessageRequest.js +21 -37
- package/src/httpGet.js +22 -37
- package/src/httpPost.js +20 -36
- package/src/httpPostFormData.js +23 -52
- package/src/listenMqtt.js +667 -414
- package/src/listenMqttV1.js +846 -0
- package/src/logout.js +17 -24
- package/src/markAsDelivered.js +16 -23
- package/src/markAsRead.js +28 -43
- package/src/markAsReadAll.js +14 -21
- package/src/markAsSeen.js +19 -29
- package/src/muteThread.js +13 -18
- package/src/removeUserFromGroup.js +18 -48
- package/src/resolvePhotoUrl.js +14 -22
- package/src/searchForThread.js +13 -23
- package/src/sendMessage.js +125 -181
- package/src/sendMqttMessage.js +71 -0
- package/src/sendTypingIndicator.js +80 -28
- package/src/setMessageReaction.js +20 -33
- package/src/setPostReaction.js +95 -105
- package/src/setTitle.js +19 -35
- package/src/shareContact.js +37 -92
- package/src/shareLink.js +5 -6
- package/src/threadColors.js +17 -109
- package/src/unfriend.js +11 -20
- package/src/unsendMessage.js +33 -30
- package/src/unsendMqttMessage.js +66 -0
- package/test/data/shareAttach.js +146 -0
- package/test/data/something.mov +1 -0
- package/test/data/test.png +1 -0
- package/test/data/test.txt +1 -0
- package/test/env/.env +1 -0
- package/test/example-config.json +18 -0
- package/test/test-page.js +140 -0
- package/test/test.js +385 -0
- package/test/testv2.js +3 -0
- package/utils.js +2908 -1247
- package/replit.nix +0 -3
- package/src/changeAvatar.js +0 -136
- package/src/changeBlockedStatusMqtt.js +0 -80
- package/src/changeCover.js +0 -72
- package/src/changeName.js +0 -78
- package/src/changeUsername.js +0 -58
- package/src/createCommentPost.js +0 -229
- package/src/createPost.js +0 -275
- package/src/data/getThreadInfo.json +0 -1
- package/src/editMessageOld.js +0 -67
- package/src/follow.js +0 -74
- package/src/getAccess.js +0 -112
- package/src/getAvatarUser.js +0 -78
- package/src/getBotInitialData.js +0 -42
- package/src/getRegion.js +0 -7
- package/src/getThreadHistoryDeprecated.js +0 -93
- package/src/getThreadInfoDeprecated.js +0 -80
- package/src/getThreadListDeprecated.js +0 -75
- package/src/listenNotification.js +0 -85
- package/src/pinMessage.js +0 -59
- package/src/refreshFb_dtsg.js +0 -89
- package/src/searchStickers.js +0 -53
- package/src/sendMessageMqtt.js +0 -316
- package/src/setMessageReactionMqtt.js +0 -62
- package/src/setProfileGuard.js +0 -44
- package/src/setStoryReaction.js +0 -64
- package/src/stopListenMqtt.js +0 -23
- package/src/uploadAttachment.js +0 -94
package/src/listenMqtt.js
CHANGED
@@ -1,44 +1,94 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
/* eslint-disable linebreak-style */
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
const utils = require('../utils');
|
5
|
+
const log = require('npmlog');
|
6
|
+
const mqtt = require('mqtt');
|
7
|
+
const WebSocket = require('ws');
|
8
|
+
const HttpsProxyAgent = require('https-proxy-agent');
|
7
9
|
const EventEmitter = require('events');
|
8
|
-
|
10
|
+
const Duplexify = require('duplexify');
|
11
|
+
const {
|
12
|
+
Transform
|
13
|
+
} = require('stream');
|
9
14
|
var identity = function() {};
|
10
15
|
var form = {};
|
11
16
|
var getSeqID = function() {};
|
17
|
+
global.Fca.Data.MsgCount = new Map();
|
18
|
+
global.Fca.Data.event = new Map();
|
19
|
+
|
20
|
+
const topics = ['/ls_req', '/ls_resp', '/legacy_web', '/webrtc', '/rtc_multi', '/onevc', '/br_sr', '/sr_res', '/t_ms', '/thread_typing', '/orca_typing_notifications', '/notify_disconnect', '/orca_presence', '/inbox', '/mercury', '/messaging_events', '/orca_message_notifications', '/pp', '/webrtc_response'];
|
21
|
+
|
22
|
+
let WebSocket_Global;
|
23
|
+
|
24
|
+
function buildProxy() {
|
25
|
+
const Proxy = new Transform({
|
26
|
+
objectMode: false,
|
27
|
+
transform(chunk, enc, next) {
|
28
|
+
if (WebSocket_Global.readyState !== WebSocket_Global.OPEN) {
|
29
|
+
return next();
|
30
|
+
}
|
31
|
+
|
32
|
+
let data;
|
33
|
+
if (typeof chunk === 'string') {
|
34
|
+
data = Buffer.from(chunk, 'utf8');
|
35
|
+
} else {
|
36
|
+
data = chunk;
|
37
|
+
}
|
38
|
+
|
39
|
+
WebSocket_Global.send(data);
|
40
|
+
next();
|
41
|
+
},
|
42
|
+
flush(done) {
|
43
|
+
WebSocket_Global.close();
|
44
|
+
done();
|
45
|
+
},
|
46
|
+
writev(chunks, cb) {
|
47
|
+
const buffers = chunks.map(({ chunk }) => {
|
48
|
+
if (typeof chunk === 'string') {
|
49
|
+
return Buffer.from(chunk, 'utf8');
|
50
|
+
}
|
51
|
+
return chunk;
|
52
|
+
});
|
53
|
+
this._write(Buffer.concat(buffers), 'binary', cb);
|
54
|
+
},
|
55
|
+
});
|
56
|
+
return Proxy;
|
57
|
+
}
|
58
|
+
|
59
|
+
function buildStream(options, WebSocket, Proxy) {
|
60
|
+
const Stream = Duplexify(undefined, undefined, options);
|
61
|
+
Stream.socket = WebSocket;
|
62
|
+
|
63
|
+
WebSocket.onclose = () => {
|
64
|
+
Stream.end();
|
65
|
+
Stream.destroy();
|
66
|
+
};
|
67
|
+
|
68
|
+
WebSocket.onerror = (err) => {
|
69
|
+
Stream.destroy(err);
|
70
|
+
};
|
12
71
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
"/inbox",
|
30
|
-
"/mercury",
|
31
|
-
"/messaging_events",
|
32
|
-
"/orca_message_notifications",
|
33
|
-
"/pp",
|
34
|
-
"/webrtc_response",
|
35
|
-
];
|
72
|
+
WebSocket.onmessage = (event) => {
|
73
|
+
const data = event.data instanceof ArrayBuffer ? Buffer.from(event.data) : Buffer.from(event.data, 'utf8');
|
74
|
+
Stream.push(data);
|
75
|
+
};
|
76
|
+
|
77
|
+
WebSocket.onopen = () => {
|
78
|
+
Stream.setReadable(Proxy);
|
79
|
+
Stream.setWritable(Proxy);
|
80
|
+
Stream.emit('connect');
|
81
|
+
};
|
82
|
+
|
83
|
+
WebSocket_Global = WebSocket;
|
84
|
+
Proxy.on('close', () => WebSocket.close());
|
85
|
+
|
86
|
+
return Stream;
|
87
|
+
}
|
36
88
|
|
37
89
|
function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
38
|
-
|
39
|
-
|
40
|
-
var chatOn = ctx.globalOptions.online;
|
41
|
-
var foreground = false;
|
90
|
+
const chatOn = ctx.globalOptions.online;
|
91
|
+
const foreground = false;
|
42
92
|
|
43
93
|
const sessionID = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1;
|
44
94
|
const GUID = utils.getGUID()
|
@@ -60,9 +110,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
60
110
|
no_auto_fg: true,
|
61
111
|
gas: null,
|
62
112
|
pack: [],
|
63
|
-
a: ctx.globalOptions.userAgent,
|
64
113
|
p: null,
|
65
|
-
aids: null,
|
66
114
|
php_override: ""
|
67
115
|
};
|
68
116
|
|
@@ -70,11 +118,11 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
70
118
|
|
71
119
|
let host;
|
72
120
|
if (ctx.mqttEndpoint) {
|
73
|
-
host = `${ctx.mqttEndpoint}&sid=${sessionID}`;
|
121
|
+
host = `${ctx.mqttEndpoint}&sid=${sessionID}&cid=${GUID}`;
|
74
122
|
} else if (ctx.region) {
|
75
|
-
host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}`;
|
123
|
+
host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}&cid=${GUID}`;
|
76
124
|
} else {
|
77
|
-
host = `wss://edge-chat.facebook.com/chat?sid=${sessionID}`;
|
125
|
+
host = `wss://edge-chat.facebook.com/chat?sid=${sessionID}&cid=${GUID}`;
|
78
126
|
}
|
79
127
|
|
80
128
|
const options = {
|
@@ -87,7 +135,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
87
135
|
headers: {
|
88
136
|
Cookie: cookies,
|
89
137
|
Origin: 'https://www.facebook.com',
|
90
|
-
'User-Agent': ctx.globalOptions.userAgent
|
138
|
+
'User-Agent': ctx.globalOptions.userAgent,
|
91
139
|
Referer: 'https://www.facebook.com/',
|
92
140
|
Host: new URL(host).hostname,
|
93
141
|
},
|
@@ -100,65 +148,111 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
100
148
|
reconnectPeriod: 3,
|
101
149
|
};
|
102
150
|
|
103
|
-
if (
|
104
|
-
|
151
|
+
if (ctx.globalOptions.proxy !== undefined) {
|
152
|
+
const agent = new HttpsProxyAgent(ctx.globalOptions.proxy);
|
105
153
|
options.wsOptions.agent = agent;
|
106
154
|
}
|
107
155
|
|
108
|
-
ctx.mqttClient = new mqtt.Client(
|
156
|
+
ctx.mqttClient = new mqtt.Client(() => buildStream(options, new WebSocket(host, options.wsOptions), buildProxy()), options);
|
157
|
+
global.mqttClient = ctx.mqttClient;
|
109
158
|
|
110
|
-
|
159
|
+
global.mqttClient.on('error', (err) => {
|
160
|
+
log.error('listenMqtt', err);
|
161
|
+
global.mqttClient.end();
|
111
162
|
|
112
|
-
|
113
|
-
function stopListening() {
|
114
|
-
if (mqttClient) {
|
115
|
-
mqttClient.unsubscribe("/webrtc");
|
116
|
-
mqttClient.unsubscribe("/rtc_multi");
|
117
|
-
mqttClient.unsubscribe("/onevc");
|
118
|
-
mqttClient.publish("/browser_close", "{}");
|
119
|
-
mqttClient.end(false, function(...data) {
|
120
|
-
ctx.mqttClient = null; mqttClient = null;
|
121
|
-
});
|
122
|
-
}
|
123
|
-
}
|
124
|
-
|
125
|
-
mqttClient.on('error', function(err) {
|
126
|
-
stopListening();
|
127
163
|
if (ctx.globalOptions.autoReconnect) {
|
128
164
|
getSeqID();
|
129
165
|
} else {
|
130
|
-
globalCallback({
|
166
|
+
globalCallback({
|
167
|
+
type: 'stop_listen',
|
168
|
+
error: 'Server Đã Sập - Auto Restart'
|
169
|
+
}, null);
|
170
|
+
return process.exit(1);
|
131
171
|
}
|
132
|
-
console.warn("login", "Error detected. Will relogin automatically...");
|
133
|
-
api.ws3.relogin();
|
134
|
-
return;
|
135
172
|
});
|
136
173
|
|
137
|
-
mqttClient.on('connect',
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
174
|
+
global.mqttClient.on('connect', () => {
|
175
|
+
if (!global.Fca.Data.Setup || global.Fca.Data.Setup === undefined) {
|
176
|
+
if (global.Fca.Require.Priyansh.RestartMQTT_Minutes !== 0 && global.Fca.Data.StopListening !== true) {
|
177
|
+
global.Fca.Data.Setup = true;
|
178
|
+
setTimeout(() => {
|
179
|
+
global.Fca.Require.logger.Warning('Closing MQTT Client...');
|
180
|
+
ctx.mqttClient.end();
|
181
|
+
global.Fca.Require.logger.Warning('Reconnecting MQTT Client...');
|
182
|
+
global.Fca.Data.Setup = false;
|
183
|
+
getSeqID();
|
184
|
+
}, Number(global.Fca.Require.Priyansh.RestartMQTT_Minutes) * 60 * 1000);
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
if (process.env.OnStatus === undefined) {
|
189
|
+
global.Fca.Require.logger.Normal('Bạn Đang Sài Phiên Bản: Premium Access');
|
190
|
+
|
191
|
+
if (Number(global.Fca.Require.Priyansh.AutoRestartMinutes) === 0) {
|
192
|
+
// something
|
193
|
+
} else if (Number(global.Fca.Require.Priyansh.AutoRestartMinutes) < 10) {
|
194
|
+
log.warn('AutoRestartMinutes', 'The number of minutes to automatically restart must be more than 10 minutes');
|
195
|
+
} else if (Number(global.Fca.Require.Priyansh.AutoRestartMinutes) < 0) {
|
196
|
+
log.warn('AutoRestartMinutes', 'Invalid auto-restart minutes!');
|
197
|
+
} else {
|
198
|
+
global.Fca.Require.logger.Normal(global.Fca.getText(global.Fca.Require.Language.Src.AutoRestart, global.Fca.Require.Priyansh.AutoRestartMinutes));
|
199
|
+
global.Fca.Require.logger.Normal(`Auto Restart MQTT Client After: ${global.Fca.Require.Priyansh.RestartMQTT_Minutes} Minutes`);
|
200
|
+
setTimeout(() => {
|
201
|
+
global.Fca.Require.logger.Normal(global.Fca.Require.Language.Src.OnRestart);
|
202
|
+
process.exit(1);
|
203
|
+
}, Number(global.Fca.Require.Priyansh.AutoRestartMinutes) * 60000);
|
204
|
+
}
|
205
|
+
require('../broadcast').startBroadcasting();
|
206
|
+
const MemoryManager = require('../Extra/Src/Release_Memory');
|
207
|
+
const path = require('path');
|
208
|
+
|
209
|
+
const SettingMemoryManager = {
|
210
|
+
warningThreshold: 0.7,
|
211
|
+
releaseThreshold: 0.8,
|
212
|
+
maxThreshold: 0.9,
|
213
|
+
interval: 300 * 1000,
|
214
|
+
logLevel: 'warn',
|
215
|
+
logFile: path.join(process.cwd(), 'Horizon_Database' ,'memory.log'),
|
216
|
+
smartReleaseEnabled: true,
|
217
|
+
allowLog: (global.Fca.Require.Priyansh.AntiStuckAndMemoryLeak.LogFile.Use || false)
|
218
|
+
};
|
219
|
+
|
220
|
+
const memoryManager = new MemoryManager(SettingMemoryManager);
|
221
|
+
|
222
|
+
memoryManager.autoStart(60 * 60 * 1000);
|
223
|
+
|
224
|
+
if (global.Fca.Require.Priyansh.AntiStuckAndMemoryLeak.AutoRestart.Use) {
|
225
|
+
memoryManager.onMaxMemory(function() {
|
226
|
+
global.Fca.Require.logger.Warning('Memory Usage >= 90% - Auto Restart Avoid Crash');
|
227
|
+
process.exit(1);
|
228
|
+
});
|
229
|
+
}
|
230
|
+
process.env.OnStatus = true;
|
231
|
+
}
|
232
|
+
|
233
|
+
topics.forEach((topicsub) => global.mqttClient.subscribe(topicsub));
|
234
|
+
|
235
|
+
|
236
|
+
let topic;
|
237
|
+
const queue = {
|
238
|
+
sync_api_version: 11,
|
239
|
+
max_deltas_able_to_process: 100,
|
143
240
|
delta_batch_size: 500,
|
144
|
-
encoding:
|
241
|
+
encoding: 'JSON',
|
145
242
|
entity_fbid: ctx.userID,
|
146
243
|
};
|
147
244
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
}
|
245
|
+
topic = "/messenger_sync_create_queue";
|
246
|
+
queue.initial_titan_sequence_id = ctx.lastSeqId;
|
247
|
+
queue.device_params = null;
|
248
|
+
|
249
|
+
global.mqttClient.publish(topic, JSON.stringify(queue), {
|
250
|
+
qos: 1,
|
251
|
+
retain: false
|
252
|
+
});
|
157
253
|
|
158
|
-
mqttClient.publish(topic, JSON.stringify(queue), { qos: 1, retain: false });
|
159
|
-
mqttClient.publish("/foreground_state", JSON.stringify({ "foreground": chatOn }), { qos: 1 });
|
160
254
|
var rTimeout = setTimeout(function() {
|
161
|
-
mqttClient.end();
|
255
|
+
global.mqttClient.end();
|
162
256
|
getSeqID();
|
163
257
|
}, 3000);
|
164
258
|
|
@@ -167,17 +261,13 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
167
261
|
ctx.globalOptions.emitReady ? globalCallback({
|
168
262
|
type: "ready",
|
169
263
|
error: null
|
170
|
-
}) :
|
264
|
+
}) : '';
|
171
265
|
delete ctx.tmsWait;
|
172
266
|
};
|
173
267
|
});
|
174
268
|
|
175
|
-
|
176
|
-
|
177
|
-
var jsonMessage = JSON.parse(message);
|
178
|
-
} catch (ex) {
|
179
|
-
return console.error("listenMqtt", ex);
|
180
|
-
}
|
269
|
+
const HandleMessage = function(topic, message, _packet) {
|
270
|
+
const jsonMessage = JSON.parse(message.toString());
|
181
271
|
if (topic === "/t_ms") {
|
182
272
|
if (ctx.tmsWait && typeof ctx.tmsWait == "function") ctx.tmsWait();
|
183
273
|
|
@@ -187,11 +277,31 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
187
277
|
}
|
188
278
|
|
189
279
|
if (jsonMessage.lastIssuedSeqId) ctx.lastSeqId = parseInt(jsonMessage.lastIssuedSeqId);
|
190
|
-
|
191
280
|
//If it contains more than 1 delta
|
192
281
|
for (var i in jsonMessage.deltas) {
|
193
282
|
var delta = jsonMessage.deltas[i];
|
194
|
-
parseDelta(defaultFuncs, api, ctx, globalCallback, {
|
283
|
+
parseDelta(defaultFuncs, api, ctx, globalCallback, {
|
284
|
+
"delta": delta
|
285
|
+
});
|
286
|
+
}
|
287
|
+
} else if (topic === "/ls_resp") {
|
288
|
+
const payload = JSON.parse(jsonMessage.payload); //'{"name":null,"step":[1,[1,[4,0,1,[5,"taskExists",[19,"415"]]],[23,[2,0],[1,[5,"replaceOptimsiticMessage","7192532113093667880","mid.$gABfX5li9LA6VdUymnWPRAdlkiawo"]]]],[1,[4,0,1,[5,"taskExists",[19,"415"]]],[23,[2,0],[1,[5,"mailboxTaskCompletionApiOnTaskCompletion",[19,"415"],true]]]],[1,[4,0,1,[5,"taskExists",[19,"415"]]],[23,[2,0],[1,[5,"removeTask",[19,"415"],[9]]]]]]}'
|
289
|
+
const request_ID = jsonMessage.request_id;
|
290
|
+
|
291
|
+
if (ctx.callback_Task[request_ID] != undefined && ctx.callback_Task[request_ID].type != undefined) {
|
292
|
+
const {
|
293
|
+
callback,
|
294
|
+
type
|
295
|
+
} = ctx.callback_Task[request_ID];
|
296
|
+
const Data = new getRespData(type, payload);
|
297
|
+
if (!callback) {
|
298
|
+
return;
|
299
|
+
}
|
300
|
+
else if (!Data) {
|
301
|
+
callback("Something went wrong 🐳", null);
|
302
|
+
} else {
|
303
|
+
callback(null, Data);
|
304
|
+
}
|
195
305
|
}
|
196
306
|
} else if (topic === "/thread_typing" || topic === "/orca_typing_notifications") {
|
197
307
|
var typ = {
|
@@ -200,7 +310,9 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
200
310
|
from: jsonMessage.sender_fbid.toString(),
|
201
311
|
threadID: utils.formatID((jsonMessage.thread || jsonMessage.sender_fbid).toString())
|
202
312
|
};
|
203
|
-
(function() {
|
313
|
+
(function() {
|
314
|
+
globalCallback(null, typ);
|
315
|
+
})();
|
204
316
|
} else if (topic === "/orca_presence") {
|
205
317
|
if (!ctx.globalOptions.updatePresence) {
|
206
318
|
for (var i in jsonMessage.list) {
|
@@ -214,421 +326,517 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
|
|
214
326
|
timestamp: data["l"] * 1000,
|
215
327
|
statuses: data["p"]
|
216
328
|
};
|
217
|
-
(function() {
|
329
|
+
(function() {
|
330
|
+
globalCallback(null, presence);
|
331
|
+
})();
|
218
332
|
}
|
219
333
|
}
|
220
334
|
}
|
221
335
|
|
222
|
-
}
|
336
|
+
};
|
223
337
|
|
224
|
-
mqttClient.on('
|
225
|
-
|
226
|
-
|
338
|
+
global.mqttClient.on('message', HandleMessage);
|
339
|
+
|
340
|
+
process.on('SIGINT', () => {
|
341
|
+
LogUptime();
|
342
|
+
process.kill(process.pid);
|
227
343
|
});
|
344
|
+
|
345
|
+
process.on('exit', LogUptime);
|
346
|
+
|
347
|
+
|
348
|
+
}
|
349
|
+
|
350
|
+
function getRespData(Type, payload) {
|
351
|
+
try {
|
352
|
+
switch (Type) {
|
353
|
+
case "sendMqttMessage": {
|
354
|
+
return {
|
355
|
+
type: Type,
|
356
|
+
threadID: payload.step[1][2][2][1][2], //this is sick bro
|
357
|
+
messageID: payload.step[1][2][2][1][3],
|
358
|
+
payload: payload.step[1][2]
|
359
|
+
};
|
360
|
+
}
|
361
|
+
default: { //!very LAZY :> cook yourself
|
362
|
+
return {
|
363
|
+
Data: payload.step[1][2][2][1],
|
364
|
+
type: Type,
|
365
|
+
payload: payload.step[1][2]
|
366
|
+
};
|
367
|
+
}
|
368
|
+
}
|
369
|
+
} catch (e) {
|
370
|
+
return null;
|
371
|
+
}
|
228
372
|
}
|
229
373
|
|
230
|
-
function
|
231
|
-
|
232
|
-
|
233
|
-
|
374
|
+
function LogUptime() {
|
375
|
+
const uptime = process.uptime();
|
376
|
+
const {
|
377
|
+
join
|
378
|
+
} = require('path');
|
379
|
+
const filePath = join(__dirname, '../CountTime.json');
|
380
|
+
|
381
|
+
let time1;
|
382
|
+
if (global.Fca.Require.fs.existsSync(filePath)) {
|
383
|
+
time1 = Number(global.Fca.Require.fs.readFileSync(filePath, 'utf8')) || 0;
|
384
|
+
} else {
|
385
|
+
time1 = 0;
|
386
|
+
}
|
387
|
+
|
388
|
+
global.Fca.Require.fs.writeFileSync(filePath, String(Number(uptime) + time1), 'utf8');
|
389
|
+
}
|
234
390
|
|
235
|
-
|
236
|
-
|
237
|
-
var fmtMsg;
|
391
|
+
if (global.Fca.Require.Priyansh.AntiGetInfo.AntiGetThreadInfo) {
|
392
|
+
setInterval(() => {
|
238
393
|
try {
|
239
|
-
|
394
|
+
const { updateMessageCount, getData, hasData } = require('../Extra/ExtraGetThread');
|
395
|
+
const Data = global.Fca.Data.MsgCount;
|
396
|
+
const Arr = Array.from(Data.keys());
|
397
|
+
for (let i of Arr) {
|
398
|
+
const Count = parseInt(Data.get(i));
|
399
|
+
if (hasData(i)) {
|
400
|
+
let x = getData(i);
|
401
|
+
x.messageCount += Count;
|
402
|
+
updateMessageCount(i, x);
|
403
|
+
Data.delete(i);
|
404
|
+
}
|
405
|
+
}
|
406
|
+
|
407
|
+
} catch (e) {
|
408
|
+
console.log(e);
|
409
|
+
}
|
410
|
+
}, 30 * 1000);
|
411
|
+
}
|
412
|
+
|
413
|
+
function parseDelta(defaultFuncs, api, ctx, globalCallback, {
|
414
|
+
delta
|
415
|
+
}) {
|
416
|
+
if (delta.class === 'NewMessage') {
|
417
|
+
if (ctx.globalOptions.pageID && ctx.globalOptions.pageID !== delta.queue) return;
|
418
|
+
|
419
|
+
const resolveAttachmentUrl = (i) => {
|
420
|
+
if (!delta.attachments || i === delta.attachments.length || utils.getType(delta.attachments) !== 'Array') {
|
421
|
+
let fmtMsg;
|
422
|
+
try {
|
423
|
+
fmtMsg = utils.formatDeltaMessage(delta);
|
240
424
|
} catch (err) {
|
241
|
-
return
|
242
|
-
error: "Problem parsing message object. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues.",
|
243
|
-
detail: err,
|
244
|
-
res: v,
|
245
|
-
type: "parse_error"
|
246
|
-
});
|
425
|
+
return log.error('Lỗi Nhẹ', err);
|
247
426
|
}
|
248
|
-
|
249
|
-
|
427
|
+
|
428
|
+
if (fmtMsg) {
|
429
|
+
const isGroup = fmtMsg.isGroup;
|
430
|
+
const threadID = fmtMsg.threadID;
|
431
|
+
const messageID = fmtMsg.messageID;
|
432
|
+
|
433
|
+
global.Fca.Data.event.set("Data", {
|
434
|
+
isGroup,
|
435
|
+
threadID,
|
436
|
+
messageID
|
437
|
+
});
|
438
|
+
|
439
|
+
if (global.Fca.Require.Priyansh.AntiGetInfo.AntiGetThreadInfo) {
|
440
|
+
global.Fca.Data.MsgCount.set(fmtMsg.threadID, ((global.Fca.Data.MsgCount.get(fmtMsg.threadID)) + 1 || 1));
|
441
|
+
}
|
442
|
+
|
443
|
+
if (ctx.globalOptions.autoMarkDelivery) {
|
444
|
+
markDelivery(ctx, api, fmtMsg.threadID, fmtMsg.messageID);
|
445
|
+
}
|
250
446
|
|
251
|
-
|
447
|
+
if (!ctx.globalOptions.selfListen && fmtMsg.senderID === ctx.userID) return;
|
448
|
+
globalCallback(null, fmtMsg);
|
449
|
+
}
|
252
450
|
} else {
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
451
|
+
const attachment = delta.attachments[i];
|
452
|
+
if (attachment.mercury.attach_type === 'photo') {
|
453
|
+
api.resolvePhotoUrl(attachment.fbid, (err, url) => {
|
454
|
+
if (!err) attachment.mercury.metadata.url = url;
|
455
|
+
resolveAttachmentUrl(i + 1);
|
257
456
|
});
|
258
|
-
} else
|
457
|
+
} else {
|
458
|
+
resolveAttachmentUrl(i + 1);
|
459
|
+
}
|
259
460
|
}
|
260
|
-
}
|
261
|
-
}
|
461
|
+
};
|
262
462
|
|
263
|
-
|
264
|
-
|
463
|
+
resolveAttachmentUrl(0);
|
464
|
+
} else if (delta.class === 'ClientPayload') {
|
465
|
+
const clientPayload = utils.decodeClientPayload(delta.payload);
|
265
466
|
if (clientPayload && clientPayload.deltas) {
|
266
|
-
for (
|
267
|
-
var delta = clientPayload.deltas[i];
|
467
|
+
for (const delta of clientPayload.deltas) {
|
268
468
|
if (delta.deltaMessageReaction && !!ctx.globalOptions.listenEvents) {
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
})();
|
469
|
+
const messageReaction = {
|
470
|
+
type: 'message_reaction',
|
471
|
+
threadID: (delta.deltaMessageReaction.threadKey.threadFbId ? delta.deltaMessageReaction.threadKey.threadFbId : delta.deltaMessageReaction.threadKey.otherUserFbId).toString(),
|
472
|
+
messageID: delta.deltaMessageReaction.messageId,
|
473
|
+
reaction: delta.deltaMessageReaction.reaction,
|
474
|
+
senderID: delta.deltaMessageReaction.senderId.toString(),
|
475
|
+
userID: delta.deltaMessageReaction.userId.toString(),
|
476
|
+
};
|
477
|
+
globalCallback(null, messageReaction);
|
279
478
|
} else if (delta.deltaRecallMessageData && !!ctx.globalOptions.listenEvents) {
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
})();
|
479
|
+
const messageUnsend = {
|
480
|
+
type: 'message_unsend',
|
481
|
+
threadID: (delta.deltaRecallMessageData.threadKey.threadFbId ? delta.deltaRecallMessageData.threadKey.threadFbId : delta.deltaRecallMessageData.threadKey.otherUserFbId).toString(),
|
482
|
+
messageID: delta.deltaRecallMessageData.messageID,
|
483
|
+
senderID: delta.deltaRecallMessageData.senderID.toString(),
|
484
|
+
deletionTimestamp: delta.deltaRecallMessageData.deletionTimestamp,
|
485
|
+
timestamp: delta.deltaRecallMessageData.timestamp,
|
486
|
+
};
|
487
|
+
globalCallback(null, messageUnsend);
|
290
488
|
} else if (delta.deltaMessageReply) {
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
delta.deltaMessageReply.message.data === undefined ?
|
295
|
-
|
489
|
+
const mdata =
|
490
|
+
delta.deltaMessageReply.message === undefined ?
|
491
|
+
[] :
|
492
|
+
delta.deltaMessageReply.message.data === undefined ?
|
493
|
+
[] :
|
494
|
+
delta.deltaMessageReply.message.data.prng === undefined ?
|
495
|
+
[] :
|
296
496
|
JSON.parse(delta.deltaMessageReply.message.data.prng);
|
297
|
-
var m_id = mdata.map(u => u.i);
|
298
|
-
var m_offset = mdata.map(u => u.o);
|
299
|
-
var m_length = mdata.map(u => u.l);
|
300
497
|
|
301
|
-
|
498
|
+
const m_id = mdata.map((u) => u.i);
|
499
|
+
const m_offset = mdata.map((u) => u.o);
|
500
|
+
const m_length = mdata.map((u) => u.l);
|
302
501
|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
502
|
+
const mentions = {};
|
503
|
+
for (let i = 0; i < m_id.length; i++) {
|
504
|
+
mentions[m_id[i]] = (delta.deltaMessageReply.message.body || '').substring(m_offset[i], m_offset[i] + m_length[i]);
|
505
|
+
}
|
506
|
+
|
507
|
+
const callbackToReturn = {
|
508
|
+
type: 'message_reply',
|
307
509
|
threadID: (delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId ? delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId : delta.deltaMessageReply.message.messageMetadata.threadKey.otherUserFbId).toString(),
|
308
510
|
messageID: delta.deltaMessageReply.message.messageMetadata.messageId,
|
309
511
|
senderID: delta.deltaMessageReply.message.messageMetadata.actorFbId.toString(),
|
310
|
-
attachments: delta.deltaMessageReply.message.attachments
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
x
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
512
|
+
attachments: ( delta.deltaMessageReply.message.attachments || [] )
|
513
|
+
.map((att) => {
|
514
|
+
const mercury = JSON.parse(att.mercuryJSON);
|
515
|
+
Object.assign(att, mercury);
|
516
|
+
return att;
|
517
|
+
})
|
518
|
+
.map((att) => {
|
519
|
+
let x;
|
520
|
+
try {
|
521
|
+
x = utils._formatAttachment(att);
|
522
|
+
} catch (ex) {
|
523
|
+
x = att;
|
524
|
+
x.error = ex;
|
525
|
+
x.type = 'unknown';
|
526
|
+
}
|
527
|
+
return x;
|
528
|
+
}),
|
529
|
+
args: (delta.deltaMessageReply.message.body || '').trim().split(/\s+/),
|
530
|
+
body: delta.deltaMessageReply.message.body || '',
|
327
531
|
isGroup: !!delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId,
|
328
|
-
mentions
|
329
|
-
timestamp: delta.deltaMessageReply.message.messageMetadata.timestamp,
|
330
|
-
participantIDs: (delta.deltaMessageReply.message.participants || []).map(e => e.toString())
|
532
|
+
mentions,
|
533
|
+
timestamp: parseInt(delta.deltaMessageReply.message.messageMetadata.timestamp),
|
534
|
+
participantIDs: (delta.deltaMessageReply.message.participants || []).map((e) => e.toString()),
|
331
535
|
};
|
332
536
|
|
333
537
|
if (delta.deltaMessageReply.repliedToMessage) {
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
delta.deltaMessageReply.repliedToMessage.data === undefined ?
|
338
|
-
|
538
|
+
const mdata =
|
539
|
+
delta.deltaMessageReply.repliedToMessage === undefined ?
|
540
|
+
[] :
|
541
|
+
delta.deltaMessageReply.repliedToMessage.data === undefined ?
|
542
|
+
[] :
|
543
|
+
delta.deltaMessageReply.repliedToMessage.data.prng === undefined ?
|
544
|
+
[] :
|
339
545
|
JSON.parse(delta.deltaMessageReply.repliedToMessage.data.prng);
|
340
|
-
m_id = mdata.map(u => u.i);
|
341
|
-
m_offset = mdata.map(u => u.o);
|
342
|
-
m_length = mdata.map(u => u.l);
|
343
546
|
|
344
|
-
|
547
|
+
const m_id = mdata.map((u) => u.i);
|
548
|
+
const m_offset = mdata.map((u) => u.o);
|
549
|
+
const m_length = mdata.map((u) => u.l);
|
550
|
+
|
551
|
+
const rmentions = {};
|
552
|
+
for (let i = 0; i < m_id.length; i++) {
|
553
|
+
rmentions[m_id[i]] = (delta.deltaMessageReply.repliedToMessage.body || '').substring(m_offset[i], m_offset[i] + m_length[i]);
|
554
|
+
}
|
345
555
|
|
346
|
-
for (var i = 0; i < m_id.length; i++) rmentions[m_id[i]] = (delta.deltaMessageReply.repliedToMessage.body || "").substring(m_offset[i], m_offset[i] + m_length[i]);
|
347
|
-
//Mention block - 2#
|
348
556
|
callbackToReturn.messageReply = {
|
349
557
|
threadID: (delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId ? delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId : delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.otherUserFbId).toString(),
|
350
558
|
messageID: delta.deltaMessageReply.repliedToMessage.messageMetadata.messageId,
|
351
559
|
senderID: delta.deltaMessageReply.repliedToMessage.messageMetadata.actorFbId.toString(),
|
352
|
-
attachments: delta.deltaMessageReply.repliedToMessage.attachments
|
353
|
-
|
354
|
-
|
560
|
+
attachments: delta.deltaMessageReply.repliedToMessage.attachments
|
561
|
+
.map((att) => {
|
562
|
+
let mercury;
|
563
|
+
try {
|
564
|
+
mercury = JSON.parse(att.mercuryJSON);
|
565
|
+
Object.assign(att, mercury);
|
566
|
+
} catch (ex) {
|
567
|
+
mercury = {};
|
568
|
+
}
|
355
569
|
return att;
|
356
|
-
})
|
357
|
-
|
570
|
+
})
|
571
|
+
.map((att) => {
|
572
|
+
let x;
|
358
573
|
try {
|
359
574
|
x = utils._formatAttachment(att);
|
360
575
|
} catch (ex) {
|
361
576
|
x = att;
|
362
577
|
x.error = ex;
|
363
|
-
x.type =
|
578
|
+
x.type = 'unknown';
|
364
579
|
}
|
365
580
|
return x;
|
366
581
|
}),
|
367
|
-
args: (delta.deltaMessageReply.repliedToMessage.body ||
|
368
|
-
body: delta.deltaMessageReply.repliedToMessage.body ||
|
582
|
+
args: (delta.deltaMessageReply.repliedToMessage.body || '').trim().split(/\s+/),
|
583
|
+
body: delta.deltaMessageReply.repliedToMessage.body || '',
|
369
584
|
isGroup: !!delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId,
|
370
585
|
mentions: rmentions,
|
371
|
-
timestamp: delta.deltaMessageReply.repliedToMessage.messageMetadata.timestamp,
|
372
|
-
participantIDs: (delta.deltaMessageReply.repliedToMessage.participants || []).map(e => e.toString())
|
586
|
+
timestamp: parseInt(delta.deltaMessageReply.repliedToMessage.messageMetadata.timestamp),
|
587
|
+
participantIDs: (delta.deltaMessageReply.repliedToMessage.participants || []).map((e) => e.toString()),
|
373
588
|
};
|
374
589
|
} else if (delta.deltaMessageReply.replyToMessageId) {
|
375
590
|
return defaultFuncs
|
376
|
-
.post(
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
})
|
591
|
+
.post('https://www.facebook.com/api/graphqlbatch/', ctx.jar, {
|
592
|
+
av: ctx.globalOptions.pageID,
|
593
|
+
queries: JSON.stringify({
|
594
|
+
o0: {
|
595
|
+
doc_id: '2848441488556444',
|
596
|
+
query_params: {
|
597
|
+
thread_and_message_id: {
|
598
|
+
thread_id: callbackToReturn.threadID,
|
599
|
+
message_id: delta.deltaMessageReply.replyToMessageId.id,
|
600
|
+
},
|
601
|
+
},
|
602
|
+
},
|
603
|
+
}),
|
390
604
|
})
|
391
605
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
392
606
|
.then((resData) => {
|
393
|
-
if (resData[resData.length - 1].error_results > 0)
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
for (var n in fetchData.message.ranges) mobj[fetchData.message.ranges[n].entity.id] = (fetchData.message.text || "").substr(fetchData.message.ranges[n].offset, fetchData.message.ranges[n].length);
|
607
|
+
if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
|
608
|
+
if (resData[resData.length - 1].successful_results === 0) throw {
|
609
|
+
error: 'forcedFetch: there was no successful_results',
|
610
|
+
res: resData
|
611
|
+
};
|
612
|
+
const fetchData = resData[0].o0.data.message;
|
613
|
+
const mobj = {};
|
401
614
|
|
615
|
+
for (const n in fetchData.message.ranges) {
|
616
|
+
mobj[fetchData.message.ranges[n].entity.id] = (fetchData.message.text || '').substr(fetchData.message.ranges[n].offset, fetchData.message.ranges[n].length);
|
617
|
+
}
|
402
618
|
callbackToReturn.messageReply = {
|
619
|
+
type: 'Message',
|
403
620
|
threadID: callbackToReturn.threadID,
|
404
621
|
messageID: fetchData.message_id,
|
405
622
|
senderID: fetchData.message_sender.id.toString(),
|
406
|
-
attachments: fetchData.message.blob_attachment.map(att => {
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
x = att;
|
412
|
-
x.error = ex;
|
413
|
-
x.type = "unknown";
|
414
|
-
}
|
415
|
-
return x;
|
416
|
-
}),
|
417
|
-
args: (fetchData.message.text || "").trim().split(/\s+/) || [],
|
418
|
-
body: fetchData.message.text || "",
|
623
|
+
attachments: fetchData.message.blob_attachment.map((att) => utils._formatAttachment({
|
624
|
+
blob_attachment: att
|
625
|
+
})),
|
626
|
+
args: (fetchData.message.text || '').trim().split(/\s+/) || [],
|
627
|
+
body: fetchData.message.text || '',
|
419
628
|
isGroup: callbackToReturn.isGroup,
|
420
629
|
mentions: mobj,
|
421
|
-
timestamp: parseInt(fetchData.timestamp_precise)
|
630
|
+
timestamp: parseInt(fetchData.timestamp_precise),
|
422
631
|
};
|
423
632
|
})
|
424
|
-
.catch(err => console.error("forcedFetch", err))
|
425
|
-
.finally(function() {
|
426
|
-
if (ctx.globalOptions.autoMarkDelivery) markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
|
427
|
-
!ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID ? undefined : (function() { globalCallback(null, callbackToReturn); })();
|
428
|
-
});
|
429
|
-
} else callbackToReturn.delta = delta;
|
430
633
|
|
431
|
-
|
634
|
+
.catch((err) => log.error('forcedFetch', err))
|
635
|
+
.finally(() => {
|
636
|
+
if (ctx.globalOptions.autoMarkDelivery) {
|
637
|
+
markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
|
638
|
+
}
|
639
|
+
|
640
|
+
if (!ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID) return;
|
641
|
+
globalCallback(null, callbackToReturn);
|
642
|
+
});
|
643
|
+
} else {
|
644
|
+
callbackToReturn.delta = delta;
|
645
|
+
}
|
646
|
+
if (ctx.globalOptions.autoMarkDelivery) {
|
647
|
+
markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
|
648
|
+
}
|
432
649
|
|
433
|
-
|
650
|
+
if (!ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID) return;
|
651
|
+
globalCallback(null, callbackToReturn);
|
434
652
|
}
|
435
653
|
}
|
654
|
+
|
436
655
|
return;
|
437
656
|
}
|
438
657
|
}
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
case "ReadReceipt":
|
443
|
-
var fmtMsg;
|
658
|
+
switch (delta.class) {
|
659
|
+
case 'ReadReceipt': {
|
660
|
+
let fmtMsg;
|
444
661
|
try {
|
445
|
-
fmtMsg = utils.formatDeltaReadReceipt(
|
662
|
+
fmtMsg = utils.formatDeltaReadReceipt(delta);
|
446
663
|
} catch (err) {
|
447
|
-
return
|
448
|
-
error: "Problem parsing message object. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues.",
|
449
|
-
detail: err,
|
450
|
-
res: v.delta,
|
451
|
-
type: "parse_error"
|
452
|
-
});
|
664
|
+
return log.error('Lỗi Nhẹ', err);
|
453
665
|
}
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
case
|
460
|
-
case
|
461
|
-
case
|
462
|
-
case
|
463
|
-
case
|
464
|
-
case
|
465
|
-
case
|
466
|
-
case
|
467
|
-
case
|
468
|
-
|
666
|
+
globalCallback(null, fmtMsg);
|
667
|
+
break;
|
668
|
+
}
|
669
|
+
case 'AdminTextMessage': {
|
670
|
+
switch (delta.type) {
|
671
|
+
case 'joinable_group_link_mode_change':
|
672
|
+
case 'magic_words':
|
673
|
+
case 'pin_messages_v2':
|
674
|
+
case 'change_thread_theme':
|
675
|
+
case 'change_thread_icon':
|
676
|
+
case 'change_thread_nickname':
|
677
|
+
case 'change_thread_admins':
|
678
|
+
case 'change_thread_approval_mode':
|
679
|
+
case 'group_poll':
|
680
|
+
case 'messenger_call_log':
|
681
|
+
case 'participant_joined_group_call': {
|
682
|
+
let fmtMsg;
|
469
683
|
try {
|
470
|
-
fmtMsg = utils.formatDeltaEvent(
|
684
|
+
fmtMsg = utils.formatDeltaEvent(delta);
|
471
685
|
} catch (err) {
|
472
|
-
|
473
|
-
|
474
|
-
detail: err,
|
475
|
-
res: v.delta,
|
476
|
-
type: "parse_error"
|
477
|
-
});
|
686
|
+
console.log(delta);
|
687
|
+
return log.error('Lỗi Nhẹ', err);
|
478
688
|
}
|
479
|
-
|
480
|
-
|
481
|
-
|
689
|
+
globalCallback(null, fmtMsg);
|
690
|
+
break;
|
691
|
+
}
|
482
692
|
}
|
483
693
|
break;
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
694
|
+
}
|
695
|
+
|
696
|
+
//For group images
|
697
|
+
case 'ForcedFetch': {
|
698
|
+
if (!delta.threadKey) return;
|
699
|
+
const mid = delta.messageId;
|
700
|
+
const tid = delta.threadKey.threadFbId;
|
701
|
+
|
489
702
|
if (mid && tid) {
|
490
703
|
const form = {
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
})
|
704
|
+
av: ctx.globalOptions.pageID,
|
705
|
+
queries: JSON.stringify({
|
706
|
+
o0: {
|
707
|
+
doc_id: '2848441488556444',
|
708
|
+
query_params: {
|
709
|
+
thread_and_message_id: {
|
710
|
+
thread_id: tid.toString(),
|
711
|
+
message_id: mid,
|
712
|
+
},
|
713
|
+
},
|
714
|
+
},
|
715
|
+
}),
|
504
716
|
};
|
505
|
-
|
506
717
|
defaultFuncs
|
507
|
-
.post(
|
718
|
+
.post('https://www.facebook.com/api/graphqlbatch/', ctx.jar, form)
|
508
719
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
509
720
|
.then((resData) => {
|
510
|
-
if (resData[resData.length - 1].error_results > 0)
|
511
|
-
const errorL = resData[0].o0.errors;
|
512
|
-
throw errorL;
|
513
|
-
}
|
721
|
+
if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
|
514
722
|
|
515
|
-
if (resData[resData.length - 1].successful_results === 0) throw {
|
723
|
+
if (resData[resData.length - 1].successful_results === 0) throw {
|
724
|
+
error: 'forcedFetch: there was no successful_results',
|
725
|
+
res: resData
|
726
|
+
};
|
516
727
|
|
517
|
-
|
728
|
+
const fetchData = resData[0].o0.data.message;
|
518
729
|
|
519
|
-
if (utils.getType(fetchData)
|
520
|
-
|
730
|
+
if (utils.getType(fetchData) === 'Object') {
|
731
|
+
log.info('forcedFetch', fetchData);
|
521
732
|
switch (fetchData.__typename) {
|
522
|
-
case
|
523
|
-
(!ctx.globalOptions.selfListen &&
|
524
|
-
|
525
|
-
!ctx.loggedIn ?
|
526
|
-
undefined :
|
527
|
-
(function() {
|
528
|
-
globalCallback(null, {
|
529
|
-
type: "change_thread_image",
|
530
|
-
threadID: utils.formatID(tid.toString()),
|
531
|
-
snippet: fetchData.snippet,
|
532
|
-
timestamp: fetchData.timestamp_precise,
|
533
|
-
author: fetchData.message_sender.id,
|
534
|
-
image: {
|
535
|
-
attachmentID: fetchData.image_with_metadata && fetchData.image_with_metadata.legacy_attachment_id,
|
536
|
-
width: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.x,
|
537
|
-
height: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.y,
|
538
|
-
url: fetchData.image_with_metadata && fetchData.image_with_metadata.preview.uri
|
539
|
-
}
|
540
|
-
});
|
541
|
-
})();
|
542
|
-
break;
|
543
|
-
case "UserMessage":
|
544
|
-
console.log("ff-Return", {
|
545
|
-
type: "message",
|
546
|
-
senderID: utils.formatID(fetchData.message_sender.id),
|
547
|
-
body: fetchData.message.text || "",
|
548
|
-
threadID: utils.formatID(tid.toString()),
|
549
|
-
messageID: fetchData.message_id,
|
550
|
-
attachments: [{
|
551
|
-
type: "share",
|
552
|
-
ID: fetchData.extensible_attachment.legacy_attachment_id,
|
553
|
-
url: fetchData.extensible_attachment.story_attachment.url,
|
554
|
-
|
555
|
-
title: fetchData.extensible_attachment.story_attachment.title_with_entities.text,
|
556
|
-
description: fetchData.extensible_attachment.story_attachment.description.text,
|
557
|
-
source: fetchData.extensible_attachment.story_attachment.source,
|
558
|
-
|
559
|
-
image: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).uri,
|
560
|
-
width: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).width,
|
561
|
-
height: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).height,
|
562
|
-
playable: (fetchData.extensible_attachment.story_attachment.media || {}).is_playable || false,
|
563
|
-
duration: (fetchData.extensible_attachment.story_attachment.media || {}).playable_duration_in_ms || 0,
|
733
|
+
case 'ThreadImageMessage':
|
734
|
+
if (!ctx.globalOptions.selfListen && fetchData.message_sender.id.toString() === ctx.userID) return;
|
735
|
+
if (!ctx.loggedIn) return;
|
564
736
|
|
565
|
-
subattachments: fetchData.extensible_attachment.subattachments,
|
566
|
-
properties: fetchData.extensible_attachment.story_attachment.properties,
|
567
|
-
}],
|
568
|
-
mentions: {},
|
569
|
-
timestamp: parseInt(fetchData.timestamp_precise),
|
570
|
-
isGroup: (fetchData.message_sender.id != tid.toString())
|
571
|
-
});
|
572
737
|
globalCallback(null, {
|
573
|
-
type:
|
738
|
+
type: 'change_thread_image',
|
739
|
+
threadID: utils.formatID(tid.toString()),
|
740
|
+
snippet: fetchData.snippet,
|
741
|
+
timestamp: fetchData.timestamp_precise,
|
742
|
+
author: fetchData.message_sender.id,
|
743
|
+
image: {
|
744
|
+
attachmentID: fetchData.image_with_metadata && fetchData.image_with_metadata.legacy_attachment_id,
|
745
|
+
width: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.x,
|
746
|
+
height: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.y,
|
747
|
+
url: fetchData.image_with_metadata && fetchData.image_with_metadata.preview.uri,
|
748
|
+
},
|
749
|
+
});
|
750
|
+
break;
|
751
|
+
case 'UserMessage': {
|
752
|
+
const event = {
|
753
|
+
type: 'message',
|
574
754
|
senderID: utils.formatID(fetchData.message_sender.id),
|
575
|
-
body: fetchData.message.text ||
|
755
|
+
body: fetchData.message.text || '',
|
576
756
|
threadID: utils.formatID(tid.toString()),
|
577
757
|
messageID: fetchData.message_id,
|
578
758
|
attachments: [{
|
579
|
-
type:
|
759
|
+
type: 'share',
|
580
760
|
ID: fetchData.extensible_attachment.legacy_attachment_id,
|
581
761
|
url: fetchData.extensible_attachment.story_attachment.url,
|
582
|
-
|
583
762
|
title: fetchData.extensible_attachment.story_attachment.title_with_entities.text,
|
584
763
|
description: fetchData.extensible_attachment.story_attachment.description.text,
|
585
764
|
source: fetchData.extensible_attachment.story_attachment.source,
|
586
|
-
|
587
765
|
image: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).uri,
|
588
766
|
width: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).width,
|
589
767
|
height: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).height,
|
590
768
|
playable: (fetchData.extensible_attachment.story_attachment.media || {}).is_playable || false,
|
591
769
|
duration: (fetchData.extensible_attachment.story_attachment.media || {}).playable_duration_in_ms || 0,
|
592
|
-
|
593
770
|
subattachments: fetchData.extensible_attachment.subattachments,
|
594
771
|
properties: fetchData.extensible_attachment.story_attachment.properties,
|
595
|
-
|
772
|
+
}],
|
596
773
|
mentions: {},
|
597
774
|
timestamp: parseInt(fetchData.timestamp_precise),
|
598
|
-
isGroup: (fetchData.message_sender.id
|
599
|
-
}
|
775
|
+
isGroup: (fetchData.message_sender.id !== tid.toString()),
|
776
|
+
};
|
777
|
+
|
778
|
+
log.info('ff-Return', event);
|
779
|
+
globalCallback(null, event);
|
780
|
+
break;
|
781
|
+
}
|
782
|
+
default:
|
783
|
+
log.error('forcedFetch', fetchData);
|
600
784
|
}
|
601
|
-
} else
|
785
|
+
} else {
|
786
|
+
log.error('forcedFetch', fetchData);
|
787
|
+
}
|
602
788
|
})
|
603
|
-
.catch((err) =>
|
789
|
+
.catch((err) => log.error('forcedFetch', err));
|
604
790
|
}
|
605
791
|
break;
|
606
|
-
|
607
|
-
case
|
608
|
-
case
|
609
|
-
|
792
|
+
}
|
793
|
+
case 'ThreadName':
|
794
|
+
case 'ParticipantsAddedToGroupThread':
|
795
|
+
case 'ParticipantLeftGroupThread': {
|
796
|
+
let formattedEvent;
|
610
797
|
try {
|
611
|
-
formattedEvent = utils.formatDeltaEvent(
|
798
|
+
formattedEvent = utils.formatDeltaEvent(delta);
|
612
799
|
} catch (err) {
|
613
|
-
|
614
|
-
|
615
|
-
detail: err,
|
616
|
-
res: v.delta,
|
617
|
-
type: "parse_error"
|
618
|
-
});
|
800
|
+
console.log(err);
|
801
|
+
return log.error('Lỗi Nhẹ', err);
|
619
802
|
}
|
620
|
-
|
803
|
+
|
804
|
+
if (!ctx.globalOptions.selfListen && formattedEvent.author.toString() === ctx.userID) return;
|
805
|
+
if (!ctx.loggedIn) return;
|
806
|
+
globalCallback(null, formattedEvent);
|
807
|
+
break;
|
808
|
+
}
|
809
|
+
case 'NewMessage': {
|
810
|
+
const hasLiveLocation = delta => {
|
811
|
+
const attachment = delta.attachments?.[0]?.mercury?.extensible_attachment;
|
812
|
+
const storyAttachment = attachment?.story_attachment;
|
813
|
+
return storyAttachment?.style_list?.includes('message_live_location');
|
814
|
+
};
|
815
|
+
|
816
|
+
if (delta.attachments?.length === 1 && hasLiveLocation(delta)) {
|
817
|
+
delta.class = 'UserLocation';
|
818
|
+
|
819
|
+
try {
|
820
|
+
const fmtMsg = utils.formatDeltaEvent(delta);
|
821
|
+
globalCallback(null, fmtMsg);
|
822
|
+
} catch (err) {
|
823
|
+
console.log(delta);
|
824
|
+
log.error('Lỗi Nhẹ', err);
|
825
|
+
}
|
826
|
+
}
|
827
|
+
break;
|
828
|
+
}
|
621
829
|
}
|
622
830
|
}
|
623
831
|
|
624
832
|
function markDelivery(ctx, api, threadID, messageID) {
|
625
833
|
if (threadID && messageID) {
|
626
834
|
api.markAsDelivered(threadID, messageID, (err) => {
|
627
|
-
if (err)
|
835
|
+
if (err) log.error('markAsDelivered', err);
|
628
836
|
else {
|
629
837
|
if (ctx.globalOptions.autoMarkRead) {
|
630
838
|
api.markAsRead(threadID, (err) => {
|
631
|
-
if (err)
|
839
|
+
if (err) log.error('markAsDelivered', err);
|
632
840
|
});
|
633
841
|
}
|
634
842
|
}
|
@@ -636,37 +844,81 @@ function markDelivery(ctx, api, threadID, messageID) {
|
|
636
844
|
}
|
637
845
|
}
|
638
846
|
|
847
|
+
|
848
|
+
|
639
849
|
module.exports = function(defaultFuncs, api, ctx) {
|
640
850
|
var globalCallback = identity;
|
851
|
+
var okeoke;
|
641
852
|
getSeqID = function getSeqID() {
|
642
853
|
ctx.t_mqttCalled = false;
|
643
854
|
defaultFuncs
|
644
855
|
.post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
|
856
|
+
.then(res => {
|
857
|
+
okeoke = res;
|
858
|
+
return res;
|
859
|
+
})
|
645
860
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
646
861
|
.then((resData) => {
|
647
|
-
if (utils.getType(resData) != "Array")
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
862
|
+
if (utils.getType(resData) != "Array") {
|
863
|
+
if (okeoke.request.uri && okeoke.request.uri.href.includes("https://www.facebook.com/checkpoint/")) {
|
864
|
+
if (okeoke.request.uri.href.includes('601051028565049')) {
|
865
|
+
return global.Fca.BypassAutomationNotification(undefined, ctx.jar, ctx.globalOptions, undefined ,process.env.UID)
|
866
|
+
}
|
867
|
+
}
|
868
|
+
if (global.Fca.Require.Priyansh.AutoLogin) {
|
869
|
+
return global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() {
|
870
|
+
return global.Fca.Action('AutoLogin');
|
871
|
+
});
|
872
|
+
} else if (!global.Fca.Require.Priyansh.AutoLogin) {
|
873
|
+
return global.Fca.Require.logger.Error(global.Fca.Require.Language.Index.ErrAppState);
|
874
|
+
}
|
875
|
+
return;
|
876
|
+
} else {
|
877
|
+
if (resData && resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
|
878
|
+
if (resData[resData.length - 1].successful_results === 0) throw {
|
879
|
+
error: "getSeqId: there was no successful_results",
|
880
|
+
res: resData
|
881
|
+
};
|
882
|
+
if (resData[0].o0.data.viewer.message_threads.sync_sequence_id) {
|
883
|
+
ctx.lastSeqId = resData[0].o0.data.viewer.message_threads.sync_sequence_id;
|
884
|
+
listenMqtt(defaultFuncs, api, ctx, globalCallback);
|
885
|
+
} else throw {
|
886
|
+
error: "getSeqId: no sync_sequence_id found.",
|
887
|
+
res: resData
|
888
|
+
};
|
652
889
|
}
|
653
|
-
if (resData[resData.length - 1].successful_results === 0) throw { error: "getSeqId: there was no successful_results", res: resData };
|
654
|
-
if (resData[0].o0.data.viewer.message_threads.sync_sequence_id) {
|
655
|
-
ctx.lastSeqId = resData[0].o0.data.viewer.message_threads.sync_sequence_id;
|
656
|
-
listenMqtt(defaultFuncs, api, ctx, globalCallback);
|
657
|
-
} else throw { error: "getSeqId: no sync_sequence_id found.", res: resData };
|
658
890
|
})
|
659
891
|
.catch((err) => {
|
660
|
-
|
661
|
-
|
662
|
-
|
892
|
+
log.error("getSeqId", err);
|
893
|
+
if (okeoke.request.uri && okeoke.request.uri.href.includes("https://www.facebook.com/checkpoint/")) {
|
894
|
+
if (okeoke.request.uri.href.includes('601051028565049')) {
|
895
|
+
return global.Fca.BypassAutomationNotification(undefined, ctx.jar, ctx.globalOptions, undefined ,process.env.UID)
|
896
|
+
}
|
897
|
+
}
|
898
|
+
if (utils.getType(err) == "Object" && err.error === global.Fca.Require.Language.Index.ErrAppState) ctx.loggedIn = false;
|
663
899
|
return globalCallback(err);
|
664
900
|
});
|
665
901
|
};
|
666
902
|
|
667
|
-
return
|
903
|
+
return function(callback) {
|
904
|
+
class MessageEmitter extends EventEmitter {
|
905
|
+
stopListening(callback) {
|
906
|
+
callback = callback || (() => {});
|
907
|
+
globalCallback = identity;
|
908
|
+
if (ctx.mqttClient) {
|
909
|
+
ctx.mqttClient.unsubscribe("/webrtc");
|
910
|
+
ctx.mqttClient.unsubscribe("/rtc_multi");
|
911
|
+
ctx.mqttClient.unsubscribe("/onevc");
|
912
|
+
ctx.mqttClient.publish("/browser_close", "{}");
|
913
|
+
ctx.mqttClient.end(false, function(...data) {
|
914
|
+
ctx.mqttClient = undefined;
|
915
|
+
});
|
916
|
+
}
|
917
|
+
global.Fca.Data.StopListening = true;
|
918
|
+
}
|
919
|
+
}
|
668
920
|
|
669
|
-
var msgEmitter = new
|
921
|
+
var msgEmitter = new MessageEmitter();
|
670
922
|
globalCallback = (callback || function(error, message) {
|
671
923
|
if (error) return msgEmitter.emit("error", error);
|
672
924
|
msgEmitter.emit("message", message);
|
@@ -676,28 +928,29 @@ module.exports = function(defaultFuncs, api, ctx) {
|
|
676
928
|
if (!ctx.firstListen) ctx.lastSeqId = null;
|
677
929
|
ctx.syncToken = undefined;
|
678
930
|
ctx.t_mqttCalled = false;
|
931
|
+
|
679
932
|
//Same request as getThreadList
|
680
933
|
form = {
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
}
|
692
|
-
}
|
693
|
-
})
|
934
|
+
av: ctx.globalOptions.pageID,
|
935
|
+
queries: JSON.stringify({
|
936
|
+
o0: {
|
937
|
+
doc_id: '3336396659757871',
|
938
|
+
query_params: {
|
939
|
+
limit: 1,
|
940
|
+
before: null,
|
941
|
+
tags: ['INBOX'],
|
942
|
+
includeDeliveryReceipts: false,
|
943
|
+
includeSeqID: true,
|
944
|
+
},
|
945
|
+
},
|
946
|
+
}),
|
694
947
|
};
|
695
948
|
|
949
|
+
|
696
950
|
if (!ctx.firstListen || !ctx.lastSeqId) getSeqID();
|
697
|
-
else
|
698
|
-
listenMqtt(defaultFuncs, api, ctx, globalCallback);
|
699
|
-
}
|
951
|
+
else listenMqtt(defaultFuncs, api, ctx, globalCallback);
|
700
952
|
ctx.firstListen = false;
|
953
|
+
|
701
954
|
return msgEmitter;
|
702
955
|
};
|
703
|
-
};
|
956
|
+
};
|