Добавлены функции резервного копирования контактов, улучшена обработка фотографий сотрудников и обновлены зависимости
Gitea Actions Demo / Explore-Gitea-Actions (push) Canceled after 0s

This commit is contained in:
Oleg-Nevsky
2026-08-12 16:25:00 +03:00
parent 34efa36d8b
commit 5acf3f9c96
7 changed files with 62 additions and 18 deletions
+49 -14
View File
@@ -2,6 +2,8 @@
using Newtonsoft.Json;
using Serilog;
using StackExchange.Redis;
using System.IO.Hashing;
using System.Text;
using System.Timers;
using Telegram.Bot;
using Telegram.Bot.Polling;
@@ -14,12 +16,12 @@ namespace nsszcontactbot;
public class Program
{
private static ITelegramBotClient Bot;
private static ITelegramBotClient Bot = default!;
private static List<Employee> Employees = [];
private static List<string> Departments = [];
private static IConfigurationRoot config;
private static FavoriteContactsManager FavoritesManager;
private static PhotosManager PhotosManager;
private static IConfigurationRoot config = default!;
private static FavoriteContactsManager FavoritesManager = default!;
private static PhotosManager PhotosManager = default!;
//private static ILogger<Program> Logger;
public static async Task<int> Main(string[] args)
@@ -57,7 +59,7 @@ public class Program
var me = await Bot.GetMe();
Log.Information($"Бот запущен: @{me.Username}");
Log.Information("Бот запущен: @{Username}", me.Username);
// Запуск обработки обновлений
var cancellationToken = new CancellationTokenSource().Token;
@@ -89,7 +91,7 @@ public class Program
if (update.Type == UpdateType.Message && update.Message?.Text != null)
{
var message = update.Message;
Log.Debug($"INPUT: from={message.From?.Username} text={message.Text}");
Log.Debug("Входящий текст (From=\"{Username}\", MessageId=\"{MessageId}\"): {Text}", message.From?.ToString() ?? "<!--message.From is null-->", message.Id, message.Text);
if (message.Text.StartsWith("/start"))
{
@@ -97,7 +99,7 @@ public class Program
}
else if (message.Text.EndsWith("Подразделения"))
{
await ChooseDepartment(message);
await HandleShowDepartments(message);
}
else if (message.Text.EndsWith("Избранные"))
{
@@ -111,6 +113,8 @@ public class Program
else if (update.Type == UpdateType.CallbackQuery)
{
string data = update.CallbackQuery!.Data ?? string.Empty;
var callbackQuery = update.CallbackQuery!;
Log.Debug("Нажатие кнопки (From=\"{Username}\", CallbackQueryId=\"{CallbackQueryId}\"): {Data}", callbackQuery.From?.ToString() ?? "<!--cbquery.From is null-->", callbackQuery.Id, data);
string[] dataParts = data.Split('/');
if (dataParts.Length > 0)
{
@@ -185,7 +189,7 @@ public class Program
await Bot.SendMessage(message.Chat.Id, text, replyMarkup: new string[] { "❤️ Избранные", "🏢 Подразделения" });
}
private static async Task ChooseDepartment(Message message)
private static async Task HandleShowDepartments(Message message)
{
Departments = [.. Employees.OrderBy(e => e.DepartmentCode).Select(e => e.Department).Distinct()];
await ShowDepartments(message.Chat.Id);
@@ -382,10 +386,10 @@ public class Program
if (employee != null)
{
await FavoritesManager.RemoveFavoriteAsync(callbackQuery.From.Id, contactId);
foreach (var row in callbackQuery.Message.ReplyMarkup.InlineKeyboard)
foreach (var row in callbackQuery.Message.ReplyMarkup!.InlineKeyboard)
foreach (var cell in row)
{
if (cell.CallbackData.Contains("delfavorite"))
if (cell.CallbackData!.Contains("delfavorite"))
{
cell.CallbackData = $"addfavorite/{contactId}";
cell.Text = "❤️ В избранные";
@@ -533,7 +537,7 @@ public class Program
private static async Task ShowEmployeeResults(Message message, List<Employee> results, bool? isFavorite = false, int page = 1, int pageSize = 10)
{
if (results.Any())
if (results.Count != 0)
{
if (results.Count <= pageSize)
{
@@ -670,7 +674,7 @@ public class Program
card += $"📞 {contact.ExtensionNumber}\n";
if (!string.IsNullOrEmpty(employee.IP))
card += $"🌐 {employee.IP}\n";
card += $"🖥 {employee.IP}\n";
card += GetEventStatus(employee);
@@ -692,7 +696,7 @@ public class Program
LoadEmployees();
}
private static int prevHash = 0;
private static string prevHash = string.Empty;
private static bool LoadEmployees()
{
try
@@ -713,13 +717,19 @@ public class Program
json = File.ReadAllText(filePath);
}
// Загрузка данных сотрудников из JSON файла при наличии изменений
int newHash = json.GetHashCode();
var newHash = CalculateHash(json);
if (prevHash == newHash)
{
return true;
}
prevHash = newHash;
Employees = JsonConvert.DeserializeObject<List<Employee>>(json)!;
var backupFilename = BackupContactsJSON(json);
if (!string.IsNullOrEmpty(backupFilename))
{
Log.Debug("Данные обновлены, создана резервная копия: {BackupFilename}", backupFilename);
}
}
else
{
@@ -748,6 +758,31 @@ public class Program
}
}
private static string CalculateHash(string data)
{
byte[] hashBytes = Crc32.Hash(Encoding.UTF8.GetBytes(data));
return Convert.ToHexString(hashBytes);
}
private static string BackupContactsJSON(string json)
{
ArgumentException.ThrowIfNullOrEmpty(json, nameof(json));
var backupDirectory = config["Paths:ContactsBackupDirectory"] ?? string.Empty;
if (!string.IsNullOrEmpty(backupDirectory))
{
if (!Directory.Exists(backupDirectory))
{
Directory.CreateDirectory(backupDirectory);
}
var hashString = CalculateHash(json).ToUpperInvariant();
var filename = Path.GetFullPath(Path.Combine(backupDirectory, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{Employees.Count}_contacts_{hashString}.json"));
File.WriteAllText(filename, json);
return filename;
}
return string.Empty;
}
private static void StartBirthdayNotifications()
{
var timer = new Timer(TimeSpan.FromHours(24).TotalMilliseconds);