Voice presence
Бот не входит в голосовой канал и не видит, кто там. Он только проигрывает аудио односторонне (см. Voice playback). Чтобы решить, в какой канал играть, бот смотрит на загруженность каналов через REST.
Загруженность каналов
GET /api/bot/spaces/{space_id}/voice · scope voice.join
Возвращает все allowed_channels бота — только число участников и факт, что
сам бот сейчас что-то играет в канале. Идентификации участников
(user_id, display_name) боту не раскрываются — это намеренное
ограничение приватности.
curl https://api.reasonspace.ru/api/bot/spaces/{space_id}/voice \
-H "Authorization: Bot bot_..."
[
{ "channel_id": "019c3851-...", "participant_count": 2, "bot_present": false }
]
| Поле | Описание |
|---|---|
channel_id | Голосовой канал из allowed_channels бота. |
participant_count | Сколько человек в канале сейчас. Без списка, кто именно. |
bot_present | Играет ли сам бот в этом канале прямо сейчас. |
Это единственное, что бот узнаёт про голос. Никаких имён, аватарок или идентификаторов участников в ответе нет и быть не может.
Как выбрать канал
Музыкальному боту обычно нужно начать играть там, где есть слушатели. Два способа:
Если канал известен заранее (команда пользователя, конфиг бота) — просто
передавайте его в /voice/{channel_id}/play.
Если канал не задан — возьмите загруженность и выберите канал с участниками.
SDK даёт шорткат: find_occupied_voice_channel возвращает channel_id
канала с наибольшим participant_count (или None, если все пусты).
# Вариант 1: явный канал
await bot.client.voice_play(channel_id, source_url, space_id=space_id)
# Вариант 2: найти, где сейчас есть слушатели
ch_id = bot.client.find_occupied_voice_channel(space_id=space_id)
if ch_id:
await bot.client.voice_play(ch_id, source_url, space_id=space_id)
# Посмотреть полную загруженность вручную
overview = await bot.client.voice_overview(space_id=space_id)
Privacy
Бот физически не может слышать участников: у него нет принимающей медиа-сессии — только источник, который проигрывает платформа. Это гарантия архитектурой, а не соглашением. Поэтому и в этом эндпоинте нет идентификаций: загруженность канала видна, личности — нет.