naughty-fb-chatify 1.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/.github/workflows/publish.yml +20 -0
 - package/README.md +225 -0
 - package/index.js +602 -0
 - package/package.json +80 -0
 - package/src/addExternalModule.js +19 -0
 - package/src/addUserToGroup.js +113 -0
 - package/src/changeAdminStatus.js +79 -0
 - package/src/changeArchivedStatus.js +55 -0
 - package/src/changeBio.js +77 -0
 - package/src/changeBlockedStatus.js +47 -0
 - package/src/changeGroupImage.js +129 -0
 - package/src/changeNickname.js +59 -0
 - package/src/changeThreadColor.js +71 -0
 - package/src/changeThreadEmoji.js +55 -0
 - package/src/createNewGroup.js +86 -0
 - package/src/createPoll.js +71 -0
 - package/src/deleteMessage.js +56 -0
 - package/src/deleteThread.js +56 -0
 - package/src/forwardAttachment.js +60 -0
 - package/src/getCurrentUserID.js +7 -0
 - package/src/getEmojiUrl.js +29 -0
 - package/src/getFriendsList.js +84 -0
 - package/src/getThreadHistory.js +645 -0
 - package/src/getThreadHistoryDeprecated.js +93 -0
 - package/src/getThreadInfo.js +201 -0
 - package/src/getThreadInfoDeprecated.js +80 -0
 - package/src/getThreadList.js +238 -0
 - package/src/getThreadListDeprecated.js +75 -0
 - package/src/getThreadPictures.js +79 -0
 - package/src/getUserID.js +66 -0
 - package/src/getUserInfo.js +72 -0
 - package/src/handleFriendRequest.js +61 -0
 - package/src/handleMessageRequest.js +65 -0
 - package/src/httpGet.js +52 -0
 - package/src/httpPost.js +52 -0
 - package/src/listenMqtt.js +788 -0
 - package/src/logout.js +75 -0
 - package/src/markAsDelivered.js +58 -0
 - package/src/markAsRead.js +80 -0
 - package/src/markAsReadAll.js +50 -0
 - package/src/markAsSeen.js +59 -0
 - package/src/muteThread.js +52 -0
 - package/src/removeUserFromGroup.js +79 -0
 - package/src/resolvePhotoUrl.js +45 -0
 - package/src/searchForThread.js +53 -0
 - package/src/sendMessage.js +459 -0
 - package/src/sendTypingIndicator.js +103 -0
 - package/src/setMessageReaction.js +117 -0
 - package/src/setPostReaction.js +76 -0
 - package/src/setTitle.js +86 -0
 - package/src/threadColors.js +57 -0
 - package/src/unfriend.js +52 -0
 - package/src/unsendMessage.js +49 -0
 - package/test/data/shareAttach.js +146 -0
 - package/test/data/something.mov +0 -0
 - package/test/data/test.png +0 -0
 - package/test/data/test.txt +1 -0
 - package/test/test-page.js +140 -0
 - package/test/test.js +385 -0
 - package/utils.js +1357 -0
 
| 
         @@ -0,0 +1,86 @@ 
     | 
|
| 
      
 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 createNewGroup(participantIDs, groupTitle, callback) {
         
     | 
| 
      
 8 
     | 
    
         
            +
                if (utils.getType(groupTitle) == "Function") {
         
     | 
| 
      
 9 
     | 
    
         
            +
                  callback = groupTitle;
         
     | 
| 
      
 10 
     | 
    
         
            +
                  groupTitle = null;
         
     | 
| 
      
 11 
     | 
    
         
            +
                }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                if (utils.getType(participantIDs) !== "Array") {
         
     | 
| 
      
 14 
     | 
    
         
            +
                  throw { error: "createNewGroup: participantIDs should be an array." };
         
     | 
| 
      
 15 
     | 
    
         
            +
                }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                if (participantIDs.length < 2) {
         
     | 
| 
      
 18 
     | 
    
         
            +
                  throw { error: "createNewGroup: participantIDs should have at least 2 IDs." };
         
     | 
| 
      
 19 
     | 
    
         
            +
                }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                var resolveFunc = function(){};
         
     | 
| 
      
 22 
     | 
    
         
            +
                var rejectFunc = function(){};
         
     | 
| 
      
 23 
     | 
    
         
            +
                var returnPromise = new Promise(function (resolve, reject) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  resolveFunc = resolve;
         
     | 
| 
      
 25 
     | 
    
         
            +
                  rejectFunc = reject;
         
     | 
| 
      
 26 
     | 
    
         
            +
                });
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                if (!callback) {
         
     | 
| 
      
 29 
     | 
    
         
            +
                  callback = function (err, threadID) {
         
     | 
| 
      
 30 
     | 
    
         
            +
                    if (err) {
         
     | 
| 
      
 31 
     | 
    
         
            +
                      return rejectFunc(err);
         
     | 
| 
      
 32 
     | 
    
         
            +
                    }
         
     | 
| 
      
 33 
     | 
    
         
            +
                    resolveFunc(threadID);
         
     | 
| 
      
 34 
     | 
    
         
            +
                  };
         
     | 
| 
      
 35 
     | 
    
         
            +
                }
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                var pids = [];
         
     | 
