Files

51 lines
2.3 KiB
C#

using StackExchange.Redis;
using Telegram.Bot.Types;
namespace nsszcontactbot;
public class PhotosManager(ConnectionMultiplexer redis, string PhotoBasePath)
{
private readonly IDatabase _redisDb = redis.GetDatabase();
private readonly string _basePath = PhotoBasePath;
private const string Key = "cache:photos";
private const string DefaultPhotoFileId = "AgACAgIAAxkDAAIDTWgtK4jsuoRTb7C4p0uhfVAOvWy2AAK1-TEb3cloSdmbxB-nuRFCAQADAgADcwADNgQ";
public async Task CacheEmployeePhotoAsync(Employee employee, string fileId, TimeSpan ttl = default)
{
string entryName = GetEntryName(employee);
#pragma warning disable CS4014 // Так как этот вызов не ожидается, выполнение существующего метода продолжается до тех пор, пока вызов не будет завершен
_redisDb.HashSetAsync(Key, [new(entryName, fileId)]).ConfigureAwait(false);
ttl = ttl == default ? TimeSpan.FromDays(30) : ttl;
_redisDb.HashFieldExpireAsync(Key, [new(entryName)], ttl).ConfigureAwait(false);
#pragma warning restore CS4014 // Так как этот вызов не ожидается, выполнение существующего метода продолжается до тех пор, пока вызов не будет завершен
}
public async Task<InputFile?> GetEmployeePhotoAsync(Employee employee)
{
string entryName = GetEntryName(employee);
var val = await _redisDb.HashGetAsync(Key, entryName);
if (val != RedisValue.Null && val.HasValue)
{
return InputFile.FromFileId(val!);
}
else
{
string photoPath = Path.Combine(_basePath, $"{employee.Id}.jpg");
photoPath = File.Exists(photoPath) ? photoPath : Path.Combine(_basePath, $"{employee.FullName}.jpg");
if (File.Exists(photoPath))
{
var fileStream = new FileStream(
photoPath,
FileMode.Open,
FileAccess.Read
);
return InputFile.FromStream(fileStream);
}
return InputFile.FromFileId(DefaultPhotoFileId); ;
}
}
private static string GetEntryName(Employee employee) => $"employee:{employee.Id}:fileid";
}