Skip to content

Работа с участниками

SDK предоставляет методы и коллбэки для управления участниками звонка.

Получение информации об участниках

При входе в звонок

Информация о текущих участниках приходит в коллбэке onConversation:

javascript
await SDK.init({
    // ...
    onConversation: (externalId, mediaModifiers, muteStates, participants, rooms) => {
        // participants - массив участников звонка
        participants.forEach(participant => {
            console.log('Участник:', participant.uid);
            console.log('Статус:', participant.status);
            console.log('Медиа:', participant.mediaSettings);
        });
    }
});

Запрос списка участников

javascript
// Получить участников по ID
const participants = await SDK.getParticipants({
    externalIds: [
        { id: 'user123', type: ExternalIdType.USER }
    ]
});

// Получить чанк списка участников (для больших звонков)
const chunk = await SDK.getParticipantListChunk({
    pageMarker: null,
    count: 50
});

Отслеживание статусов участников

Статус подключения

javascript
await SDK.init({
    // ...
    onRemoteStatus: (userIds, status, data) => {
        // status: ParticipantStatus
        // - WAITING - ожидание
        // - CONNECTING - подключение  
        // - CONNECTED - подключен
        // - HANGUP - отключился
        
        userIds.forEach(userId => {
            console.log(`${userId} - ${status}`);
        });
    }
});

Настройки медиа участника

javascript
await SDK.init({
    // ...
    onRemoteMediaSettings: (userId, mediaSettings, markers) => {
        // mediaSettings содержит:
        // - isAudioEnabled - микрофон включен
        // - isVideoEnabled - камера включена
        // - isScreenSharingEnabled - демонстрация экрана
        // - isAnimojiEnabled - Vmoji включен
        
        if (mediaSettings.isVideoEnabled) {
            // Запросить видео от участника
            SDK.updateDisplayLayout([{
                uid: userId,
                mediaType: MediaType.CAMERA,
                width: 1920,
                height: 1080
            }]);
        }
    }
});

Добавление участников

javascript
import { ExternalIdType } from '@vkontakte/calls-sdk';

// Добавить одного участника
await SDK.addParticipant({
    id: 'user123',
    type: ExternalIdType.USER
});

// Добавить нескольких участников
await SDK.addParticipant([
    { id: 'user123', type: ExternalIdType.USER },
    { id: 'user456', type: ExternalIdType.USER }
]);

Удаление участников

javascript
// Удалить участника
await SDK.removeParticipant({
    id: 'user123',
    type: ExternalIdType.USER
});

// Удалить и забанить участника
await SDK.removeParticipant(
    { id: 'user123', type: ExternalIdType.USER },
    true  // ban
);

Отключение участника от звонка

javascript
await SDK.init({
    // ...
    onRemoteRemoved: (userId, markers) => {
        // Участник покинул звонок
        console.log('Участник вышел:', userId);
    }
});

Качество связи участников

javascript
await SDK.init({
    // ...
    // Качество локального соединения
    onLocalNetworkStatusChanged: (rating) => {
        // rating: 0-5 (0 - плохое, 5 - отличное)
        console.log('Моё качество связи:', rating);
    },
    
    // Качество соединения участников
    onNetworkStatusChanged: (status) => {
        status.forEach(item => {
            console.log(`${item.uid}: качество ${item.rating}`);
        });
    }
});

Состояние участника

Участники могут иметь кастомные состояния (например, "поднял руку"):

javascript
await SDK.init({
    // ...
    onRemoteParticipantState: (externalId, state, markers) => {
        if (state.hand?.state === '1') {
            console.log('Участник поднял руку:', externalId);
        }
    }
});

// Изменить своё состояние (поднять руку)
await SDK.changeParticipantState({
    hand: { state: '1' }
});

// Опустить руку
await SDK.changeParticipantState({
    hand: { state: '0' }
});

Определение говорящего

javascript
await SDK.init({
    // ...
    onSpeakerChanged: (userId) => {
        // userId - ID участника, который сейчас говорит
        console.log('Говорит:', userId);
    },
    
    // Уровни громкости участников
    onVolumesDetected: (volumes) => {
        volumes.forEach(item => {
            console.log(`${item.uid}: громкость ${item.volume}`);
        });
    }
});