@cexy/hoonfca 1.0.0 → 1.0.2

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 (98) hide show
  1. package/.travis.yml +6 -0
  2. package/LICENSE-MIT +21 -0
  3. package/index.d.ts +620 -0
  4. package/index.js +745 -433
  5. package/package.json +45 -6
  6. package/src/addExternalModule.js +14 -16
  7. package/src/addUserToGroup.js +45 -30
  8. package/src/changeAdminStatus.js +39 -42
  9. package/src/changeApprovalMode.js +79 -0
  10. package/src/changeArchivedStatus.js +19 -15
  11. package/src/changeBio.js +18 -16
  12. package/src/changeBlockedStatus.js +14 -12
  13. package/src/changeBlockedStatusMqtt.js +38 -17
  14. package/src/changeGroupImage.js +100 -77
  15. package/src/changeNickname.js +12 -11
  16. package/src/changeThreadColor.js +25 -16
  17. package/src/changeThreadEmoji.js +11 -10
  18. package/src/createNewGroup.js +21 -14
  19. package/src/createPoll.js +87 -21
  20. package/src/deleteMessage.js +18 -17
  21. package/src/deleteThread.js +18 -17
  22. package/src/editMessage.js +28 -31
  23. package/src/forwardAttachment.js +22 -19
  24. package/src/forwardMessage.js +63 -0
  25. package/src/getCurrentUserID.js +4 -2
  26. package/src/getEmojiUrl.js +20 -9
  27. package/src/getFriendsList.js +21 -18
  28. package/src/getGroupsList.js +83 -0
  29. package/src/getMarketplace.js +84 -0
  30. package/src/getNotifications.js +86 -0
  31. package/src/getPagesList.js +83 -0
  32. package/src/getStories.js +88 -0
  33. package/src/getThreadHistory.js +277 -126
  34. package/src/getThreadInfo.js +143 -115
  35. package/src/getThreadList.js +216 -143
  36. package/src/getThreadPictures.js +26 -32
  37. package/src/getUserID.js +13 -14
  38. package/src/getUserInfo.js +107 -68
  39. package/src/handleFriendRequest.js +16 -15
  40. package/src/handleMessageRequest.js +15 -15
  41. package/src/httpGet.js +36 -31
  42. package/src/httpPost.js +36 -31
  43. package/src/listenMqtt.js +705 -370
  44. package/src/logout.js +26 -28
  45. package/src/markAsDelivered.js +22 -17
  46. package/src/markAsRead.js +63 -49
  47. package/src/markAsReadAll.js +17 -13
  48. package/src/markAsSeen.js +23 -19
  49. package/src/muteThread.js +17 -14
  50. package/src/pinMessage.js +23 -22
  51. package/src/removeUserFromGroup.js +42 -22
  52. package/src/resolvePhotoUrl.js +15 -17
  53. package/src/searchForThread.js +18 -20
  54. package/src/searchUsers.js +89 -0
  55. package/src/sendComment.js +161 -0
  56. package/src/sendMessage.js +65 -52
  57. package/src/sendTypingIndicator.js +173 -48
  58. package/src/setBio.js +86 -0
  59. package/src/setMessageReaction.js +76 -16
  60. package/src/setPostReaction.js +29 -61
  61. package/src/setTheme.js +313 -0
  62. package/src/setTitle.js +27 -37
  63. package/src/shareContact.js +34 -82
  64. package/src/shareLink.js +56 -99
  65. package/src/threadColors.js +35 -97
  66. package/src/unfriend.js +15 -20
  67. package/src/unsendMessage.js +71 -18
  68. package/utils.js +1000 -472
  69. package/README.md +0 -83
  70. package/replit.nix +0 -3
  71. package/src/changeAvatar.js +0 -89
  72. package/src/changeCover.js +0 -92
  73. package/src/changeName.js +0 -106
  74. package/src/changeUsername.js +0 -80
  75. package/src/createCommentPost.js +0 -196
  76. package/src/createPost.js +0 -285
  77. package/src/data/getThreadInfo.json +0 -1
  78. package/src/follow.js +0 -71
  79. package/src/getAccess.js +0 -130
  80. package/src/getAvatarUser.js +0 -88
  81. package/src/getBotInitialData.js +0 -59
  82. package/src/getCtx.js +0 -5
  83. package/src/getMessage.js +0 -827
  84. package/src/getOptions.js +0 -5
  85. package/src/getRegion.js +0 -7
  86. package/src/getThreadHistoryDeprecated.js +0 -95
  87. package/src/getThreadInfoDeprecated.js +0 -77
  88. package/src/getThreadListDeprecated.js +0 -86
  89. package/src/httpPostFormData.js +0 -58
  90. package/src/listenNotification.js +0 -96
  91. package/src/refreshFb_dtsg.js +0 -75
  92. package/src/searchStickers.js +0 -59
  93. package/src/sendMessageMqtt.js +0 -326
  94. package/src/setMessageReactionMqtt.js +0 -74
  95. package/src/setProfileGuard.js +0 -66
  96. package/src/setStoryReaction.js +0 -97
  97. package/src/stopListenMqtt.js +0 -47
  98. package/src/uploadAttachment.js +0 -98
