metacord 0.0.1-security → 1.2.0-Beta
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.
Potentially problematic release.
This version of metacord might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/MetaCord_Config.json +11 -0
- package/MetaCord_Database/Database.sqlite +0 -0
- package/MetaCord_Database/Do not delete this folder or any of the files in it +0 -0
- package/README.md +207 -5
- package/index.js +678 -0
- package/logger.js +16 -0
- package/package.json +38 -3
- package/src/addExternalModule.js +16 -0
- package/src/addUserToGroup.js +78 -0
- package/src/changeAdminStatus.js +78 -0
- package/src/changeArchivedStatus.js +41 -0
- package/src/changeBio.js +65 -0
- package/src/changeBlockedStatus.js +36 -0
- package/src/changeGroupImage.js +106 -0
- package/src/changeNickname.js +45 -0
- package/src/changeThreadColor.js +62 -0
- package/src/changeThreadEmoji.js +42 -0
- package/src/createNewGroup.js +70 -0
- package/src/createPoll.js +60 -0
- package/src/deleteMessage.js +45 -0
- package/src/deleteThread.js +43 -0
- package/src/forwardAttachment.js +48 -0
- package/src/getCurrentUserID.js +7 -0
- package/src/getEmojiUrl.js +27 -0
- package/src/getFriendsList.js +73 -0
- package/src/getOnlineTime.js +31 -0
- package/src/getThreadHistory.js +193 -0
- package/src/getThreadInfo.js +197 -0
- package/src/getThreadList.js +213 -0
- package/src/getThreadPictures.js +59 -0
- package/src/getUID.js +57 -0
- package/src/getUserID.js +62 -0
- package/src/getUserInfo.js +66 -0
- package/src/handleFriendRequest.js +49 -0
- package/src/handleMessageRequest.js +49 -0
- package/src/httpGet.js +49 -0
- package/src/httpPost.js +48 -0
- package/src/httpPostFormData.js +41 -0
- package/src/listenMqtt.js +634 -0
- package/src/logout.js +68 -0
- package/src/markAsDelivered.js +48 -0
- package/src/markAsRead.js +70 -0
- package/src/markAsReadAll.js +43 -0
- package/src/markAsSeen.js +51 -0
- package/src/muteThread.js +47 -0
- package/src/removeUserFromGroup.js +49 -0
- package/src/resolvePhotoUrl.js +37 -0
- package/src/searchForThread.js +43 -0
- package/src/sendMessage.js +334 -0
- package/src/sendTypingIndicator.js +80 -0
- package/src/setMessageReaction.js +109 -0
- package/src/setPostReaction.js +102 -0
- package/src/setTitle.js +74 -0
- package/src/threadColors.js +39 -0
- package/src/unfriend.js +43 -0
- package/src/unsendMessage.js +40 -0
- package/utils/Database.js +42 -0
- package/utils/Extension.js +143 -0
- package/utils/Html/MetaCord.png +0 -0
- package/utils/Html/index.html +200 -0
- package/utils/StateCrypt.js +53 -0
- package/utils.js +1249 -0
    
        package/logger.js
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            const chalk = require('chalk');
         | 
| 2 | 
            +
            //const notifier = require('node-notifier');
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module.exports = (str, end) => {
         | 
| 5 | 
            +
            	console.log(chalk.hex('#00FFCC').bold(`${end || '[ MetaCord ]'} • `) + str);
         | 
| 6 | 
            +
            };
         | 
| 7 | 
            +
            module.exports.onLogger = (str,end,ctscolor) => { 
         | 
| 8 | 
            +
            	var checkbutdak = ctscolor.replace("#",'');
         | 
| 9 | 
            +
            	if (ctscolor.indexOf('#') != 1) {
         | 
| 10 | 
            +
            		console.log(chalk.hex('#00FFCC').bold(`${end || '[ MetaCord ]'} • `) + str);
         | 
| 11 | 
            +
            	}
         | 
| 12 | 
            +
            	else if (!isNaN(checkbutdak)) {
         | 
| 13 | 
            +
            		console.log(chalk.hex('#00FFCC').bold(`${end || '[ MetaCord ]'} • `) + str);
         | 
| 14 | 
            +
            	} 
         | 
| 15 | 
            +
            	else console.log(chalk.hex('#00FFCC').bold(`${end || '[ MetaCord ]'} • `) + str);
         | 
| 16 | 
            +
            }
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,6 +1,41 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "metacord",
         | 
