| @@ -0,0 +1,52 @@ | |||||
| { | |||||
| "routes": [ | |||||
| { | |||||
| "method": "GET", | |||||
| "path": "/chats", | |||||
| "handler": "chats.find", | |||||
| "config": { | |||||
| "policies": [] | |||||
| } | |||||
| }, | |||||
| { | |||||
| "method": "GET", | |||||
| "path": "/chats/count", | |||||
| "handler": "chats.count", | |||||
| "config": { | |||||
| "policies": [] | |||||
| } | |||||
| }, | |||||
| { | |||||
| "method": "GET", | |||||
| "path": "/chats/:id", | |||||
| "handler": "chats.findOne", | |||||
| "config": { | |||||
| "policies": [] | |||||
| } | |||||
| }, | |||||
| { | |||||
| "method": "POST", | |||||
| "path": "/chats", | |||||
| "handler": "chats.create", | |||||
| "config": { | |||||
| "policies": [] | |||||
| } | |||||
| }, | |||||
| { | |||||
| "method": "PUT", | |||||
| "path": "/chats/:id", | |||||
| "handler": "chats.update", | |||||
| "config": { | |||||
| "policies": [] | |||||
| } | |||||
| }, | |||||
| { | |||||
| "method": "DELETE", | |||||
| "path": "/chats/:id", | |||||
| "handler": "chats.delete", | |||||
| "config": { | |||||
| "policies": [] | |||||
| } | |||||
| } | |||||
| ] | |||||
| } | |||||
| @@ -0,0 +1,8 @@ | |||||
| 'use strict'; | |||||
| /** | |||||
| * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/controllers.html#core-controllers) | |||||
| * to customize this controller | |||||
| */ | |||||
| module.exports = {}; | |||||
| @@ -0,0 +1,8 @@ | |||||
| 'use strict'; | |||||
| /** | |||||
| * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/models.html#lifecycle-hooks) | |||||
| * to customize this model | |||||
| */ | |||||
| module.exports = {}; | |||||
| @@ -0,0 +1,33 @@ | |||||
| { | |||||
| "kind": "collectionType", | |||||
| "collectionName": "chats", | |||||
| "info": { | |||||
| "name": "Chats", | |||||
| "description": "" | |||||
| }, | |||||
| "options": { | |||||
| "increments": true, | |||||
| "timestamps": true, | |||||
| "draftAndPublish": true | |||||
| }, | |||||
| "attributes": { | |||||
| "session_key": { | |||||
| "model": "session-data" | |||||
| }, | |||||
| "name": { | |||||
| "type": "string" | |||||
| }, | |||||
| "unreadCount": { | |||||
| "type": "integer" | |||||
| }, | |||||
| "chatId": { | |||||
| "type": "json" | |||||
| }, | |||||
| "phoneNumber": { | |||||
| "type": "string" | |||||
| }, | |||||
| "timestamp": { | |||||
| "type": "datetime" | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,8 @@ | |||||
| 'use strict'; | |||||
| /** | |||||
| * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/services.html#core-services) | |||||
| * to customize this service | |||||
| */ | |||||
| module.exports = {}; | |||||
| @@ -28,6 +28,7 @@ module.exports = { | |||||
| }); | }); | ||||
| if (data["TYPE"] == "READY") { | if (data["TYPE"] == "READY") { | ||||
| result = await messageModel.getAllChats(); | result = await messageModel.getAllChats(); | ||||
| console.log(JSON.stringify(result["DATA"])); | |||||
| } | } | ||||
| ctx.body = result; | ctx.body = result; | ||||
| } catch (e) { | } catch (e) { | ||||
| @@ -11,7 +11,7 @@ | |||||
| "draftAndPublish": true | "draftAndPublish": true | ||||
| }, | }, | ||||
| "attributes": { | "attributes": { | ||||
| "send_to": { | |||||
| "to": { | |||||
| "type": "string", | "type": "string", | ||||
| "regex": "\\+?([ -]?\\d+)+|\\(\\d+\\)([ -]\\d+)", | "regex": "\\+?([ -]?\\d+)+|\\(\\d+\\)([ -]\\d+)", | ||||
| "required": true | "required": true | ||||
| @@ -27,21 +27,31 @@ | |||||
| "plugin": "upload", | "plugin": "upload", | ||||
| "required": false | "required": false | ||||
| }, | }, | ||||
| "template_key": { | |||||
| "model": "message-template" | |||||
| }, | |||||
| "state": { | "state": { | ||||
| "type": "string", | "type": "string", | ||||
| "private": false | "private": false | ||||
| }, | }, | ||||
| "raw_text": { | |||||
| "body": { | |||||
| "type": "string" | "type": "string" | ||||
| }, | }, | ||||
| "session_datum_key": { | |||||
| "model": "session-data" | |||||
| }, | |||||
| "keterangan": { | "keterangan": { | ||||
| "type": "string" | "type": "string" | ||||
| }, | |||||
| "isForwarded": { | |||||
| "type": "boolean", | |||||
| "default": false | |||||
| }, | |||||
| "chat_key": { | |||||
| "model": "chats" | |||||
| }, | |||||
| "from": { | |||||
| "type": "string" | |||||
| }, | |||||
| "messageId": { | |||||
| "type": "string" | |||||
| }, | |||||
| "timestamp": { | |||||
| "type": "datetime" | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -14,4 +14,12 @@ module.exports = { | |||||
| }); | }); | ||||
| return arrKeys; | return arrKeys; | ||||
| }, | }, | ||||
| sessionCheck: async (sessionId) => { | |||||
| const sessions = await strapi.api["session-data"].services[ | |||||
| "session-data" | |||||
| ].getId({ | |||||
| _sort: "phonenumber:desc", | |||||
| }); | |||||
| return sessions.includes(sessionId); | |||||
| }, | |||||
| }; | }; | ||||
| @@ -1,5 +1,6 @@ | |||||
| "use strict"; | "use strict"; | ||||
| const messageModel = require("../../model/messageModel"); | const messageModel = require("../../model/messageModel"); | ||||
| const utils = require("../../util/util"); | |||||
| const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); | const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); | ||||
| /** | /** | ||||
| * Cron config that gives you an opportunity | * Cron config that gives you an opportunity | ||||
| @@ -71,57 +72,56 @@ module.exports = { | |||||
| if (Object.keys(clients).length == 0) taskSendingMessage = false; | if (Object.keys(clients).length == 0) taskSendingMessage = false; | ||||
| else { | else { | ||||
| for (const i of Object.keys(clients)) { | for (const i of Object.keys(clients)) { | ||||
| const sessions = await strapi.api["session-data"].services[ | |||||
| var sessionsValid = await strapi.api[ | |||||
| "session-data" | "session-data" | ||||
| ].getId({ | |||||
| _sort: "phonenumber:desc", | |||||
| }); | |||||
| if (!sessions.includes(parseInt(i))) { | |||||
| ].services["session-data"].sessionCheck(parseInt(i)); | |||||
| if (!sessionsValid) { | |||||
| delete clients[parseInt(i)]; | delete clients[parseInt(i)]; | ||||
| } else { | } else { | ||||
| const messages = await strapi.api.message.services.message.find( | |||||
| { | |||||
| _sort: "session_datum_key:desc", | |||||
| state: "QUEUE", | |||||
| session_datum_key: i, | |||||
| } | |||||
| ); | |||||
| 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["send_to"], | |||||
| message["raw_text"] | |||||
| ); | |||||
| // console.log(send); | |||||
| 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", | |||||
| keterangan: send["DATA"], | |||||
| } | |||||
| ); | |||||
| } | |||||
| } | |||||
| } catch (e) { | |||||
| await strapi.api.message.services.message.update( | |||||
| { id: message.id }, | |||||
| { state: "ERROR", keterangan: e.message } | |||||
| ); | |||||
| } | |||||
| } | |||||
| // const messages = await strapi.api.message.services.message.find( | |||||
| // { | |||||
| // _sort: "session_datum_key:desc", | |||||
| // state: "QUEUE", | |||||
| // session_datum_key: i, | |||||
| // } | |||||
| // ); | |||||
| // 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["send_to"], | |||||
| // message["raw_text"] | |||||
| // ); | |||||
| // // console.log(send); | |||||
| // 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", | |||||
| // keterangan: send["DATA"], | |||||
| // } | |||||
| // ); | |||||
| // } | |||||
| // } | |||||
| // } catch (e) { | |||||
| // await strapi.api.message.services.message.update( | |||||
| // { id: message.id }, | |||||
| // { state: "ERROR", keterangan: e.message } | |||||
| // ); | |||||
| // } | |||||
| // } | |||||
| await utils.refreshChat(clients[i], parseInt(i)); | |||||
| } | } | ||||
| } | } | ||||
| taskSendingMessage = false; | taskSendingMessage = false; | ||||
| @@ -159,23 +159,24 @@ var sendMessage = async function (client, phone_number, textMessage) { | |||||
| } | } | ||||
| }; | }; | ||||
| var getChatbyPhoneNumber = async function (phone_number) { | |||||
| var getMessagebyId = async function (client, chatId, param = {}) { | |||||
| try { | try { | ||||
| if (!client.info) { | if (!client.info) { | ||||
| throw { message: "Client Is Not Ready !" }; | throw { message: "Client Is Not Ready !" }; | ||||
| } | } | ||||
| let phoneNumber = reformatMobilePhone(phone_number); | |||||
| let chats = await client.getChatById(phoneNumber); | |||||
| let messageList = await chats.fetchMessages(); | |||||
| var chat = await client.getChatById(chatId._serialized); | |||||
| var messageList = await chat.fetchMessages(param); | |||||
| // console.log(messageList); | |||||
| return { STATUS: 1, DATA: messageList }; | return { STATUS: 1, DATA: messageList }; | ||||
| } catch (e) { | } catch (e) { | ||||
| // console.log(e); | |||||
| return { STATUS: 0, DATA: e.message }; | return { STATUS: 0, DATA: e.message }; | ||||
| } | } | ||||
| }; | }; | ||||
| var getAllChats = async function () { | |||||
| var getAllChats = async function (client) { | |||||
| try { | try { | ||||
| if (!client.info) { | |||||
| if (!client || !client.info) { | |||||
| throw { message: "Client Is Not Ready !" }; | throw { message: "Client Is Not Ready !" }; | ||||
| } | } | ||||
| let chatList = await client.getChats(); | let chatList = await client.getChats(); | ||||
| @@ -255,7 +256,7 @@ module.exports = { | |||||
| destroySession: destroySession, | destroySession: destroySession, | ||||
| getClientState: getClientState, | getClientState: getClientState, | ||||
| getClientState: getClientState, | getClientState: getClientState, | ||||
| getChatbyPhoneNumber: getChatbyPhoneNumber, | |||||
| asyncLoadClient: asyncLoadClient, | |||||
| getMessagebyId: getMessagebyId, | |||||
| getAllChats: getAllChats, | getAllChats: getAllChats, | ||||
| asyncLoadClient: asyncLoadClient, | |||||
| }; | }; | ||||
| @@ -12,6 +12,7 @@ | |||||
| "devDependencies": {}, | "devDependencies": {}, | ||||
| "dependencies": { | "dependencies": { | ||||
| "knex": "<0.20.0", | "knex": "<0.20.0", | ||||
| "moment": "^2.29.1", | |||||
| "mysql": "latest", | "mysql": "latest", | ||||
| "qrcode-terminal": "^0.12.0", | "qrcode-terminal": "^0.12.0", | ||||
| "strapi": "3.4.1", | "strapi": "3.4.1", | ||||
| @@ -0,0 +1,89 @@ | |||||
| "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, | |||||
| }; | |||||