| 
      
 38 
     | 
    
         
            +
                for (var n in participantIDs) {
         
     | 
| 
      
 39 
     | 
    
         
            +
                  pids.push({
         
     | 
| 
      
 40 
     | 
    
         
            +
                    fbid: participantIDs[n]
         
     | 
| 
      
 41 
     | 
    
         
            +
                  });
         
     | 
| 
      
 42 
     | 
    
         
            +
                }
         
     | 
| 
      
 43 
     | 
    
         
            +
                pids.push({fbid: ctx.userID});
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                var form = {
         
     | 
| 
      
 46 
     | 
    
         
            +
                  fb_api_caller_class: "RelayModern",
         
     | 
| 
      
 47 
     | 
    
         
            +
                  fb_api_req_friendly_name: "MessengerGroupCreateMutation",
         
     | 
| 
      
 48 
     | 
    
         
            +
                  av: ctx.userID,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  //This doc_id is valid as of January 11th, 2020
         
     | 
| 
      
 50 
     | 
    
         
            +
                  doc_id: "577041672419534",
         
     | 
| 
      
 51 
     | 
    
         
            +
                  variables: JSON.stringify({
         
     | 
| 
      
 52 
     | 
    
         
            +
                    input: {
         
     | 
| 
      
 53 
     | 
    
         
            +
                      entry_point: "jewel_new_group",
         
     | 
| 
      
 54 
     | 
    
         
            +
                      actor_id: ctx.userID,
         
     | 
| 
      
 55 
     | 
    
         
            +
                      participants: pids,
         
     | 
| 
      
 56 
     | 
    
         
            +
                      client_mutation_id: Math.round(Math.random() * 1024).toString(),
         
     | 
| 
      
 57 
     | 
    
         
            +
                      thread_settings: {
         
     | 
| 
      
 58 
     | 
    
         
            +
                        name: groupTitle,
         
     | 
| 
      
 59 
     | 
    
         
            +
                        joinable_mode: "PRIVATE",
         
     | 
| 
      
 60 
     | 
    
         
            +
                        thread_image_fbid: null
         
     | 
| 
      
 61 
     | 
    
         
            +
                      }
         
     | 
| 
      
 62 
     | 
    
         
            +
                    }
         
     | 
| 
      
 63 
     | 
    
         
            +
                  })
         
     | 
| 
      
 64 
     | 
    
         
            +
                };
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                defaultFuncs
         
     | 
| 
      
 67 
     | 
    
         
            +
                  .post(
         
     | 
| 
      
 68 
     | 
    
         
            +
                    "https://www.facebook.com/api/graphql/",
         
     | 
| 
      
 69 
     | 
    
         
            +
                    ctx.jar,
         
     | 
| 
      
 70 
     | 
    
         
            +
                    form
         
     | 
| 
      
 71 
     | 
    
         
            +
                  )
         
     | 
| 
      
 72 
     | 
    
         
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         
     | 
