protected virtual void FillRecipientAttachments(ApiRecipient recipient, ITemplateConfiguration templateConfiguration, string[] recipientArray, string fileName, string line, UserApiConfiguration user, ProcessResult result)
        {
            var attachmentsList = new List <string>();

            foreach (FieldConfiguration field in templateConfiguration.Fields.Where(x => x.IsAttachment))
            {
                string attachName = recipientArray[field.Position];

                if (!string.IsNullOrEmpty(attachName))
                {
                    string localAttachement = GetAttachmentFile(attachName, fileName, user);

                    if (!string.IsNullOrEmpty(localAttachement))
                    {
                        attachmentsList.Add(localAttachement);
                    }
                    else
                    {
                        string message = $"The attachment file {attachName} doesn't exists.";
                        recipient.HasError   = true;
                        recipient.ResultLine = $"{line}{templateConfiguration.FieldSeparator}{message}";
                        _logger.Error(message);
                        string errorMessage = $"{DateTime.UtcNow}:{message} proccesing line {line}";
                        result.WriteError(errorMessage);
                        result.ErrorsCount++;
                    }
                }
            }

            if (attachmentsList.Count > 0)
            {
                recipient.FillAttachments(attachmentsList);
            }
        }
        public ITemplateConfiguration Clone()
        {
            ITemplateConfiguration templateConfiguration = (ITemplateConfiguration)Activator.CreateInstance(this.GetType());

            templateConfiguration.FileNamePartSeparator = this.FileNamePartSeparator;
            templateConfiguration.FieldSeparator        = this.FieldSeparator;
            templateConfiguration.TemplateId            = this.TemplateId;
            templateConfiguration.TemplateName          = this.TemplateName;
            templateConfiguration.HasHeaders            = this.HasHeaders;

            if (this.FileNameParts != null)
            {
                templateConfiguration.FileNameParts = new List <string>();
                foreach (string fileNamePart in this.FileNameParts)
                {
                    templateConfiguration.FileNameParts.Add(fileNamePart);
                }
            }

            if (this.Fields != null)
            {
                templateConfiguration.Fields = new List <FieldConfiguration>();
                foreach (FieldConfiguration fieldConfiguration in this.Fields)
                {
                    templateConfiguration.Fields.Add(fieldConfiguration.Clone());
                }
            }

            return(templateConfiguration);
        }
        protected override string[] GetDataLine(string line, ITemplateConfiguration templateConfiguration)
        {
            string newLine = string.Empty;

            int start = 0;

            string value;

            foreach (FieldConfiguration field in templateConfiguration.Fields)
            {
                if (start + field.Length <= line.Length)
                {
                    value    = line.Substring(start, field.Length);
                    newLine += $"{value.Trim()}{templateConfiguration.FieldSeparator}";
                }
                else
                {
                    newLine += $"{templateConfiguration.FieldSeparator}";
                }
                start += field.Length;
            }

            if (newLine.EndsWith(templateConfiguration.FieldSeparator.ToString()))
            {
                newLine = newLine.Remove(newLine.Length - 1, 1);
            }

            return(newLine.Split(templateConfiguration.FieldSeparator));
        }
Ejemplo n.º 4
0
        protected override string[] GetDataLine(string line, ITemplateConfiguration templateConfiguration)
        {
            string[] lineArray = line.Split(templateConfiguration.FieldSeparator);

            var charsToTrim = new char[] { '"' };

            return(lineArray.Select(x => x.Trim().Trim(charsToTrim)).ToArray());
        }
        protected virtual string GetHeaderLine(string line, ITemplateConfiguration templateConfiguration)
        {
            if (templateConfiguration != null && !templateConfiguration.HasHeaders)
            {
                return(string.Join(templateConfiguration.FieldSeparator.ToString(), templateConfiguration.Fields.Select(x => x.Name)));
            }

            return(line);
        }
