using System.Data.SqlClient; using System.Net; using System.Text; internal class Program { private static DateTime lastDate = DateTime.MinValue; private static void Main(string[] args) { while (true) { DateTime now = DateTime.Now; string? gotifyUrl = null; string? appToken_izhstal = null; string? proxyUrl = null; string? proxyUsername = null; string? proxyPassword = null; var config = File.ReadAllLines("config.txt"); foreach (var line in config) { if (line.StartsWith("gotify_url=")) gotifyUrl = line.Substring("gotify_url=".Length); else if (line.StartsWith("app_token_izhstal=")) appToken_izhstal = line.Substring("app_token_izhstal=".Length); else if (line.StartsWith("proxy_url=")) proxyUrl = line.Substring("proxy_url=".Length); else if (line.StartsWith("proxy_username=")) proxyUsername = line.Substring("proxy_username=".Length); else if (line.StartsWith("proxy_password=")) proxyPassword = line.Substring("proxy_password=".Length); } if (gotifyUrl == null || appToken_izhstal == null || proxyUrl == null || proxyUsername == null || proxyPassword == null) { Console.WriteLine("Ошибка: не все параметры указаны в config.txt"); Log("Ошибка: не все параметры указаны в config.txt"); } else { CheckStatusAsync(gotifyUrl, appToken_izhstal, proxyUrl, proxyUsername, proxyPassword); if (now.Hour == 4 && now.Date != lastDate.Date) { TestMSG(gotifyUrl, appToken_izhstal, proxyUrl, proxyUsername, proxyPassword); lastDate = now; } } Thread.Sleep(60000); } } private static async void CheckStatusAsync(string url, string token, string proxyUrl, string proxyUsername, string proxyPassword) { var result = CheckFurnace250Async().Result; if (!result.status) { var notification = new { title = "Статус ПШП ст.250", message = result.msg, priority = 5 }; await SendNotify(url, token, notification, proxyUrl, proxyUsername, proxyPassword); } } private static async void TestMSG(string url, string token, string proxyUrl, string proxyUsername, string proxyPassword) { var notification = new { title = "Test notify", message = "IS OK", priority = 3 }; await SendNotify(url, token, notification, proxyUrl, proxyUsername, proxyPassword); } private static async Task<(bool status, string msg)> CheckFurnace250Async() { int cntEmptyPOID = 0; DateTime lastDT = DateTime.Now; try { string sqlConn = @"Password=WonderUser;User ID=WonderUser;Initial Catalog=Furnace_l2;Data Source=10.14.18.38\IZHSTALSQLSRVER;TrustServerCertificate=true;Encrypt=true;"; using (var conn = new SqlConnection(sqlConn)) { await conn.OpenAsync(); string sqlQuery = @"SELECT COUNT(PO_ID) cnt_empty_poid, (SELECT top(1) CHARGING_TIME FROM [Furnace_l2].[dbo].[HIST_PIECES] where [IS_DISCHARGED] ='N' and datediff(day,CHARGING_TIME, Getdate()) < 1 AND RTRIM(LTRIM(PO_ID)) != '' order by CHARGING_TIME desc) last_dt FROM [Furnace_l2].[dbo].[HIST_PIECES] where [IS_DISCHARGED] ='N' and datediff(day,CHARGING_TIME, Getdate()) < 1 AND RTRIM(LTRIM(PO_ID)) = '';"; using (var command = new SqlCommand(sqlQuery, conn)) using (var dbReader = await command.ExecuteReaderAsync()) { while (await dbReader.ReadAsync()) { cntEmptyPOID = Convert.ToInt32(dbReader.GetValue(0)); lastDT = Convert.ToDateTime(dbReader.GetValue(1)); } } } } catch { return (false, "Ошибка подключения к БД!"); } if (cntEmptyPOID > 15 && DateTime.Now - lastDT > new TimeSpan(0, 5, 0)) { return (false, $"Проблема с привязкой ID заготовок в ПШП. Не привязанных - {cntEmptyPOID}, время последней привязанной - {lastDT}"); } return (true, "OK"); } private static async Task SendNotify(string url, string token, object notification, string proxyUrl, string proxyUsername, string proxyPassword) { var proxy = new WebProxy(new Uri(proxyUrl)) { Credentials = new NetworkCredential(proxyUsername, proxyPassword, "MECHEL") }; var handler = new HttpClientHandler() { Proxy = proxy, UseProxy = true, PreAuthenticate = true, UseDefaultCredentials = false }; using (var client = new HttpClient(handler)) { client.DefaultRequestHeaders.Add("X-Gotify-Key", token); string json = Newtonsoft.Json.JsonConvert.SerializeObject(notification); var content = new StringContent(json, Encoding.UTF8, "application/json"); try { HttpResponseMessage response = await client.PostAsync(url, content); if (response.IsSuccessStatusCode) { Console.WriteLine($"{DateTime.Now} - Отправлено сообщение."); Log($"Отправлено сообщение."); } else { Console.WriteLine($"Ошибка: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}"); Log($"Ошибка: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}"); } } catch (HttpRequestException ex) { Console.WriteLine($"Ошибка подключения: {ex.Message}"); Log($"Ошибка подключения: {ex.Message}"); if (ex.InnerException != null) { Console.WriteLine($"Детали: {ex.InnerException.Message}"); Log($"Детали: {ex.InnerException.Message}"); } } } } private static void Log(string str) { string outdir = Environment.CurrentDirectory + @"\logs\"; if (!Directory.Exists(outdir)) Directory.CreateDirectory(outdir); string filename = $"{DateTime.Now.Day}_{DateTime.Now.Month}_{DateTime.Now.Year}_SendNotify"; foreach (FileInfo file in new DirectoryInfo(outdir).GetFiles()) { if (Convert.ToDateTime(file.LastWriteTime) < DateTime.Now.AddDays(-30)) file.Delete(); } using (FileStream aFile = new FileStream($@"{outdir}\{filename}.log", FileMode.Append, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(aFile)) { sw.WriteLine(DateTime.Now + " - " + str); } } }