Ejemplo n.º 1
0
        public void Initialize(int scriptId, IPlatformDatabase database)
        {
            try
            {
                var script = database.Scripts.First(x => x.Id == scriptId);

                if (!string.IsNullOrEmpty(script?.Name))
                {
                    var deserializer = new YamlDotNet.Serialization.Deserializer();
                    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(script.Instruction)))
                        using (var reader = new StreamReader(stream))
                        {
                            var behavior = deserializer.Deserialize <Behavior>(reader.ReadToEnd());

                            if (BehaviorValidator.IsValid(behavior))
                            {
                                _behavior = behavior;
                            }
                        }
                }
            }
            catch (Exception ex)
            {
                _logger.LogCritical(ex, $"Cannot build behavior. ScriptId: {scriptId}.");
                throw;
            }
        }
Ejemplo n.º 2
0
 public Task <InterpretationResult> InterpretAsync(IPlatformDatabase database, Dialog dialog)
 {
     return(Task.FromResult(new InterpretationResult
     {
         ResultType = ExpressionResultType.Boolean,
         Result = true
     }));
 }
Ejemplo n.º 3
0
 public TransportService(
     IPlatformDatabase database,
     ILogger <TransportService> logger
     )
 {
     _database = database;
     _logger   = logger;
 }
Ejemplo n.º 4
0
 public ScriptService(
     IPlatformDatabase database,
     ILogger <ScriptService> logger
     )
 {
     _database = database;
     _logger   = logger;
 }
Ejemplo n.º 5
0
 public BotService(
     ILogger <BotService> logger,
     IPlatformDatabase database
     )
 {
     _logger   = logger;
     _database = database;
 }
Ejemplo n.º 6
0
        public Database(IPlatformDatabase database)
        {
            _database     = database;
            _queueCommand = new BlockingQueue <Command>();

            // Background Init of database.
            Init();

            Start();
        }
Ejemplo n.º 7
0
 public DiscordService(
     ILogger <DiscordService> logger,
     IOptions <DiscordOptions> options,
     IBehaviorExecutor behaviorExecutor,
     IPlatformDatabase database,
     ServiceContext serviceContext
     )
     : base(logger, options, behaviorExecutor, database, serviceContext)
 {
     _logger  = logger;
     _options = options.Value;
 }
Ejemplo n.º 8
0
        public Task <InterpretationResult> InterpretAsync(IPlatformDatabase database, Dialog dialog)
        {
            var expression = ExpressionFactory.ParseExpression(_parameters);

            var command = _commandFactory.CreateCommand(expression.@operator);

            command.Parameter = expression.parameters;

            return(Task.FromResult(new InterpretationResult
            {
                Command = command,
                ResultType = ExpressionResultType.TransportCommand,
                State = InterpretationResultState.Completed
            }));
        }
Ejemplo n.º 9
0
        public TelegramService(
            ILogger <TelegramService> logger,
            IOptions <TelegramOptions> options,
            IBehaviorExecutor behaviorExecutor,
            IPlatformDatabase database,
            ServiceContext serviceContext
            )
            : base(logger, options, behaviorExecutor, database, serviceContext)
        {
            _logger  = logger;
            _options = options.Value;
            _botId   = serviceContext.BotId;

            _client                 = new TelegramBotClient(_options.Token);
            _client.OnMessage      += OnMessageAsync;
            _client.OnReceiveError += OnReceiveError;
        }
Ejemplo n.º 10
0
        public async Task <Message> CreateDialogMessage(IPlatformDatabase dbContext, Dialog dialog, string payload, MessageDirection direction)
        {
            var message =
                new Message
            {
                Payload   = payload,
                Direction = direction
            };

            dialog.Messages.Add(message);
            dialog.CurrentMessage = message;

            dbContext.Dialogs.Update(dialog);
            await dbContext.SaveChangesAsync();

            return(message);
        }
Ejemplo n.º 11
0
        protected IngoingServiceBase(
            ILogger <IngoingServiceBase> logger,
            IOptions <TransportOptions> options,
            IBehaviorExecutor behaviorExecutor,
            IPlatformDatabase database,
            ServiceContext serviceContext
            )
        {
            _logger           = logger;
            _options          = options.Value;
            _behaviorExecutor = behaviorExecutor;
            _serviceContext   = serviceContext;

            using (database)
            {
                _behaviorExecutor.Initialize(_serviceContext.ScriptId, database);
            }
        }
