Skip to content

Commit

Permalink
Add logs, creds, args
Browse files Browse the repository at this point in the history
  • Loading branch information
diev committed Jul 3, 2024
1 parent 662019c commit bfbb807
Show file tree
Hide file tree
Showing 11 changed files with 591 additions and 129 deletions.
2 changes: 2 additions & 0 deletions FinCERT-Client/API/Feeds.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public static async Task<bool> DownloadFeedsAsync(FeedType feed, string path)
{
try
{
Directory.CreateDirectory(path);

var response = await TlsClient.GetAsync($"antifraud/feeds/{feed}/download");
response.EnsureSuccessStatusCode();

Expand Down
5 changes: 5 additions & 0 deletions FinCERT-Client/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,9 @@ public class Config
/// Папка для сохранения полученных файлов бюллетеней.
/// </summary>
public string BulletinsDownloads { get; set; } = nameof(BulletinsDownloads);

/// <summary>
/// Папка для ведения логов.
/// </summary>
public string Logs { get; set; } = nameof(Logs);
}
1 change: 1 addition & 0 deletions FinCERT-Client/FinCERT-Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<Authors>Diev</Authors>
<PackageProjectUrl>https://github.com/diev/FinCERT-Client</PackageProjectUrl>
<RepositoryUrl>https://github.com/diev/FinCERT-Client.git</RepositoryUrl>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
Expand Down
249 changes: 155 additions & 94 deletions FinCERT-Client/Managers/BulletinsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
*/
#endregion

using System.Diagnostics;
using System.Text;

using API;
Expand All @@ -28,6 +29,12 @@ namespace FincertClient.Managers;

internal static class BulletinsManager
{
/// <summary>
/// Получение комплекта файлов и папок для прохождения чек-листа.
/// </summary>
/// <param name="path">Путь к папке для формируемого комплекта.</param>
/// <param name="limit">Ограничение на несколько записей для примера (4).</param>
/// <returns>Комплект получен.</returns>
public static async Task<bool> GetCheckList(string path, int limit = 4)
{
try
Expand Down Expand Up @@ -67,126 +74,180 @@ public static async Task<bool> GetCheckList(string path, int limit = 4)
return false;
}

public static async Task LoadBulletinsList(string path, int limit = 100, long offset = 0)
/// <summary>
/// Неполноценный вариант загрузки бюллетеней, т.к. нет возможности получить
/// из него дополнительные файлы.
/// Получается список, из него составляется список для получения бюллетеней,
/// а в них нет информации о дополнительных файлах - только id основного.
/// Видимо, это только для отображения таблицы бюллетеней в интерфейсе.
/// </summary>
/// <param name="path">Путь к папке, где будет создан файл 'Bulletins.txt'.
/// Если он существует, то он будет перезаписан.</param>
/// <param name="limit">Ограничение на число бюллетеней (1-100), максимум 100.</param>
/// <param name="offset">Смещение по списку бюллетеней вглубь истории (0 - без смещения).</param>
/// <returns>Процесс дошел до конца.</returns>
public static async Task<bool> LoadBulletinsList(string path, int limit = 100, long offset = 0)
{
Console.WriteLine("Получение бюллетеней списком...");

var ids = await GetBulletinIdsAsync(limit, offset);

if (ids is null)
try
{
Console.WriteLine("Список бюллетеней не получен.");
Environment.Exit(1);
}
Directory.CreateDirectory(path);

int count = ids.Items.Length;
string[] ids2 = new string[count];
Trace.WriteLine("Получение бюллетеней списком...");

Console.WriteLine($"Всего: {ids.Total}, в листе: {count}.");
var ids = await GetBulletinIdsAsync(limit, offset);

for (int i = 0; i < count; i++)
{
ids2[i] = ids.Items[i].Id;
}
if (ids is null)
{
Trace.WriteLine("Список бюллетеней не получен.");
Environment.Exit(1);
}

var BulletinInfos = await GetBulletinInfosAsync(ids2);
StringBuilder sb = new();
int count = ids.Items.Length;
string[] ids2 = new string[count];

if (BulletinInfos is null)
{
Console.WriteLine("Список информации по бюллетеням не получен.");
Environment.Exit(1);
}
Trace.WriteLine($"Всего: {ids.Total}, в листе: {count}.");

foreach (var bulletin in BulletinInfos.Items)
{
var id = bulletin.Id;
var date = DateTime.Parse(bulletin.PublishedDate);

sb.AppendLine(new string('-', 36))
.AppendLine(id)
.AppendLine($"Дата публикации: {date:g}")
.AppendLine($"Идентификатор: {bulletin.Hrid}")
.AppendLine($"Заголовок: {bulletin.Header}")
.AppendLine($"Тип рассылки: {bulletin.Type}")
.AppendLine($"Подтип рассылки: {bulletin.Subtype}");

if (bulletin.AttachmentId != null)
for (int i = 0; i < count; i++)
{
sb.AppendLine($"Файл рассылки: {bulletin.AttachmentId}");
//string name = "attachment.dat";
//await Bulletins.DownloadAttachmentAsync(bulletin.AttachmentId, PathCombine(dir, name));
ids2[i] = ids.Items[i].Id;
}

sb.AppendLine($"Описание: {bulletin.Description}");
}

string text = sb.ToString();
string file = Path.Combine(path, "Bulletins.txt");
await File.WriteAllTextAsync(file, text);
var BulletinInfos = await GetBulletinInfosAsync(ids2);
StringBuilder sb = new();

Console.WriteLine(text);
}
if (BulletinInfos is null)
{
Trace.WriteLine("Список информации по бюллетеням не получен.");
Environment.Exit(1);
}

public static async Task LoadBulletinsDirs(string path, int limit = 100, long offset = 0)
{
Console.WriteLine("Получение бюллетеней по папкам...");
foreach (var bulletin in BulletinInfos.Items)
{
var id = bulletin.Id;
var date = DateTime.Parse(bulletin.PublishedDate);

sb.AppendLine(new string('-', 36))
.AppendLine(id)
.AppendLine($"Дата публикации: {date:g}")
.AppendLine($"Идентификатор: {bulletin.Hrid}")
.AppendLine($"Заголовок: {bulletin.Header}")
.AppendLine($"Тип рассылки: {bulletin.Type}")
.AppendLine($"Подтип рассылки: {bulletin.Subtype}");

if (bulletin.AttachmentId != null)
{
sb.AppendLine($"Файл рассылки: {bulletin.AttachmentId}");
//string name = "attachment.dat";
//await Bulletins.DownloadAttachmentAsync(bulletin.AttachmentId, PathCombine(dir, name));
}

sb.AppendLine($"Описание: {bulletin.Description}");
}

var ids = await GetBulletinIdsAsync(limit, offset);
string text = sb.ToString();
string file = Path.Combine(path, "Bulletins.txt");
await File.WriteAllTextAsync(file, text);

if (ids is null)
{
Console.WriteLine("Список бюллетеней не получен.");
Environment.Exit(1);
Console.WriteLine(text);
return true;
}
catch { }
return false;
}

Console.WriteLine($"Всего: {ids.Total}, в листе: {ids.Items.Length}.");

foreach (var itemId in ids.Items)
/// <summary>
/// Полноценный вариант загрузки бюллетеней со всеми файлами.
/// Получается список, по нему запрашиваются поштучно бюллетени, для них - файлы.
/// </summary>
/// <param name="path">Путь к папке для скачиваний.</param>
/// <param name="limit">Ограничение на число бюллетеней (1-100), максимум 100.</param>
/// <param name="offset">Смещение по списку бюллетеней вглубь истории (0 - без смещения).</param>
/// <returns>Процесс дошел до конца.</returns>
public static async Task<bool> LoadBulletinsDirs(string path, int limit = 100, long offset = 0)
{
try
{
var id = itemId.Id;
var bulletin = await GetBulletinAttachInfoAsync(id);
var date = DateTime.Parse(bulletin!.PublishedDate);

// Dirname generator! Do not change it to prevent an unwanted full reload!

var dir = PathCombine(path, $"{date:yyyy-MM-dd HHmm} {bulletin.Hrid.Trim()}");
Directory.CreateDirectory(path);

if (Directory.Exists(dir)) break;
Trace.WriteLine("Получение бюллетеней по папкам...");

Directory.CreateDirectory(dir);
var ids = await GetBulletinIdsAsync(limit, offset);

StringBuilder sb = new();
sb.AppendLine(id)
.AppendLine($"Дата публикации: {date:g}")
.AppendLine($"Идентификатор: {bulletin.Hrid}")
.AppendLine($"Заголовок: {bulletin.Header}")
.AppendLine($"Тип рассылки: {bulletin.Type}")
.AppendLine($"Подтип рассылки: {bulletin.Subtype}");

if (bulletin.Attachment != null)
if (ids is null)
{
string name = bulletin.Attachment.Name;
sb.AppendLine($"Файл рассылки: {name}");
await DownloadAttachmentAsync(bulletin.Attachment.Id, Path.Combine(dir, name));
Trace.WriteLine("Список бюллетеней не получен.");
Environment.Exit(1);
}

int i = 0;
foreach (var additional in bulletin.AdditionalAttachments)
Trace.WriteLine($"Всего: {ids.Total}, в листе: {ids.Items.Length}.");

foreach (var itemId in ids.Items)
{
string name = additional.Name;
sb.AppendLine($"Доп. файл {++i}: {name}");
await DownloadAttachmentAsync(additional.Id, Path.Combine(dir, name));
var id = itemId.Id;
var bulletin = await GetBulletinAttachInfoAsync(id);
var date = DateTime.Parse(bulletin!.PublishedDate);

// Генератор имени папки - не изменяйте его, чтобы не скачать заново лишнее!

var name = CorrectName($"{date:yyyy-MM-dd HHmm} {bulletin.Hrid.Trim()}");
var dir = Path.Combine(path, name);

// Встречена ранее скачанная папка
if (Directory.Exists(dir))
{
if (offset == 0)
{
// Скачивание прекращается
Trace.WriteLine($"{name} // конец скачивания.");
break;
}
else
{
// Ранее скачанная папка пропускается
Trace.WriteLine($"{name} // есть");
continue;
}
}

// Создается новая папка
Trace.WriteLine(name);
Directory.CreateDirectory(dir);

StringBuilder sb = new();
sb.AppendLine(id)
.AppendLine($"Дата публикации: {date:g}")
.AppendLine($"Идентификатор: {bulletin.Hrid}")
.AppendLine($"Заголовок: {bulletin.Header}")
.AppendLine($"Тип рассылки: {bulletin.Type}")
.AppendLine($"Подтип рассылки: {bulletin.Subtype}");

if (bulletin.Attachment != null)
{
string filename = bulletin.Attachment.Name;
sb.AppendLine($"Файл рассылки: {filename}");
await DownloadAttachmentAsync(bulletin.Attachment.Id, Path.Combine(dir, filename));
}

int i = 0;
foreach (var additional in bulletin.AdditionalAttachments)
{
string filename = additional.Name;
sb.AppendLine($"Доп. файл {++i}: {filename}");
await DownloadAttachmentAsync(additional.Id, Path.Combine(dir, filename));
}

sb.AppendLine($"Описание: {bulletin.Description}");

string text = sb.ToString();
string file = Path.Combine(dir, bulletin.Type + ".txt");
await File.WriteAllTextAsync(file, text);

Console.WriteLine(new string('-', 36));
Console.WriteLine(text);
}

sb.AppendLine($"Описание: {bulletin.Description}");

string text = sb.ToString();
string file = Path.Combine(dir, bulletin.Type + ".txt");
await File.WriteAllTextAsync(file, text);

Console.WriteLine(new string('-', 36));
Console.WriteLine(text);
return true;
}
catch { }
return false;
}
}
3 changes: 2 additions & 1 deletion FinCERT-Client/Managers/ConfigManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
*/
#endregion

using System.Diagnostics;
using System.Text.Json;

namespace FincertClient.Managers;
Expand Down Expand Up @@ -46,7 +47,7 @@ public static Config Read()
using var write = File.OpenWrite(appsettings);
JsonSerializer.Serialize(write, new Config(), GetJsonOptions());

Console.WriteLine(@$"Создан новый файл настроек ""{appsettings}"" - откорректируйте его.");
Trace.WriteLine(@$"Создан новый файл настроек ""{appsettings}"" - откорректируйте его.");
throw new Exception();
}
catch
Expand Down
Loading

0 comments on commit bfbb807

Please sign in to comment.