| 3 | 
            -
              "version": " | 
| 4 | 
            -
              "description": " | 
| 5 | 
            -
              " | 
| 3 | 
            +
              "version": "1.2.0-Beta",
         | 
| 4 | 
            +
              "description": "Facebook Chat API",
         | 
| 5 | 
            +
              "author": "Avery, David, Maude, Benjamin, ShinTHL09, KanzuWakazaki, Disme, NTKhang",
         | 
| 6 | 
            +
              "dependencies": {
         | 
| 7 | 
            +
                "aes-js": "^3.1.2",
         | 
| 8 | 
            +
                "axios": "latest",
         | 
| 9 | 
            +
                "better-sqlite3": "latest",
         | 
| 10 | 
            +
                "bluebird": "^2.11.0",
         | 
| 11 | 
            +
                "chalk": "4.1.2",
         | 
| 12 | 
            +
                "chalkercli": "^1.6.4",
         | 
| 13 | 
            +
                "cheerio": "latest",
         | 
| 14 | 
            +
                "crypto": "^1.0.1",
         | 
| 15 | 
            +
                "dotenv": "^16.0.1",
         | 
| 16 | 
            +
                "express": "latest",
         | 
| 17 | 
            +
                "figlet": "^1.5.2",
         | 
| 18 | 
            +
                "https-proxy-agent": "latest",
         | 
| 19 | 
            +
                "mqtt": "latest",
         | 
| 20 | 
            +
                "npmlog": "latest",
         | 
| 21 | 
            +
                "os": "^0.1.2",
         | 
| 22 | 
            +
                "request": "latest",
         | 
| 23 | 
            +
                "semver": "latest",
         | 
| 24 | 
            +
                "websocket-stream": "latest"
         | 
| 25 | 
            +
              },
         | 
| 26 | 
            +
              "engines": {
         | 
| 27 | 
            +
                "node": ">=14.x"
         | 
| 28 | 
            +
              },
         | 
| 29 | 
            +
              "keywords": [
         | 
| 30 | 
            +
                "facebook",
         | 
| 31 | 
            +
                "chat",
         | 
| 32 | 
            +
                "api",
         | 
| 33 | 
            +
                "metacord"
         | 
| 34 | 
            +
              ],
         | 
| 35 | 
            +
              "license": "MIT",
         | 
| 36 | 
            +
              "scripts": {
         | 
| 37 | 
            +
                "lint": "eslint **.js",
         | 
| 38 | 
            +
                "prettier": "prettier utils.js src/* --write",
         | 
| 39 | 
            +
                "test": "mocha"
         | 
| 40 | 
            +
              }
         | 
| 6 41 | 
             
            }
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            const utils = require("../utils");
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 6 | 
            +
              return function addExternalModule(moduleObj) {
         | 
| 7 | 
            +
                if (utils.getType(moduleObj) == "Object") {
         | 
| 8 | 
            +
                  for (let apiName in moduleObj) {
         | 
| 9 | 
            +
                    if (utils.getType(moduleObj[apiName]) == "Function") api[apiName] = moduleObj[apiName](defaultFuncs, api, ctx);
         | 
| 10 | 
            +
                    else throw new Error(`Item "${apiName}" in moduleObj must be a function, not ${utils.getType(moduleObj[apiName])}!`);
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  }
         | 
| 13 | 
            +
                }
         | 
| 14 | 
            +
                else throw new Error(`moduleObj must be an object, not ${utils.getType(moduleObj)}!`);
         | 
| 15 | 
            +
              };
         | 