Ejemplo n.º 12
0
        public async Task <Dialog> CreateOrUpdateDialogAsync(IPlatformDatabase dbContext, User client, string payload, MessageDirection direction, int botId = default)
        {
            var message = new Message
            {
                Payload   = payload,
                Direction = direction
            };

            if (!_dialogs.TryGetValue(client.Id, out var dialog))
            {
                if (botId < 1)
                {
                    throw new ArgumentOutOfRangeException(nameof(botId), "Dialog cannot be created without botId.");
                }

                dialog = new Dialog
                {
                    Client   = client,
                    State    = DialogState.Active,
                    BotId    = botId,
                    Messages = new List <Message>
                    {
                        message
                    }
                };

                _dialogs.TryAdd(client.Id, dialog);

                //todo: нужна логика поиска диалога, пока что в случае если текущий диалог не будет найден в репо, то будет создан новый
                await dbContext.Dialogs.AddAsync(dialog);
            }
            else
            {
                dialog.Messages.Add(message);
                dbContext.Dialogs.Update(dialog);
            }

            dialog.CurrentMessage = message;
            await dbContext.SaveChangesAsync();

            return(dialog);
        }
Ejemplo n.º 13
0
        private PlatformDatabase UpdateDatabases(IManagedPlatform platform, string catalog, string server, ICollection <IEntity> entities)
        {
            using (Profiler.Measure("PlatformService.UpdateDatabases"))
            {
                if (string.IsNullOrEmpty(catalog))
                {
                    throw new ArgumentNullException("catalog");
                }

                if (string.IsNullOrEmpty(server))
                {
                    throw new ArgumentNullException("server");
                }

                IPlatformDatabase db = null;

                if (platform != null)
                {
                    db = platform.DatabaseHistory.FirstOrDefault(d =>
                                                                 string.Equals(d.Catalog, catalog, StringComparison.InvariantCultureIgnoreCase) &&
                                                                 string.Equals(d.Server, server, StringComparison.InvariantCultureIgnoreCase));
                }

                if (db != null)
                {
                    db = db.AsWritable <PlatformDatabase>();
                }
                else
                {
                    db         = CastEntityHelper.CreatePlatformDatabase();
                    db.Catalog = catalog;
                    db.Server  = server;
                }

                db.Name        = string.Format("{0} ({1})", server, catalog);
                db.LastContact = DateTime.UtcNow;

                entities.Add(db);

                return((PlatformDatabase)db);
            }
        }
Ejemplo n.º 14
0
        public async Task <InterpretationResult> InterpretAsync(IPlatformDatabase database, Dialog dialog)
        {
            var parameters = _parameters.Split(' ').Select(x => x.Trim());

            var result = new InterpretationResult
            {
                Result     = false,
                ResultType = ExpressionResultType.Boolean
            };

            foreach (var p in parameters)
            {
                if (dialog.CurrentMessage.Payload.Contains(p, System.StringComparison.OrdinalIgnoreCase))
                {
                    result.Result = true;
                }
            }

            return(result);
        }
Ejemplo n.º 15
0
        public async Task StopBotsAsync(IPlatformDatabase database)
        {
            var lastExecution = DateTime.Now.AddMilliseconds(-1 * _options.ServiceIntervalMs);

            var stoppedBots = await database.Bots
                              .AsNoTracking()
                              .Where(x => x.BotState == BotState.Stopped && x.ModifiedOn > lastExecution)
                              .ToListAsync();

            var transportsData = _runningBots.Where(x => stoppedBots.Contains(x.Bot));

            if (transportsData.Any())
            {
                foreach (var transportData in transportsData)
                {
                    transportData.Bot.BotState = BotState.Stopped;
                    await transportData.Transport.StopAsync();

                    _runningBots.Remove(transportData);
                }
            }
        }
Ejemplo n.º 16
0
        public async Task StartBotsAsync(IPlatformDatabase database)
        {
            var bots = await database.Bots
                       .Where(x => (x.BotState == BotState.Pending || x.BotState == BotState.Started) &&
                              !_runningBots.Select(e => e.Bot.Id).Contains(x.Id))
                       .Include(x => x.Transport)
                       .Include(x => x.Owner)
                       .Include(x => x.Script)
                       .ToListAsync();

            if (bots.Any())
            {
                foreach (var bot in bots)
                {
                    try
                    {
                        EnsureValidity(bot);

                        var transportData = CreateTransport(bot);
                        _runningBots.Add(transportData);
                        await transportData.Transport.StartAsync(transportData.CancellationToken);

                        bot.BotState = BotState.Started;
                    }
                    catch (Exception ex)
                    {
                        bot.BotState = BotState.Invalid;
                        _logger.LogError(ex, $"Error during bot creation. BotId: {bot.Id}.");
                    }

                    database.Bots.Update(bot);
                }

                await database.SaveChangesAsync();
            }
        }
