AnimeFlame
@AnimeFlame
JavaScript developer

Voice Activity Tracking System discord.js?

Всем доброго времени суток, у меня есть слушатель событий voiceStateUpdate, мне необходимо добавлять в таблицу пользователя время, которое он провёл в голосовом канале. (каждые 5 секунд).
Но есть несколько проблем:

1. Функция addVoiceTime выполняется не только при подключении пользователя к голосовому каналу, но и при попытке выключить/включить микрофон, наушники.
2. При отключении пользователя от голосового канала эта функция не должна больше выполнятся, setInterval(или может что-то другое) должен очищаться.

if (
		(oldState.channelId === null && newState.channelId !== null) ||
		(oldState.channelId && newState.channelId !== null)) {
		async function addVoiceTime() {
			if (!newState.channelId) return
			//if (newState.channel.members.size < 2) return
			if (newState.selfMute == true) return
			if (newState.selfDeaf == true) return

			await dbQuery(
				`INSERT INTO users (user_id) VALUES ($1) ON CONFLICT (user_id) DO UPDATE SET voice_time = 
users.voice_time + 5000`,
				(values = [`${newState.id}`])
			)
			console.log(`Added Voice Time For ${newState.id}`)
		}

		setInterval(addVoiceTime, 5000)
	}
  • Вопрос задан
  • 363 просмотра
Пригласить эксперта
Ответы на вопрос 1
Syjalo
@Syjalo
Представьте себе бота
Для начала убедитесь, что у вас есть интент GUILD_VOICE_STATES в опциях клиента.

Теперь создайте Map для интервалов перед регистрацией ивента
const intervals = new Map();
Далее при подключении к каналу создавайте интервал и записывайте в только что созданный Map
client.on("voiceStateUpdate", (oldState, newState) => {
  function addVoiceTime() {}
  if (!oldState.channelId && newState.channelId) {
    intervals.set(newState.id, setInterval(addVoiceTime, 5000));
  }
});

А при отключении отчищайте
client.on("voiceStateUpdate", (oldState, newState) => {
  if (oldState.channelId && !newState.channelId) {
    clearInterval(intervals.get(newState.id));
    intervals.delete(newState.id);
  }
});

Результирующий код
const intervals = new Map();
client.on("voiceStateUpdate", (oldState, newState) => {
  function addVoiceTime() {}
  if (!oldState.channelId && newState.channelId) {
    intervals.set(newState.id, setInterval(addVoiceTime, 5000));
  }
  if (oldState.channelId && !newState.channelId) {
    clearInterval(intervals.get(newState.id));
    intervals.delete(newState.id);
  }
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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