@aquapendente

Тормозит бот ВК. Что делать?

У меня есть бот, и он сильно тормозит. Или это низкая пропускная способность интернета или это мои допущенные костыли в коде или это интернет. Главный файл ниже. Файл запускатор есть, и конфиг тоже

const {VK, getRandomId, Keyboard} = require('vk-io')
const config = require('../config/config.json')
const {MongoClient} = require('mongodb')

console.log(config.prefix + 'Модуль VK запущен')

const vk = new VK ({
    token: config.token,
    apiVersion: '5.131'
})
const client = new MongoClient(config.db)
const spokes = client.db().collection('spokes')
const paids = client.db().collection('paids')
const completed = client.db().collection('completed')
let timeout = new Set();
let date = new Date()
let dateUTC = date.getUTCDate() * date.getUTCFullYear() * date.getUTCHours() * date.getUTCMonth() * date.getUTCSeconds() * date.getUTCMilliseconds()

vk.updates.on('message', async function(message) {
    if (message.text == null || message.isGroup == true || message.text == 'undefined' || message.isOutbox) return;
    if (message.senderId == config.admins) {
        let command = await message.text.split(' ')
        let spokesWatch = await spokes.findOne({userID: command[1]})
        if (command[0] == '/screen') {
            if (command[2] == 'true') {
                paids.insertOne({
                    userID: Number(command[1]),
                    order: JSON.stringify(spokesWatch),
                    time: date
                })
                spokes.deleteOne({userID: command[1]})
                vk.api.messages.send({
                    random_id: dateUTC,
                    peer_id: command[1],
                    message: config.form
                })
                message.send('Команда отправлена!')
            } else {
                vk.api.messages.send({
                    random_id: dateUTC,
                    peer_id: command[1],
                    message: 'Вы не прошли проверку. Если это не так обратитесь к @mr.sakura52. Удачных покупок!'
                })
                spokes.updateOne({userID: command[1]}, {$set: {screen: false}})
                message.send('Команда отправлена!')
            }
        }
        if (command[0] == '/form') {
            await vk.api.messages.send({
                random_id: dateUTC,
                peer_id: command[1],
                message: config.formSuccesfully
            })
            message.send('Форма пользователя успешно принята!')
        }
    } else {
        let paidsWatch = await paids.findOne({userID: message.senderId})
        if (paidsWatch != null) {
            let command = await message.text.split(' ')
            if (command[0] == '/form' && Object.keys(config.formStart).indexOf(command[1]) >= 0) {
                message.send("Команда отправлена, ожидайте проверки администрации...")
                let userData = await spokes.findOne({userID: message.senderId})
                await vk.api.messages.send({
                    random_id: dateUTC,
                    peer_id: config.admins,
                    message: '[BOT] Пожалуйста, проверьте форму пользователя ' + message.senderId + '\n\nФорма: ' + message.text + '\n' + JSON.stringify(userData) + '\n\nИспользуйте команду /form <Пользователь> <true/false>'
                })
            } else {
                message.send("Укажите после команды 1 или 1. или 1)\nВ вашем чате установлен таймаут в 10 секунд во избежания спама")
                timeout.add(message.senderId)
                function deleteTimer() {
                    timeout.delete(message.senderId)
                    message.send('Вы можете отправить форму снова!')
                }
                setTimeout(deleteTimer, 10000);
            }
        };
        if (await spokes.findOne({userID: message.senderId, screen: 'wait...'}) != null) return;
        if (await spokes.findOne({userID: message.senderId, screen: 'verified...'}) != null) return;

        let spokesWatch = await spokes.findOne({userID: message.senderId})
        let choiceWatch = await spokes.findOne({userID: message.senderId, screen: 'choice...'})
        let choice2Watch = await spokes.findOne({userID: message.senderId, screen: 'choice2...'})

        if (spokesWatch == null) {
            spokes.insertOne({
                userID: message.senderId,
                screen: 'false',
                spoke: message.text,
                time: date
            })
        }

        if (Object.keys(config.startcmd).indexOf(message.text.toLowerCase()) >= 0 && timeout.has(message.senderId) == false && choiceWatch == null && choice2Watch == null) {
            spokes.updateOne({userID: message.senderId, screen: 'false'}, { $set: {screen: 'choice...', time: date}})
            let keyboard = Keyboard
            
            .keyboard([[
                Keyboard.textButton({
                    label: 'Оформление VK ' + config.orders['Оформление VK'],
                    color: 'primary'
                })
            ], [
                Keyboard.textButton({
                    label: 'Оформление YT ' + config.orders['Оформление YT'],
                    color: 'primary'
                })
            ], [
                Keyboard.textButton({
                    label: 'Оформление TW ' + config.orders['Оформление TW'],
                    color: 'primary'
                })
            ], [
                Keyboard.textButton({
                    label: 'Пак от BREADY (ОБНОВЛЕН) ' + config.orders['Пак от BREADY (ОБНОВЛЕН)'],
                    color: 'primary'
                })
            ], [
                Keyboard.textButton({
                    label: 'Граффити ' + config.orders['Граффити'],
                    color: 'primary'
                })
            ]])
            .inline();
            
            message.send({ message: 'Привет! В нашей группе ты можешь заказать много всего интересного...\nОзнакомься со спектром услуг и выбери нужную.\nПосле оплаты вы получите форму для заполнения.\nДизайн рисуется 1-3 дня\nУдачного пользования!', keyboard: keyboard, random_id: getRandomId() })
        
            return;
        } //startMessage

        if (Object.keys(config.orders).indexOf(message.text) >= 0 && timeout.has(message.senderId) == false) {
            message.send({
                message: 'Вам необходимо оплатить товар.\n\nСтоимость - ' + config.orders_price[message.text] + '\nОплата картой: 0000 0000 0000 0000\n\nПосле операции вы должны предоставить чек об оплате.',
                keyboard: Keyboard.builder()
                    .urlButton({
                        label: 'Мне долго не отвечают, позвать модерацию',
                        url: 'https://vk.com/mr.sakura52'
                    })
                    .inline()
            });
            message.send({
                message: 'Оплата через DonationAlerts',
                keyboard: Keyboard.builder()
                    .urlButton({
                        label: 'Оплатить через DonationAlerts',
                        url: 'https://youtube.com'
                    })
            });
            message.send(config.screen)
            if (choiceWatch != null) {
                spokes.updateOne({userID: message.senderId}, { $set: {spoke: message.text, screen: 'choice2...', time: date}})
            } else {
                spokes.updateOne({userID: message.senderId}, { $set: {spoke: message.text, screen: 'choice2...', time: date}})
                message.send('Во избежания спама в вашем чате установлен 10ти секундовый таймаут во время которого бот не будет работать')
                timeout.add(message.senderId)
                function deleteTimer() {
                    timeout.delete(message.senderId)
                    message.send('Вы можете выбрать товар опять!')
                }
                setTimeout(deleteTimer, 15000);
            }
            return;
        }

        const screen = await message.text.split(' ')
        if (screen[0] == '/screen') {
            if (spokesWatch != null) { 
                spokes.updateOne({userID: message.senderId}, { $set: {screen: 'verified...'}})
                message.send("Команда отправлена, ожидайте проверки администрации...");
                let userData = await spokes.findOne({userID: message.senderId})
                await vk.api.messages.send({
                    random_id: dateUTC,
                    peer_id: config.admins,
                    message: '[BOT] Пожалуйста, проверьте наличие оплаты у пользователя ' + message.senderId + '\n\nСпособ оплаты: ' + screen[1] + '\n\n' + JSON.stringify(userData) + '\n\nИспользуйте команду /screen <Пользователь> <true/false>'
                })
            }
        }
    }
}) /* vk updates message */

async function dbinitialize() {
    try {
        await client.connect()
        console.log(config.prefix + 'Соединение установлено')
    } catch (e) {
        console.log(e)
    }
};

async function vkinitialize() {
    await vk.updates.startPolling();
};

module.exports = {
    vk: vk,
    dbinitialize: dbinitialize,
    vkinitialize: vkinitialize
};
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
Negezor
@Negezor
Senior Shaurma Developer
Если упирается в количество запросов на API, вас стоит увеличить apiLimit, попробовать другие режимы
apiMode и apiRequestMode. Дальше вас стоит профилировать свой код что бы понять узкое место.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Ну так вы разберитесь нагрузка на сеть на проц на диск на память
Посмотрите системными утилитами на что нагрузка то
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы