1255 lines
31 KiB
JavaScript
1255 lines
31 KiB
JavaScript
'use strict'
|
|
|
|
const { initIO } = require("./helpers/socket")
|
|
|
|
const { ObjectId } = require('mongodb')
|
|
|
|
|
|
const backup_session = require('./helpers/backup_session')
|
|
const restore = require('./helpers/restore')
|
|
|
|
const dbcloud = require('./funcs/dbcloud.js')
|
|
|
|
const { Client, Location, List, Buttons, LocalAuth } = require('whatsapp-web.js/index')
|
|
|
|
|
|
const qrencode = require('qr-encode')
|
|
const axios = require('axios').default
|
|
const bodyparser = require('body-parser')
|
|
const path = require('path')
|
|
const fs = require('fs')
|
|
const express = require('express')
|
|
const FormData = require('form-data')
|
|
|
|
// const { MessageMedia } = require('./node_modules/whatsapp-web.js/src/structures');
|
|
let whatsappWebGlobalPath = path.join(process.env.NODE_PATH, 'whatsapp-web.js', '/src/structures')
|
|
whatsappWebGlobalPath = whatsappWebGlobalPath.replace(':', '')
|
|
|
|
console.log('whatsappWebGlobalPath: ', whatsappWebGlobalPath)
|
|
console.log('process.env.NODE_PATH: ', process.env.NODE_PATH)
|
|
|
|
const { MessageMedia } = require(whatsappWebGlobalPath)
|
|
|
|
const logger = require('logger')
|
|
|
|
const dotenv = require('dotenv')
|
|
dotenv.config({ path: '.env' })
|
|
|
|
const mime = require('mime')
|
|
const qrcode = require('qrcode-terminal')
|
|
const omnihit = require('./funcs/omnihit.js')
|
|
const { allowedNodeEnvironmentFlags } = require('process')
|
|
|
|
const checkInternetConnection = require('./helpers/checkIntenet')
|
|
|
|
const mongo = require('./funcs/mongoConn')
|
|
|
|
const db = mongo.db(process.env.DB_MONGO_NAME)
|
|
|
|
let auxCampaignMessage = ''
|
|
|
|
|
|
|
|
require("./funcs/tools.js")()
|
|
let scheduler_messages_outbound
|
|
let scheduler_monitor
|
|
let scheduler_monitor_cell
|
|
let scheduler_campaign_monitor
|
|
let scheduler_internet_conn
|
|
|
|
let client
|
|
// const PORT = 80;
|
|
let sendSeen = false
|
|
let unreadMessaesProcess
|
|
|
|
const { imageUpload } = require('./helpers/image-uploader')
|
|
|
|
var QRCODE = "0"
|
|
var mobileuid
|
|
var destroy
|
|
var changeInternetConn = true
|
|
|
|
let asking_qrcode = false
|
|
|
|
const dbcc = require('./helpers/mysql_conn.js')
|
|
|
|
const removeDir = require('./helpers/remove_dir')
|
|
|
|
|
|
// (async()=>{
|
|
// backup_session(destroy)
|
|
// clearTimeout(destroy)
|
|
// })
|
|
// console.log('PASSOU............')
|
|
// return
|
|
|
|
|
|
// Sleep
|
|
const sleep = (ms) => {
|
|
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
}
|
|
|
|
function getRandomNumber(min, max) {
|
|
return Math.floor(Math.random() * (max - min + 1)) + min
|
|
}
|
|
|
|
const app = express()
|
|
|
|
app.use(express.static(path.join(__dirname, 'public')))
|
|
//app.use(bodyparser.urlencoded({ extended: true }));
|
|
app.use(bodyparser.json())
|
|
|
|
const sessionName = process.env.MOBILEUID
|
|
|
|
|
|
|
|
// console.log('DIRNAME: ', path.join(__dirname, '.wwebjs_auth', 'session-omnihit_sesssion'))
|
|
|
|
//TEST DEL
|
|
|
|
console.log('process.env.CLIENT_URL: ', process.env.CLIENT_URL)
|
|
|
|
console.log('1')
|
|
// Connect to server
|
|
var io = require('socket.io-client')
|
|
|
|
|
|
|
|
|
|
// const socket = initIO('http://localhost:8024')
|
|
|
|
|
|
const socketIo = io(process.env.CLIENT_URL, { reconnect: true, maxHttpBufferSize: 1e8 })
|
|
|
|
socketIo.on('connect', async function () {
|
|
console.log('Made socket connection', socketIo.id)
|
|
|
|
console.log('process.env.WHATSAPP_ID: ', process.env.WHATSAPP_ID)
|
|
|
|
socketIo.emit('joinWhatsSession', process.env.WHATSAPP_ID)
|
|
|
|
sendSeen = true
|
|
|
|
if (mobileuid) {
|
|
|
|
console.log('Socket conectado com o cliente: ', mobileuid)
|
|
|
|
setTimeout(async () => {
|
|
|
|
console.log('Entro no syncUnreadMessages ON CONNECTED SOCKET')
|
|
await syncUnreadMessages(client)
|
|
|
|
client.sendPresenceAvailable()
|
|
|
|
}, 5000)
|
|
}
|
|
|
|
})
|
|
|
|
socketIo.on('message_from_server', function () {
|
|
console.log('message_from_server data: ')
|
|
})
|
|
|
|
// socketIo.on('disconnect', function () {
|
|
// console.log('disconnect');
|
|
// });
|
|
|
|
// var count = 0
|
|
|
|
// // Send a message to the server 3 seconds after initial connection.
|
|
// setInterval(function () {
|
|
// // socketIo.emit('message_from_client', 'Sent an event from the client!');
|
|
|
|
// const data = {
|
|
// id: "64d7fa0ce984e1cb781baee0",
|
|
// sent: count
|
|
// }
|
|
|
|
// socketIo.emit("campaign_message_sent", data)
|
|
|
|
// count++
|
|
|
|
// }, 3000)
|
|
|
|
socketIo.on('connect_error', async function (err) {
|
|
|
|
console.log('connection errror', err)
|
|
|
|
sendSeen = false
|
|
|
|
if (mobileuid) {
|
|
client.sendPresenceUnavailable()
|
|
}
|
|
})
|
|
//
|
|
|
|
|
|
//NOVA OPÇÃO MD
|
|
client = new Client({
|
|
authStrategy: new LocalAuth({ clientId: 'omnihit_sesssion' }),
|
|
puppeteer: { args: ['--no-sandbox', '--disable-setuid-sandbox'], executablePath: process.env.CHROME_BIN || '/usr/bin/google-chrome-stable' },
|
|
})
|
|
|
|
client.initialize()
|
|
|
|
client.on("qr", async qr => {
|
|
|
|
console.log("Session:", sessionName)
|
|
|
|
// Generate and scan this code with your phone
|
|
QRCODE = qr
|
|
qrcode.generate(qr, { small: true })
|
|
console.log('QR RECEIVED', qr)
|
|
|
|
// omnihit.qrcode(process.env.MOBILEUID, process.env.MOBILENAME, qr);
|
|
// omnihit.monitor(process.env.MOBILEUID, process.env.MOBILENAME, "STARTUP");
|
|
|
|
asking_qrcode = true
|
|
|
|
await new Promise((resolve, reject) => {
|
|
|
|
dbcc.query("UPDATE Whatsapps SET qrcode = ?, status = ?, retries = ? where id = ?", [qr, 'qrcode', 0, process.env.WHATSAPP_ID],
|
|
|
|
function (err, result) {
|
|
|
|
if (err) {
|
|
console.log("ERROR: " + err)
|
|
reject(err)
|
|
}
|
|
else {
|
|
resolve(result)
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
let url = process.env.CLIENT_URL + '/whatsapp/connection/qrcode'
|
|
|
|
try {
|
|
|
|
let response = await axios.post(url, { whatsappId: process.env.WHATSAPP_ID })
|
|
|
|
} catch (error) {
|
|
console.log('There was an error on POST THE DATA TO URL: ', url, '\n' + error)
|
|
}
|
|
|
|
})
|
|
|
|
client.on("authenticated", async session => {
|
|
console.log(`Session: ${sessionName} AUTHENTICATED`)
|
|
})
|
|
|
|
client.on("auth_failure", async msg => {
|
|
console.log(
|
|
`Session: ${sessionName} AUTHENTICATION FAILURE! Reason: ${msg}`
|
|
)
|
|
|
|
// omnihit.monitor(process.env.MOBILEUID, process.env.MOBILENAME, "AUTHFAILURE");
|
|
|
|
//reject(new Error("Error starting whatsapp session."));
|
|
})
|
|
|
|
client.on("ready", async () => {
|
|
console.log(`Session: ${sessionName} READY`)
|
|
|
|
// console.log('>>>>>>>>>>>>>> ready client.ts MOBILE NUMBER: ', client.info["wid"]["user"])
|
|
|
|
mobileuid = client.info["wid"]["user"]
|
|
console.log(new Date().toISOString() + " >>> Mobile UID ::: " + mobileuid)
|
|
|
|
|
|
// logger.info(`Session: ${sessionName} READY`);
|
|
|
|
|
|
|
|
const whatsapp = await new Promise((resolve, reject) => {
|
|
|
|
dbcc.query("SELECT * from Whatsapps where id = ?", [process.env.WHATSAPP_ID], (err, result) => {
|
|
|
|
if (err) {
|
|
reject(err)
|
|
}
|
|
else {
|
|
resolve(result)
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
|
|
if (whatsapp[0]['name'].includes(client.info["wid"]["user"])) {
|
|
console.log('-----------------> THIS IS THE RIGHT NUMBER')
|
|
|
|
}
|
|
else {
|
|
console.log('-----------------> THIS IS THE WRONG NUMBER')
|
|
let read_number = client.info["wid"]["user"]
|
|
|
|
|
|
let url = process.env.CLIENT_URL + '/whatsapp/connection/number'
|
|
|
|
try {
|
|
|
|
await client.logout()
|
|
|
|
let response = await axios.post(url, { number: read_number })
|
|
|
|
} catch (error) {
|
|
console.log('There was an error on POST THE DATA TO URL: ', url, '\n' + error)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
|
|
if (process.env.OLD_MOBILEUID) {
|
|
const ticketSettingsId = await new Promise((resolve, reject) => {
|
|
|
|
dbcc.query("select id from SettingTickets where number = ?", [process.env.OLD_MOBILEUID,], (err, result) => {
|
|
|
|
if (err) {
|
|
reject(err)
|
|
}
|
|
else {
|
|
// resolve(result)
|
|
const idArray = result.map(row => row.id)
|
|
resolve(idArray)
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
|
|
if (ticketSettingsId?.length > 0) {
|
|
await new Promise((resolve, reject) => {
|
|
const idsToUpdate = ticketSettingsId // Assuming ticketSettingsId is an array of IDs
|
|
|
|
// Create placeholders for the IN clause based on the number of elements in idsToUpdate
|
|
const placeholders = Array(idsToUpdate.length).fill('?').join(',')
|
|
|
|
dbcc.query(
|
|
`UPDATE SettingTickets SET number = ? WHERE id IN (${placeholders})`,
|
|
[client.info["wid"]["user"], ...idsToUpdate], // Spread the array to pass individual values
|
|
function (err, result) {
|
|
if (err) {
|
|
console.log("ERROR: " + err)
|
|
reject(err)
|
|
} else {
|
|
resolve(result)
|
|
}
|
|
}
|
|
)
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
|
|
await new Promise((resolve, reject) => {
|
|
|
|
dbcc.query("UPDATE Whatsapps SET qrcode = ?, status = ?, retries = ?, number = ? where id = ?", ["", 'CONNECTED', 0, client.info["wid"]["user"], process.env.WHATSAPP_ID],
|
|
|
|
function (err, result) {
|
|
|
|
if (err) {
|
|
console.log("ERROR: " + err)
|
|
reject(err)
|
|
}
|
|
else {
|
|
resolve(result)
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
let url = process.env.CLIENT_URL + '/whatsapp/connection/qrcode'
|
|
|
|
try {
|
|
|
|
let response = await axios.post(url, { whatsappId: process.env.WHATSAPP_ID })
|
|
|
|
} catch (error) {
|
|
console.log('There was an error on POST THE DATA TO URL: ', url, '\n' + error)
|
|
}
|
|
|
|
console.log('SEND SEEN: ', sendSeen)
|
|
|
|
|
|
await syncUnreadMessages(client)
|
|
|
|
if (sendSeen) {
|
|
client.sendPresenceAvailable()
|
|
}
|
|
|
|
// if(asking_qrcode){
|
|
// // backup_session(destroy, 120000, true)
|
|
// }
|
|
|
|
backup_session(destroy, 120000, false)
|
|
|
|
asking_qrcode = false
|
|
|
|
console.log('PASSOU............')
|
|
})
|
|
|
|
|
|
async function read() {
|
|
let chats = await client.getState()
|
|
console.log(chats)
|
|
}
|
|
|
|
|
|
|
|
client.on("message_create", async msg => {
|
|
|
|
// if (msg.hasMedia && msg.fromMe)
|
|
// return
|
|
|
|
if (msg.fromMe && msg.type === "chat" && auxCampaignMessage.trim() == msg?.body?.trim()) {
|
|
console.log('IGNORED MESSAGE SENT CAMPAIGN')
|
|
return
|
|
}
|
|
|
|
await handleMessage(msg)
|
|
|
|
|
|
})
|
|
|
|
client.on("media_uploaded", async msg => {
|
|
|
|
console.log('Entrou no midia upload')
|
|
|
|
let msgContact = null
|
|
let media = null
|
|
|
|
if (msg.fromMe) {
|
|
|
|
msgContact = await client.getContactById(msg.to)
|
|
|
|
}
|
|
else {
|
|
|
|
msgContact = await msg.getContact()
|
|
|
|
}
|
|
|
|
const chat = await msg.getChat()
|
|
|
|
msgContact.getProfilePicUrl = await msgContact.getProfilePicUrl()
|
|
|
|
let quotedMsg = await msg.getQuotedMessage()
|
|
|
|
if (msg.hasMedia) {
|
|
media = await msg.downloadMedia()
|
|
}
|
|
|
|
let data = {
|
|
id: process.env.WHATSAPP_ID,
|
|
msg: msg,
|
|
msgContact: msgContact,
|
|
chat: chat,
|
|
quotedMsg: quotedMsg ? quotedMsg.id.id : null,
|
|
media: media
|
|
}
|
|
|
|
socketIo.emit("media_uploaded", data)
|
|
|
|
})
|
|
|
|
client.on("message_ack", async (msg, ack) => {
|
|
|
|
const campaigSend = await db.collection('campaignsends').findOne({ whatsapp_msg_id: msg.id.id })
|
|
|
|
if (campaigSend && ack == 3) {
|
|
|
|
const updateResult = await db.collection('campaignsends').updateOne({ _id: ObjectId(campaigSend._id) },
|
|
{
|
|
$set: {
|
|
read: new Date(new Date() + "UTC"),
|
|
ack: ack
|
|
}
|
|
})
|
|
|
|
// console.log('RESULT ACK UPDATE: ', updateResult)
|
|
|
|
const read = await db.collection('campaignsends').countDocuments({ campaignId: ObjectId(campaigSend.campaignId), ack: 3 })
|
|
|
|
const data = {
|
|
id: ObjectId(campaigSend.campaignId),
|
|
read: read
|
|
}
|
|
|
|
console.log('DATA ACK READ MESSAGE CAMPAIGN: ', data)
|
|
|
|
socketIo.emit("campaign_message_sent", data)
|
|
|
|
return
|
|
}
|
|
else if (campaigSend && (ack == 2 || ack == 1)) {
|
|
return
|
|
}
|
|
|
|
|
|
let data = {
|
|
whatsappId: process.env.WHATSAPP_ID,
|
|
id: msg.id.id,
|
|
ack: ack
|
|
}
|
|
|
|
socketIo.emit("message_ack", data)
|
|
|
|
})
|
|
|
|
socketIo.on('send_message', async data => {
|
|
|
|
console.log('#')
|
|
console.log('--------------> send_message from number: ', mobileuid)
|
|
console.log('--------------> send_message to number: ', data.msg.number)
|
|
console.log('--------------> send_message body: ', data.msg.body)
|
|
console.log('--------------> send_message quotedMessageId: ', data.msg.quotedMessageId)
|
|
console.log('--------------> send_message linkPreview: ', data.msg.linkPreview)
|
|
console.log('#')
|
|
const sentMessage = await client.sendMessage(data.msg.number, data.msg.body, { quotedMessageId: data.msg.quotedMessageId, linkPreview: data.msg.linkPreview })
|
|
|
|
// console.log('=====================> sentMessage: ', sentMessage)
|
|
|
|
})
|
|
|
|
|
|
socketIo.on('send_media', async data => {
|
|
|
|
console.log('#')
|
|
console.log('--------------> send_message from number: ', mobileuid)
|
|
console.log('--------------> send_message to number: ', data.msg.number)
|
|
// console.log('--------------> send_message media: ', data.msg.media);
|
|
console.log('--------------> send_message sendAudioAsVoice: ', data.msg.sendAudioAsVoice)
|
|
console.log('--------------> data.msg.media.mimetype: ', data.msg.media.mimetype)
|
|
console.log('--------------> data.msg.media.filename: ', data.msg.media.filename)
|
|
console.log('#')
|
|
|
|
let media = new MessageMedia(data.msg.media.mimetype, data.msg.media.data, data.msg.media.file)
|
|
|
|
if (media && !media.filename)
|
|
media.filename = data.msg.media.filename
|
|
|
|
const sentMessage = await client.sendMessage(data.msg.number, media, { sendAudioAsVoice: data.msg.sendAudioAsVoice })
|
|
|
|
// const fullFilename = process.cwd() + process.env.MEDIA_DOWNLOAD_IN + data.msg.media.filename;
|
|
// console.log('fullFIlename: ', fullFilename)
|
|
// fs.writeFileSync(fullFilename, data.msg.media.data, { encoding: 'base64' });
|
|
|
|
})
|
|
|
|
|
|
|
|
client.on("change_state", async newState => {
|
|
|
|
let omnihit_url = process.env.CLIENT_URL + '/whatsapp/connection/monitor'
|
|
|
|
// logger.info(`Monitor session: ${sessionName}, ${newState}`);
|
|
|
|
console.log('>>>>>>>>>>>>>> change_state wbotMonitor.ts MOBILE NUMBER: ', client.info["wid"]["user"])
|
|
|
|
let data = {
|
|
action: 'change_state',
|
|
whatsappId: process.env.WHATSAPP_ID
|
|
}
|
|
|
|
await whatsappMonitor(newState, omnihit_url, data)
|
|
|
|
})
|
|
|
|
client.on("disconnected", async reason => {
|
|
|
|
let omnihit_url = process.env.CLIENT_URL + '/whatsapp/connection/monitor'
|
|
|
|
console.log('>>>>>>>>>>>>>> change_state wbotMonitor.ts MOBILE NUMBER: ', client.info["wid"]["user"])
|
|
|
|
let data = {
|
|
action: 'disconnected',
|
|
whatsappId: process.env.WHATSAPP_ID,
|
|
reason: reason
|
|
}
|
|
|
|
|
|
await removeDir(path.join(__dirname, '.wwebjs_auth', 'session-omnihit_sesssion'))
|
|
|
|
setTimeout(() => {
|
|
process.exit()
|
|
}, 3000)
|
|
|
|
await whatsappMonitor('OPENING', omnihit_url, data)
|
|
|
|
|
|
})
|
|
|
|
app.get('/', function (req, res) { return res.send('Express + TypeScript Server') })
|
|
|
|
app.post('/start', function (req, res) {
|
|
client.initialize()
|
|
res.send("OK")
|
|
})
|
|
|
|
app.post('/qr', function (req, res) {
|
|
res.send(QRCODE)
|
|
})
|
|
|
|
|
|
app.post('/api/getWbotMessage', async (req, res) => {
|
|
|
|
const { number, messageId, limit } = req.body
|
|
|
|
console.log('number: ', number, ' | limit: ', limit)
|
|
|
|
const wbotChat = await client.getChatById(number)
|
|
|
|
const fetchWbotMessagesGradually = async () => {
|
|
|
|
const chatMessages = await wbotChat.fetchMessages({ limit })
|
|
|
|
const msgFound = chatMessages.find(msg => msg.id.id === messageId)
|
|
|
|
if (!msgFound && limit < 100) {
|
|
limit += 20
|
|
return fetchWbotMessagesGradually()
|
|
}
|
|
|
|
return msgFound
|
|
}
|
|
|
|
try {
|
|
const msgFound = await fetchWbotMessagesGradually()
|
|
|
|
if (!msgFound) {
|
|
res.status(404).json({ message: "Cannot found message within 100 last messages" })
|
|
return
|
|
}
|
|
|
|
res.status(200).json({ message: "ok", data: msgFound })
|
|
|
|
} catch (err) {
|
|
|
|
console.log('ERR_FETCH_WAPP_MSG: ', err)
|
|
|
|
res.status(404).json({ message: "ERR_FETCH_WAPP_MSG" })
|
|
}
|
|
|
|
})
|
|
|
|
|
|
app.post('/api/disconnect', async (req, res) => {
|
|
|
|
try {
|
|
|
|
console.log('Restaring the session.........')
|
|
|
|
await removeDir(path.join(__dirname, '.wwebjs_auth', 'session-omnihit_sesssion'))
|
|
|
|
await client.logout()
|
|
|
|
setTimeout(() => {
|
|
process.exit()
|
|
}, 3000)
|
|
|
|
|
|
} catch (error) {
|
|
console.log('There was an error on try disconnect the whatsapp: ', error)
|
|
}
|
|
|
|
res.status(200).json({ message: "ok" })
|
|
|
|
})
|
|
|
|
|
|
app.post('/api/DeleteWhatsAppMessage', async (req, res) => {
|
|
|
|
const { number, messageId, limit } = req.body
|
|
|
|
console.log('number: ', number, ' | messageId: ', messageId, ' | limit: ', limit)
|
|
|
|
try {
|
|
|
|
const messageToDelete = await getWbotMessage(messageId, number, limit)
|
|
|
|
await messageToDelete.delete(true)
|
|
|
|
res.status(200).json({ message: "ok", data: messageToDelete })
|
|
return
|
|
|
|
} catch (error) {
|
|
|
|
console.log('There was an error on try delete the massage: ', error)
|
|
|
|
res.status(500).json({ message: "There was an error on trying delete the message" })
|
|
return
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
app.post('/api/GetProfilePicUrl', async (req, res) => {
|
|
|
|
const { number } = req.body
|
|
|
|
console.log('THE NUMBER: ', number)
|
|
|
|
const profilePicUrl = await client.getProfilePicUrl(`${number}@c.us`)
|
|
|
|
res.status(200).json({ message: "ok", data: profilePicUrl })
|
|
})
|
|
|
|
|
|
app.post('/api/restore', async (req, res) => {
|
|
|
|
await restore(client)
|
|
|
|
res.status(200).json({ message: "ok" })
|
|
})
|
|
|
|
app.post('/api/sendSeen', async (req, res) => {
|
|
|
|
let stat
|
|
|
|
const { number } = req.body
|
|
|
|
try {
|
|
|
|
stat = await client.getState()
|
|
|
|
// await syncUnreadMessages(client)
|
|
|
|
const wbotChat = await client.getChatById(number)
|
|
|
|
wbotChat.sendSeen()
|
|
|
|
// const chatMessages = await wbotChat.fetchMessages({ limit: 100 });
|
|
|
|
// console.log('=============> wbotChat: ', chatMessages)
|
|
|
|
} catch (err) {
|
|
|
|
let terr = err.message
|
|
|
|
stat = (terr.search('Session closed') > -1 ? 'SESSIONCLOSED' : 'UNKNOWN')
|
|
|
|
}
|
|
|
|
res.status(200).json({ message: "ok" })
|
|
})
|
|
|
|
app.get('/api/connection/status', async (req, res) => {
|
|
|
|
let stat
|
|
|
|
try {
|
|
|
|
stat = await client.getState()
|
|
|
|
} catch (err) {
|
|
|
|
let terr = err.message
|
|
|
|
stat = (terr.search('Session closed') > -1 ? 'SESSIONCLOSED' : 'UNKNOWN')
|
|
|
|
}
|
|
|
|
res.status(200).json({ message: "ok", data: stat })
|
|
|
|
})
|
|
|
|
|
|
const syncUnreadMessages = async (wbot) => {
|
|
|
|
console.log('ENTROU NO UNREAD MESSAGES +++++++++++++=')
|
|
|
|
const chats = await wbot.getChats()
|
|
|
|
/* eslint-disable no-restricted-syntax */
|
|
/* eslint-disable no-await-in-loop */
|
|
for (const chat of chats) {
|
|
|
|
// console.log('chat: ', chat)
|
|
|
|
if (chat.unreadCount > 0) {
|
|
|
|
const unreadMessages = await chat.fetchMessages({
|
|
limit: chat.unreadCount
|
|
})
|
|
|
|
for (const msg of unreadMessages) {
|
|
|
|
// console.log('--BACKEND MSG: ', msg)
|
|
|
|
if (!sendSeen) {
|
|
return
|
|
}
|
|
|
|
await handleMessage(msg, wbot)
|
|
}
|
|
|
|
console.log(':::::::::::::::::::::::::::::PASSOU')
|
|
|
|
await chat.sendSeen()
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
const getWbotMessage = async (messageId, number, limit,) => {
|
|
|
|
const wbotChat = await client.getChatById(number)
|
|
|
|
const fetchWbotMessagesGradually = async () => {
|
|
|
|
const chatMessages = await wbotChat.fetchMessages({ limit })
|
|
|
|
const msgFound = chatMessages.find(msg => msg.id.id === messageId)
|
|
|
|
if (!msgFound && limit < 100) {
|
|
limit += 20
|
|
return fetchWbotMessagesGradually()
|
|
}
|
|
|
|
return msgFound
|
|
}
|
|
|
|
try {
|
|
const msgFound = await fetchWbotMessagesGradually()
|
|
|
|
if (!msgFound) {
|
|
return null
|
|
}
|
|
|
|
return msgFound
|
|
|
|
} catch (err) {
|
|
|
|
console.log('ERR_FETCH_WAPP_MSG: ', err)
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
|
|
async function whatsappMonitor(newState, omnihit_url, data) {
|
|
|
|
const whatsapp = await whatsappUpdateStatus(newState)
|
|
|
|
if (whatsapp && whatsapp.affectedRows) {
|
|
console.log('whatsapp status update affectedRows: ', whatsapp.affectedRows)
|
|
}
|
|
|
|
// console.log(' whatsappwhatsappwhatsappwhatsapp: ', whatsapp)
|
|
|
|
|
|
try {
|
|
let response = await axios.post(omnihit_url, data)
|
|
} catch (error) {
|
|
console.log('There was an error on POST THE DATA TO URL: ', omnihit_url, '\n' + error)
|
|
}
|
|
}
|
|
|
|
async function whatsappUpdateStatus(newState) {
|
|
return await new Promise((resolve, reject) => {
|
|
|
|
dbcc.query("UPDATE Whatsapps SET status = ? where id = ?", [newState, process.env.WHATSAPP_ID],
|
|
function (err, result) {
|
|
if (err) {
|
|
console.log("ERROR: " + err)
|
|
reject(err)
|
|
}
|
|
else {
|
|
resolve(result)
|
|
}
|
|
})
|
|
|
|
})
|
|
}
|
|
|
|
async function handleMessage(msg) {
|
|
|
|
console.log('Entrou no message_create')
|
|
|
|
let msgContact = null
|
|
let media = null
|
|
|
|
if (msg.fromMe) {
|
|
|
|
msgContact = await client.getContactById(msg.to)
|
|
|
|
}
|
|
else {
|
|
|
|
console.log('################# RECEIVING MESSAGE FROM: ', msg.from, ' to ', msg.to)
|
|
|
|
msgContact = await msg.getContact()
|
|
|
|
}
|
|
|
|
const chat = await msg.getChat()
|
|
|
|
msgContact.getProfilePicUrl = await msgContact.getProfilePicUrl()
|
|
|
|
let quotedMsg = await msg.getQuotedMessage()
|
|
|
|
if (msg.hasMedia) {
|
|
media = await msg.downloadMedia()
|
|
}
|
|
|
|
let data = {
|
|
id: process.env.WHATSAPP_ID,
|
|
msg: msg,
|
|
msgContact: msgContact,
|
|
chat: chat,
|
|
quotedMsg: quotedMsg ? quotedMsg.id.id : null,
|
|
media: media
|
|
}
|
|
|
|
|
|
socketIo.emit("message_create", data)
|
|
|
|
}
|
|
|
|
async function getlabels() {
|
|
var ret = await client.getContactById('551721379544-1625752306@g.us')
|
|
//createGroup('The books', ['551100000000@c.us']);
|
|
console.log("-- Chats --------------------------------")
|
|
console.log(ret)
|
|
return ret
|
|
}
|
|
|
|
function base64_encode(file) {
|
|
// read binary data
|
|
var bitmap = fs.readFileSync(file)
|
|
// convert binary data to base64 encoded string
|
|
return new Buffer(bitmap).toString('base64')
|
|
}
|
|
|
|
function getBase64(url) {
|
|
return axios
|
|
.get(url, {
|
|
responseType: 'arraybuffer'
|
|
})
|
|
.then(response => Buffer.from(response.data, 'binary').toString('base64'))
|
|
}
|
|
|
|
function downloadMedia(url) {
|
|
let base64 = axios.get(url, { response: "arraybuffer" }).toString("base64")
|
|
console.log("-- BASE64 -------------------------------")
|
|
console.log(base64)
|
|
return base64
|
|
}
|
|
|
|
async function validate(mobile, cb) {
|
|
|
|
// let ret = await client.isRegisteredUser(mobile);
|
|
|
|
let ret = await client.isRegisteredUser(`${mobile}@c.us`)
|
|
|
|
// ///////////////////////////////////////////////////// 5571992888229 casaes
|
|
|
|
let _validNumber = null
|
|
|
|
console.log('******** mobile: ', mobile)
|
|
|
|
try {
|
|
|
|
_validNumber = (await client.getNumberId(`${mobile}@c.us`)).user
|
|
|
|
} catch (err) {
|
|
console.log(`Error number: ${err}`)
|
|
}
|
|
|
|
|
|
console.log('_validNumber: ', _validNumber)
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
cb({ isValid: ret, number: _validNumber })
|
|
|
|
// cb(ret)
|
|
}
|
|
|
|
app.post('/api/validate', (req, res) => {
|
|
|
|
console.log('ENTROU')
|
|
|
|
let mobile = req.body['mobile']
|
|
|
|
console.log(new Date() + " >>> Validating Registration Number ::: " + mobile + " on WhatsApp ...")
|
|
|
|
validate(mobile, function (e) {
|
|
|
|
res.send(e)
|
|
|
|
})
|
|
})
|
|
|
|
app.post('/api/chat', (req, res) => {
|
|
let mobile = req.body['mobile']
|
|
let message = req.body['message']
|
|
console.log(new Date() + " >>> Send Message ::: " + mobile + " ...")
|
|
client.sendMessage(mobile, message)
|
|
res.send('OK')
|
|
})
|
|
|
|
|
|
app.post('/group', function (req, res) {
|
|
//var ret = client.createGroup("Prueba", ["55@c.us"]);
|
|
var ret = getlabels()
|
|
res.send(ret)
|
|
})
|
|
|
|
app.post('/stop', function (req, res) {
|
|
client.destroy()
|
|
res.send("OK")
|
|
})
|
|
|
|
|
|
app.post('/api/status', function (req, res) {
|
|
res.send("OK")
|
|
})
|
|
|
|
async function monitor() {
|
|
let _nextime = 0
|
|
try {
|
|
clearInterval(scheduler_monitor)
|
|
let stat
|
|
|
|
if (mobileuid != undefined) {
|
|
try {
|
|
stat = await client.getState()
|
|
} catch (err) {
|
|
let terr = err.message
|
|
stat = (terr.search('Session closed') > -1 ? 'SESSIONCLOSED' : 'UNKNOWN')
|
|
}
|
|
// omnihit.monitor(process.env.MOBILEUID, process.env.MOBILENAME, stat);
|
|
|
|
_nextime = 30000
|
|
} else {
|
|
_nextime = 10000
|
|
}
|
|
|
|
console.log(`WHATSAPP_ID: ${process.env.WHATSAPP_ID} | CLIENT MOBILEUID: ${mobileuid} | NAME: ${process.env.MOBILENAME} | ENV MOBILEUID: ${process.env.MOBILEUID} | STATUS: ${stat} | INTERNET: ${changeInternetConn}`)
|
|
|
|
if (stat && stat === 'CONNECTED') {
|
|
|
|
|
|
|
|
const result = await whatsappUpdateStatus('CONNECTED')
|
|
|
|
if (result)
|
|
console.log(`Update status to CONNECTED WHATSAPP_ID: ${process.env.WHATSAPP_ID} => result.affectedRows: ${result.affectedRows}`)
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
//new Date(new Date() + 'UTC')
|
|
// console.log(new Date().toISOString() + " >>> ", error);
|
|
console.log(new Date(new Date() + 'UTC') + " >>> ", error)
|
|
} finally {
|
|
scheduler_monitor = setInterval(monitor, _nextime)
|
|
}
|
|
}
|
|
|
|
|
|
const sendCampaignMessage = async () => {
|
|
|
|
try {
|
|
clearInterval(scheduler_campaign_monitor)
|
|
|
|
|
|
let internetConnection = await checkInternetConnection()
|
|
|
|
if (!internetConnection) {
|
|
changeInternetConn = false
|
|
} else {
|
|
changeInternetConn = true
|
|
}
|
|
|
|
// let stat
|
|
// try {
|
|
// stat = await client.getState()
|
|
// } catch (err) {
|
|
// stat = (err?.message?.search('Session closed') > -1 ? 'SESSIONCLOSED' : 'UNKNOWN')
|
|
// }
|
|
// console.log('===========> stat: ', stat)
|
|
|
|
if (mobileuid != undefined && internetConnection) {
|
|
|
|
auxCampaignMessage = ''
|
|
|
|
const campaign = await db.collection('campaigns').findOne({ 'campaign.whatsapp_sender': process.env.MOBILEUID, 'app.status': 'running' })
|
|
|
|
if (!campaign)
|
|
return
|
|
|
|
const campaigSend = await db.collection('campaignsends').findOne({ campaignId: ObjectId(campaign._id), ack: 1 })
|
|
|
|
if (!campaigSend) {
|
|
|
|
const countCampaignSend = await db.collection('campaignsends').countDocuments()
|
|
|
|
if (countCampaignSend && countCampaignSend > 0) {
|
|
|
|
await db.collection('campaigns').updateOne({ _id: ObjectId(campaign._id) },
|
|
{
|
|
$set: {
|
|
'app.status': 'success'
|
|
}
|
|
})
|
|
|
|
const data = {
|
|
id: ObjectId(campaign._id),
|
|
status: 'success'
|
|
}
|
|
|
|
socketIo.emit("campaign_message_sent", data)
|
|
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
|
|
if (campaign.campaign?.textToSeconds &&
|
|
campaign.campaign?.message &&
|
|
campaign.campaign.message.trim().length > 0) {
|
|
|
|
let msgMs = Math.round((campaign.campaign.message.trim().length * 0.1) * 1000)
|
|
|
|
console.log('AWAITING MESSAGE TEXT LENGTH TO MILISECONDS: ', msgMs)
|
|
|
|
await sleep(msgMs)
|
|
|
|
}
|
|
|
|
if (campaign.campaign?.secondStart && campaign.campaign?.secondEnd) {
|
|
|
|
let randomTime = getRandomNumber(campaign.campaign.secondStart, campaign.campaign.secondEnd) * 1000
|
|
|
|
console.log('AWAITING RANDOM TIME TO SEND CAMPAIGN MESSAGE: ', randomTime)
|
|
|
|
await sleep(randomTime)
|
|
}
|
|
|
|
|
|
auxCampaignMessage = campaign.campaign.message
|
|
|
|
const sentMessage = await client.sendMessage(`${campaigSend.number}@c.us`, campaign.campaign.message)
|
|
|
|
if (sentMessage) {
|
|
|
|
const updateResult = await db.collection('campaignsends').updateOne({ _id: ObjectId(campaigSend._id) },
|
|
{
|
|
$set: {
|
|
whatsapp_msg_id: sentMessage.id.id,
|
|
sender: process.env.MOBILEUID,
|
|
delivered: new Date(new Date() + "UTC"),
|
|
ack: 2
|
|
}
|
|
})
|
|
|
|
// console.log('RESULT: ', updateResult)
|
|
|
|
const sent = await db.collection('campaignsends').countDocuments({ campaignId: ObjectId(campaign._id), $or: [{ ack: 2 }, { ack: 3 }] })
|
|
|
|
const data = {
|
|
id: ObjectId(campaign._id),
|
|
sent
|
|
}
|
|
|
|
socketIo.emit("campaign_message_sent", data)
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
console.log('error on sendCampaignMessage: ', error)
|
|
}
|
|
finally {
|
|
scheduler_campaign_monitor = setInterval(sendCampaignMessage, 3000)
|
|
}
|
|
}
|
|
|
|
async function monitorCell() {
|
|
|
|
try {
|
|
clearInterval(scheduler_monitor_cell)
|
|
// let _contact_mobile = "5511954803572@c.us";
|
|
let _message = new Date(new Date() + 'UTC')
|
|
|
|
if (client.info && client.info["wid"]["user"]) {
|
|
client.sendMessage(`${process.env.MONITOR_NUMBER}@c.us`, _message)
|
|
}
|
|
|
|
} catch (error) {
|
|
console.log(`Error on send monitor message to number ${process.env.MONITOR_NUMBER} from monitorCell function: ${error}`)
|
|
} finally {
|
|
scheduler_monitor_cell = setInterval(monitorCell, 1800000)
|
|
}
|
|
}
|
|
|
|
|
|
async function internetMonitor() {
|
|
try {
|
|
clearInterval(scheduler_internet_conn)
|
|
|
|
if (!changeInternetConn) {
|
|
|
|
console.log('INTERNET IS OFFLINE. THE PM2 WILL RESTORE THE PROCESS')
|
|
|
|
process.exit()
|
|
}
|
|
|
|
} catch (error) {
|
|
console.log(`Error on try kill the process from internetMonitor function`)
|
|
} finally {
|
|
scheduler_internet_conn = setInterval(internetMonitor, 60000)
|
|
}
|
|
}
|
|
|
|
|
|
function comercialBuss(until_hour) {
|
|
const _hour = new Date().getHours()
|
|
|
|
console.log(' _hour: ', _hour)
|
|
// const _minute = new Date().getMinutes()
|
|
// const _second = new Date().getSeconds()
|
|
|
|
if (_hour >= until_hour) {
|
|
console.log('Trying send message into comercial buss!')
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
scheduler_monitor = setInterval(monitor, 10000)
|
|
|
|
// scheduler_campaign_monitor = setInterval(sendCampaignMessage, 3000)
|
|
|
|
// scheduler_internet_conn = setInterval(internetMonitor, 60000)
|
|
|
|
app.listen(process.env.PORT || 8003, function () {
|
|
console.log("\u26A1[server]: Server is running at Port ::: " + process.env.PORT || 8003)
|
|
})
|
|
|
|
|
|
process.on('uncaughtException', function (err) {
|
|
console.error(' ')
|
|
console.error('----- ' + (new Date).toUTCString() + ' ----------------------------------')
|
|
console.error('Erro uncaughtException: ', err.message)
|
|
console.error(err.stack)
|
|
console.error(' ')
|
|
return
|
|
});
|
|
|
|
|
|
|