using System.Globalization; using System.Text; namespace File_Watcher.Infineon.Monitoring.MonA; public class MonIn : IMonIn { private readonly string _MonInUrl; private readonly HttpClient _HttpClient; private static CultureInfo? _CultureInfo; private static readonly Dictionary _Instances = []; public const string MonInUrl = "http://moninhttp.{0}.infineon.com/input/text"; private static readonly DateTime _Utc1970DateTime = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static MonIn GetInstance(IHttpClientFactory httpClientFactory, string url = MonInUrl) { MonIn instance; if (_Instances.ContainsKey(url)) { instance = _Instances[url]; } else { lock (_Instances) { if (!_Instances.ContainsKey(url)) { instance = new MonIn(httpClientFactory, url); _Instances.Add(url, instance); } else instance = _Instances[url]; } } return instance; } private MonIn(IHttpClientFactory httpClientFactory, string url) { _MonInUrl = url; _CultureInfo = new CultureInfo("en-US"); _HttpClient = httpClientFactory.CreateClient(); } public Task SendStatus(string site, string resource, string stateName, State state) => SendStatus(site, new DateTime?(), resource, string.Empty, stateName, state, string.Empty); public Task SendStatus(string site, DateTime timeStamp, string resource, string stateName, State state) => SendStatus(site, new DateTime?(timeStamp), resource, string.Empty, stateName, state, string.Empty); public Task SendStatus(string site, string resource, string stateName, State state, string description) => SendStatus(site, new DateTime?(), resource, string.Empty, stateName, state, description); public Task SendStatus(string site, DateTime timeStamp, string resource, string stateName, State state, string description) => SendStatus(site, new DateTime?(timeStamp), resource, string.Empty, stateName, state, description); public Task SendStatus(string site, string resource, string subResource, string stateName, State state) => SendStatus(site, new DateTime?(), resource, subResource, stateName, state, string.Empty); public Task SendStatus(string site, DateTime timeStamp, string resource, string subResource, string stateName, State state) => SendStatus(site, new DateTime?(timeStamp), resource, subResource, stateName, state, string.Empty); public Task SendStatus(string site, string resource, string subResource, string stateName, State state, string description) => SendStatus(site, new DateTime?(), resource, subResource, stateName, state, description); public Task SendStatus( string site, DateTime? timeStamp, string resource, string subResource, string stateName, State state, string description) { string statusMessage = CreateStatusMessage(site, timeStamp, resource, subResource, stateName, state.ToString(), description); StringContent stringContent = new(statusMessage, Encoding.UTF8, "application/text"); lock (_HttpClient) return _HttpClient.PostAsync(string.Format(_MonInUrl, site), stringContent); } public Task SendPerformanceMessage(string site, string resource, string performanceName, double value) => SendPerformanceMessage(site, new DateTime?(), resource, string.Empty, performanceName, value, string.Empty, string.Empty, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string performanceName, double value) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, string.Empty, new int?()); public Task SendPerformanceMessage(string site, string resource, string performanceName, double value, string description) => SendPerformanceMessage(site, new DateTime?(), resource, string.Empty, performanceName, value, description, string.Empty, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string performanceName, double value, string description) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, description, string.Empty, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string performanceName, double value, int? interval) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, string.Empty, interval); public Task SendPerformanceMessage(string site, string resource, DateTime? timeStamp, string performanceName, double value, string unit) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, unit, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string performanceName, double value, string unit, int? interval) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, unit, interval); public Task SendPerformanceMessage(string site, string resource, string subResource, string performanceName, double value) => SendPerformanceMessage(site, new DateTime?(), resource, subResource, performanceName, value, string.Empty, string.Empty, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string subResource, string performanceName, double value) => SendPerformanceMessage(site, timeStamp, resource, subResource, performanceName, value, string.Empty, string.Empty, new int?()); public Task SendPerformanceMessage(string site, string resource, string subResource, string performanceName, double value, string description) => SendPerformanceMessage(site, new DateTime?(), resource, subResource, performanceName, value, description, string.Empty, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string subResource, string performanceName, double value, int? interval) => SendPerformanceMessage(site, timeStamp, resource, subResource, performanceName, value, string.Empty, string.Empty, interval); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string subResource, string performanceName, double value, string unit) => SendPerformanceMessage(site, timeStamp, resource, subResource, performanceName, value, string.Empty, unit, new int?()); public Task SendPerformanceMessage(string site, DateTime? timeStamp, string resource, string subResource, string performanceName, double value, string description, string unit, int? interval) { string performanceMessage = CreatePerformanceMessage(site, timeStamp, resource, subResource, performanceName, value, description, unit, interval); StringContent stringContent = new(performanceMessage, Encoding.UTF8, "application/text"); lock (_HttpClient) return _HttpClient.PostAsync(string.Format(_MonInUrl, site), stringContent); } private static string CreateStatusMessage(string site, DateTime? timeStamp, string resource, string subResource, string stateName, string state, string description) { StringBuilder stringBuilder = new(); if (string.IsNullOrEmpty(subResource)) _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" {4} \n{5}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), stateName.Trim(), state.Trim(), description.Trim()); else _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" \"{4}\" {5} \n{6}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), subResource.Trim(), stateName.Trim(), state.Trim(), description.Trim()); return stringBuilder.ToString(); } private static string CreatePerformanceMessage(string site, DateTime? timeStamp, string resource, string subResource, string performanceName, double value, string description, string unit, int? interval) { StringBuilder stringBuilder = new(); if (string.IsNullOrEmpty(subResource)) { if (unit.Equals(string.Empty) && !interval.HasValue) _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" {4} \n{5}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), performanceName.Trim(), value, description.Trim()); else _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" {4} {5} {{interval={6}, unit={7}}}\n", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), performanceName.Trim(), value, description.Trim(), interval.HasValue ? interval.Value.ToString() : (object)string.Empty, unit.Trim()); } else if (unit.Equals(string.Empty) && !interval.HasValue) _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" \"{4}\" {5} \n{6}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), subResource.Trim(), performanceName.Trim(), value, description.Trim()); else _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" \"{4}\" {5} {6} {{interval={7}, unit={8}}}\n", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), subResource.Trim(), performanceName.Trim(), value, description.Trim(), interval.HasValue ? interval.Value.ToString() : (object)string.Empty, unit.Trim()); return stringBuilder.ToString(); } private static string GetDateTimeNowAsPosix(DateTime timeStamp) { if (timeStamp > DateTime.Now) timeStamp = DateTime.Now; return ((int)timeStamp.ToUniversalTime().Subtract(_Utc1970DateTime).TotalSeconds).ToString(CultureInfo.InvariantCulture); } }