@@ -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(); | |||
} | |||
@@ -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; | |||
}, | |||
}; |
@@ -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" } | |||
// ); | |||
// }); | |||
} | |||
}, | |||
}; |
@@ -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 !" }; | |||