Exemple #1
0
    public string RegisterProvider(List <string> arguments)
    {
        KeyValuePair <Provider, string> pair = providerCreator.CreateProvider(arguments);
        Provider provider = pair.Key;
        string   message  = pair.Value;

        if (provider == null)
        {
            return(string.Format(ConstantMessages.UnSuccessfullyRegisterProvider, message));
        }

        providers.Add(provider);
        return(string.Format(ConstantMessages.SuccessfullyRegisterProvider, arguments[0], arguments[1]));
    }
Exemple #2
0
        /// <inheritdoc />
        public async Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
        {
            if (newSettings == null)
            {
                throw new ArgumentNullException(nameof(newSettings));
            }
            IProvider provider;

            async Task DisconnectProvider(IProvider p)
            {
                try
                {
                    await p.Disconnect(cancellationToken).ConfigureAwait(false);
                }
                finally
                {
                    p.Dispose();
                }
            }

            Task disconnectTask;

            lock (providers)
            {
                //raw settings changes forces a rebuild of the provider
                if (providers.TryGetValue(newSettings.Id, out provider))
                {
                    providers.Remove(newSettings.Id);
                    disconnectTask = DisconnectProvider(provider);
                }
                else
                {
                    disconnectTask = Task.CompletedTask;
                }
                if (newSettings.Enabled.Value)
                {
                    provider = providerFactory.CreateProvider(newSettings);
                    providers.Add(newSettings.Id, provider);
                }
            }

            lock (mappedChannels)
                foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == newSettings.Id).Select(x => x.Key).ToList())
                {
                    mappedChannels.Remove(I);
                }

            await disconnectTask.ConfigureAwait(false);

            if (started)
            {
                if (newSettings.Enabled.Value)
                {
                    await provider.Connect(cancellationToken).ConfigureAwait(false);
                }
                lock (this)
                {
                    //same thread shennanigans
                    var oldOne = connectionsUpdated;
                    connectionsUpdated = new TaskCompletionSource <object>();
                    oldOne.SetResult(null);
                }
            }
        }
Exemple #3
0
        public MainViewModel(MainState state, IProviderFactory factory, ProviderViewModelFactory createViewModel)
        {
            _factory = factory;
            Refresh  = ReactiveCommand.Create(state.Providers.Refresh);

            _isLoading = Refresh
                         .IsExecuting
                         .ToProperty(this, x => x.IsLoading);

            _isReady = Refresh
                       .IsExecuting
                       .Select(executing => !executing)
                       .ToProperty(this, x => x.IsReady);

            state.Providers.Connect()
            .Transform(ps => createViewModel(ps, factory.CreateProvider(ps.Parameters)))
            .Sort(SortExpressionComparer <IProviderViewModel> .Descending(x => x.Created))
            .ObserveOn(RxApp.MainThreadScheduler)
            .Bind(out _providers)
            .Subscribe();

            var canRemove = this
                            .WhenAnyValue(x => x.SelectedProvider)
                            .Select(provider => provider != null);

            Remove = ReactiveCommand.Create(
                () => state.Providers.RemoveKey(SelectedProvider.Id),
                canRemove);

            var canAddProvider = this
                                 .WhenAnyValue(x => x.SelectedSupportedType)
                                 .Select(type => Enum.IsDefined(typeof(ProviderType), type));

            Add = ReactiveCommand.Create(
                () => state.Providers.AddOrUpdate(new ProviderState {
                Type = SelectedSupportedType
            }),
                canAddProvider);

            _welcomeScreenVisible = this
                                    .WhenAnyValue(x => x.SelectedProvider)
                                    .Select(provider => provider == null)
                                    .ToProperty(this, x => x.WelcomeScreenVisible);

            _welcomeScreenCollapsed = this
                                      .WhenAnyValue(x => x.WelcomeScreenVisible)
                                      .Select(visible => !visible)
                                      .ToProperty(this, x => x.WelcomeScreenCollapsed);

            var canUnselect = this
                              .WhenAnyValue(x => x.SelectedProvider)
                              .Select(provider => provider != null);

            Unselect = ReactiveCommand.Create(() => Unit.Default, canUnselect);
            Unselect.Subscribe(unit => SelectedProvider = null);

            var outputCollectionChanges = Providers
                                          .ToObservableChangeSet(x => x.Id)
                                          .Publish()
                                          .RefCount();

            outputCollectionChanges
            .Filter(provider => provider.Id == state.SelectedProviderId)
            .ObserveOn(RxApp.MainThreadScheduler)
            .OnItemAdded(provider => SelectedProvider = provider)
            .Subscribe();

            outputCollectionChanges
            .OnItemRemoved(provider => SelectedProvider = null)
            .Subscribe();

            this.WhenAnyValue(x => x.SelectedProvider)
            .Skip(1)
            .Select(provider => provider?.Id ?? Guid.Empty)
            .Subscribe(id => state.SelectedProviderId = id);

            SelectedSupportedType = state.SelectedSupportedType ?? SupportedTypes.First();
            this.WhenAnyValue(x => x.SelectedSupportedType)
            .Subscribe(type => state.SelectedSupportedType = type);
        }
        /// <inheritdoc />
        public async Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
        {
            if (newSettings == null)
            {
                throw new ArgumentNullException(nameof(newSettings));
            }
            IProvider provider;

            async Task DisconnectProvider(IProvider p)
            {
                try
                {
                    await p.Disconnect(cancellationToken).ConfigureAwait(false);
                }
                finally
                {
                    p.Dispose();
                }
            }

            Task disconnectTask;

            lock (providers)
            {
                // raw settings changes forces a rebuild of the provider
                if (providers.TryGetValue(newSettings.Id, out provider))
                {
                    providers.Remove(newSettings.Id);
                    disconnectTask = DisconnectProvider(provider);
                }
                else
                {
                    disconnectTask = Task.CompletedTask;
                }
                if (newSettings.Enabled.Value)
                {
                    provider = providerFactory.CreateProvider(newSettings);
                    providers.Add(newSettings.Id, provider);
                }
            }

            lock (mappedChannels)
                foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == newSettings.Id).Select(x => x.Key).ToList())
                {
                    mappedChannels.Remove(I);
                }

            await disconnectTask.ConfigureAwait(false);

            if (started)
            {
                if (newSettings.Enabled.Value)
                {
                    await provider.Connect(cancellationToken).ConfigureAwait(false);
                }
                lock (synchronizationLock)
                {
                    // same thread shennanigans
                    var oldOne = connectionsUpdated;
                    connectionsUpdated = new TaskCompletionSource <object>();
                    oldOne.SetResult(null);
                }
            }

            Task reconnectionUpdateTask = Task.CompletedTask;

            lock (activeChatBots)
            {
                var originalChatBot = activeChatBots.FirstOrDefault(bot => bot.Id == newSettings.Id);
                if (originalChatBot != null)
                {
                    if (originalChatBot.ReconnectionInterval != newSettings.ReconnectionInterval)
                    {
                        reconnectionUpdateTask = provider.SetReconnectInterval(newSettings.ReconnectionInterval.Value);
                    }

                    activeChatBots.Remove(originalChatBot);
                }

                activeChatBots.Add(new Models.ChatBot
                {
                    Id = newSettings.Id,
                    ConnectionString     = newSettings.ConnectionString,
                    Enabled              = newSettings.Enabled,
                    Name                 = newSettings.Name,
                    ReconnectionInterval = newSettings.ReconnectionInterval,
                    Provider             = newSettings.Provider
                });
            }

            await reconnectionUpdateTask.ConfigureAwait(false);
        }