| 
      
 73 
     | 
    
         
            +
                  .then(function(resData) {
         
     | 
| 
      
 74 
     | 
    
         
            +
                    if (resData.errors) {
         
     | 
| 
      
 75 
     | 
    
         
            +
                      throw resData;
         
     | 
| 
      
 76 
     | 
    
         
            +
                    }
         
     | 
| 
      
 77 
     | 
    
         
            +
                    return callback(null, resData.data.messenger_group_thread_create.thread.thread_key.thread_fbid);
         
     | 
| 
      
 78 
     | 
    
         
            +
                  })
         
     | 
| 
      
 79 
     | 
    
         
            +
                  .catch(function(err) {
         
     | 
| 
      
 80 
     | 
    
         
            +
                    log.error("createNewGroup", err);
         
     | 
| 
      
 81 
     | 
    
         
            +
                    return callback(err);
         
     | 
| 
      
 82 
     | 
    
         
            +
                  });
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                return returnPromise;
         
     | 
| 
      
 85 
     | 
    
         
            +
              };
         
     | 
| 
      
 86 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -0,0 +1,71 @@ 
     | 
|
| 
      
 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 createPoll(title, threadID, options, 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(options) == "Function") {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    callback = options;
         
     | 
| 
      
 18 
     | 
    
         
            +
                    options = null;
         
     | 
| 
      
 19 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 20 
     | 
    
         
            +
                    callback = function(err) {
         
     | 
| 
      
 21 
     | 
    
         
            +
                      if (err) {
         
     | 
| 
      
 22 
     | 
    
         
            +
                        return rejectFunc(err);
         
     | 
| 
      
 23 
     | 
    
         
            +
                      }
         
     | 
| 
      
 24 
     | 
    
         
            +
                      resolveFunc();
         
     | 
| 
      
 25 
     | 
    
         
            +
                    };
         
     | 
| 
      
 26 
     | 
    
         
            +
                  }
         
     | 
| 
      
 27 
     | 
    
         
            +
                }
         
     | 
| 
      
 28 
     | 
    
         
            +
                if (!options) {
         
     | 
| 
      
 29 
     | 
    
         
            +
                  options = {}; // Initial poll options are optional
         
     | 
| 
      
 30 
     | 
    
         
            +
                }
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                var form = {
         
     | 
| 
      
 33 
     | 
    
         
            +
                  target_id: threadID,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  question_text: title
         
     | 
| 
      
 35 
     | 
    
         
            +
                };
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                // Set fields for options (and whether they are selected initially by the posting user)
         
     | 
| 
      
 38 
     | 
    
         
            +
                var ind = 0;
         
     | 
| 
      
 39 
     | 
    
         
            +
                for (var opt in options) {
         
     | 
| 
      
 40 
     | 
    
         
            +
                  // eslint-disable-next-line no-prototype-builtins
         
     | 
| 
      
 41 
     | 
    
         
            +
                  if (options.hasOwnProperty(opt)) {
         
     | 
| 
      
 42 
     | 
    
         
            +
                    form["option_text_array[" + ind + "]"] = opt;
         
     | 
| 
      
 43 
     | 
    
         
            +
                    form["option_is_selected_array[" + ind + "]"] = options[opt]
         
     | 
| 
      
 44 
     | 
    
         
            +
                      ? "1"
         
     | 
| 
      
 45 
     | 
    
         
            +
                      : "0";
         
     | 
| 
      
 46 
     | 
    
         
            +
                    ind++;
         
     | 
| 
      
 47 
     | 
    
         
            +
                  }
         
     | 
| 
      
 48 
     | 
    
         
            +
                }
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                defaultFuncs
         
     | 
| 
      
 51 
     | 
    
         
            +
                  .post(
         
     | 
| 
      
 52 
     | 
    
         
            +
                    "https://www.facebook.com/messaging/group_polling/create_poll/?dpr=1",
         
     | 
| 
      
 53 
     | 
    
         
            +
                    ctx.jar,
         
     | 
| 
      
 54 
     | 
    
         
            +
                    form
         
     | 
| 
      
 55 
     | 
    
         
            +
                  )
         
     | 
| 
      
 56 
     | 
    
         
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         
     | 
| 
      
 57 
     | 
    
         
            +
                  .then(function(resData) {
         
     | 
| 
      
 58 
     | 
    
         
            +
                    if (resData.payload.status != "success") {
         
     | 
| 
      
 59 
     | 
    
         
            +
                      throw resData;
         
     | 
| 
      
 60 
     | 
    
         
            +
                    }
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                    return callback();
         
     | 
| 
      
 63 
     | 
    
         
            +
                  })
         
     | 
