private void OnSubscriptionFailed(SlackClientWrapper client, string externalAccountId, AggregateException exception) { Logger.GetLogger().Warn($"SlackEventManager: subscription fail for user {externalAccountId}. Exception - {exception}"); lock (_locker) { foreach (var planId in client.SubscribedPlans) { _accountsByPlanId.Remove(planId); } _clientsByUserName.Remove(client.SlackData.Self.Name); client.Dispose(); } }
public Task Subscribe(AuthorizationToken token, Guid planId) { lock (_locker) { if (_disposed) { Logger.GetLogger().Warn($"SlackEventManager: can't subscribe to disposed object. User = {token.ExternalAccountId}, PlanId = {planId}"); return(Task.FromResult(0)); } Unsubscribe(planId); SlackClientWrapper client; var userName = token.ExternalAccountId; if (!_clientsByUserName.TryGetValue(userName, out client)) { Logger.GetLogger().Info($"SlackEventManager: creating new subscription and opening socket for user {token.ExternalAccountId}"); //This user doesn't have subscription yet - create a new subscription client = new SlackClientWrapper(token.Token, userName); client.MessageReceived += OnMessageReceived; _clientsByUserName.Add(userName, client); } else { Logger.GetLogger().Info($"SlackEventManager: client for user {token.ExternalAccountId} already exists"); } Logger.GetLogger().Info($"SlackEventManager: subscribing Plan {planId} to events from user {token.ExternalAccountId}"); client.Subscribe(planId); _accountsByPlanId[planId] = userName; var result = client.Connect(); result.ContinueWith(x => { if (x.IsFaulted) { OnSubscriptionFailed(client, token.ExternalAccountId, x.Exception); } }, TaskContinuationOptions.OnlyOnFaulted); return(result); } }