| 16 | 
            +
            };
         | 
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function addUserToGroup(userID, threadID, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (!callback && (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction")) throw { error: "please pass a threadID as a second argument." };
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                if (!callback) {
         | 
| 18 | 
            +
                  callback = function (err) {
         | 
| 19 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 20 | 
            +
                    resolveFunc();
         | 
| 21 | 
            +
                  };
         | 
| 22 | 
            +
                }
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                if (utils.getType(threadID) !== "Number" && utils.getType(threadID) !== "String") throw { error: "ThreadID should be of type Number or String and not " + utils.getType(threadID) + "." };
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                if (utils.getType(userID) !== "Array") userID = [userID];
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                var messageAndOTID = utils.generateOfflineThreadingID();
         | 
| 29 | 
            +
                var form = {
         | 
| 30 | 
            +
                  client: "mercury",
         | 
| 31 | 
            +
                  action_type: "ma-type:log-message",
         | 
| 32 | 
            +
                  author: "fbid:" + ctx.userID,
         | 
| 33 | 
            +
                  thread_id: "",
         | 
| 34 | 
            +
                  timestamp: Date.now(),
         | 
| 35 | 
            +
                  timestamp_absolute: "Today",
         | 
| 36 | 
            +
                  timestamp_relative: utils.generateTimestampRelative(),
         | 
| 37 | 
            +
                  timestamp_time_passed: "0",
         | 
| 38 | 
            +
                  is_unread: false,
         | 
| 39 | 
            +
                  is_cleared: false,
         | 
| 40 | 
            +
                  is_forward: false,
         | 
| 41 | 
            +
                  is_filtered_content: false,
         | 
| 42 | 
            +
                  is_filtered_content_bh: false,
         | 
| 43 | 
            +
                  is_filtered_content_account: false,
         | 
| 44 | 
            +
                  is_spoof_warning: false,
         | 
| 45 | 
            +
                  source: "source:chat:web",
         | 
| 46 | 
            +
                  "source_tags[0]": "source:chat",
         | 
| 47 | 
            +
                  log_message_type: "log:subscribe",
         | 
| 48 | 
            +
                  status: "0",
         | 
| 49 | 
            +
                  offline_threading_id: messageAndOTID,
         | 
| 50 | 
            +
                  message_id: messageAndOTID,
         | 
| 51 | 
            +
                  threading_id: utils.generateThreadingID(ctx.clientID),
         | 
| 52 | 
            +
                  manual_retry_cnt: "0",
         | 
| 53 | 
            +
                  thread_fbid: threadID
         | 
| 54 | 
            +
                };
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                for (var i = 0; i < userID.length; i++) {
         | 
| 57 | 
            +
                  if (utils.getType(userID[i]) !== "Number" && utils.getType(userID[i]) !== "String") throw { error: "Elements of userID should be of type Number or String and not " + utils.getType(userID[i]) + "." };
         | 
| 58 | 
            +
                  form["log_message_data[added_participants][" + i + "]"] = "fbid:" + userID[i];
         | 
| 59 | 
            +
                }
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                defaultFuncs
         | 
| 62 | 
            +
                  .post("https://www.facebook.com/messaging/send/", ctx.jar, form)
         | 
| 63 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 64 | 
            +
                  .then(function (resData) {
         | 
| 65 | 
            +
                    if (!resData) throw { error: "Add to group failed." };
         | 
| 66 | 
            +
                    if (resData.error) throw resData;
         | 
| 67 | 
            +
             | 
| 68 | 
            +
             | 
| 69 | 
            +
                    return callback();
         | 
| 70 | 
            +
                  })
         | 
| 71 | 
            +
                  .catch(function (err) {
         | 
| 72 | 
            +
                    log.error("addUserToGroup", err);
         | 
| 73 | 
            +
                    return callback(err);
         | 
| 74 | 
            +
                  });
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                return returnPromise;
         | 
| 77 | 
            +
              };
         | 
| 78 | 
            +
            };
         | 
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            const utils = require("../utils");
         | 
| 4 | 
            +
            const log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function(defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeAdminStatus(threadID, adminIDs, adminStatus, callback) {
         | 
| 8 | 
            +
                if (utils.getType(threadID) !== "String") {
         | 
| 9 | 
            +
                  throw {error: "changeAdminStatus: threadID must be a string"};
         | 
| 10 | 
            +
                }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                if (utils.getType(adminIDs) === "String") {
         | 
| 13 | 
            +
                  adminIDs = [adminIDs];
         | 
| 14 | 
            +
                }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                if (utils.getType(adminIDs) !== "Array") {
         | 
| 17 | 
            +
                  throw {error: "changeAdminStatus: adminIDs must be an array or string"};
         | 
| 18 | 
            +
                }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                if (utils.getType(adminStatus) !== "Boolean") {
         | 
| 21 | 
            +
                  throw {error: "changeAdminStatus: adminStatus must be a string"};
         | 
| 22 | 
            +
                }
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                var resolveFunc = function(){};
         | 
| 25 | 
            +
                var rejectFunc = function(){};
         | 
| 26 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 27 | 
            +
                  resolveFunc = resolve;
         | 
| 28 | 
            +
                  rejectFunc = reject;
         | 
| 29 | 
            +
                });
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                if (!callback) {
         | 
| 32 | 
            +
                  callback = function (err) {
         | 
| 33 | 
            +
                    if (err) {
         | 
| 34 | 
            +
                      return rejectFunc(err);
         | 
| 35 | 
            +
                    }
         | 
| 36 | 
            +
                    resolveFunc();
         | 
| 37 | 
            +
                  };
         | 
| 38 | 
            +
                }
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
         | 
| 41 | 
            +
                  throw {error: "changeAdminStatus: callback is not a function"};
         | 
| 42 | 
            +
                }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                let form = {
         | 
| 45 | 
            +
                  "thread_fbid": threadID,
         | 
| 46 | 
            +
                };
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                let i = 0;
         | 