| 
      
 64 
     | 
    
         
            +
                  .catch(function(err) {
         
     | 
| 
      
 65 
     | 
    
         
            +
                    log.error("createPoll", err);
         
     | 
| 
      
 66 
     | 
    
         
            +
                    return callback(err);
         
     | 
| 
      
 67 
     | 
    
         
            +
                  });
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                return returnPromise;
         
     | 
| 
      
 70 
     | 
    
         
            +
              };
         
     | 
| 
      
 71 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 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 deleteMessage(messageOrMessages, 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) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                      return rejectFunc(err);
         
     | 
| 
      
 18 
     | 
    
         
            +
                    }
         
     | 
| 
      
 19 
     | 
    
         
            +
                    resolveFunc();
         
     | 
| 
      
 20 
     | 
    
         
            +
                  };
         
     | 
| 
      
 21 
     | 
    
         
            +
                }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                var form = {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  client: "mercury"
         
     | 
| 
      
 25 
     | 
    
         
            +
                };
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                if (utils.getType(messageOrMessages) !== "Array") {
         
     | 
| 
      
 28 
     | 
    
         
            +
                  messageOrMessages = [messageOrMessages];
         
     | 
| 
      
 29 
     | 
    
         
            +
                }
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                for (var i = 0; i < messageOrMessages.length; i++) {
         
     | 
| 
      
 32 
     | 
    
         
            +
                  form["message_ids[" + i + "]"] = messageOrMessages[i];
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                defaultFuncs
         
     | 
| 
      
 36 
     | 
    
         
            +
                  .post(
         
     | 
| 
      
 37 
     | 
    
         
            +
                    "https://www.facebook.com/ajax/mercury/delete_messages.php",
         
     | 
| 
      
 38 
     | 
    
         
            +
                    ctx.jar,
         
     | 
| 
      
 39 
     | 
    
         
            +
                    form
         
     | 
| 
      
 40 
     | 
    
         
            +
                  )
         
     | 
| 
      
 41 
     | 
    
         
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         
     | 
| 
      
 42 
     | 
    
         
            +
                  .then(function(resData) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                    if (resData.error) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                      throw resData;
         
     | 
| 
      
 45 
     | 
    
         
            +
                    }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                    return callback();
         
     | 
| 
      
 48 
     | 
    
         
            +
                  })
         
     | 
| 
      
 49 
     | 
    
         
            +
                  .catch(function(err) {
         
     | 
| 
      
 50 
     | 
    
         
            +
                    log.error("deleteMessage", err);
         
     | 
| 
      
 51 
     | 
    
         
            +
                    return callback(err);
         
     | 
| 
      
 52 
     | 
    
         
            +
                  });
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                return returnPromise;
         
     | 
| 
      
 55 
     | 
    
         
            +
              };
         
     | 
| 
      
 56 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 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 deleteThread(threadOrThreads, 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) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                      return rejectFunc(err);
         
     | 
| 
      
 18 
     | 
    
         
            +
                    }
         
     | 
| 
      
 19 
     | 
    
         
            +
                    resolveFunc();
         
     | 
| 
      
 20 
     | 
    
         
            +
                  };
         
     | 
| 
      
 21 
     | 
    
         
            +
                }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                var form = {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  client: "mercury"
         
     | 
| 
      
 25 
     | 
    
         
            +
                };
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                if (utils.getType(threadOrThreads) !== "Array") {
         
     | 
| 
      
 28 
     | 
    
         
            +
                  threadOrThreads = [threadOrThreads];
         
     | 
| 
      
 29 
     | 
    
         
            +
                }
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                for (var i = 0; i < threadOrThreads.length; i++) {
         
     | 
| 
      
 32 
     | 
    
         
            +
                  form["ids[" + i + "]"] = threadOrThreads[i];
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                defaultFuncs
         
     | 
| 
      
 36 
     | 
    
         
            +
                  .post(
         
     | 
| 
      
 37 
     | 
    
         
            +
                    "https://www.facebook.com/ajax/mercury/delete_thread.php",
         
     | 
| 
      
 38 
     | 
    
         
            +
                    ctx.jar,
         
     | 
| 
      
 39 
     | 
    
         
            +
                    form
         
     | 
| 
      
 40 
     | 
    
         
            +
                  )
         
     | 
| 
      
 41 
     | 
    
         
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         
     | 
| 
      
 42 
     | 
    
         
            +
                  .then(function(resData) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                    if (resData.error) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                      throw resData;
         
     | 
| 
      
 45 
     | 
    
         
            +
                    }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                    return callback();
         
     | 
| 
      
 48 
     | 
    
         
            +
                  })
         
     | 