Ejemplo n.º 17
0
 public Task FinishDialogAsync(IPlatformDatabase dbContext, Dialog dialog)
 {
     dialog.State = DialogState.Finished;
     dbContext.Dialogs.Update(dialog);
     return(dbContext.SaveChangesAsync());
 }
Ejemplo n.º 18
0
 public DialogService(
     IPlatformDatabase database,
     ILogger <DialogService> logger)
 {
 }
Ejemplo n.º 19
0
 public Task <InterpretationResult> InterpretAsync(IPlatformDatabase database, Dialog dialog)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 20
0
 public UserService(IPlatformDatabase database, ILogger <UserService> logger)
 {
     _database = database;
     _logger   = logger;
 }
Ejemplo n.º 21
0
 public Task <string> InsertEntityParameters(string message, Dialog dialog, IPlatformDatabase database)
 {
     return(TextTemplateHandler.InsertEntityParameters(message, dialog, database));
 }
Ejemplo n.º 22
0
        public async Task <InterpretationResult> Interpret(IInstruction instruction, Dialog dialog, IPlatformDatabase database, string transport)
        {
            try
            {
                var enrichedInstruction = await InsertEntityParameters(instruction.Instruction, dialog, database);

                var expression = _expressionFactory.CreateExpression(enrichedInstruction, transport);
                return(await expression.InterpretAsync(database, dialog));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Interpretation failed. Instruction: {instruction.Instruction}.");

                return(new InterpretationResult
                {
                    Result = ex,
                    State = InterpretationResultState.Failed
                });
            }
        }
Ejemplo n.º 23
0
        private async Task <User> FindOrCreateUserAsync(string connectionId, string username, IPlatformDatabase database, Services.ServiceContext serviceContext)
        {
            var client =
                (await database.UserTransports
                 .Include(x => x.User)
                 .FirstOrDefaultAsync(x => x.Id == serviceContext.TransportId && x.TransportUserId.Equals(connectionId)))?.User;

            if (client is null)
            {
                client = new User
                {
                    Username = username
                };

                database.UserTransports.Add(
                    new UserTransport
                {
                    Transport       = await database.Transports.FirstAsync(x => x.Id == serviceContext.TransportId),
                    User            = client,
                    TransportUserId = connectionId
                });

                _logger.LogInformation($"New user just created. Username: {username}. Transport: {serviceContext.TransportName}. BotId: {serviceContext.BotId}.");
            }

            client.LastActivity = DateTime.Now;
            await database.SaveChangesAsync();

            _connectionsRepository.AddConnection(client.Id, serviceContext.TransportName, connectionId);

            return(client);
        }
Ejemplo n.º 24
0
        public static async Task <string> InsertEntityParameters(string textTemplate, Dialog dialog, IPlatformDatabase database)
        {
            //todo: нужно считать хеш шаблона, хранить его возможно прямо в объекте шага поведения, после кешировать хеш и параметры шаблона
            var parameters = TemplateRegex.Matches(textTemplate)
                             .OfType <Match>()
                             .Select(x => x.Groups[0].Value)
                             .ToDictionary(parameter => parameter.Trim('{').Trim('}'), parameter => parameter);

            if (!parameters.Any())
            {
                return(textTemplate);
            }

            StringBuilder resultString = new StringBuilder(textTemplate);

            foreach (var p in parameters.Keys)
            {
                var entityParameter = p.Split(':');

                if (!EntityNameIsValid(entityParameter[0]))
                {
                    throw new KeyNotFoundException($"Text template processing error. Entity name not found. {p[0]}");
                }

                if (entityParameter[0].Equals("user", StringComparison.OrdinalIgnoreCase))
                {
                    var value = dialog.Client.GetType()
                                .GetProperties()
                                .FirstOrDefault(x => x.Name.Equals(entityParameter[1], StringComparison.OrdinalIgnoreCase))
                                ?.GetValue(dialog.Client)
                                ?.ToString() ?? "null";

                    resultString.Replace(parameters[p], value);
                }
                else
                {
                }
            }

            return(resultString.ToString());
        }
Ejemplo n.º 25
0
 public ConnectionsRepository(IPlatformDatabase database)
 {
     _database = database;
 }