| 49 | 
            +
                for (let u of adminIDs) {
         | 
| 50 | 
            +
                  form[`admin_ids[${i++}]`] = u;
         | 
| 51 | 
            +
                }
         | 
| 52 | 
            +
                form["add"] = adminStatus;
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                defaultFuncs
         | 
| 55 | 
            +
                  .post("https://www.facebook.com/messaging/save_admins/?dpr=1", ctx.jar, form)
         | 
| 56 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 57 | 
            +
                  .then(function(resData) {
         | 
| 58 | 
            +
                    if (resData.error) {
         | 
| 59 | 
            +
                      switch (resData.error) {
         | 
| 60 | 
            +
                        case 1976004:
         | 
| 61 | 
            +
                          throw { error: "Cannot alter admin status: you are not an admin.", rawResponse: resData };
         | 
| 62 | 
            +
                        case 1357031:
         | 
| 63 | 
            +
                          throw { error: "Cannot alter admin status: this thread is not a group chat.", rawResponse: resData };
         | 
| 64 | 
            +
                        default:
         | 
| 65 | 
            +
                          throw { error: "Cannot alter admin status: unknown error.", rawResponse: resData };
         | 
| 66 | 
            +
                      }
         | 
| 67 | 
            +
                    }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    callback();
         | 
| 70 | 
            +
                  })
         | 
| 71 | 
            +
                  .catch(function(err) {
         | 
| 72 | 
            +
                    log.error("changeAdminStatus", err);
         | 
| 73 | 
            +
                    return callback(err);
         | 
| 74 | 
            +
                  });
         | 
| 75 | 
            +
                  
         | 
| 76 | 
            +
                return returnPromise;
         | 
| 77 | 
            +
              };
         | 
