Skip to content

Commit cae433b

Browse files
authored
Merge pull request #852 from binhodev/dev
Dev - IdleState
2 parents 5e66d60 + 894edde commit cae433b

File tree

7 files changed

+115
-15
lines changed

7 files changed

+115
-15
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
const { EventEmitter } = require('node:events')
2+
3+
class IdleState extends EventEmitter {
4+
timer = null
5+
startTime = 0
6+
endTime = 0
7+
8+
setIdleTime = (timeInSeconds) => {
9+
this.startTime = timeInSeconds
10+
return this.reset()
11+
}
12+
13+
startTimer = () => {
14+
this.timer = setInterval(() => {
15+
const currentTime = new Date().getTime()
16+
17+
if (currentTime > this.endTime) {
18+
this.stop()
19+
this.emit('idle')
20+
} else {
21+
this.debugTime()
22+
}
23+
}, 1000)
24+
}
25+
26+
start = () => {
27+
if (!this.timer) {
28+
this.reset()
29+
this.startTimer()
30+
}
31+
}
32+
33+
reset = () => {
34+
const currentTime = new Date().getTime()
35+
this.endTime = currentTime + this.startTime * 1000
36+
}
37+
38+
stop = () => {
39+
if (this.timer) {
40+
clearInterval(this.timer)
41+
this.timer = null
42+
}
43+
}
44+
45+
debugTime = () => {
46+
const currentTime = new Date().getTime()
47+
return `Tiempo restante: ${((this.endTime - currentTime) / 1000).toFixed(0)} segundos`
48+
}
49+
}
50+
51+
module.exports = IdleState

packages/bot/core/core.class.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const { LIST_REGEX } = require('../io/events')
99
const SingleState = require('../context/state.class')
1010
const GlobalState = require('../context/globalState.class')
1111
const { generateTime } = require('../utils/hash')
12+
const IdleState = require('../context/idleState.class')
1213

