| "use strict"; |
|
|
| const utils = require("../utils"); |
| const log = require("npmlog"); |
|
|
| module.exports = function (defaultFuncs, api, ctx) { |
| function handleUpload(image, callback) { |
| const uploads = []; |
|
|
| const form = { |
| profile_id: ctx.i_userID || ctx.userID, |
| photo_source: 57, |
| av: ctx.i_userID || ctx.userID, |
| file: image |
| }; |
|
|
| uploads.push( |
| defaultFuncs |
| .postFormData( |
| "https://www.facebook.com/profile/picture/upload/", |
| ctx.jar, |
| form, |
| {} |
| ) |
| .then(utils.parseAndCheckLogin(ctx, defaultFuncs)) |
| .then(function (resData) { |
| if (resData.error) { |
| throw resData; |
| } |
| return resData; |
| }) |
| ); |
|
|
| |
| Promise |
| .all(uploads) |
| .then(function (resData) { |
| callback(null, resData); |
| }) |
| .catch(function (err) { |
| log.error("handleUpload", err); |
| return callback(err); |
| }); |
| } |
|
|
| return function changeAvatar(image, caption = "", timestamp = null, callback) { |
| let resolveFunc = function () { }; |
| let rejectFunc = function () { }; |
| const returnPromise = new Promise(function (resolve, reject) { |
| resolveFunc = resolve; |
| rejectFunc = reject; |
| }); |
|
|
| if (!timestamp && utils.getType(caption) === "Number") { |
| timestamp = caption; |
| caption = ""; |
| } |
|
|
| if (!timestamp && !callback && (utils.getType(caption) == "Function" || utils.getType(caption) == "AsyncFunction")) { |
| callback = caption; |
| caption = ""; |
| timestamp = null; |
| } |
|
|
| if (!callback) callback = function (err, data) { |
| if (err) { |
| return rejectFunc(err); |
| } |
| resolveFunc(data); |
| }; |
|
|
| if (!utils.isReadableStream(image)) |
| return callback("Image is not a readable stream"); |
|
|
| handleUpload(image, function (err, payload) { |
| if (err) { |
| return callback(err); |
| } |
|
|
| const form = { |
| av: ctx.i_userID || ctx.userID, |
| fb_api_req_friendly_name: "ProfileCometProfilePictureSetMutation", |
| fb_api_caller_class: "RelayModern", |
| doc_id: "5066134240065849", |
| variables: JSON.stringify({ |
| input: { |
| caption, |
| existing_photo_id: payload[0].payload.fbid, |
| expiration_time: timestamp, |
| profile_id: ctx.i_userID || ctx.userID, |
| profile_pic_method: "EXISTING", |
| profile_pic_source: "TIMELINE", |
| scaled_crop_rect: { |
| height: 1, |
| width: 1, |
| x: 0, |
| y: 0 |
| }, |
| skip_cropping: true, |
| actor_id: ctx.i_userID || ctx.userID, |
| client_mutation_id: Math.round(Math.random() * 19).toString() |
| }, |
| isPage: false, |
| isProfile: true, |
| scale: 3 |
| }) |
| }; |
|
|
| defaultFuncs |
| .post("https://www.facebook.com/api/graphql/", ctx.jar, form) |
| .then(utils.parseAndCheckLogin(ctx, defaultFuncs)) |
| .then(function (resData) { |
| if (resData.errors) { |
| throw resData; |
| } |
| return callback(null, resData[0].data.profile_picture_set); |
| }) |
| .catch(function (err) { |
| log.error("changeAvatar", err); |
| return callback(err); |
| }); |
| }); |
|
|
| return returnPromise; |
| }; |
| }; |
|
|