Ejemplo n.º 6
0
        protected List <string> FilterFilesByTemplate(List <string> files, IUserConfiguration user)
        {
            var filteredFiles = new List <string>();

            foreach (string file in files)
            {
                ITemplateConfiguration templateConfiguration = ((UserApiConfiguration)user).GetTemplateConfiguration(file);

                if (templateConfiguration != null && _reportTypeConfiguration.Templates.Contains(templateConfiguration.TemplateName))
                {
                    filteredFiles.Add(file);
                }
            }

            return(filteredFiles);
        }
        protected string GetResultsFileName(string fileName, UserApiConfiguration user)
        {
            var filePathHelper = new FilePathHelper(_configuration, user.Name);

            ITemplateConfiguration templateConfiguration = user.GetTemplateConfiguration(fileName);

            string extension = ".sent";

            if (user.Reports == null || user.Reports.ReportsList.Count == 0)
            {
                extension = ".report";
            }

            string resultsFileName = $@"{filePathHelper.GetResultsFilesFolder()}\{fileName.Replace(".processing", extension)}";

            return(resultsFileName);
        }
        /// <summary>
        /// Default template constructor
        /// </summary>
        /// <param name="configuration"></param>
        public CSharpExecutorTemplate(ITemplateConfiguration configuration)
        {
            Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));

            if (configuration.GetActions() == null || !configuration.GetActions().Any())
            {
                throw new ArgumentNullException(nameof(configuration.GetActions));
            }

            if (string.IsNullOrWhiteSpace(configuration.GetNamespace()))
            {
                throw new ArgumentNullException(nameof(configuration.GetNamespace));
            }

            if (string.IsNullOrWhiteSpace(configuration.GetClassName()))
            {
                throw new ArgumentNullException(nameof(configuration.GetClassName));
            }
        }
Ejemplo n.º 9
0
        protected override List <string> GetFilesToProcess(IUserConfiguration user)
        {
            var fileList       = new List <string>();
            var filePathHelper = new FilePathHelper(_configuration, user.Name);
            var directoryInfo  = new DirectoryInfo(filePathHelper.GetResultsFilesFolder());

            FileInfo[] files = directoryInfo.GetFiles("*.sent");

            foreach (var file in files)
            {
                ITemplateConfiguration templateConfiguration = ((UserApiConfiguration)user).GetTemplateConfiguration(file.FullName);

                if (_reportTypeConfiguration.Templates.Contains(templateConfiguration.TemplateName) &&
                    DateTime.UtcNow.Subtract(file.CreationTimeUtc).TotalHours > _reportTypeConfiguration.Hour)
                {
                    fileList.Add(file.FullName);
                }
            }

            return(fileList);
        }
 public AddTemplatedStalkCommand(
     string commandSource,
     IUser user,
     IList <string> arguments,
     ILogger logger,
     IFlagService flagService,
     IConfigurationProvider configurationProvider,
     IIrcClient client,
     ITemplateConfiguration templateConfiguration,
     IChannelConfiguration channelConfiguration)
     : base(commandSource,
            user,
            arguments,
            logger,
            flagService,
            configurationProvider,
            client)
 {
     this.templateConfiguration = templateConfiguration;
     this.channelConfiguration  = channelConfiguration;
 }
