Перейти к основному содержимому

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Играет ли сам бот в этом канале прямо сейчас.

Это единственное, что бот узнаёт про голос. Никаких имён, аватарок или идентификаторов участников в ответе нет и быть не может.

Как выбрать канал

Музыкальному боту обычно нужно начать играть там, где есть слушатели. Два способа:

Явный channel_id

Если канал известен заранее (команда пользователя, конфиг бота) — просто передавайте его в /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

Бот физически не может слышать участников: у него нет принимающей медиа-сессии — только источник, который проигрывает платформа. Это гарантия архитектурой, а не соглашением. Поэтому и в этом эндпоинте нет идентификаций: загруженность канала видна, личности — нет.

Дальше