@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.
Files changed (128) hide show
  1. package/.gitattributes +1 -0
  2. package/CHANGELOG.md +30 -27
  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} +172 -256
  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
package/README.md CHANGED
@@ -29,19 +29,17 @@ It will download @dongdev/fca-unofficial from NPM repositories
29
29
  ## Example Usage
30
30
 
31
31
  ```javascript
32
-
33
32
  const login = require("@dongdev/fca-unofficial");
34
33
 
35
34
  login({ appState: [] }, (err, api) => {
36
- if (err) return console.error(err);
35
+ if (err) return console.error(err);
37
36
 
38
- api.listenMqtt((err, event) => {
39
- if (err) return console.error(err);
37
+ api.listenMqtt((err, event) => {
38
+ if (err) return console.error(err);
40
39
 
41
- api.sendMessage(event.body, event.threadID);
42
- });
40
+ api.sendMessage(event.body, event.threadID);
41
+ });
43
42
  });
44
-
45
43
  ```
46
44
 
47
45
  Result:
@@ -52,74 +50,72 @@ Result:
52
50
 
53
51
  ### Sending a message
54
52
 
55
- #### api.sendMessage(message, threadID[, callback][, messageID])
53
+ #### api.sendMessage(message, threadID[, callback][, messageid])
56
54
 
57
55
  Various types of message can be sent:
58
56
 
59
- * *Regular:* set field `body` to the desired message as a string.
60
- * *Sticker:* set a field `sticker` to the desired sticker ID.
61
- * *File or image:* Set field `attachment` to a readable stream or an array of readable streams.
62
- * *URL:* set a field `url` to the desired URL.
63
- * *Emoji:* set field `emoji` to the desired emoji as a string and set field `emojiSize` with size of the emoji (`small`, `medium`, `large`)
57
+ - _Regular:_ set field `body` to the desired message as a string.
58
+ - _Sticker:_ set a field `sticker` to the desired sticker ID.
59
+ - _File or image:_ Set field `attachment` to a readable stream or an array of readable streams.
60
+ - _URL:_ set a field `url` to the desired URL.
61
+ - _Emoji:_ set field `emoji` to the desired emoji as a string and set field `emojiSize` with size of the emoji (`small`, `medium`, `large`)
64
62
 
65
63
  Note that a message can only be a regular message (which can be empty) and optionally one of the following: a sticker, an attachment or a url.
66
64
 
67
- __Tip__: to find your own ID, you can look inside the cookies. The `userID` is under the name `c_user`.
65
+ **Tip**: to find your own ID, you can look inside the cookies. The `userID` is under the name `c_user`.
68
66
 
69
- __Example (Basic Message)__
67
+ **Example (Basic Message)**
70
68
 
71
69
  ```js
72
70
  const login = require("@dongdev/fca-unofficial");
73
71
 
74
72
  login({ appState: [] }, (err, api) => {
75
- if (err) {
76
- console.error("Login Error:", err);
77
- return;
78
- }
79
-
80
- let yourID = "000000000000000"; // Replace with actual Facebook ID
81
- let msg = "Hey!";
82
-
83
- api.sendMessage(msg, yourID, (err) => {
84
- if (err) console.error("Message Sending Error:", err);
85
- else console.log("Message sent successfully!");
86
- });
73
+ if (err) {
74
+ console.error("Login Error:", err);
75
+ return;
76
+ }
77
+
78
+ let yourID = "000000000000000"; // Replace with actual Facebook ID
79
+ let msg = "Hey!";
80
+
81
+ api.sendMessage(msg, yourID, err => {
82
+ if (err) console.error("Message Sending Error:", err);
83
+ else console.log("Message sent successfully!");
84
+ });
87
85
  });
88
-
89
86
  ```
90
87
 
91
- __Example (File upload)__
88
+ **Example (File upload)**
92
89
 
93
90
  ```js
94
91
  const login = require("@dongdev/fca-unofficial");
95
92
  const fs = require("fs"); // ✅ Required the fs module
96
93
 
97
94
  login({ appState: [] }, (err, api) => {
98
- if (err) {
99
- console.error("Login Error:", err);
100
- return;
101
- }
102
-
103
- let yourID = "000000000000000"; // Replace with actual Facebook ID
104
- let imagePath = __dirname + "/image.jpg";
105
-
106
- // Check if the file exists before sending
107
- if (!fs.existsSync(imagePath)) {
108
- console.error("Error: Image file not found!");
109
- return;
110
- }
111
-
112
- let msg = {
113
- body: "Hey!",
114
- attachment: fs.createReadStream(imagePath)
115
- };
116
-
117
- api.sendMessage(msg, yourID, (err) => {
118
- if (err) console.error("Message Sending Error:", err);
119
- else console.log("Message sent successfully!");
120
- });
95
+ if (err) {
96
+ console.error("Login Error:", err);
97
+ return;
98
+ }
99
+
100
+ let yourID = "000000000000000"; // Replace with actual Facebook ID
101
+ let imagePath = __dirname + "/image.jpg";
102
+
103
+ // Check if the file exists before sending
104
+ if (!fs.existsSync(imagePath)) {
105
+ console.error("Error: Image file not found!");
106
+ return;
107
+ }
108
+
109
+ let msg = {
110
+ body: "Hey!",
111
+ attachment: fs.createReadStream(imagePath)
112
+ };
113
+
114
+ api.sendMessage(msg, yourID, err => {
115
+ if (err) console.error("Message Sending Error:", err);
116
+ else console.log("Message sent successfully!");
117
+ });
121
118
  });
122
-
123
119
  ```
