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)); }
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); }
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)); } }
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; }
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; }
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); }