const mysql = require("mysql2");
require('dotenv').config()
const TelegramApi = require('node-telegram-bot-api')
const bot = new TelegramApi(process.env.BOT_TOKEN, {polling: true})
var mysqlConfig = require('./my_sql_connect.js');
const cron = require("node-cron");
const shellexe = require('./requests/func.js')
const propotkl=5;
bot.setMyCommands([
{command: '/add', description: 'Add node: /add xxx.xxx.xxx.xxx:9000'},
{command: '/delete', description: 'Delete node: /delete xxx.xxx.xxx.xxx:9000'},
{command: '/notif', description: 'show logs'},
{command: '/notifoff', description: 'hide logs'},
{command: '/my', description: 'your nodes'}
])
const start = () => {
bot.on('message', async msg => {
const text = msg.text;
//console.log(msg)
if(text === '/start'){
return bot.sendMessage(msg.from.id, `Welcome!`)
}
if(text === '/my'){
console.log("нажат my")
bot.sendMessage(msg.from.id,`Ваши ip: skljfkdsl`)
return
}
return bot.sendMessage(msg.from.id, `Unknown command`)
})
}
start()
var pool=mysql.createPool(mysqlConfig);
cron.schedule('* */1 * * * *', async () => {
let bddata;
pool.getConnection(function(err,connection){
if (err) {
connection.release();
console.log("ошибка соед");
//bot.sendMessage(msg.from.id,'нет соединения с БД')
reject(err)
}else{
console.log("зашли читать БД");
const sql = `SELECT * FROM userip`;
pool.query(sql, '',function(err, resp) {
if(err) {
//bot.sendMessage(msg.from.id,'не удалось добавить данные')
return console.log(err);
}
bddata =resp
console.log("resp")
if(bddata && bddata!=''){
bddata.map((val)=>{
console.log(val)
console.log("curl:")
const p = new Promise(function(resolve, reject){
//let main = await shellexe(`curl --max-time 3 --location --silent --request POST [url]https://fullnode.testnet.sui.io:443[/url] --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
let tmp = shellexe(`curl --max-time 3 --location --silent --request POST http://${val.ipu} --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
resolve(tmp)
})
p.then(data=>{
console.log(data)
})
})
//let curlres = proverka();
console.log("curl res:")
//console.log(curlres)
111111
}else{
console.log(`База пуста`)
}
connection.release(); // закрываем соединение с базой данных
})
}
});
console.log("bddata")
})
Привет! Набросал скрипт для бота и не могу разобраться с асинхронностью.
start() - это функция от бота. Прием команд от пользователя через телегу. Например /my вытаскивает все заведенные ip.
И есть второй раздел с кроном. Который мониторит. Надо чтобы второй раздел с кроном работал как бы независимо от первого. В переменную bddata загружаются сотни ip адресов. Программа вытаскивает айпи и через курл проверяет доступность. 1 адрес через курл занимает 3 секунды. Если адресов много, то это будет долго.
И дело в том, что когда вызываю /my в start, то ответ приходит только после окончания проверки всех ip из базы. Как сделать, чтобы функции в start не зависели от тормоззов функции с курлом?
Т.е. нужно, чтобы при нажатии /my сразу пришел ответ не дождавшись выполнения функции в крон
|