@@ -1,10 +1,18 @@
1
1
  "use strict";
2
2
 
3
- const { generateOfflineThreadingID, getGUID } = require("../utils.js");
3
+ const {
4
+ generateOfflineThreadingID,
5
+ getCurrentTimestamp,
6
+ getGUID,
7
+ } = require("../utils");
4
8
 
5
- // নিরাপদ ফাংশন চেকিং (আগের Reflect.apply বাগটি ফিক্স করা হয়েছে)
6
9
  function isCallable(func) {
7
- return typeof func === "function";
10
+ try {
11
+ Reflect.apply(func, null, []);
12
+ return true;
13
+ } catch (error) {
14
+ return false;
15
+ }
8
16
  }
9
17
 
10
18
  module.exports = function (defaultFuncs, api, ctx) {
@@ -16,15 +24,26 @@ module.exports = function (defaultFuncs, api, ctx) {
16
24
  ctx.wsReqNumber += 1;
17
25
  ctx.wsTaskNumber += 1;
18
26
 
19
- let userBlockAction;
27
+ const label = "334";
28
+ let userBlockAction = 0;
20
29
 
21
- // টাইপ ও স্টেটাসের ওপর ভিত্তি করে অ্যাকশন আইডি নির্ধারণ
22
- if (type === "messenger") {
23
- userBlockAction = status ? 1 : 0; // 1 = Block, 0 = Unblock
24
- } else if (type === "facebook") {
25
- userBlockAction = status ? 3 : 2; // 3 = Block, 2 = Unblock
26
- } else {
27
- throw new Error("Invalid type");
30
+ switch (type) {
31
+ case "messenger":
32
+ if (status) {
33
+ userBlockAction = 1; // Block
34
+ } else {
35
+ userBlockAction = 0; // Unblock
36
+ }
37
+ break;
38
+ case "facebook":
39
+ if (status) {
40
+ userBlockAction = 3; // Block
41
+ } else {
42
+ userBlockAction = 2; // Unblock
43
+ }
44
+ break;
45
+ default:
46
+ throw new Error("Invalid type");
28
47
  }
29
48
 
30
49
  const taskPayload = {
@@ -33,10 +52,13 @@ module.exports = function (defaultFuncs, api, ctx) {
33
52
  user_block_action: userBlockAction,
34
53
  };
35
54
 
55
+ const payload = JSON.stringify(taskPayload);
56
+ const version = "25393437286970779";
57
+
36
58
  const task = {
37
59
  failure_count: null,
38
- label: "334",
39
- payload: JSON.stringify(taskPayload),
60
+ label: label,
61
+ payload: payload,
40
62
  queue_name: "native_sync_block",
41
63
  task_id: ctx.wsTaskNumber,
42
64
  };
@@ -45,18 +67,17 @@ module.exports = function (defaultFuncs, api, ctx) {
45
67
  app_id: "2220391788200892",
46
68
  payload: JSON.stringify({
47
69
  tasks: [task],
48
- epoch_id: parseInt(generateOfflineThreadingID(), 10), // radix 10 যোগ করা হয়েছে সেফটির জন্য
49
- version_id: "25393437286970779",
70
+ epoch_id: parseInt(generateOfflineThreadingID()),
71
+ version_id: version,
50
72
  }),
51
73
  request_id: ctx.wsReqNumber,
52
74
  type: 3,
53
75
  };
54
76
 
55
77
  if (isCallable(callback)) {
56
- ctx.reqCallbacks[ctx.wsReqNumber] = callback;
78
+ // to be implemented
57
79
  }
58
80
 
59
- // MQTT ব্রোকারে রিকোয়েস্ট পাবলিশ করা হচ্ছে
60
81
  ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
61
82
  qos: 1,
62
83
  retain: false,
@@ -1,109 +1,132 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+ var bluebird = require("bluebird");
4
6
 
5
7
  module.exports = function (defaultFuncs, api, ctx) {
6
-
7
- // ইমেজ আপলোড করার ইন্টারনাল হেল্পার ফাংশন
8
- async function handleUpload(image) {
9
- const form = {
8
+ function handleUpload(image, callback) {
9
+ var uploads = [];
10
+
11
+ var form = {
10
12
  images_only: "true",
11
13
  "attachment[]": image,
12
14
  };
13
15
 
14
- const resData = await defaultFuncs.postFormData(
15
- "https://upload.facebook.com/ajax/mercury/upload.php",
16
- ctx.jar,
17
- form,
18
- {}
16
+ uploads.push(
17
+ defaultFuncs
18
+ .postFormData(
19
+ "https://upload.facebook.com/ajax/mercury/upload.php",
20
+ ctx.jar,
21
+ form,
22
+ {},
23
+ )
24
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
25
+ .then(function (resData) {
26
+ if (resData.error) {
27
+ throw resData;
28
+ }
29
+
30
+ return resData.payload.metadata[0];
31
+ }),
19
32
  );
20
-
21
- const checkedData = utils.parseAndCheckLogin(ctx, defaultFuncs)(resData);
22
- if (checkedData.error) throw checkedData;
23
33
 
24
- return checkedData.payload.metadata[0];
34
+ // resolve all promises
35
+ bluebird
36
+ .all(uploads)
37
+ .then(function (resData) {
38
+ callback(null, resData);
39
+ })
40
+ .catch(function (err) {
41
+ log.error("handleUpload", err);
42
+ return callback(err);
43
+ });
25
44
  }
26
45
 
27
46
  return function changeGroupImage(image, threadID, callback) {
28
- const threadIDType = utils.getType(threadID);
29
-
30
- if (!callback && (threadIDType === "Function" || threadIDType === "AsyncFunction")) {
47
+ if (
48
+ !callback &&
49
+ (utils.getType(threadID) === "Function" ||
50
+ utils.getType(threadID) === "AsyncFunction")
51
+ ) {
31
52
  throw { error: "please pass a threadID as a second argument." };
32
53
  }
33
54
 
34
- if (!utils.isReadableStream(image)) {
35
- throw { error: "please pass a readable stream as a first argument." };
36
- }
37
-
38
- let resolveFunc = () => {};
39
- let rejectFunc = () => {};
40
- const returnPromise = new Promise((resolve, reject) => {
55
+ var resolveFunc = function () {};
56
+ var rejectFunc = function () {};
57
+ var returnPromise = new Promise(function (resolve, reject) {
41
58
  resolveFunc = resolve;
42
59
  rejectFunc = reject;
43
60
  });
44
61
 
45
62
  if (!callback) {
46
63
  callback = function (err) {
47
- if (err) return rejectFunc(err);
64
+ if (err) {
65
+ return rejectFunc(err);
66
+ }
48
67
  resolveFunc();
49
68
  };
50
69
  }
51
70
 
52
- // অ্যাসিনক্রোনাস কাজগুলো প্রপারলি প্রসেস করার জন্য IIFE async ফাংশন
53
- (async () => {
54
- try {
55
- const messageAndOTID = utils.generateOfflineThreadingID();
56
- const form = {
57
- client: "mercury",
58
- action_type: "ma-type:log-message",
59
- author: "fbid:" + ctx.userID,
60
- author_email: "",
61
- ephemeral_ttl_mode: "0",
62
- is_filtered_content: false,
63
- is_filtered_content_account: false,
64
- is_filtered_content_bh: false,
65
- is_filtered_content_invalid_app: false,
66
- is_filtered_content_quasar: false,
67
- is_forward: false,
68
- is_spoof_warning: false,
69
- is_unread: false,
70
- log_message_type: "log:thread-image",
71
- manual_retry_cnt: "0",
72
- message_id: messageAndOTID,
73
- offline_threading_id: messageAndOTID,
74
- source: "source:chat:web",
75
- "source_tags[0]": "source:chat",
76
- status: "0",
77
- thread_fbid: threadID,
78
- thread_id: "",
79
- timestamp: Date.now(),
80
- timestamp_absolute: "Today",
81
- timestamp_relative: utils.generateTimestampRelative(),
82
- timestamp_time_passed: "0",
83
- };
84
-
85
- // ১. ইমেজ আপলোড করে মেটাডাটা নেওয়া হচ্ছে
86
- const uploadPayload = await handleUpload(image);
87
-
88
- form["thread_image_id"] = uploadPayload["image_id"];
89
- form["thread_id"] = threadID;
90
-
91
- // ২. চ্যাট গ্রুপের ইমেজ সেট করার রিকোয়েস্ট
92
- const resData = await defaultFuncs.post(
93
- "https://www.facebook.com/messaging/set_thread_image/",
94
- ctx.jar,
95
- form
96
- );
97
-
98
- const checkedResult = utils.parseAndCheckLogin(ctx, defaultFuncs)(resData);
99
- if (checkedResult.error) throw checkedResult;
71
+ var messageAndOTID = utils.generateOfflineThreadingID();
72
+ var form = {
73
+ client: "mercury",
74
+ action_type: "ma-type:log-message",
75
+ author: "fbid:" + ctx.userID,
76
+ author_email: "",
77
+ ephemeral_ttl_mode: "0",
78
+ is_filtered_content: false,
79
+ is_filtered_content_account: false,
80
+ is_filtered_content_bh: false,
81
+ is_filtered_content_invalid_app: false,
82
+ is_filtered_content_quasar: false,
83
+ is_forward: false,
84
+ is_spoof_warning: false,
85
+ is_unread: false,
86
+ log_message_type: "log:thread-image",
87
+ manual_retry_cnt: "0",
88
+ message_id: messageAndOTID,
89
+ offline_threading_id: messageAndOTID,
90
+ source: "source:chat:web",
91
+ "source_tags[0]": "source:chat",
92
+ status: "0",
93
+ thread_fbid: threadID,
94
+ thread_id: "",
95
+ timestamp: Date.now(),
96
+ timestamp_absolute: "Today",
97
+ timestamp_relative: utils.generateTimestampRelative(),
98
+ timestamp_time_passed: "0",
99
+ };
100
100
 
101
- return callback();
102
- } catch (err) {
103
- utils.error("changeGroupImage", err);
101
+ handleUpload(image, function (err, payload) {
102
+ if (err) {
104
103
  return callback(err);
105
104
  }
106
- })();
105
+
106
+ form["thread_image_id"] = payload[0]["image_id"];
107
+ form["thread_id"] = threadID;
108
+
109
+ defaultFuncs
110
+ .post(
111
+ "https://www.facebook.com/messaging/set_thread_image/",
112
+ ctx.jar,
113
+ form,
114
+ )
115
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
116
+ .then(function (resData) {
117
+ // check for errors here
118
+
119
+ if (resData.error) {
120
+ throw resData;
121
+ }
122
+
123
+ return callback();
124
+ })
125
+ .catch(function (err) {
126
+ log.error("changeGroupImage", err);
127
+ return callback(err);
128
+ });
129
+ });
107
130
 
108
131
  return returnPromise;
109
132
  };
@@ -1,25 +1,27 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function changeNickname(nickname, threadID, participantID, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ var resolveFunc = function () {};
9
+ var rejectFunc = function () {};
10
+ var returnPromise = new Promise(function (resolve, reject) {
10
11
  resolveFunc = resolve;
11
12
  rejectFunc = reject;
12
13
  });
13
-
14
14
  if (!callback) {
15
15
  callback = function (err) {
16
- if (err) return rejectFunc(err);
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
17
19
  resolveFunc();
18
20
  };
19
21
  }
20
22
 
21
- const form = {
22
- nickname, // ES6 property shorthand
23
+ var form = {
24
+ nickname: nickname,
23
25
  participant_id: participantID,
24
26
  thread_or_other_fbid: threadID,
25
27
  };
@@ -28,11 +30,10 @@ module.exports = function (defaultFuncs, api, ctx) {
28
30
  .post(
29
31
  "https://www.facebook.com/messaging/save_thread_nickname/?source=thread_settings&dpr=1",
30
32
  ctx.jar,
31
- form
33
+ form,
32
34
  )
33
35
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
34
36
  .then(function (resData) {
35
- // স্ট্রিক্ট কম্প্যারিসন (===) ব্যবহার করে এরর কোড চেক করা হচ্ছে
36
37
  if (resData.error === 1545014) {
37
38
  throw { error: "Trying to change nickname of user isn't in thread" };
38
39
  }
@@ -49,7 +50,7 @@ module.exports = function (defaultFuncs, api, ctx) {
49
50
  return callback();
50
51
  })
51
52
  .catch(function (err) {
52
- utils.error("changeNickname", err);
53
+ log.error("changeNickname", err);
53
54
  return callback(err);
54
55
  });
55
56
 
@@ -1,33 +1,42 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function changeThreadColor(color, threadID, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ var resolveFunc = function () {};
9
+ var rejectFunc = function () {};
10
+ var returnPromise = new Promise(function (resolve, reject) {
10
11
  resolveFunc = resolve;
11
12
  rejectFunc = reject;
12
13
  });
13
14
 
14
15
  if (!callback) {
15
16
  callback = function (err) {
16
- if (err) return rejectFunc(err);
17
- resolveFunc();
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(err);
18
21
  };
19
22
  }
20
23
 
21
- // কালার ভ্যালিডেশন এবং ফরম্যাটিং (Bug Fix)
22
- let validatedColor = color;
23
- if (color !== null && color !== undefined) {
24
- validatedColor = !isNaN(color) ? color.toString().toLowerCase() : color.toLowerCase();
25
- }
24
+ var validatedColor = color !== null ? color.toLowerCase() : color; // API only accepts lowercase letters in hex string
25
+ var colorList = Object.keys(api.threadColors).map(function (name) {
26
+ return api.threadColors[name];
27
+ });
28
+ // if (!colorList.includes(validatedColor)) {
29
+ // throw {
30
+ // error:
31
+ // "The color you are trying to use is not a valid thread color. Use api.threadColors to find acceptable values.",
32
+ // };
33
+ // }
26
34
 
27
- const form = {
35
+ var form = {
28
36
  dpr: 1,
29
37
  queries: JSON.stringify({
30
38
  o0: {
39
+ //This doc_id is valid as of January 31, 2020
31
40
  doc_id: "1727493033983591",
32
41
  query_params: {
33
42
  data: {
@@ -46,14 +55,14 @@ module.exports = function (defaultFuncs, api, ctx) {
46
55
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
47
56
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
48
57
  .then(function (resData) {
49
- // এরর রেজাল্ট চেক করা হচ্ছে
50
- if (resData[resData.length - 1]?.error_results > 0) {
51
- throw new utils.CustomError(resData[0].o0.errors);
58
+ if (resData[resData.length - 1].error_results > 0) {
59
+ throw resData[0].o0.errors;
52
60
  }
61
+
53
62
  return callback();
54
63
  })
55
64
  .catch(function (err) {
56
- utils.error("changeThreadColor", err);
65
+ log.error("changeThreadColor", err);
57
66
  return callback(err);
58
67
  });
59
68
 
@@ -1,24 +1,26 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function changeThreadEmoji(emoji, threadID, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ var resolveFunc = function () {};
9
+ var rejectFunc = function () {};
10
+ var returnPromise = new Promise(function (resolve, reject) {
10
11
  resolveFunc = resolve;
11
12
  rejectFunc = reject;
12
13
  });
13
14
 
14
15
  if (!callback) {
15
16
  callback = function (err) {
16
- if (err) return rejectFunc(err);
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
17
20
  resolveFunc();
18
21
  };
19
22
  }
20
-
21
- const form = {
23
+ var form = {
22
24
  emoji_choice: emoji,
23
25
  thread_or_other_fbid: threadID,
24
26
  };
@@ -27,11 +29,10 @@ module.exports = function (defaultFuncs, api, ctx) {
27
29
  .post(
28
30
  "https://www.facebook.com/messaging/save_thread_emoji/?source=thread_settings&__pc=EXP1%3Amessengerdotcom_pkg",
29
31
  ctx.jar,
30
- form
32
+ form,
31
33
  )
32
34
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
33
35
  .then(function (resData) {
34
- // স্ট্রিক্ট কম্প্যারিসন (===) ব্যবহার করা হয়েছে
35
36
  if (resData.error === 1357031) {
36
37
  throw {
37
38
  error:
@@ -45,7 +46,7 @@ module.exports = function (defaultFuncs, api, ctx) {
45
46
  return callback();
46
47
  })
47
48
  .catch(function (err) {
48
- utils.error("changeThreadEmoji", err);
49
+ log.error("changeThreadEmoji", err);
49
50
  return callback(err);
50
51
  });
51
52
 
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function createNewGroup(participantIDs, groupTitle, callback) {
7
- // groupTitle-এর জায়গায় ফাংশন পাস করলে তা কলব্যাক হিসেবে সেট হচ্ছে
8
- if (utils.getType(groupTitle) === "Function") {
8
+ if (utils.getType(groupTitle) == "Function") {
9
9
  callback = groupTitle;
10
10
  groupTitle = null;
11
11
  }
@@ -20,28 +20,35 @@ module.exports = function (defaultFuncs, api, ctx) {
20
20
  };
21
21
  }
22
22
 
23
- let resolveFunc = () => {};
24
- let rejectFunc = () => {};
25
- const returnPromise = new Promise((resolve, reject) => {
23
+ var resolveFunc = function () {};
24
+ var rejectFunc = function () {};
25
+ var returnPromise = new Promise(function (resolve, reject) {
26
26
  resolveFunc = resolve;
27
27
  rejectFunc = reject;
28
28
  });
29
29
 
30
30
  if (!callback) {
31
31
  callback = function (err, threadID) {
32
- if (err) return rejectFunc(err);
32
+ if (err) {
33
+ return rejectFunc(err);
34
+ }
33
35
  resolveFunc(threadID);
34
36
  };
35
37
  }
36
38
 
37
- // map() ব্যবহার করে দ্রুত এবং ক্লিন উপায়ে পার্টিসিপেন্ট অবজেক্ট অ্যারে তৈরি
38
- const pids = participantIDs.map(id => ({ fbid: id }));
39
- pids.push({ fbid: ctx.userID }); // বটের নিজের আইডি যুক্ত করা হলো
39
+ var pids = [];
40
+ for (var n in participantIDs) {
41
+ pids.push({
42
+ fbid: participantIDs[n],
43
+ });
44
+ }
45
+ pids.push({ fbid: ctx.userID });
40
46
 
41
- const form = {
47
+ var form = {
42
48
  fb_api_caller_class: "RelayModern",
43
49
  fb_api_req_friendly_name: "MessengerGroupCreateMutation",
44
50
  av: ctx.userID,
51
+ //This doc_id is valid as of January 11th, 2020
45
52
  doc_id: "577041672419534",
46
53
  variables: JSON.stringify({
47
54
  input: {
@@ -65,14 +72,14 @@ module.exports = function (defaultFuncs, api, ctx) {
65
72
  if (resData.errors) {
66
73
  throw resData;
67
74
  }
68
- // সফলভাবে গ্রুপ তৈরি হলে নতুন থ্রেড আইডি (Thread ID) রিটার্ন করা হচ্ছে
69
75
  return callback(
70
76
  null,
71
- resData.data.messenger_group_thread_create.thread.thread_key.thread_fbid
77
+ resData.data.messenger_group_thread_create.thread.thread_key
78
+ .thread_fbid,
72
79
  );
73
80
  })
74
81
  .catch(function (err) {
75
- utils.error("createNewGroup", err);
82
+ log.error("createNewGroup", err);
76
83
  return callback(err);
77
84
  });
78
85