|
- const qrcode = require("qrcode-terminal");
- const fs = require("fs");
-
- // const path = require("path");
- const { Client, Chat, Message } = require("whatsapp-web.js");
- // const SESSION_FOLDER = path.join(__dirname, "../data/");
- // const SESSION_FILE_PATH = path.join(__dirname, "../data/session.json");
- // const sessions = require("../api/session_data");
- const { parseMultipartData, sanitizeEntity } = require("strapi-utils");
-
- var client;
- //Login Session when there is Session File
-
- function callbacks(client, callback, type = "create") {
- // console.log("starting", type);
- let sessionData;
- client.on("auth_failure", (session) => {
- // console.log("auth_failure");
- return callback({
- STATUS: 0,
- TYPE: "AUTH_FAILURE",
- DATA: "SESSION HAS BEEN ENDED , PLEASE CREATE A NEW ONE !",
- });
- });
- client.on("disconnected", async function (session) {
- console.log("disconnected from ", type, session);
- if (session == "UNPAIRED" || session == "CONFLICT") {
- try {
- if (type == "load" && client && client.info) {
- console.log(getID);
- getID = await strapi
- .query("session-data")
- .findOne({ phonenumber: client.info.wid.user });
- console.log(getID);
- if (getID) {
- let id = getID["id"];
- await strapi.api["session-data"].services[
- "session-data"
- ].delete({ id });
- }
- await client.destroy();
- }
- } catch (e) {}
- }
- });
-
- client.on("ready", async () => {
- // console.log("ready");
- var clientInfo = client.info;
- clientInfo["sessionData"] = sessionData;
- if (type == "create") await client.destroy();
- return callback({
- STATUS: 1,
- TYPE: "READY",
- DATA: type == "create" ? clientInfo : client,
- });
- });
- client.on("message", async (msg) => {
- // console.log("MESSAGE RECEIVED", msg.body);
- });
- client.on("qr", (qr) => {
- return callback({ STATUS: 1, TYPE: "QR_AUTH", DATA: qr });
- });
-
- client.on("change_state", (state) => {
- // console.log(`state => ${state}`);
- });
- client.on("authenticated", (session) => {
- // console.log("authenticated");
- try {
- sessionData = session;
- // fs.writeFileSync(SESSION_FILE_PATH, JSON.stringify(session));
- } catch (e) {
- return callback({
- STATUS: 0,
- TYPE: "AUTHENTICATED_ERROR",
- DATA: e.message,
- });
- }
- });
- }
-
- var loadClient = async function (clientSessionData, callback) {
- try {
- // if(!client){
- // console.log(client.info);
- // return callback({"STATUS" : 1 , "TYPE" : "READY" , "DATA" : client.info})
- // }
- // let sessionPath = path.join(SESSION_FOLDER, `${phoneNumber}.json`);
- // if (fs.existsSync(sessionPath)) {
- // sessionData = require(sessionPath);
-
- client = new Client({
- puppeteer: {
- args: ["--no-sandbox", "--disable-setuid-sandbox"],
- },
- session: clientSessionData,
- restartOnAuthFail: true,
- });
-
- callbacks(client, callback, "load");
- // console.log("initialize");
- client.initialize();
- } catch (e) {
- // console.log(e);
- return callback({
- STATUS: 0,
- TYPE: "ERROR",
- DATA: e.message,
- });
- }
- };
-
- function asyncLoadClient(i) {
- return new Promise((resolve, reject) => {
- try {
- loadClient(i["session_data"], async (data) => {
- return resolve(data);
- });
- } catch (e) {
- return reject(e.message);
- }
- });
- }
-
- var createNewClient = async function (callback) {
- try {
- client = new Client({
- puppeteer: {
- args: ["--no-sandbox", "--disable-setuid-sandbox"],
- },
- });
-
- callbacks(client, callback);
-
- client.initialize();
- //var clientInfo = await getClientInfo();
- //return clientInfo;
- } catch (e) {
- return callback({ STATUS: 0, TYPE: "READY", DATA: e.message });
- }
- };
-
- var sendMessage = async function (client, phone_number, textMessage) {
- try {
- if (!client.info) {
- throw { message: "Client Is Not Ready !" };
- }
- var phoneNumber = reformatMobilePhone(phone_number);
- // var state = await client.isRegisteredUser(phoneNumber);
- // console.log(state);
-
- await client.sendMessage(phoneNumber, textMessage);
-
- return { STATUS: 1, DATA: "Messages Succesfully send !" };
- } catch (e) {
- console.log(e);
- return { STATUS: 0, DATA: e.message };
- }
- };
-
- var getChatbyPhoneNumber = async function (phone_number) {
- try {
- if (!client.info) {
- throw { message: "Client Is Not Ready !" };
- }
- let phoneNumber = reformatMobilePhone(phone_number);
- let chats = await client.getChatById(phoneNumber);
- let messageList = await chats.fetchMessages();
- return { STATUS: 1, DATA: messageList };
- } catch (e) {
- return { STATUS: 0, DATA: e.message };
- }
- };
-
- var getClientInfo = function () {
- try {
- var a;
- while (!a) {
- a = client.info;
- }
- return { STATUS: 1, DATA: a };
- } catch (e) {
- return { STATUS: 0, DATA: e.message };
- }
- };
-
- var getClientState = async function () {
- try {
- if (!client.info) {
- throw { message: "Client Is Not Ready !" };
- }
- let state = await client.getState();
- return { STATUS: 1, DATA: state };
- } catch (e) {
- return { STATUS: 0, DATA: e.message };
- }
- };
-
- var destroySession = async function (phoneNumber) {
- try {
- if (client && client.info) {
- await client.logout();
- await client.destroy();
- clearFileSession(phoneNumber);
- return { STATUS: 1, DATA: "Session cleared" };
- } else throw { message: "Client Is Not Ready !" };
- } catch (e) {
- return { STATUS: 0, DATA: e.message };
- }
- };
-
- function reformatMobilePhone(phoneNumber) {
- var newPhoneNumber;
- if (phoneNumber[0].toString() == "0") {
- newPhoneNumber = "62" + phoneNumber.substring(1) + "@c.us";
- } else if (phoneNumber[0] == "+") {
- newPhoneNumber = phoneNumber.substring(1) + "@c.us";
- } else {
- newPhoneNumber = phoneNumber + "@c.us";
- }
-
- return newPhoneNumber;
- }
-
- function clearFileSession(phoneNumber) {
- try {
- let sessionPath = path.join(SESSION_FOLDER, `${phoneNumber}.json`);
- if (fs.existsSync(sessionPath)) {
- console.log(`clearing session ${phoneNumber}`);
- fs.unlinkSync(sessionPath);
- }
- } catch (e) {
- throw e;
- }
- }
-
- module.exports = {
- sendMessage: sendMessage,
- createNewClient: createNewClient,
- loadClient: loadClient,
- getClientInfo: getClientInfo,
- destroySession: destroySession,
- getClientState: getClientState,
- getClientState: getClientState,
- getChatbyPhoneNumber: getChatbyPhoneNumber,
- asyncLoadClient: asyncLoadClient,
- };
|