public override async Task OnDisconnectedAsync(Exception exception) { try { string name = Context.User.Identity.Name; if (name != null) { var user = await _userManager.FindByIdAsync(name); var isPatient = await _userManager.IsInRoleAsync(user, "patient"); if (isPatient) { var patient = await _patientIManager.GetPatientDetails(name); var roomName = await _commonManager.GetRoomNameForParticipant(new CallParticipantModel { ParticipantId = patient.PatientId, SocketId = Context.ConnectionId }); await Clients.Group(roomName).SendAsync("ParticipantDisconnected", new JObject { ["PatientId"] = patient.PatientId, }.ToString()); } else { var provider = await _providerManager.GetProviderDetails(name); var rooms = await _providerManager.GetAllWaitingRooms(provider.ProviderId); foreach (var room in rooms) { await Clients.Group(room.RoomName).SendAsync("DoctorOffline", new JObject { ["ProviderId"] = provider.ProviderId }.ToString()); } await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users"); await base.OnDisconnectedAsync(exception); } } } catch (Exception ex) { await Clients.Caller.SendAsync("Exception", new JObject { ["error"] = ex.Message, ["stackTrace"] = ex.StackTrace }.ToString()); } }