From d98bc7108a69d6f784eb00b43543ab3b286fd928 Mon Sep 17 00:00:00 2001 From: jefry Date: Tue, 26 Jan 2021 17:07:41 +0700 Subject: [PATCH] 26 jan --- api/session-data/controllers/session-data.js | 59 ++++++------ api/session-data/services/session-data.js | 13 ++- config/functions/cron.js | 130 ++++++++++++++++++++------- model/messageModel.js | 70 +++++++-------- 4 files changed, 176 insertions(+), 96 deletions(-) diff --git a/api/session-data/controllers/session-data.js b/api/session-data/controllers/session-data.js index aa1f495..d882e47 100644 --- a/api/session-data/controllers/session-data.js +++ b/api/session-data/controllers/session-data.js @@ -16,15 +16,14 @@ module.exports = { messageModel.createNewClient(async function (data) { // console.log(data); - var json = JSON.parse(data); - if (json["STATUS"] == 1 && json["TYPE"] == "READY") { - // console.log(json["DATA"]); + if (data["STATUS"] == 1 && data["TYPE"] == "READY") { + // console.log(data["DATA"]); let checkExist = await strapi - .query("session-data") - .findOne({ phonenumber: json["DATA"].wid.user }); + .query("session-data") + .findOne({ phonenumber: data["DATA"].wid.user }); if (checkExist) { // messageModel.loadClient(async function(data){ - // let state = JSON.parse(data); + // let state = data.parse(data); // if (state["STATUS"] == 1 && state["TYPE"] == "READY"){ // let loaded = new Client(); // loaded = state["DATA"]; @@ -32,33 +31,37 @@ module.exports = { // } // }); let id = checkExist.id; - await strapi.services["session-data"].update({ id }, { - name:json["DATA"].pushname, - device_manufacturer:json["DATA"].phone.device_manufacturer, - device_model:json["DATA"].phone.device_model, - platform:json["DATA"].platform, - os_version:json["DATA"].phone.os_version, - phonenumber:json["DATA"].wid.user, - session_data:json["DATA"].sessionData, - }); - } - else { + await strapi.services["session-data"].update( + { id }, + { + name: data["DATA"].pushname, + device_manufacturer: + data["DATA"].phone.device_manufacturer, + device_model: data["DATA"].phone.device_model, + platform: data["DATA"].platform, + os_version: data["DATA"].phone.os_version, + phonenumber: data["DATA"].wid.user, + session_data: data["DATA"].sessionData, + } + ); + } else { await strapi.services["session-data"].create({ - name:json["DATA"].pushname, - device_manufacturer:json["DATA"].phone.device_manufacturer, - device_model:json["DATA"].phone.device_model, - platform:json["DATA"].platform, - os_version:json["DATA"].phone.os_version, - phonenumber:json["DATA"].wid.user, - session_data:json["DATA"].sessionData, + name: data["DATA"].pushname, + device_manufacturer: + data["DATA"].phone.device_manufacturer, + device_model: data["DATA"].phone.device_model, + platform: data["DATA"].platform, + os_version: data["DATA"].phone.os_version, + phonenumber: data["DATA"].wid.user, + session_data: data["DATA"].sessionData, }); // console.log(entry); - } + } } - res.write(data); + res.write(JSON.stringify(data)); if ( - json["STATUS"] == 0 || - (json["STATUS"] == 1 && json["TYPE"] == "READY") + data["STATUS"] == 0 || + (data["STATUS"] == 1 && data["TYPE"] == "READY") ) { return res.end(); } diff --git a/api/session-data/services/session-data.js b/api/session-data/services/session-data.js index 6bc4168..fea7208 100644 --- a/api/session-data/services/session-data.js +++ b/api/session-data/services/session-data.js @@ -1,8 +1,17 @@ -'use strict'; +"use strict"; /** * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/services.html#core-services) * to customize this service */ -module.exports = {}; +module.exports = { + getId: async (params) => { + const results = await strapi.query("session-data").find(params); + let arrKeys = []; + results.forEach((i) => { + if (!arrKeys.includes(i["id"])) arrKeys.push(i["id"]); + }); + return arrKeys; + }, +}; diff --git a/config/functions/cron.js b/config/functions/cron.js index 3d910e3..8f7c3d5 100644 --- a/config/functions/cron.js +++ b/config/functions/cron.js @@ -11,40 +11,110 @@ const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); * See more details here: https://strapi.io/documentation/developer-docs/latest/concepts/configurations.html#cron-tasks */ let clients = {}; +let taskClientLoading = false; +let taskSendingMessage = false; module.exports = { "*/10 * * * * *": async () => { - const session_key = await strapi.api.message.services.message.distinctbyKey( - { - _sort: "session_datum_key:desc", - state: "QUEUE", + if (!taskClientLoading) { + console.log("refresh cients"); + taskClientLoading = true; + const session_key = await strapi.api["session-data"].services[ + "session-data" + ].find({ + _sort: "phonenumber:desc", + }); + if (session_key.length == 0) taskClientLoading = false; + else { + session_key.forEach(async (i, indx) => { + if (!Object.keys(clients).includes(`${i["id"]}`)) { + clients[i["id"]] = null; + await messageModel.loadClient( + i["session_data"], + async (data) => { + if ( + data["STATUS"] == 1 && + data["TYPE"] == "READY" + ) { + if (indx + 1 == session_key.length) + taskClientLoading = false; + clients[i["id"]] = data["DATA"]; + return; + } else if ( + data["STATUS"] == 0 && + data["AUTH_FAILURE"] + ) { + let id = i["id"]; + await strapi.api["session-data"].services[ + "session-data" + ].delete({ id }); + if (indx + 1 == session_key.length) + taskClientLoading = false; + return; + } else if (data["STATUS"] == 0) { + if (indx + 1 == session_key.length) + taskClientLoading = false; + return; + } + } + ); + } + }); } - ); - session_key.forEach(async (i)=>{ - if(!Object.keys(clients).includes(`${i["id"]}`)){ - clients[i["id"]] = null; - messageModel.loadClient(i["session_data"],async (data)=>{ - var json = JSON.parse(data); - if (json["STATUS"] == 1 && json["TYPE"] == "READY") { - return clients[i["id"]] = json["DATA"]; - } - else if(json["STATUS"] ==0){ - return; - } + } + }, + "*/3 * * * * *": async () => { + if (!taskSendingMessage) { + console.log("auto send", clients); + taskSendingMessage = true; + if (Object.keys(clients).length == 0) taskSendingMessage = false; + else { + Object.keys(clients).forEach(async (i, indx) => { + const sessions = await strapi.api["session-data"].services[ + "session-data" + ].getId({ + _sort: "phonenumber:desc", + }); + if (!sessions.includes(i)) { + delete clients[i]; + } else { + const messages = await strapi.api.message.services.message.find( + { + _sort: "session_datum_key:desc", + state: "QUEUE", + session_datum_key: i, + } + ); + messages.forEach(async (message) => { + console.log(clients[i] != null, i, clients); + if (clients[i] != null) { + await strapi.api.message.services.message.update( + { id: message.id }, + { state: "SENDING" } + ); + let send = await messageModel.sendMessage( + clients[i], + message["send_to"], + message["raw_text"] + ); + if (send["STATUS"] == 1) { + await strapi.api.message.services.message.update( + { id: message.id }, + { state: "SENT" } + ); + } else { + await strapi.api.message.services.message.update( + { id: message.id }, + { state: "ERROR" } + ); + } + } else taskSendingMessage = false; + }); + } + + if (indx + 1 == Object.keys(clients).length) + taskSendingMessage = false; }); } - }) - console.log(clients); - // const messages = await strapi.api.message.services.message.find( - // { - // _sort: "session_datum_key:desc", - // state: "QUEUE", - // } - // ); - // messages.forEach(async (message) => { - // await strapi.api.message.services.message.update( - // { id: message.id }, - // { state: "SENT" } - // ); - // }); + } }, }; diff --git a/model/messageModel.js b/model/messageModel.js index 0bbf3b7..2721d01 100644 --- a/model/messageModel.js +++ b/model/messageModel.js @@ -11,72 +11,69 @@ const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); var client; //Login Session when there is Session File -function callbacks(client, callback,type="create") { +function callbacks(client, callback, type = "create") { + console.log("starting", type); let sessionData; client.on("auth_failure", (session) => { - console.log("auth_failure"); - // clearFileSession(phoneNumber); - return callback( - JSON.stringify({ - STATUS: 0, - TYPE: "AUTH_FAILURE", - DATA: "SESSION HAS BEEN ENDED , PLEASE CREATE A NEW ONE !", - }) - ); + // 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 loading"); if (session == "UNPAIRED") { try { - if (client && client.info) { + if (type == "load" && client && client.info) { getID = await strapi .query("session-data") .findOne({ phonenumber: client.info.wid.user }); - if (getID) { let id = getID["id"]; - await strapi.query("session-data").delete({ id }); + await strapi.api["session-data"].services[ + "session-data" + ].delete({ id }); } + await client.destroy(); } } catch (e) {} } }); - client.on("ready", () => { + client.on("ready", async () => { + // console.log("ready"); var clientInfo = client.info; clientInfo["sessionData"] = sessionData; - return callback( - JSON.stringify({ - STATUS: 1, - TYPE: "READY", - DATA: (type=="create")?clientInfo:client, - }) - ); + 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); + // console.log("MESSAGE RECEIVED", msg.body); }); client.on("qr", (qr) => { - return callback( - JSON.stringify({ STATUS: 1, TYPE: "QR_AUTH", DATA: qr }) - ); + return callback({ STATUS: 1, TYPE: "QR_AUTH", DATA: qr }); }); client.on("change_state", (state) => { - console.log(`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( - JSON.stringify({ - STATUS: 0, - TYPE: "AUTHENTICATED_ERROR", - DATA: e.message, - }) - ); + return callback({ + STATUS: 0, + TYPE: "AUTHENTICATED_ERROR", + DATA: e.message, + }); } }); } @@ -99,10 +96,11 @@ var loadClient = async function (clientSessionData, callback) { restartOnAuthFail: true, }); - callbacks(client, callback,"load"); - console.log("initialize"); + callbacks(client, callback, "load"); + // console.log("initialize"); client.initialize(); } catch (e) { + // console.log(e); return callback({ STATUS: 0, TYPE: "ERROR", @@ -129,7 +127,7 @@ var createNewClient = async function (callback) { } }; -var sendMessage = async function (phone_number, textMessage) { +var sendMessage = async function (client, phone_number, textMessage) { try { if (!client.info) { throw { message: "Client Is Not Ready !" };