| 
      
 49 
     | 
    
         
            +
                  .catch(function(err) {
         
     | 
| 
      
 50 
     | 
    
         
            +
                    log.error("deleteThread", err);
         
     | 
| 
      
 51 
     | 
    
         
            +
                    return callback(err);
         
     | 
| 
      
 52 
     | 
    
         
            +
                  });
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                return returnPromise;
         
     | 
| 
      
 55 
     | 
    
         
            +
              };
         
     | 
| 
      
 56 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 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 forwardAttachment(attachmentID, userOrUsers, 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) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                      return rejectFunc(err);
         
     | 
| 
      
 18 
     | 
    
         
            +
                    }
         
     | 
| 
      
 19 
     | 
    
         
            +
                    resolveFunc();
         
     | 
| 
      
 20 
     | 
    
         
            +
                  };
         
     | 
| 
      
 21 
     | 
    
         
            +
                }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                var form = {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  attachment_id: attachmentID
         
     | 
| 
      
 25 
     | 
    
         
            +
                };
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                if (utils.getType(userOrUsers) !== "Array") {
         
     | 
| 
      
 28 
     | 
    
         
            +
                  userOrUsers = [userOrUsers];
         
     | 
| 
      
 29 
     | 
    
         
            +
                }
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                var timestamp = Math.floor(Date.now() / 1000);
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                for (var i = 0; i < userOrUsers.length; i++) {
         
     | 
| 
      
 34 
     | 
    
         
            +
                  //That's good, the key of the array is really timestmap in seconds + index
         
     | 
| 
      
 35 
     | 
    
         
            +
                  //Probably time when the attachment will be sent?
         
     | 
| 
      
 36 
     | 
    
         
            +
                  form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
         
     | 
| 
      
 37 
     | 
    
         
            +
                }
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                defaultFuncs
         
     | 
| 
      
 40 
     | 
    
         
            +
                  .post(
         
     | 
| 
      
 41 
     | 
    
         
            +
                    "https://www.facebook.com/mercury/attachments/forward/",
         
     | 
| 
      
 42 
     | 
    
         
            +
                    ctx.jar,
         
     | 
| 
      
 43 
     | 
    
         
            +
                    form
         
     | 
| 
      
 44 
     | 
    
         
            +
                  )
         
     | 
| 
      
 45 
     | 
    
         
            +
                  .then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
         
     | 
| 
      
 46 
     | 
    
         
            +
                  .then(function(resData) {
         
     | 
| 
      
 47 
     | 
    
         
            +
                    if (resData.error) {
         
     | 
| 
      
 48 
     | 
    
         
            +
                      throw resData;
         
     | 
| 
      
 49 
     | 
    
         
            +
                    }
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                    return callback();
         
     | 
| 
      
 52 
     | 
    
         
            +
                  })
         
     | 
| 
      
 53 
     | 
    
         
            +
                  .catch(function(err) {
         
     | 
| 
      
 54 
     | 
    
         
            +
                    log.error("forwardAttachment", err);
         
     | 
| 
      
 55 
     | 
    
         
            +
                    return callback(err);
         
     | 
| 
      
 56 
     | 
    
         
            +
                  });
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                return returnPromise;
         
     | 
| 
      
 59 
     | 
    
         
            +
              };
         
     | 
