Voice Time | discord.js

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Доброго времени суток, друзья! Решил значит я написать систему фиксации времени проведённого пользователем в голосовых каналах. Значит сделал всё вроде по уму, но есть проблема. При генерации Date.now() есть такой баг или я незнаю как это назвать. Вот в чём фишка: при генерации числа может выпасть обычное число(которое нам не подходит), а может выпасть число к примеру 43520(которое нам необходимо). Естественно, когда генерируется необходимое нам число, то всё считается отлично, но когда генерируется число, которое нам не подходит, то всё считается в следующем виде
1605220256699.png

Когда же генерируется нужно число, то всё считается в таком виде
1605220298954.png

Ниже предоставляю код и скриншот консоли, возможно кто-то знает как исправить данный баг или ошибку. Буду рад услышать советы!
JavaScript:
const Discord = require('discord.js');
const client = new Discord.Client({
    partials: ['MESSAGE', 'CHANNEL', 'REACTION'],
});
const quick = require('quick.db');

client.on('voiceStateUpdate', async(oldState, newState) => {
    if (!oldState.channel && newState.channel) {
        var startTime = Date.now();
        console.log(startTime);

        let checkBase = quick.fetch(`voiceTime.${newState.member.id}`);
        if(checkBase == null) quick.set(`voiceTime.${newState.member.id}`, startTime);
    }else if (!newState.channel) {
        var endTime = Date.now();

        let checkBase = quick.fetch(`voiceTime.${oldState.member.id}`);
        if(checkBase == null) return;

        let time = Math.floor(endTime - checkBase);
        console.log(time);

        quick.set(`voiceTime.${oldState.member.id}`, time);
    }
});

IMG_20201113_002347.jpg
JavaScript:
const prefix = '!';

if(cmd === `${prefix}voiceTime`) {
    let checkBase = quick.fetch(`voiceTime.${message.author.id}`);
    if(checkBase == null) return message.channel.send('Error!');

    const seconds = Math.floor((checkBase / 1000) % 60);
    const minutes = Math.floor((checkBase / 1000 / 60) % 60);
    const hours = Math.floor((checkBase / 1000 / 60 / 60) % 24);
    const days = Math.floor(checkBase / 1000 / 60 / 60 / 24);
    
    message.channel.send(`${message.author}, Вы находились в войсе: **${days}** дн., **${hours}** час., **${minutes}** мин., **${seconds}** сек.`);
}
 

Black_Yuzia

Зарабатываю на жизнь Мемами про Крузю.
Сообщения
693
Реакции
372
а зачем тебе % 60 , % 60, % 24 в коде (7-9 строки)?
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@xyligan, Ну это естественно, когда вы работаете с перезаписью одного поля, ключа, в бд и при этом никак не обрабатываете ситуации с ошибкой.
К тому же, fetch, полагаю, асинхронная и никак это не обыгрываете. Хотя хрен его знает, ведь вы не говорите, что используете для хранения данных.

Что происходит сейчас:
  1. Вы получаете, возможно каждый раз (и то вряд ли), текущую дату.
  2. Эта дата никак не обрабатывается (потому что)
  3. Происходит форматирование раннее записанной даты
  4. Вам выводит эту дату (время).
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
а зачем тебе % 60 , % 60, % 24 в коде (7-9 строки)?
Вся эта "сложная" математика нужна для того, чтобы перевести огромное число в миллисекундах в дни, часы, минуты и секунды.
Сообщения автоматически склеены:

@xyligan, Ну это естественно, когда вы работаете с перезаписью одного поля, ключа, в бд и при этом никак не обрабатываете ситуации с ошибкой.
К тому же, fetch, полагаю, асинхронная и никак это не обыгрываете. Хотя хрен его знает, ведь вы не говорите, что используете для хранения данных.

Что происходит сейчас:
  1. Вы получаете, возможно каждый раз (и то вряд ли), текущую дату.
  2. Эта дата никак не обрабатывается (потому что)
  3. Происходит форматирование раннее записанной даты
  4. Вам выводит эту дату (время).
Для хранения данных использую локальную БД.
Название пакета npmJS: quick.db

1. Дату получаем как только человек зайдёт в голосовой канал и выйдет из него.
2. Даже незнаю как её обрабатывать
3. Форматируется дата, которая была записана ботом при выходе пользователя из голосового канала
4. Логично
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
При первом входе на канал вы храните в voiceTime.${id} Date.now(), при выходе из канала вы пишите туда, сколько time секунд человек провёл в звуковом канале. Когда человек вновь заходит на канал, вы уже ничего не пишете в voiceTime.${id}, а там находится time. Поэтому на нечётном входе на канал у вас будут гигантские числа. На чётных входах (начиная со второго чётного входа) у вас будет выводится не время, проведённое на канале, а сколько секунд прошло между перезаходом на звуковой канал.
Таким образом, данный код будет работать "правильно" только при первом входе на голосовой канал.
Чтобы исправить эту ошибку, вам нужно всегда при каждом входе писать в voiceTime.${id} Date.now().
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
При первом входе на канал вы храните в voiceTime.${id} Date.now(), при выходе из канала вы пишите туда, сколько time секунд человек провёл в звуковом канале. Когда человек вновь заходит на канал, вы уже ничего не пишете в voiceTime.${id}, а там находится time. Поэтому на нечётном входе на канал у вас будут гигантские числа. На чётных входах (начиная со второго чётного входа) у вас будет выводится не время, проведённое на канале, а сколько секунд прошло между перезаходом на звуковой канал.
Таким образом, данный код будет работать "правильно" только при первом входе на голосовой канал.
Чтобы исправить эту ошибку, вам нужно всегда при каждом входе писать в voiceTime.${id} Date.now().
Как я понимаю, Вы представляете работу системы так: пользователь заходит в канал, в базу пишется значение даты. Пользователь выходит, и идёт подсчёт времени, которое он провёл в голосовом канале. Но мне нужно сделать так, чтобы бот считал время не за 1 раз, а за всё время. Собственно поэтому при заходе пользователя стоит условие, которое проверяет в базе запись на данного пользователя. Если она не найдена, она создаётся. При следующих заходах она меняться не будет, а вот выходах будет.
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Как я понимаю, Вы представляете работу системы так: пользователь заходит в канал, в базу пишется значение даты. Пользователь выходит, и идёт подсчёт времени, которое он провёл в голосовом канале. Но мне нужно сделать так, чтобы бот считал время не за 1 раз, а за всё время. Собственно поэтому при заходе пользователя стоит условие, которое проверяет в базе запись на данного пользователя. Если она не найдена, она создаётся. При следующих заходах она меняться не будет, а вот выходах будет.
Я вам объяснил причину ошибки и предложил один из вариантов решения проблемы. Если вам нужно добавить общее время, проведённое на сервере, то очевидно, что необходимо иметь вторую отдельную переменную, в которой будет храниться общее время, проведённое на сервере.
 
Сверху Снизу