| 78 | 
            +
            };
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeArchivedStatus(threadOrThreads, archive, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (!callback) {
         | 
| 16 | 
            +
                  callback = function (err) {
         | 
| 17 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 18 | 
            +
                    resolveFunc();
         | 
| 19 | 
            +
                  };
         | 
| 20 | 
            +
                }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                var form = {};
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                if (utils.getType(threadOrThreads) === "Array") for (var i = 0; i < threadOrThreads.length; i++) form["ids[" + threadOrThreads[i] + "]"] = archive;
         | 
| 25 | 
            +
                else form["ids[" + threadOrThreads + "]"] = archive;
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                defaultFuncs
         | 
| 28 | 
            +
                  .post("https://www.facebook.com/ajax/mercury/change_archived_status.php", ctx.jar, form)
         | 
| 29 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 30 | 
            +
                  .then(function (resData) {
         | 
| 31 | 
            +
                    if (resData.error) throw resData;
         | 
| 32 | 
            +
                    return callback();
         | 
| 33 | 
            +
                  })
         | 
| 34 | 
            +
                  .catch(function (err) {
         | 
| 35 | 
            +
                    log.error("changeArchivedStatus", err);
         | 
| 36 | 
            +
                    return callback(err);
         | 
| 37 | 
            +
                  });
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                return returnPromise;
         | 
| 40 | 
            +
              };
         | 
| 41 | 
            +
            };
         | 
    
        package/src/changeBio.js
    ADDED
    
    | @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeBio(bio, publish, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (!callback) {
         | 
| 16 | 
            +
                  if (utils.getType(publish) == "Function" || utils.getType(publish) == "AsyncFunction") callback = publish;
         | 
| 17 | 
            +
                  else {
         | 
| 18 | 
            +
                    callback = function (err) {
         | 
| 19 | 
            +
                      if (err) return rejectFunc(err);
         | 
| 20 | 
            +
                      resolveFunc();
         | 
| 21 | 
            +
                    };
         | 
| 22 | 
            +
                  }
         | 
| 23 | 
            +
                }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                if (utils.getType(publish) != "Boolean") publish = false;
         | 
| 26 | 
            +
                if (utils.getType(bio) != "String") {
         | 
| 27 | 
            +
                  bio = "";
         | 
| 28 | 
            +
                  publish = false;
         | 
| 29 | 
            +
                }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                var form = {
         | 
| 32 | 
            +
                  fb_api_caller_class: "RelayModern",
         | 
| 33 | 
            +
                  fb_api_req_friendly_name: "ProfileCometSetBioMutation",
         | 
| 34 | 
            +
                  // This doc_is is valid as of May 23, 2020
         | 
| 35 | 
            +
                  doc_id: "2725043627607610",
         | 
| 36 | 
            +
                  variables: JSON.stringify({
         | 
| 37 | 
            +
                    input: {
         | 
| 38 | 
            +
                      bio: bio,
         | 
| 39 | 
            +
                      publish_bio_feed_story: publish,
         | 
| 40 | 
            +
                      actor_id: ctx.userID,
         | 
| 41 | 
            +
                      client_mutation_id: Math.round(Math.random() * 1024).toString()
         | 
| 42 | 
            +
                    },
         | 
| 43 | 
            +
                    hasProfileTileViewID: false,
         | 
| 44 | 
            +
                    profileTileViewID: null,
         | 
| 45 | 
            +
                    scale: 1
         | 
| 46 | 
            +
                  }),
         | 
| 47 | 
            +
                  av: ctx.userID
         | 
| 48 | 
            +
                };
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                defaultFuncs
         | 
| 51 | 
            +
                  .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
         | 
| 52 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 53 | 
            +
                  .then(function (resData) {
         | 
| 54 | 
            +
                    if (resData.errors) throw resData;
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    return callback();
         | 
| 57 | 
            +
                  })
         | 
| 58 | 
            +
                  .catch(function (err) {
         | 
| 59 | 
            +
                    log.error("changeBio", err);
         | 
| 60 | 
            +
                    return callback(err);
         | 
| 61 | 
            +
                  });
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                return returnPromise;
         | 
| 64 | 
            +
              };
         | 
