protected void SendGroupStateUpdate(IGroupStateContext context, IGroupPlaybackRequest reason, SessionInfo session, CancellationToken cancellationToken) { // Notify relevant state change event. var stateUpdate = new GroupStateUpdate(Type, reason.Action); var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.StateUpdate, stateUpdate); context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken); }
/// <inheritdoc /> public void HandleRequest(SessionInfo session, IGroupPlaybackRequest request, CancellationToken cancellationToken) { if (session == null) { throw new InvalidOperationException("Session is null!"); } if (request == null) { throw new InvalidOperationException("Request is null!"); } if (_sessionToGroupMap.TryGetValue(session.Id, out var group)) { // Group lock required as Group is not thread-safe. lock (group) { // Make sure that session still belongs to this group. if (_sessionToGroupMap.TryGetValue(session.Id, out var checkGroup) && !checkGroup.GroupId.Equals(group.GroupId)) { // Drop request. return; } // Drop request if group is empty. if (group.IsGroupEmpty()) { return; } // Apply requested changes to group. group.HandleRequest(session, request, cancellationToken); } } else { _logger.LogWarning("Session {SessionId} does not belong to any group.", session.Id); var error = new GroupUpdate <string>(Guid.Empty, GroupUpdateType.NotInGroup, string.Empty); _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None); } }
public virtual void HandleRequest(IGroupPlaybackRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken) { UnhandledRequest(request); }
private void UnhandledRequest(IGroupPlaybackRequest request) { _logger.LogWarning("Unhandled request of type {RequestType} in {StateType} state.", request.Action, Type); }