1314
const logger = new Console({
1415
stdout: createWriteStream(`${process.cwd()}/core.class.log`),
@@ -19,6 +20,7 @@ const loggerQueue = new Console({
1920

2021
const StateHandler = new SingleState()
2122
const GlobalStateHandler = new GlobalState()
23+
const idle = new IdleState()
2224

2325
/**
2426
* [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos
@@ -325,6 +327,7 @@ class CoreClass {
325327
state,
326328
globalState,
327329
extensions,
330+
idleState: idle,
328331
fallBack: fallBack(flags),
329332
flowDynamic: flowDynamic(flags),
330333
endFlow: endFlow(flags),

packages/database/src/mysql/index.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,27 @@ class MyslAdapter {
2525
})
2626
}
2727

28-
getPrevByNumber = (from) =>
29-
new Promise((resolve, reject) => {
30-
const sql = `SELECT * FROM history WHERE phone='${from}' ORDER BY id DESC`
28+
getPrevByNumber = async (from) => {
29+
if (this.db._closing) await this.init()
30+
return await new Promise((resolve, reject) => {
31+
const sql = `SELECT * FROM history WHERE phone='${from}' ORDER BY id DESC`;
3132
this.db.query(sql, (error, rows) => {
3233
if (error) {
33-
reject(error)
34+
reject(error);
3435
}
3536

3637
if (rows.length) {
37-
const [row] = rows
38-
row.options = JSON.parse(row.options)
39-
resolve(row)
38+
const [row] = rows;
39+
row.options = JSON.parse(row.options);
40+
resolve(row);
4041
}
4142

4243
if (!rows.length) {
43-
resolve(null)
44+
resolve(null);
4445
}
45-
})
46+
});
4647
})
48+
}
4749

4850
save = (ctx) => {
4951
const values = [

packages/provider/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@bot-whatsapp/provider",
3-
"version": "0.0.124-alpha.0",
3+
"version": "0.0.132-alpha.0",
44
"description": "Esto es el conector a Twilio, Meta, etc...",
55
"main": "./lib/mock/index.cjs",
66
"keywords": [],

packages/provider/src/meta/server.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class MetaWebHookServer extends EventEmitter {
6161
}
6262

6363
if (message.type === 'image') {
64-
const body = generateRefprovider('_event_image_')
64+
const body = generateRefprovider('_event_media_')
6565
const idUrl = message.image?.id
6666
const resolvedUrl = await getMediaUrl(this.version, idUrl, this.numberId, this.jwtToken)
6767
const responseObj = {
@@ -91,7 +91,7 @@ class MetaWebHookServer extends EventEmitter {
9191
}
9292

9393
if (message.type === 'video') {
94-
const body = generateRefprovider('_event_video_')
94+
const body = generateRefprovider('_event_media_')
9595
const idUrl = message.video?.id
9696

9797
const resolvedUrl = await getMediaUrl(this.version, idUrl, this.numberId, this.jwtToken)
@@ -138,7 +138,7 @@ class MetaWebHookServer extends EventEmitter {
138138
}
139139

140140
if (message.type === 'sticker') {
141-
const body = generateRefprovider('_event_sticker_')
141+
const body = generateRefprovider('_event_media_')
142142

143143
const responseObj = {
144144
type: message.type,

packages/provider/src/twilio/index.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ class TwilioProvider extends ProviderClass {
2020
twilioHook
2121
vendor
2222
vendorNumber
23-
constructor({ accountSid, authToken, vendorNumber, port = PORT }) {
23+
publicUrl
24+
constructor({ accountSid, authToken, vendorNumber, port = PORT, publicUrl = '' }) {
2425
super()
26+
this.publicUrl = publicUrl
2527
this.vendor = new twilio(accountSid, authToken)
2628
this.twilioHook = new TwilioWebHookServer(port)
2729
this.vendorNumber = parseNumber(vendorNumber)
@@ -66,6 +68,25 @@ class TwilioProvider extends ProviderClass {
6668
*/
6769
sendMedia = async (number, message, mediaInput = null) => {
6870
if (!mediaInput) throw new Error(`MEDIA_INPUT_NULL_: ${mediaInput}`)
71+
const urlEncode = `${this.publicUrl}/tmp?path=${encodeURIComponent(mediaInput)}`
72+
const regexUrl = /^(?!https?:\/\/)[^\s]+$/
73+
74+
const urlNotice = [
75+
`[NOTA]: Estas intentando enviar una fichero que esta en local.`,
76+
`[NOTA]: Para que esto funcione con Twilio necesitas que el fichero este en una URL publica`,
77+
`[NOTA]: más informacion aqui https://bot-whatsapp.netlify.app/docs/provider-twilio/`,
78+
].join('\n')
79+
80+
if (
81+
mediaInput.includes('localhost') ||
82+
mediaInput.includes('127.0.0.1') ||
83+
mediaInput.includes('0.0.0.0') ||
84+
regexUrl.test(mediaInput)
85+
) {
86+
console.log(urlNotice)
87+
mediaInput = urlEncode
88+
}
89+
6990
number = parseNumber(number)
7091
return this.vendor.messages.create({
7192
mediaUrl: [`${mediaInput}`],

packages/provider/src/twilio/server.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const { EventEmitter } = require('node:events')
2+
const { existsSync, createReadStream } = require('node:fs')
3+
const mime = require('mime-types')
24
const polka = require('polka')
3-
const { urlencoded } = require('body-parser')
5+
const { urlencoded, json } = require('body-parser')
46
const { parseNumber } = require('./utils')
57

68
/**
@@ -33,14 +35,35 @@ class TwilioWebHookServer extends EventEmitter {
3335
res.end(json)
3436
}
3537

38+
/**
39+
* Manejar los local media como
40+
* C\\Projects\\bot-restaurante\\tmp\\menu.png
41+
* para que puedas ser llevar a una url online
42+
* @param {*} req
43+
* @param {*} res
44+
*/
45+
handlerLocalMedia = (req, res) => {
46+
const { query } = req
47+
const file = query?.path
48+
if (!file) return res.end(`path: invalid`)
49+
const decodeFile = decodeURIComponent(file)
50+
if (!existsSync(decodeFile)) return res.end(`not exits: ${decodeFile}`)
51+
const fileStream = createReadStream(decodeFile)
52+
const mimeType = mime.lookup(decodeFile)
53+
res.writeHead(200, { 'Content-Type': mimeType })
54+
fileStream.pipe(res)
55+
}
56+
3657
/**
3758
* Contruir HTTP Server
3859
* @returns
3960
*/
4061
buildHTTPServer = () => {
4162
return polka()
4263
.use(urlencoded({ extended: true }))
64+
.use(json())
4365
.post('/twilio-hook', this.incomingMsg)
66+
.get('/tmp', this.handlerLocalMedia)
4467
}
4568

4669
/**

0 commit comments

Comments
 (0)