| 65 | 
            +
            };
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeBlockedStatus(userID, block, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (!callback) {
         | 
| 16 | 
            +
                  callback = function (err) {
         | 
| 17 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 18 | 
            +
                    resolveFunc();
         | 
| 19 | 
            +
                  };
         | 
| 20 | 
            +
                }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                defaultFuncs
         | 
| 23 | 
            +
                  .post(`https://www.facebook.com/messaging/${block ? "" : "un"}block_messages/`, ctx.jar, { fbid: userID })
         | 
| 24 | 
            +
                  .then(utils.saveCookies(ctx.jar))
         | 
| 25 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 26 | 
            +
                  .then(function (resData) {
         | 
| 27 | 
            +
                    if (resData.error) throw resData;
         | 
| 28 | 
            +
                    return callback();
         | 
| 29 | 
            +
                  })
         | 
| 30 | 
            +
                  .catch(function (err) {
         | 
| 31 | 
            +
                    log.error("changeBlockedStatus", err);
         | 
| 32 | 
            +
                    return callback(err);
         | 
| 33 | 
            +
                  });
         | 
| 34 | 
            +
                return returnPromise;
         | 
| 35 | 
            +
              };
         | 
| 36 | 
            +
            };
         | 
| @@ -0,0 +1,106 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
            var bluebird = require("bluebird");
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 8 | 
            +
              function handleUpload(image, callback) {
         | 
| 9 | 
            +
                var uploads = [];
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                var form = {
         | 
| 12 | 
            +
                  images_only: "true",
         | 
| 13 | 
            +
                  "attachment[]": image
         | 
| 14 | 
            +
                };
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                uploads.push(
         | 
| 17 | 
            +
                  defaultFuncs
         | 
| 18 | 
            +
                    .postFormData("https://upload.facebook.com/ajax/mercury/upload.php", ctx.jar, form, {})
         | 
| 19 | 
            +
                    .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 20 | 
            +
                    .then(function (resData) {
         | 
| 21 | 
            +
                      if (resData.error) throw resData;
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                      return resData.payload.metadata[0];
         | 
| 24 | 
            +
                    })
         | 
| 25 | 
            +
                );
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                // resolve all promises
         | 
| 28 | 
            +
                bluebird
         | 
| 29 | 
            +
                  .all(uploads)
         | 
| 30 | 
            +
                  .then(resData => callback(null, resData))
         | 
| 31 | 
            +
                  .catch(function (err) {
         | 
| 32 | 
            +
                    log.error("handleUpload", err);
         | 
| 33 | 
            +
                    return callback(err);
         | 
| 34 | 
            +
                  });
         | 
| 35 | 
            +
              }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              return function changeGroupImage(image, threadID, callback) {
         | 
| 38 | 
            +
                if (!callback && (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction")) throw { error: "please pass a threadID as a second argument." };
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                var resolveFunc = function () { };
         | 
| 41 | 
            +
                var rejectFunc = function () { };
         | 
| 42 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 43 | 
            +
                  resolveFunc = resolve;
         | 
| 44 | 
            +
                  rejectFunc = reject;
         | 
| 45 | 
            +
                });
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                if (!callback) {
         | 
| 48 | 
            +
                  callback = function (err) {
         | 
| 49 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 50 | 
            +
                    resolveFunc();
         | 
| 51 | 
            +
                  };
         | 
| 52 | 
            +
                }
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                var messageAndOTID = utils.generateOfflineThreadingID();
         | 
| 55 | 
            +
                var form = {
         | 
| 56 | 
            +
                  client: "mercury",
         | 
| 57 | 
            +
                  action_type: "ma-type:log-message",
         | 
| 58 | 
            +
                  author: "fbid:" + ctx.userID,
         | 
| 59 | 
            +
                  author_email: "",
         | 
| 60 | 
            +
                  ephemeral_ttl_mode: "0",
         | 
| 61 | 
            +
                  is_filtered_content: false,
         | 
| 62 | 
            +
                  is_filtered_content_account: false,
         | 
| 63 | 
            +
                  is_filtered_content_bh: false,
         | 
| 64 | 
            +
                  is_filtered_content_invalid_app: false,
         | 
| 65 | 
            +
                  is_filtered_content_quasar: false,
         | 
| 66 | 
            +
                  is_forward: false,
         | 
| 67 | 
            +
                  is_spoof_warning: false,
         | 
| 68 | 
            +
                  is_unread: false,
         | 
| 69 | 
            +
                  log_message_type: "log:thread-image",
         | 
| 70 | 
            +
                  manual_retry_cnt: "0",
         | 
| 71 | 
            +
                  message_id: messageAndOTID,
         | 
| 72 | 
            +
                  offline_threading_id: messageAndOTID,
         | 
| 73 | 
            +
                  source: "source:chat:web",
         | 
| 74 | 
            +
                  "source_tags[0]": "source:chat",
         | 
| 75 | 
            +
                  status: "0",
         | 
| 76 | 
            +
                  thread_fbid: threadID,
         | 
| 77 | 
            +
                  thread_id: "",
         | 
| 78 | 
            +
                  timestamp: Date.now(),
         | 
| 79 | 
            +
                  timestamp_absolute: "Today",
         | 
| 80 | 
            +
                  timestamp_relative: utils.generateTimestampRelative(),
         | 
| 81 | 
            +
                  timestamp_time_passed: "0"
         | 
| 82 | 
            +
                };
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                handleUpload(image, function (err, payload) {
         | 
| 85 | 
            +
                  if (err) return callback(err);
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  form["thread_image_id"] = payload[0]["image_id"];
         | 
| 88 | 
            +
                  form["thread_id"] = threadID;
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  defaultFuncs
         | 
| 91 | 
            +
                    .post("https://www.facebook.com/messaging/set_thread_image/", ctx.jar, form)
         | 
| 92 | 
            +
                    .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 93 | 
            +
                    .then(function (resData) {
         | 
| 94 | 
            +
                      // check for errors here
         | 
| 95 | 
            +
                      if (resData.error) throw resData;
         | 
| 96 | 
            +
                      return callback();
         | 
| 97 | 
            +
                    })
         | 
| 98 | 
            +
                    .catch(function (err) {
         | 
| 99 | 
            +
                      log.error("changeGroupImage", err);
         | 
| 100 | 
            +
                      return callback(err);
         | 
| 101 | 
            +
                    });
         | 
| 102 | 
            +
                });
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                return returnPromise;
         | 
| 105 | 
            +
              };
         | 
