[JS]
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'}
])
var pool=mysql.createPool(mysqlConfig);
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(/^\/add\s([0-9]{1,3}[\.]){3}[0-9]{1,3}[\:]{1}[0-9]{4,5}$/.test(text)){
var ip=text.replace("/add ", "").trim();
pool.getConnection(function(err,connection){
if (err) {
connection.release();
bot.sendMessage(msg.from.id,'нет соединения с БД')
throw err;
//result = 'не удалось добавить ip, нет соединения с БД'
}else{
const sql = `INSERT INTO userip(userid,ipu) VALUES (?, ?);`
pool.query(sql, [msg.from.id,ip],function(err, resp) {
if(err) {
bot.sendMessage(msg.from.id,'failed to add data | не удалось добавить данные')
return console.log(err);
}
bot.sendMessage(msg.from.id,`ip ${ip} added to user ${msg.from.id}`)
console.log('Inserted ')
pool.close(); // закрываем соединение с базой данных
})
}
});
return
}
if(text === '/my'){
console.log("нажат my")
pool.getConnection(function(err,connection){
console.log("юазу прошли")
if (err) {
connection.release();
bot.sendMessage(msg.from.id,'не удалось добавить ip, нет соединения с БД')
//result = 'не удалось добавить ip, нет соединения с БД'
return console.error("Ошибка: " + err.message);
}else{
const sql = `SELECT ipu FROM userip WHERE userid=?`;
pool.query(sql, [msg.from.id],function(err, resp) {
if(err) {
bot.sendMessage(msg.from.id,'не удалось достать данные | failed to retrieve data')
return console.log(err);
}
//bot.sendMessage(msg.from.id,`ip ${ip} добавлен к юзеру ${msg.from.id}`)
if(resp && resp!=''){
resp.map((ip)=>{
bot.sendMessage(msg.from.id,`Ваши ip ${ip.ipu}`)
})
}else{
bot.sendMessage(msg.from.id,`You haven't added an ip yet | Вы еще не добавили ip`)
}
//pool.close(); // закрываем соединение с базой данных
})
}
});
return
}
if(text === '/notif'){
pool.getConnection(function(err,connection){
if (err) {
connection.release();
bot.sendMessage(msg.from.id,'не удалось добавить ip, нет соединения с БД')
//result = 'не удалось добавить ip, нет соединения с БД'
return console.error("Ошибка: " + err.message);
}else{
let tmpsql=`UPDATE userip SET worked=0 WHERE userid=?`;
pool.query(tmpsql, [msg.from.id],function(err, resp) {
if(err) {
return console.log(err);
}
bot.sendMessage(msg.from.id, `Sending logs is enabled`)
})
}
});
return
}
if(text === '/notifoff'){
var connection=mysql.createConnection(mysqlConfig);
pool.getConnection(function(err,connection){
if (err) {
connection.release();
bot.sendMessage(msg.from.id,'не удалось добавить ip, нет соединения с БД')
//result = 'не удалось добавить ip, нет соединения с БД'
return console.error("Ошибка: " + err.message);
}else{
let tmpsql=`UPDATE userip SET worked=1 WHERE userid=?`;
pool.query(tmpsql, [msg.from.id],function(err, resp) {
if(err) {
return console.log(err);
}
bot.sendMessage(msg.from.id, `Sending logs is disabled`)
})
}
});
return
}
if(/^\/delete\s([0-9]{1,3}[\.]){3}[0-9]{1,3}[\:]{1}[0-9]{4,5}$/.test(text)){
var ip=text.replace("/delete ", "").trim();
var connection=mysql.createConnection(mysqlConfig);
pool.getConnection(function(err,connection){
if (err) {
connection.release();
bot.sendMessage(msg.from.id,'нет соединения с БД')
//result = 'не удалось добавить ip, нет соединения с БД'
return console.error("Ошибка: " + err.message);
}else{
const sql = `DELETE FROM userip WHERE ipu=? AND userid=?;`
pool.query(sql, [ip,msg.from.id],function(err, resp) {
if(err) {
bot.sendMessage(msg.from.id,'failed to delete ip | не удалось удалить ip')
return console.log(err);
}
if(resp.affectedRows>0) {
bot.sendMessage(msg.from.id,`ip ${ip} deleted`)
}else{
bot.sendMessage(msg.from.id,`ip ${ip} not found`)
}
console.log(resp)
console.log('Deleted:')
pool.close(); // закрываем соединение с базой данных
})
}
});
return
}
return bot.sendMessage(msg.from.id, `Unknown command`)
})
}
start()
cron.schedule('* * * * * *', 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(async (val)=>{
console.log(val)
console.log("curl:")
function load(){
let main = shellexe(`curl --max-time 3 --location --silent --request POST https://fullnode.testnet.sui.io:443 --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`)
console.log("tmp=")
console.log(tmp)
console.log(":curl")
}
tmp =await load()
console.log(tmp)
})
//let curlres = proverka();
console.log("curl res:")
//console.log(curlres)
111111
}else{
console.log(`База пуста`)
}
connection.release(); // закрываем соединение с базой данных
})
}
});
console.log("bddata")
})
[/JS]
Привет! Набросал скрипт для бота и не могу разобраться с асинхронностью.
start() - это функция от бота. Прием команд от пользователя через телегу. Например /my вытаскивает все заведенные ip.
И есть второй раздел с кроном. Который мониторит. Надо чтобы второй раздел с кроном работал как бы независимо от первого. В переменную bddata загружаются сотни ip адресов. Программа вытаскивает айпи и через курл проверяет доступность. 1 адрес через курл занимает 3 секунды. Если адресов много, то это будет долго.
И дело в том, что когда вызываю /my в start, то ответ приходит только после окончания проверки всех ip из базы. Как сделать, чтобы функции в start не зависели от тормоззов функции с курлом?
Т.е. нужно, чтобы при нажатии /my сразу пришел ответ не дождавшись выполнения функции в крон
Спасибо!