Ejemplo n.º 11
0
        public Launch(
            ILogger logger,
            IIrcClient freenodeClient,
            IIrcClient wikimediaClient,
            IAppConfiguration appConfig,
            ITemplateConfiguration templateConfiguration,
            IBotUserConfiguration userConfiguration,
            IChannelConfiguration channelConfiguration,
            IStalkFactory stalkFactory,
            IFileService fileService)
        {
            this.logger               = logger;
            this.freenodeClient       = freenodeClient;
            this.wikimediaClient      = wikimediaClient;
            this.appConfig            = appConfig;
            this.channelConfiguration = channelConfiguration;

            if (!this.channelConfiguration.Items.Any())
            {
                this.logger.InfoFormat("Migrating to channel configuration file...");

                var defaultChannel = new IrcChannel(this.appConfig.FreenodeChannel);
                this.channelConfiguration.Add(defaultChannel);

                if (appConfig.StalkConfigFile != null)
                {
                    var stalkConfig = new StalkConfiguration(
                        appConfig,
                        logger.CreateChildLogger("LegacyStalkConfig"),
                        stalkFactory,
                        fileService
                        );
                    stalkConfig.Initialize();

                    foreach (var stalk in stalkConfig.Items)
                    {
                        stalk.Channel = this.appConfig.FreenodeChannel;
                        defaultChannel.Stalks.Add(stalk.Identifier, stalk);
                        stalkConfig.Remove(stalk.Identifier);
                    }

                    stalkConfig.Save();
                }

                this.channelConfiguration.Save();
            }

            this.logger.InfoFormat(
                "Tracking {0} stalks, {1} templates, {2} users, and {3} channels.",
                this.channelConfiguration.Items.Aggregate(0, (i, channel) => i + channel.Stalks.Count),
                templateConfiguration.Items.Count,
                userConfiguration.Items.Count,
                channelConfiguration.Items.Count
                );

            if (appConfig.MetricsPort != 0)
            {
                this.logger.DebugFormat("Setting up metrics server on port {0}", appConfig.MetricsPort);
                this.metricsServer = new MetricServer(appConfig.MetricsPort);
                this.metricsServer.Start();

                VersionInfo.WithLabels(
                    FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion,
                    FileVersionInfo.GetVersionInfo(Assembly.GetAssembly(typeof(IrcClient)).Location)
                    .FileVersion,
                    FileVersionInfo.GetVersionInfo(Assembly.GetAssembly(typeof(CommandBase)).Location)
                    .FileVersion,
                    FileVersionInfo.GetVersionInfo(Assembly.GetAssembly(typeof(MediaWikiApi)).Location)
                    .FileVersion,
                    FileVersionInfo.GetVersionInfo(Assembly.GetAssembly(typeof(ConduitClient)).Location)
                    .FileVersion,
                    Environment.Version.ToString(),
                    Environment.OSVersion.ToString(),
                    ((TargetFrameworkAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(TargetFrameworkAttribute), false).FirstOrDefault())?.FrameworkDisplayName ?? "Unknown"
                    )
                .Set(1);

                this.logger.DebugFormat("Metrics server configured.");
            }
            else
            {
                this.logger.Warn("Prometheus metrics server disabled.");
            }

            this.freenodeClient.DisconnectedEvent  += this.OnDisconnect;
            this.wikimediaClient.DisconnectedEvent += this.OnDisconnect;
        }