| 106 | 
            +
            };
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeNickname(nickname, threadID, participantID, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
                if (!callback) {
         | 
| 15 | 
            +
                  callback = function (err) {
         | 
| 16 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 17 | 
            +
                    resolveFunc();
         | 
| 18 | 
            +
                  };
         | 
| 19 | 
            +
                }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                var form = {
         | 
| 22 | 
            +
                  nickname: nickname,
         | 
| 23 | 
            +
                  participant_id: participantID,
         | 
| 24 | 
            +
                  thread_or_other_fbid: threadID
         | 
| 25 | 
            +
                };
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                defaultFuncs
         | 
| 28 | 
            +
                  .post("https://www.facebook.com/messaging/save_thread_nickname/?source=thread_settings&dpr=1", ctx.jar, form)
         | 
| 29 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 30 | 
            +
                  .then(function (resData) {
         | 
| 31 | 
            +
                    if (resData.error === 1545014) throw { error: "Trying to change nickname of user isn't in thread" };
         | 
| 32 | 
            +
                    if (resData.error === 1357031) throw { error: "Trying to change user nickname of a thread that doesn't exist. Have at least one message in the thread before trying to change the user nickname." };
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    if (resData.error) throw resData;
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    return callback();
         | 
| 37 | 
            +
                  })
         | 
| 38 | 
            +
                  .catch(function (err) {
         | 
| 39 | 
            +
                    log.error("changeNickname", err);
         | 
| 40 | 
            +
                    return callback(err);
         | 
| 41 | 
            +
                  });
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                return returnPromise;
         | 
| 44 | 
            +
              };
         | 
