@@ -16,15 +16,14 @@ module.exports = { | |||||
messageModel.createNewClient(async function (data) { | messageModel.createNewClient(async function (data) { | ||||
// console.log(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 | let checkExist = await strapi | ||||
.query("session-data") | |||||
.findOne({ phonenumber: json["DATA"].wid.user }); | |||||
.query("session-data") | |||||
.findOne({ phonenumber: data["DATA"].wid.user }); | |||||
if (checkExist) { | if (checkExist) { | ||||
// messageModel.loadClient(async function(data){ | // messageModel.loadClient(async function(data){ | ||||
// let state = JSON.parse(data); | |||||
// let state = data.parse(data); | |||||
// if (state["STATUS"] == 1 && state["TYPE"] == "READY"){ | // if (state["STATUS"] == 1 && state["TYPE"] == "READY"){ | ||||
// let loaded = new Client(); | // let loaded = new Client(); | ||||
// loaded = state["DATA"]; | // loaded = state["DATA"]; | ||||
@@ -32,33 +31,37 @@ module.exports = { | |||||
// } | // } | ||||
// }); | // }); | ||||
let id = checkExist.id; | 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({ | 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); | // console.log(entry); | ||||
} | |||||
} | |||||
} | } | ||||
res.write(data); | |||||
res.write(JSON.stringify(data)); | |||||
if ( | if ( | ||||
json["STATUS"] == 0 || | |||||
(json["STATUS"] == 1 && json["TYPE"] == "READY") | |||||
data["STATUS"] == 0 || | |||||
(data["STATUS"] == 1 && data["TYPE"] == "READY") | |||||
) { | ) { | ||||
return res.end(); | return res.end(); | ||||
} | } | ||||
@@ -1,8 +1,17 @@ | |||||
'use strict'; | |||||
"use strict"; | |||||
/** | /** | ||||
* Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/services.html#core-services) | * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/services.html#core-services) | ||||
* to customize this service | * 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; | |||||
}, | |||||
}; |
@@ -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 | * See more details here: https://strapi.io/documentation/developer-docs/latest/concepts/configurations.html#cron-tasks | ||||
*/ | */ | ||||
let clients = {}; | let clients = {}; | ||||
let taskClientLoading = false; | |||||
let taskSendingMessage = false; | |||||
module.exports = { | module.exports = { | ||||
"*/10 * * * * *": async () => { | "*/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" } | |||||
// ); | |||||
// }); | |||||
} | |||||
}, | }, | ||||
}; | }; |
@@ -11,72 +11,69 @@ const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); | |||||
var client; | var client; | ||||
//Login Session when there is Session File | //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; | let sessionData; | ||||
client.on("auth_failure", (session) => { | 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) { | client.on("disconnected", async function (session) { | ||||
console.log("disconnected from loading"); | console.log("disconnected from loading"); | ||||
if (session == "UNPAIRED") { | if (session == "UNPAIRED") { | ||||
try { | try { | ||||
if (client && client.info) { | |||||
if (type == "load" && client && client.info) { | |||||
getID = await strapi | getID = await strapi | ||||
.query("session-data") | .query("session-data") | ||||
.findOne({ phonenumber: client.info.wid.user }); | .findOne({ phonenumber: client.info.wid.user }); | ||||
if (getID) { | if (getID) { | ||||
let id = getID["id"]; | 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) {} | } catch (e) {} | ||||
} | } | ||||
}); | }); | ||||
client.on("ready", () => { | |||||
client.on("ready", async () => { | |||||
// console.log("ready"); | |||||
var clientInfo = client.info; | var clientInfo = client.info; | ||||
clientInfo["sessionData"] = sessionData; | 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) => { | client.on("message", async (msg) => { | ||||
console.log("MESSAGE RECEIVED", msg.body); | |||||
// console.log("MESSAGE RECEIVED", msg.body); | |||||
}); | }); | ||||
client.on("qr", (qr) => { | 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) => { | client.on("change_state", (state) => { | ||||
console.log(`state => ${state}`); | |||||
// console.log(`state => ${state}`); | |||||
}); | }); | ||||
client.on("authenticated", (session) => { | client.on("authenticated", (session) => { | ||||
// console.log("authenticated"); | |||||
try { | try { | ||||
sessionData = session; | sessionData = session; | ||||
// fs.writeFileSync(SESSION_FILE_PATH, JSON.stringify(session)); | // fs.writeFileSync(SESSION_FILE_PATH, JSON.stringify(session)); | ||||
} catch (e) { | } 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, | restartOnAuthFail: true, | ||||
}); | }); | ||||
callbacks(client, callback,"load"); | |||||
console.log("initialize"); | |||||
callbacks(client, callback, "load"); | |||||
// console.log("initialize"); | |||||
client.initialize(); | client.initialize(); | ||||
} catch (e) { | } catch (e) { | ||||
// console.log(e); | |||||
return callback({ | return callback({ | ||||
STATUS: 0, | STATUS: 0, | ||||
TYPE: "ERROR", | 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 { | try { | ||||
if (!client.info) { | if (!client.info) { | ||||
throw { message: "Client Is Not Ready !" }; | throw { message: "Client Is Not Ready !" }; | ||||