83 lines
3.0 KiB
C#
83 lines
3.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using JiraTimeBotForm.Configuration;
|
|
using JiraTimeBotForm.Mercurial;
|
|
using JiraTimeBotForm.Mercurial.Objects;
|
|
using JiraTimeBotForm.TasksProcessors;
|
|
using JiraTimeBotForm.TaskTime;
|
|
using JiraTimeBotForm.TaskTime.Objects;
|
|
|
|
namespace JiraTimeBotForm
|
|
{
|
|
class Job
|
|
{
|
|
private readonly IAllMercurialProviders _mercurialProviders;
|
|
private readonly ITaskTimeCalculator _taskTimeDiscoverer;
|
|
private readonly ILog _log;
|
|
|
|
public Job(IAllMercurialProviders mercurialProviders, ITaskTimeCalculator taskTimeDiscoverer, ILog log)
|
|
{
|
|
_mercurialProviders = mercurialProviders;
|
|
_taskTimeDiscoverer = taskTimeDiscoverer;
|
|
_log = log;
|
|
}
|
|
|
|
public Task DoTheJob(Settings settings, ITasksProcessor tasksProcessor, bool dummyMode, CancellationToken cancellationToken)
|
|
{
|
|
_log.Info("Начинаем работу");
|
|
|
|
return Task.Run(() => DoTheJobImpl(settings, tasksProcessor, dummyMode, cancellationToken), cancellationToken);
|
|
}
|
|
|
|
private void DoTheJobImpl(Settings settings, ITasksProcessor tasksProcessor, bool dummyMode, CancellationToken cancellationToken)
|
|
{
|
|
int daysDiff = 0;
|
|
if (tasksProcessor is MeetingProcessor)
|
|
{
|
|
daysDiff = -1;
|
|
}
|
|
|
|
while (true)
|
|
{
|
|
DateTime date = DateTime.Now.Date.AddDays(daysDiff);
|
|
|
|
IMercurialLog mercurial = _mercurialProviders.MercurialLog;
|
|
if (string.IsNullOrEmpty(settings.RepositoryPath))
|
|
{
|
|
_log.Info("Путь до репозитория пуст, использую Jira как источник информации.");
|
|
mercurial = _mercurialProviders.JiraCommitEmulator;
|
|
}
|
|
List<MercurialCommitItem> commits = mercurial.GetMercurialLog(settings, date, cancellationToken);
|
|
List<TaskTimeItem> taskTimes = _taskTimeDiscoverer.CalculateTaskTime(commits, settings, cancellationToken);
|
|
|
|
if (cancellationToken.IsCancellationRequested)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!taskTimes.Any())
|
|
{
|
|
_log.Warn($"{date:dd.MM.yyyy} вы не сделали ничего полезного =) Использую предыдущий день.");
|
|
daysDiff--;
|
|
if (daysDiff < -7)
|
|
{
|
|
_log.Error("Не нашли ни одного коммита за предыдущие 7 дней. Возможно вы в отпуске? Выхожу.");
|
|
return;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
tasksProcessor.Process(date, taskTimes, settings, dummyMode);
|
|
|
|
_log.Info("Готово.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|