| 
      
 60 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            "use strict";
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            const util = require("util");
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module.exports = function() {
         
     | 
| 
      
 6 
     | 
    
         
            +
              return function getEmojiUrl(c, size, pixelRatio) {
         
     | 
| 
      
 7 
     | 
    
         
            +
                /*
         
     | 
| 
      
 8 
     | 
    
         
            +
                 Resolves Facebook Messenger emoji image asset URL for an emoji character.
         
     | 
| 
      
 9 
     | 
    
         
            +
                 Supported sizes are 32, 64, and 128.
         
     | 
| 
      
 10 
     | 
    
         
            +
                 Supported pixel ratios are '1.0' and '1.5' (possibly more; haven't tested)
         
     | 
| 
      
 11 
     | 
    
         
            +
                 */
         
     | 
| 
      
 12 
     | 
    
         
            +
                const baseUrl = "https://static.xx.fbcdn.net/images/emoji.php/v8/z%s/%s";
         
     | 
| 
      
 13 
     | 
    
         
            +
                pixelRatio = pixelRatio || "1.0";
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                let ending = util.format(
         
     | 
| 
      
 16 
     | 
    
         
            +
                  "%s/%s/%s.png",
         
     | 
| 
      
 17 
     | 
    
         
            +
                  pixelRatio,
         
     | 
| 
      
 18 
     | 
    
         
            +
                  size,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  c.codePointAt(0).toString(16)
         
     | 
| 
      
 20 
     | 
    
         
            +
                );
         
     | 
| 
      
 21 
     | 
    
         
            +
                let base = 317426846;
         
     | 
| 
      
 22 
     | 
    
         
            +
                for (let i = 0; i < ending.length; i++) {
         
     | 
| 
      
 23 
     | 
    
         
            +
                  base = (base << 5) - base + ending.charCodeAt(i);
         
     | 
| 
      
 24 
     | 
    
         
            +
                }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                let hashed = (base & 255).toString(16);
         
     | 
| 
      
 27 
     | 
    
         
            +
                return util.format(baseUrl, hashed, ending);
         
     | 
| 
      
 28 
     | 
    
         
            +
              };
         
     | 
| 
      
 29 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -0,0 +1,84 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            "use strict";
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            //var cheerio = require("cheerio");
         
     | 
| 
      
 4 
     | 
    
         
            +
            var utils = require("../utils");
         
     | 
| 
      
 5 
     | 
    
         
            +
            var log = require("npmlog");
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            // [almost] copy pasted from one of FB's minified file (GenderConst)
         
     | 
| 
      
 8 
     | 
    
         
            +
            var GENDERS = {
         
     | 
| 
      
 9 
     | 
    
         
            +
              0: "unknown",
         
     | 
| 
      
 10 
     | 
    
         
            +
              1: "female_singular",
         
     | 
| 
      
 11 
     | 
    
         
            +
              2: "male_singular",
         
     | 
| 
      
 12 
     | 
    
         
            +
              3: "female_singular_guess",
         
     | 
| 
      
 13 
     | 
    
         
            +
              4: "male_singular_guess",
         
     | 
| 
      
 14 
     | 
    
         
            +
              5: "mixed",
         
     | 
| 
      
 15 
     | 
    
         
            +
              6: "neuter_singular",
         
     | 
| 
      
 16 
     | 
    
         
            +
              7: "unknown_singular",
         
     | 
| 
      
 17 
     | 
    
         
            +
              8: "female_plural",
         
     | 
| 
      
 18 
     | 
    
         
            +
              9: "male_plural",
         
     | 
| 
      
 19 
     | 
    
         
            +
              10: "neuter_plural",
         
     | 
| 
      
 20 
     | 
    
         
            +
              11: "unknown_plural"
         
     | 
| 
      
 21 
     | 
    
         
            +
            };
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            function formatData(obj) {
         
     | 
| 
      
 24 
     | 
    
         
            +
              return Object.keys(obj).map(function(key) {
         
     | 
| 
      
 25 
     | 
    
         
            +
                var user = obj[key];
         
     | 
| 
      
 26 
     | 
    
         
            +
                return {
         
     | 
| 
      
 27 
     | 
    
         
            +
                  alternateName: user.alternateName,
         
     | 
| 
      
 28 
     | 
    
         
            +
                  firstName: user.firstName,
         
     | 
| 
      
 29 
     | 
    
         
            +
                  gender: GENDERS[user.gender],
         
     | 
| 
      
 30 
     | 
    
         
            +
                  userID: utils.formatID(user.id.toString()),
         
     | 
| 
      
 31 
     | 
    
         
            +
                  isFriend: user.is_friend != null && user.is_friend ? true : false,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  fullName: user.name,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  profilePicture: user.thumbSrc,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  type: user.type,
         
     | 
| 
      
 35 
     | 
    
         
            +
                  profileUrl: user.uri,
         
     | 
| 
      
 36 
     | 
    
         
            +
                  vanity: user.vanity,
         
     | 
| 
      
 37 
     | 
    
         
            +
                  isBirthday: !!user.is_birthday
         
     | 
| 
      
 38 
     | 
    
         
            +
                };
         
     | 
| 
      
 39 
     | 
    
         
            +
              });
         
     | 
| 
      
 40 
     | 
    
         
            +
            }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            module.exports = function(defaultFuncs, api, ctx) {
         
     | 
| 
      
 43 
     | 
    
         
            +
              return function getFriendsList(callback) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                var resolveFunc = function(){};
         
     | 
| 
      
 45 
     | 
    
         
            +
                var rejectFunc = function(){};
         
     | 
| 
      
 46 
     | 
    
         
            +
                var returnPromise = new Promise(function (resolve, reject) {
         
     | 
| 
      
 47 
     | 
    
         
            +
                  resolveFunc = resolve;
         
     | 
| 
      
 48 
     | 
    
         
            +
                  rejectFunc = reject;
         
     | 
| 
      
 49 
     | 
    
         
            +
                });
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                if (!callback) {
         
     | 
| 
      
 52 
     | 
    
         
            +
                  callback = function (err, friendList) {
         
     | 
| 
      
 53 
     | 
    
         
            +
                    if (err) {
         
     | 
| 
      
 54 
     | 
    
         
            +
                      return rejectFunc(err);
         
     | 
| 
      
 55 
     | 
    
         
            +
                    }
         
     | 
| 
      
 56 
     | 
    
         
            +
                    resolveFunc(friendList);
         
     | 
| 
      
 57 
     | 
    
         
            +
                  };
         
     | 
| 
      
 58 
     | 
    
         
            +
                }
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                defaultFuncs
         
     | 
| 
      
 61 
     | 
    
         
            +
                  .postFormData(
         
     | 
| 
      
 62 
     | 
    
         
            +
                    "https://www.facebook.com/chat/user_info_all",
         
     | 
| 
      
 63 
     | 
    
         
            +
                    ctx.jar,
         
     | 
| 
      
 64 
     | 
    
         
            +
                    {},
         
     | 
| 
      
 65 
     | 
    
         
            +
                    { viewer: ctx.userID }
         
     | 
| 
      
 66 
     | 
    
         
            +
                  )
         
     | 
| 
      
 67 
     | 
    
         
            +
                  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
         
     | 
| 
      
 68 
     | 
    
         
            +
                  .then(function(resData) {
         
     | 
| 
      
 69 
     | 
    
         
            +
                    if (!resData) {
         
     | 
| 
      
 70 
     | 
    
         
            +
                      throw { error: "getFriendsList returned empty object." };
         
     | 
| 
      
 71 
     | 
    
         
            +
                    }
         
     | 
| 
      
 72 
     | 
    
         
            +
                    if (resData.error) {
         
     | 
| 
      
 73 
     | 
    
         
            +
                      throw resData;
         
     | 
| 
      
 74 
     | 
    
         
            +
                    }
         
     | 
| 
      
 75 
     | 
    
         
            +
                    callback(null, formatData(resData.payload));
         
     | 
| 
      
 76 
     | 
    
         
            +
                  })
         
     | 
| 
      
 77 
     | 
    
         
            +
                  .catch(function(err) {
         
     | 
| 
      
 78 
     | 
    
         
            +
                    log.error("getFriendsList", err);
         
     | 
| 
      
 79 
     | 
    
         
            +
                    return callback(err);
         
     | 
| 
      
 80 
     | 
    
         
            +
                  });
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                return returnPromise;
         
     | 
| 
      
 83 
     | 
    
         
            +
              };
         
     | 
| 
      
 84 
     | 
    
         
            +
            };
         
     |