2.7 KiB
2.7 KiB
title, weight
| title | weight |
|---|---|
| Интерактивные голосовые функции | 3 |
Цель: Реализовать сложные голосовые взаимодействия, которые учитывают границы серверов (гильдий) и управляют временными ресурсами.
1. Стратегия ограничения ресурсов
Голосовые функции ОБЯЗАТЕЛЬНО должны быть ограничены рамками Гильдии (Guild).
- Паттерн: Контроллер поддерживает
Map<GuildID, Player>. - Поведение:
- Подключение (Join): Создать Player для
Гильдии A, если он еще не существует. - Отключение (Leave): Уничтожить Player и освободить соединения.
- Изоляция: Команды в
Гильдии Bникогда не влияют наГильдию A.
- Подключение (Join): Создать Player для
2. Оркестрация команд
Голосовые функции требуют набора команд, координируемых через Контроллер.
| Команда | Действие | Логика Контроллера |
|---|---|---|
/join |
Подключиться к каналу | createPlayer(guildId, channelId) |
/play |
Добавить трек в очередь | getPlayer(guildId).enqueue(track) |
/stop |
Отключиться | destroyPlayer(guildId) |
3. Сохранение состояния
Аудиосессии эфемерны.
- Временное состояние: Активный аудиопоток (Теряется при отключении).
- Постоянное состояние: Очередь / Плейлист (Сохраняется в Контроллере до перезапуска).
Tip
Устойчивость: Разделяйте логику Очереди и логику Голосового соединения. Это позволяет боту переподключаться без потери плейлиста пользователя.
4. Пример реализации
// lib/MusicController.ts
class MusicController {
private players = new Map<string, AudioPlayer>();
getPlayer(guildId: string): AudioPlayer {
if (!this.players.has(guildId)) {
this.players.set(guildId, new AudioPlayer());
}
return this.players.get(guildId);
}
destroyPlayer(guildId: string) {
this.players.get(guildId)?.disconnect();
this.players.delete(guildId);
}
}
См. также: