From 131caa5f97860c1769abef486670220bb92685bc Mon Sep 17 00:00:00 2001 From: jefry Date: Fri, 16 Apr 2021 16:03:25 +0700 Subject: [PATCH] done ajax send recieve --- .../models/message-template.settings.json | 4 + api/message/models/message.settings.json | 4 +- api/message/services/message.js | 30 ++++++-- api/session-data/models/session-data.settings.json | 4 - config/functions/cron.js | 72 +---------------- model/messageModel.js | 16 +++- util/refreshChat.js | 62 +++++++++++++++ util/refreshMessage.js | 27 +++++++ util/sendQueueMessage.js | 55 +++++++++++++ util/util.js | 89 ---------------------- 10 files changed, 189 insertions(+), 174 deletions(-) create mode 100644 util/refreshChat.js create mode 100644 util/refreshMessage.js create mode 100644 util/sendQueueMessage.js delete mode 100644 util/util.js diff --git a/api/message-template/models/message-template.settings.json b/api/message-template/models/message-template.settings.json index 65cbfeb..1770c24 100644 --- a/api/message-template/models/message-template.settings.json +++ b/api/message-template/models/message-template.settings.json @@ -23,6 +23,10 @@ }, "body_vars": { "type": "string" + }, + "message": { + "via": "template_key", + "model": "message" } } } diff --git a/api/message/models/message.settings.json b/api/message/models/message.settings.json index 2af2010..dcc6368 100644 --- a/api/message/models/message.settings.json +++ b/api/message/models/message.settings.json @@ -53,8 +53,8 @@ "timestamp": { "type": "datetime" }, - "session_datum_key": { - "model": "session-data", + "template_key": { + "model": "message-template", "via": "message" } } diff --git a/api/message/services/message.js b/api/message/services/message.js index a876efa..68ae794 100644 --- a/api/message/services/message.js +++ b/api/message/services/message.js @@ -1,4 +1,4 @@ -'use strict'; +"use strict"; /** * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/services.html#core-services) @@ -6,12 +6,28 @@ */ module.exports = { - distinctbyKey: async (params) =>{ - const results = await strapi.query('message').find(params); + distinctbyKey: async (params) => { + const results = await strapi.query("message").find(params); let arrKeys = []; - results.forEach((i)=>{ - if(!arrKeys.includes(i["session_datum_key"])) arrKeys.push(i["session_datum_key"]); + results.forEach((i) => { + if (!arrKeys.includes(i["session_datum_key"])) + arrKeys.push(i["session_datum_key"]); }); - return arrKeys - } + return arrKeys; + }, + getQueueMessage: async (sessionId) => { + var chat = await strapi.api["chats"].services["chats"].find({ + session_key: sessionId, + }); + var arrayChat = chat.map((i) => i.id); + var messageList = []; + if (chat && chat.length != 0) { + messageList = await strapi.api.message.services.message.find({ + _sort: "chat_key:desc", + state: "QUEUE", + chat_key_in: arrayChat, + }); + } + return messageList; + }, }; diff --git a/api/session-data/models/session-data.settings.json b/api/session-data/models/session-data.settings.json index c89673f..92723d9 100644 --- a/api/session-data/models/session-data.settings.json +++ b/api/session-data/models/session-data.settings.json @@ -32,10 +32,6 @@ "phonenumber": { "type": "string", "required": true - }, - "message": { - "via": "session_datum_key", - "model": "message" } } } diff --git a/config/functions/cron.js b/config/functions/cron.js index 19f8adc..ff5600d 100644 --- a/config/functions/cron.js +++ b/config/functions/cron.js @@ -1,6 +1,7 @@ "use strict"; const messageModel = require("../../model/messageModel"); -const utils = require("../../util/util"); +const refreshChat = require("../../util/refreshChat"); +const sendQueueMessage = require("../../util/sendQueueMessage"); const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); /** * Cron config that gives you an opportunity @@ -78,73 +79,8 @@ module.exports = { if (!sessionsValid) { delete clients[parseInt(i)]; } else { - const messages = await strapi.api.message.services.message.find( - { - _sort: "session_datum_key:desc", - state: "QUEUE", - session_datum_key: parseInt(i), - } - ); - // console.log(messages); - for (const message of messages) { - // console.log(clients[i] != null, i, clients); - try { - if (clients[i] != null) { - await strapi.api.message.services.message.update( - { id: message.id }, - { state: "SENDING" } - ); - let send = await messageModel.sendMessage( - clients[i], - message["chat_key"]["chatId"] - ._serialized, - message["body"] - ); - if (send["STATUS"] == 1) { - // console.log(send["DATA"]); - await strapi.api.message.services.message.update( - { id: message.id }, - { - state: "SENT", - messageId: - send["DATA"]["id"]["id"], - from: send["DATA"]["from"], - isForwarded: - send["DATA"][ - "isForwarded" - ] == undefined - ? false - : send["DATA"][ - "isForwarded" - ], - timestamp: moment - .unix( - send["DATA"][ - "timestamp" - ] - ) - .toDate(), - } - ); - } else { - await strapi.api.message.services.message.update( - { id: message.id }, - { - state: "ERROR", - keterangan: send["DATA"], - } - ); - } - } - } catch (e) { - // console.log("err", e); - await strapi.api.message.services.message.update( - { id: message.id }, - { state: "ERROR", keterangan: e.message } - ); - } - } - await utils.refreshChat(clients[i], parseInt(i)); + await sendQueueMessage(clients[i], parseInt(i)); + await refreshChat(clients[i], parseInt(i)); } } taskSendingMessage = false; diff --git a/model/messageModel.js b/model/messageModel.js index 3765590..e8b5479 100644 --- a/model/messageModel.js +++ b/model/messageModel.js @@ -1,6 +1,6 @@ const qrcode = require("qrcode-terminal"); const fs = require("fs"); - +const refreshMessage = require("../util/refreshMessage"); // const path = require("path"); const { Client, Chat, Message } = require("whatsapp-web.js"); // const SESSION_FOLDER = path.join(__dirname, "../data/"); @@ -27,11 +27,11 @@ function callbacks(client, callback, type = "create") { if (session == "UNPAIRED" || session == "CONFLICT") { try { if (type == "load" && client && client.info) { - console.log(getID); + // console.log(getID); getID = await strapi .query("session-data") .findOne({ phonenumber: client.info.wid.user }); - console.log(getID); + // console.log(getID); if (getID) { let id = getID["id"]; await strapi.api["session-data"].services[ @@ -56,8 +56,16 @@ function callbacks(client, callback, type = "create") { }); }); client.on("message", async (msg) => { - // console.log("MESSAGE RECEIVED", msg.body); + var phoneNumber = msg.from; + // console.log(phoneNumber); + var chat = await strapi.api["chats"].services["chats"].findOne({ + phoneNumber: phoneNumber.split("@")[0], + }); + await refreshMessage(msg, chat); }); + // client.on("message_create", async (msg) => { + + // }); client.on("qr", (qr) => { return callback({ STATUS: 1, TYPE: "QR_AUTH", DATA: qr }); }); diff --git a/util/refreshChat.js b/util/refreshChat.js new file mode 100644 index 0000000..3707010 --- /dev/null +++ b/util/refreshChat.js @@ -0,0 +1,62 @@ +"use strict"; +const messageModel = require("../model/messageModel"); +const moment = require("moment"); +const refreshMessage = require("./refreshMessage"); + +const refreshChat = async function (client, sessionsId) { + try { + if (client && sessionsId) { + var chatId; + var result = await messageModel.getAllChats(client); + if (result["STATUS"] == 1) { + for (var i = 0; i < result["DATA"].length; i++) { + var chatsExist = await strapi.api["chats"].services[ + "chats" + ].findOne({ + session_key: sessionsId, + phoneNumber: result["DATA"][i]["id"].user, + }); + if (!chatsExist) { + await strapi.query("chats").create({ + session_key: sessionsId, + name: result["DATA"][i]["name"], + unreadCount: result["DATA"][i]["unreadCount"], + timestamp: moment + .unix(result["DATA"][i]["timestamp"]) + .toDate(), + chatId: result["DATA"][i]["id"], + phoneNumber: result["DATA"][i]["id"].user, + }); + chatsExist = await strapi.api["chats"].services[ + "chats" + ].findOne({ + session_key: sessionsId, + phoneNumber: result["DATA"][i]["id"].user, + }); + } + var messages = await messageModel.getMessagebyId( + client, + result["DATA"][i]["id"] + ); + if (messages["STATUS"] == 1) { + for (var j = 0; j < messages["DATA"].length; j++) { + await refreshMessage( + messages["DATA"][j], + chatsExist + ); + } + } + } + } else { + throw { message: result["DATA"] }; + } + } + + // console.log("done populating chats"); + } catch (e) { + console.log("error", e.message || e); + // return { STATUS: 0, DATA: e.message || e }; + } +}; + +module.exports = refreshChat; diff --git a/util/refreshMessage.js b/util/refreshMessage.js new file mode 100644 index 0000000..a42fbdd --- /dev/null +++ b/util/refreshMessage.js @@ -0,0 +1,27 @@ +"use strict"; +const moment = require("moment"); + +const refreshMessage = async function (message, chat) { + var Exist = await strapi.api["message"].services["message"].findOne({ + messageId: message["id"].id, + }); + if (!Exist) { + // console.log(chatId); + await strapi.query("message").create({ + messageId: message["id"].id, + to: message["to"], + from: message["from"], + body: message["body"], + state: message["fromMe"] ? "SENT" : "RECIEVED", + isForwarded: + message["isForwarded"] == undefined + ? false + : message["isForwarded"], + chat_key: chat.id, + timestamp: moment.unix(message["timestamp"]).toDate(), + }); + // console.log("message added"); + } +}; + +module.exports = refreshMessage; diff --git a/util/sendQueueMessage.js b/util/sendQueueMessage.js new file mode 100644 index 0000000..1fd9be5 --- /dev/null +++ b/util/sendQueueMessage.js @@ -0,0 +1,55 @@ +const messageModel = require("../model/messageModel"); +const moment = require("moment"); + +module.exports = async function (client, sessionId) { + const messages = await strapi.api.message.services.message.getQueueMessage( + sessionId + ); + for (const message of messages) { + try { + if (client != null) { + await strapi.api.message.services.message.update( + { id: message.id }, + { state: "SENDING" } + ); + let send = await messageModel.sendMessage( + client, + message["chat_key"]["chatId"]._serialized, + message["body"] + ); + if (send["STATUS"] == 1) { + // console.log(send["DATA"]); + await strapi.api.message.services.message.update( + { id: message.id }, + { + state: "SENT", + messageId: send["DATA"]["id"]["id"], + from: send["DATA"]["from"], + isForwarded: + send["DATA"]["isForwarded"] == undefined + ? false + : send["DATA"]["isForwarded"], + timestamp: moment + .unix(send["DATA"]["timestamp"]) + .toDate(), + } + ); + } else { + await strapi.api.message.services.message.update( + { id: message.id }, + { + state: "ERROR", + keterangan: send["DATA"], + } + ); + } + } + } catch (e) { + // console.log("err", e); + await strapi.api.message.services.message.update( + { id: message.id }, + { state: "ERROR", keterangan: e.message } + ); + } + } +}; diff --git a/util/util.js b/util/util.js deleted file mode 100644 index 826e235..0000000 --- a/util/util.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; -const messageModel = require("../model/messageModel"); -const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); -const moment = require("moment"); - -const refreshChat = async function (client, sessionsId) { - try { - if (client && sessionsId) { - var chatId; - var result = await messageModel.getAllChats(client); - if (result["STATUS"] == 1) { - for (var i = 0; i < result["DATA"].length; i++) { - var chatsExist = await strapi.api["chats"].services[ - "chats" - ].findOne({ - session_key: sessionsId, - phoneNumber: result["DATA"][i]["id"].user, - }); - if (!chatsExist) { - await strapi.query("chats").create({ - session_key: sessionsId, - name: result["DATA"][i]["name"], - unreadCount: result["DATA"][i]["unreadCount"], - timestamp: moment - .unix(result["DATA"][i]["timestamp"]) - .toDate(), - chatId: result["DATA"][i]["id"], - phoneNumber: result["DATA"][i]["id"].user, - }); - chatsExist = await strapi.api["chats"].services[ - "chats" - ].findOne({ - session_key: sessionsId, - phoneNumber: result["DATA"][i]["id"].user, - }); - } - chatId = chatsExist.id; - var messages = await messageModel.getMessagebyId( - client, - result["DATA"][i]["id"] - ); - if (messages["STATUS"] == 1) { - for (var j = 0; j < messages["DATA"].length; j++) { - var Exist = await strapi.api["message"].services[ - "message" - ].findOne({ - messageId: messages["DATA"][j]["id"].id, - }); - if (!Exist) { - // console.log(chatId); - await strapi.query("message").create({ - messageId: messages["DATA"][j]["id"].id, - to: messages["DATA"][j]["to"], - from: messages["DATA"][j]["from"], - body: messages["DATA"][j]["body"], - state: messages["DATA"][j]["fromMe"] - ? "SENT" - : "RECIEVED", - isForwarded: - messages["DATA"][j]["isForwarded"] == - undefined - ? false - : messages["DATA"][j][ - "isForwarded" - ], - chat_key: chatId, - timestamp: moment - .unix(messages["DATA"][j]["timestamp"]) - .toDate(), - }); - } - } - } - } - } else { - throw { message: result["DATA"] }; - } - } - - // console.log("done populating chats"); - } catch (e) { - console.log("error", e.message || e); - // return { STATUS: 0, DATA: e.message || e }; - } -}; - -module.exports = { - refreshChat: refreshChat, -};