| 45 | 
            +
            };
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeThreadColor(color, threadID, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (!callback) {
         | 
| 16 | 
            +
                  callback = function (err) {
         | 
| 17 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 18 | 
            +
                    resolveFunc(err);
         | 
| 19 | 
            +
                  };
         | 
| 20 | 
            +
                }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                var validatedColor = color !== null ? color.toLowerCase() : color; // API only accepts lowercase letters in hex string
         | 
| 23 | 
            +
                var colorList = Object.keys(api.threadColors).map(function (name) {
         | 
| 24 | 
            +
                  return api.threadColors[name];
         | 
| 25 | 
            +
                });
         | 
| 26 | 
            +
                if (!colorList.includes(validatedColor)) throw { error: "The color you are trying to use is not a valid thread color. Use api.threadColors to find acceptable values." };
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                var form = {
         | 
| 29 | 
            +
                  dpr: 1,
         | 
| 30 | 
            +
                  queries: JSON.stringify({
         | 
| 31 | 
            +
                    o0: {
         | 
| 32 | 
            +
                      //This doc_id is valid as of January 31, 2020
         | 
| 33 | 
            +
                      doc_id: "1727493033983591",
         | 
| 34 | 
            +
                      query_params: {
         | 
| 35 | 
            +
                        data: {
         | 
| 36 | 
            +
                          actor_id: ctx.userID,
         | 
| 37 | 
            +
                          client_mutation_id: "0",
         | 
| 38 | 
            +
                          source: "SETTINGS",
         | 
| 39 | 
            +
                          theme_id: validatedColor,
         | 
| 40 | 
            +
                          thread_id: threadID
         | 
| 41 | 
            +
                        }
         | 
| 42 | 
            +
                      }
         | 
| 43 | 
            +
                    }
         | 
| 44 | 
            +
                  })
         | 
| 45 | 
            +
                };
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                defaultFuncs
         | 
| 48 | 
            +
                  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
         | 
| 49 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 50 | 
            +
                  .then(function (resData) {
         | 
| 51 | 
            +
                    if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    return callback();
         | 
| 54 | 
            +
                  })
         | 
| 55 | 
            +
                  .catch(function (err) {
         | 
| 56 | 
            +
                    log.error("changeThreadColor", err);
         | 
| 57 | 
            +
                    return callback(err);
         | 
| 58 | 
            +
                  });
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                return returnPromise;
         | 
| 61 | 
            +
              };
         | 
| 62 | 
            +
            };
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            var utils = require("../utils");
         | 
| 4 | 
            +
            var log = require("npmlog");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports = function (defaultFuncs, api, ctx) {
         | 
| 7 | 
            +
              return function changeThreadEmoji(emoji, threadID, callback) {
         | 
| 8 | 
            +
                var resolveFunc = function () { };
         | 
| 9 | 
            +
                var rejectFunc = function () { };
         | 
| 10 | 
            +
                var returnPromise = new Promise(function (resolve, reject) {
         | 
| 11 | 
            +
                  resolveFunc = resolve;
         | 
| 12 | 
            +
                  rejectFunc = reject;
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (!callback) {
         | 
| 16 | 
            +
                  callback = function (err) {
         | 
| 17 | 
            +
                    if (err) return rejectFunc(err);
         | 
| 18 | 
            +
                    resolveFunc();
         | 
| 19 | 
            +
                  };
         | 
| 20 | 
            +
                }
         | 
| 21 | 
            +
                var form = {
         | 
| 22 | 
            +
                  emoji_choice: emoji,
         | 
| 23 | 
            +
                  thread_or_other_fbid: threadID
         | 
| 24 | 
            +
                };
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                defaultFuncs
         | 
| 27 | 
            +
                  .post("https://www.facebook.com/messaging/save_thread_emoji/?source=thread_settings&__pc=EXP1%3Amessengerdotcom_pkg", ctx.jar, form)
         | 
| 28 | 
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         | 
| 29 | 
            +
                  .then(function (resData) {
         | 
| 30 | 
            +
                    if (resData.error === 1357031) throw { error: "Trying to change emoji of a chat that doesn't exist. Have at least one message in the thread before trying to change the emoji." };
         | 
| 31 | 
            +
                    if (resData.error) throw resData;
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    return callback();
         | 
| 34 | 
            +
                  })
         | 
| 35 | 
            +
                  .catch(function (err) {
         | 
| 36 | 
            +
                    log.error("changeThreadEmoji", err);
         | 
| 37 | 
            +
                    return callback(err);
         | 
| 38 | 
            +
                  });
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                return returnPromise;
         | 
| 41 | 
            +
              };
         | 
| 42 | 
            +
            };
         |