Ejemplo n.º 12
0
        protected override ApiRecipient GetRecipient(List <ApiRecipient> recipients, string[] recipientArray, ITemplateConfiguration templateConfiguration)
        {
            int position = templateConfiguration.Fields.FirstOrDefault(x => x.IsKey).Position;

            string key = recipientArray[position];

            ApiRecipient recipient = recipients.Where(x => x.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

            if (recipient == null)
            {
                recipient = new ApiRecipient();
            }

            return(recipient);
        }
 protected virtual ApiRecipient GetRecipient(List <ApiRecipient> recipients, string[] recipientArray, ITemplateConfiguration templateConfiguration)
 {
     return(new ApiRecipient());
 }
 protected virtual string[] GetDataLine(string line, ITemplateConfiguration templateConfiguration)
 {
     return(line.Split(templateConfiguration.FieldSeparator));
 }
        protected override string Process(IUserConfiguration user, string localFileName, ProcessResult result)
        {
            string resultsFileName = string.Empty;

            if (string.IsNullOrEmpty(localFileName))
            {
                return(null);
            }

            try
            {
                if (!ValidateCredentials(user.Credentials))
                {
                    string message = $"{DateTime.UtcNow}:Error to authenticate user {user.Name}";
                    result.Type = ResulType.LOGIN;
                    result.WriteError(message);
                    return(null);
                }

                string fileName = Path.GetFileName(localFileName);

                resultsFileName = GetResultsFileName(fileName, (UserApiConfiguration)user);

                _logger.Debug($"Start to read file {localFileName}");

                using (StreamReader reader = new StreamReader(localFileName))
                {
                    ITemplateConfiguration templateConfiguration = ((UserApiConfiguration)user).GetTemplateConfiguration(fileName);

                    if (templateConfiguration == null)
                    {
                        string message = $"{DateTime.UtcNow}:There is not template configuration.";
                        result.Type = ResulType.PROCESS;
                        result.WriteError(message);
                        return(resultsFileName);
                    }


                    string line = templateConfiguration.HasHeaders ? reader.ReadLine() : null;

                    string headers = GetHeaderLine(line, templateConfiguration);

                    if (string.IsNullOrEmpty(headers))
                    {
                        string message = $"{DateTime.UtcNow}:There are not headers.";
                        result.Type = ResulType.PROCESS;
                        result.WriteError(message);
                        return(resultsFileName);
                    }

                    AddExtraHeaders(resultsFileName, headers, templateConfiguration.FieldSeparator);

                    string[] headersArray = headers.Split(templateConfiguration.FieldSeparator);

                    List <CustomHeader> customHeaders = GetHeaderList(headersArray);

                    int maxHeaderPosition = templateConfiguration.Fields.Max(x => x.Position);

                    string templateId = templateConfiguration != null ? templateConfiguration.TemplateId : null;

                    var recipients = new List <ApiRecipient>();

                    _logger.Debug($"Start process {fileName}");

                    while (!reader.EndOfStream)
                    {
                        if (MustStop())
                        {
                            _logger.Debug($"Stop send process file:{fileName} for user:{user.Name}");
                            // TODO: add generate retry file

                            return(null);
                        }

                        line = reader.ReadLine();

                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }

                        string[] recipientArray = GetDataLine(line, templateConfiguration);

                        ApiRecipient recipient = GetRecipient(recipients, recipientArray, templateConfiguration);

                        result.ProcessedCount++;

                        if (recipientArray.Length == headersArray.Length)
                        {
                            if (recipientArray.Length > maxHeaderPosition)
                            {
                                FillRecipientBasics(recipient, recipientArray, templateConfiguration.Fields, templateId);
                                FillRecipientCustoms(recipient, recipientArray, customHeaders, templateConfiguration.Fields);
                                FillRecipientAttachments(recipient, templateConfiguration, recipientArray, fileName, line, (UserApiConfiguration)user, result);

                                if (!recipient.HasError && !string.IsNullOrEmpty(recipient.TemplateId) && !string.IsNullOrEmpty(recipient.ToEmail))
                                {
                                    recipient.ResultLine = $"{line}{templateConfiguration.FieldSeparator}{Constants.PROCESS_RESULT_OK}";
                                }
                                else if (string.IsNullOrEmpty(recipient.TemplateId))
                                {
                                    string message = "Has not template to send.";
                                    recipient.HasError   = true;
                                    recipient.ResultLine = $"{line}{templateConfiguration.FieldSeparator}{message}";
                                    _logger.Error(message);
                                    string errorMessage = $"{DateTime.UtcNow}:{message} proccesing line {line}";
                                    result.WriteError(errorMessage);
                                    result.ErrorsCount++;
                                }
                                else if (string.IsNullOrEmpty(recipient.ToEmail))
                                {
                                    string message = "Has not email to send.";
                                    recipient.HasError   = true;
                                    recipient.ResultLine = $"{line}{templateConfiguration.FieldSeparator}{message}";
                                    _logger.Error(message);
                                    string errorMessage = $"{DateTime.UtcNow}:{message} proccesing line {line}";
                                    result.WriteError(errorMessage);
                                    result.ErrorsCount++;
                                }
                            }
                            else
                            {
                                string message = "Wrong recipient data.";
                                recipient.HasError   = true;
                                recipient.ResultLine = $"{line}{templateConfiguration.FieldSeparator}{message}";
                                _logger.Error(message);
                                string errorMessage = $"{DateTime.UtcNow}:{message} proccesing line {line}";
                                result.WriteError(errorMessage);
                                result.ErrorsCount++;
                            }
                        }
                        else
                        {
                            string message = "The fields number is different to headers number.";
                            recipient.HasError   = true;
                            recipient.ResultLine = $"{line}{templateConfiguration.FieldSeparator}{message}";
                            _logger.Error(message);
                            string errorMessage = $"{DateTime.UtcNow}:{message} proccesing line {line}";
                            result.WriteError(errorMessage);
                            result.ErrorsCount++;
                        }

                        AddRecipient(recipients, recipient);

                        if (recipients.Count() == _configuration.BulkEmailCount)
                        {
                            SendRecipientsList(recipients, resultsFileName, templateConfiguration.FieldSeparator, result, user.Credentials);
                        }
                    }

                    SendRecipientsList(recipients, resultsFileName, templateConfiguration.FieldSeparator, result, user.Credentials);
                }
            }
            catch (Exception e)
            {
                // TODO check if needed return null.
                string message = $"{DateTime.UtcNow}:GENERAL ERROR PROCESS contact admin for more information.";
                result.WriteError(message);
                _logger.Error($"ERROR on process file {localFileName} -- {e}");
            }

            return(resultsFileName);
        }