124
120
 
125
121
  ---
@@ -128,7 +124,7 @@ login({ appState: [] }, (err, api) => {
128
124
 
129
125
  To avoid logging in every time you should save AppState (cookies etc.) to a file, then you can use it without having password in your scripts.
130
126
 
131
- __Example__
127
+ **Example**
132
128
 
133
129
  ```js
134
130
  const fs = require("fs");
@@ -137,20 +133,19 @@ const login = require("@dongdev/fca-unofficial");
137
133
  const credentials = { appState: [] };
138
134
 
139
135
  login(credentials, (err, api) => {
140
- if (err) {
141
- console.error("Login Error:", err);
142
- return;
143
- }
144
-
145
- try {
146
- const appState = JSON.stringify(api.getAppState(), null, 2); // Pretty print for readability
147
- fs.writeFileSync("appstate.json", appState);
148
- console.log("✅ AppState saved successfully!");
149
- } catch (error) {
150
- console.error("Error saving AppState:", error);
151
- }
136
+ if (err) {
137
+ console.error("Login Error:", err);
138
+ return;
139
+ }
140
+
141
+ try {
142
+ const appState = JSON.stringify(api.getAppState(), null, 2); // Pretty print for readability
143
+ fs.writeFileSync("appstate.json", appState);
144
+ console.log("✅ AppState saved successfully!");
145
+ } catch (error) {
146
+ console.error("Error saving AppState:", error);
147
+ }
152
148
  });
153
-
154
149
  ```
155
150
 
156
151
  Alternative: Use [c3c-fbstate](https://github.com/c3cbot/c3c-fbstate) to get fbstate.json (appstate.json)
@@ -163,50 +158,52 @@ Alternative: Use [c3c-fbstate](https://github.com/c3cbot/c3c-fbstate) to get fbs
163
158
 
164
159
  Listen watches for messages sent in a chat. By default this won't receive events (joining/leaving a chat, title change etc…) but it can be activated with `api.setOptions({listenEvents: true})`. This will by default ignore messages sent by the current account, you can enable listening to your own messages with `api.setOptions({selfListen: true})`.
165
160
 
166
- __Example__
161
+ **Example**
167
162
 
168
163
  ```js
169
164
  const fs = require("fs");
170
165
  const login = require("@dongdev/fca-unofficial");
171
166
 
172
167
  // Simple echo bot: Repeats everything you say. Stops when you say "/stop".
173
- login({ appState: JSON.parse(fs.readFileSync("appstate.json", "utf8")) }, (err, api) => {
168
+ login(
169
+ { appState: JSON.parse(fs.readFileSync("appstate.json", "utf8")) },
170
+ (err, api) => {
174
171
  if (err) {
175
- console.error("Login Error:", err);
176
- return;
172
+ console.error("Login Error:", err);
173
+ return;
177
174
  }
178
175
 
179
176
  api.setOptions({ listenEvents: true });
180
177
 
181
178
  const stopListening = api.listenMqtt((err, event) => {
182
- if (err) {
183
- console.error("Listen Error:", err);
179
+ if (err) {
180
+ console.error("Listen Error:", err);
181
+ return;
182
+ }
183
+
184
+ // Mark message as read
185
+ api.markAsRead(event.threadID, err => {
186
+ if (err) console.error("Mark as read error:", err);
187
+ });
188
+
189
+ // Handle different event types
190
+ switch (event.type) {
191
+ case "message":
192
+ if (event.body && event.body.trim().toLowerCase() === "/stop") {
193
+ api.sendMessage("Goodbye…", event.threadID);
194
+ stopListening();
184
195
  return;
185
- }
186
-
187
- // Mark message as read
188
- api.markAsRead(event.threadID, (err) => {
189
- if (err) console.error("Mark as read error:", err);
190
- });
191
-
192
- // Handle different event types
193
- switch (event.type) {
194
- case "message":
195
- if (event.body && event.body.trim().toLowerCase() === "/stop") {
196
- api.sendMessage("Goodbye…", event.threadID);
197
- stopListening();
198
- return;
199
- }
200
- api.sendMessage(`TEST BOT: ${event.body}`, event.threadID);
201
- break;
202
-
203
- case "event":
204
- console.log("Event Received:", event);
205
- break;
206
- }
196
+ }
197
+ api.sendMessage(`TEST BOT: ${event.body}`, event.threadID);
198
+ break;
199
+
200
+ case "event":
201
+ console.log("Event Received:", event);
202
+ break;
203
+ }
207
204
  });
208
- });
209
-
205
+ }
206
+ );
210
207
  ```
211
208
 
212
209
  `<a name="projects-using-this-api"></a>`
package/func/logger.js ADDED
@@ -0,0 +1,112 @@
1
+ const chalk = require("chalk");
2
+ const gradient = require("gradient-string");
3
+ const themes = [
4
+ "blue",
5
+ "dream2",
6
+ "dream",
7
+ "test",
8
+ "fiery",
9
+ "rainbow",
10
+ "pastel",
11
+ "cristal",
12
+ "red",
13
+ "aqua",
14
+ "pink",
15
+ "retro",
16
+ "sunlight",
17
+ "teen",
18
+ "summer",
19
+ "flower",
20
+ "ghost",
21
+ "hacker"
22
+ ];
23
+ const theme = themes[Math.floor(Math.random() * themes.length)];
24
+ let co;
25
+ let error;
26
+ if (theme.toLowerCase() === "blue") {
27
+ co = gradient([
28
+ { color: "#1affa3", pos: 0.2 },
29
+ { color: "cyan", pos: 0.4 },
30
+ { color: "pink", pos: 0.6 },
31
+ { color: "cyan", pos: 0.8 },
32
+ { color: "#1affa3", pos: 1 }
33
+ ]);
34
+ error = chalk.red.bold;
35
+ } else if (theme == "dream2") {
36
+ cra = gradient("blue", "pink");
37
+ co = gradient("#a200ff", "#21b5ff", "#a200ff");
38
+ } else if (theme.toLowerCase() === "dream") {
39
+ co = gradient([
40
+ { color: "blue", pos: 0.2 },
41
+ { color: "pink", pos: 0.3 },
42
+ { color: "gold", pos: 0.6 },
43
+ { color: "pink", pos: 0.8 },
44
+ { color: "blue", pos: 1 }
45
+ ]);
46
+ error = chalk.red.bold;
47
+ } else if (theme.toLowerCase() === "fiery") {
48
+ co = gradient("#fc2803", "#fc6f03", "#fcba03");
49
+ error = chalk.red.bold;
50
+ } else if (theme.toLowerCase() === "rainbow") {
51
+ co = gradient.rainbow;
52
+ error = chalk.red.bold;
53
+ } else if (theme.toLowerCase() === "pastel") {
54
+ co = gradient.pastel;
55
+ error = chalk.red.bold;
56
+ } else if (theme.toLowerCase() === "cristal") {
57
+ co = gradient.cristal;
58
+ error = chalk.red.bold;
59
+ } else if (theme.toLowerCase() === "red") {
60
+ co = gradient("red", "orange");
61
+ error = chalk.red.bold;
62
+ } else if (theme.toLowerCase() === "aqua") {
63
+ co = gradient("#0030ff", "#4e6cf2");
64
+ error = chalk.blueBright;
65
+ } else if (theme.toLowerCase() === "pink") {
66
+ cra = gradient("purple", "pink");
67
+ co = gradient("#d94fff", "purple");
68
+ } else if (theme.toLowerCase() === "retro") {
69
+ cra = gradient("#d94fff", "purple");
70
+ co = gradient.retro;
71
+ } else if (theme.toLowerCase() === "sunlight") {
72
+ cra = gradient("#f5bd31", "#f5e131");
73
+ co = gradient("orange", "#ffff00", "#ffe600");
74
+ } else if (theme.toLowerCase() === "teen") {
75
+ cra = gradient("#00a9c7", "#853858", "#853858", "#00a9c7");
76
+ co = gradient.teen;
77
+ } else if (theme.toLowerCase() === "summer") {
78
+ cra = gradient("#fcff4d", "#4de1ff");
79
+ co = gradient.summer;
80
+ } else if (theme.toLowerCase() === "flower") {
81
+ cra = gradient("blue", "purple", "yellow", "#81ff6e");
82
+ co = gradient.pastel;
83
+ } else if (theme.toLowerCase() === "ghost") {
84
+ cra = gradient("#0a658a", "#0a7f8a", "#0db5aa");
85
+ co = gradient.mind;
86
+ } else if (theme === "hacker") {
87
+ cra = chalk.hex("#4be813");
88
+ co = gradient("#47a127", "#0eed19", "#27f231");
89
+ } else {
90
+ co = gradient("#243aff", "#4687f0", "#5800d4");
91
+ error = chalk.red.bold;
92
+ }
93
+ module.exports = (text, type) => {
94
+ switch (type) {
95
+ case "warn":
96
+ process.stderr.write(co(`\r[ FCA-WARN ] > ${text}`) + "\n");
97
+ break;
98
+ case "error":
99
+ process.stderr.write(
100
+ chalk.bold.hex("#ff0000").bold(`\r[ FCA-ERROR ]`) + ` > ${text}` + "\n"
101
+ );
102
+ break;
103
+ case "info":
104
+ process.stderr.write(chalk.bold(co(`\r[ FCA-UNO ] > ${text}`) + "\n"));
105
+ break;
106
+ default:
107
+ process.stderr.write(
108
+ chalk.bold(co(`\r${String(type).toUpperCase()} ${text}`) + "\n")
109
+ );
110
+ break;
111
+ }
112
+ };