всякая мелочевка
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
|
||||
namespace JiraTimeBot.Core.Configuration
|
||||
{
|
||||
public interface ISettingsManager
|
||||
{
|
||||
Settings Load();
|
||||
Settings LoadAndCheck(Action settingsSource, Action<string> errorMessageReporter);
|
||||
|
||||
void Save(Settings settings);
|
||||
}
|
||||
}
|
||||
@@ -1,148 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using JiraTimeBot.Core.Encryption;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace JiraTimeBot.Core.Configuration
|
||||
{
|
||||
public class Settings
|
||||
{
|
||||
public int MinuterPerWorkDay = 8 * 60;
|
||||
public int RountToMinutes { get; set; }
|
||||
|
||||
public string JiraUrl = "https://myteam.aeroclub.ru";
|
||||
|
||||
public string RepositoryPath { get; set; }
|
||||
public string MercurialAuthorEmail { get; set; }
|
||||
public string JiraUserName { get; set; }
|
||||
public string JiraPassword { get; set; }
|
||||
public int MinuterPerWorkDay = 8 * 60;
|
||||
|
||||
public TimeSpan ActivationTime { get; set; }
|
||||
|
||||
public bool AddCommentsToWorklog { get; set; }
|
||||
public WorkType WorkType { get; set; }
|
||||
|
||||
public string JiraPassword { get; set; }
|
||||
|
||||
public string JiraQuery { get; set; }
|
||||
|
||||
public string JiraUserName { get; set; }
|
||||
|
||||
public string MercurialAuthorEmail { get; set; }
|
||||
|
||||
public string RepositoryPath { get; set; }
|
||||
|
||||
public int RoundToMinutes { get; set; }
|
||||
|
||||
public string TimeControlTask { get; set; }
|
||||
|
||||
public static Settings LoadAndCheck(Action settingsSource, Action<string> errorMessageReporter)
|
||||
{
|
||||
Settings settings;
|
||||
bool settingsValid;
|
||||
|
||||
do
|
||||
{
|
||||
settings = Load();
|
||||
settingsValid = SettingsIsValid(settings, out var message);
|
||||
|
||||
if (!settingsValid)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(message))
|
||||
{
|
||||
errorMessageReporter(message);
|
||||
}
|
||||
|
||||
settingsSource();
|
||||
}
|
||||
|
||||
} while (!settingsValid);
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
private static bool SettingsIsValid(Settings settings, out string message)
|
||||
{
|
||||
if (settings == null)
|
||||
{
|
||||
message = "Заполните настройки";
|
||||
return false;
|
||||
}
|
||||
|
||||
var errors = new List<string>();
|
||||
message = null;
|
||||
|
||||
if (settings.RountToMinutes == default(int))
|
||||
{
|
||||
errors.Add("Укажите округление времени, например, 10 (минут)");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(settings.JiraPassword))
|
||||
{
|
||||
errors.Add("Укажите Password от Jira");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(settings.JiraUserName))
|
||||
{
|
||||
errors.Add("Укажите UserName от Jira");
|
||||
}
|
||||
|
||||
if (settings.WorkType == WorkType.Mercurial && (string.IsNullOrEmpty(settings.RepositoryPath) || !Directory.Exists(settings.RepositoryPath)))
|
||||
{
|
||||
errors.Add("Укажите верный RepositoryPath");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.TimeControlTask) && !settings.TimeControlTask.Contains("-"))
|
||||
{
|
||||
errors.Add("Укажите верно зажачу контроля времени. Она джолжна содержать знак '-', например, SV-1211");
|
||||
}
|
||||
|
||||
var hasErrors = errors.Any();
|
||||
if (hasErrors)
|
||||
{
|
||||
message = string.Join(Environment.NewLine, errors);
|
||||
}
|
||||
|
||||
return !hasErrors;
|
||||
}
|
||||
|
||||
public static Settings Load()
|
||||
{
|
||||
var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, "");
|
||||
var settingsPath = Path.Combine(configDir, _settingsFileName);
|
||||
if (!File.Exists(settingsPath))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var settingsText = File.ReadAllText(settingsPath);
|
||||
|
||||
Settings settings;
|
||||
|
||||
try
|
||||
{
|
||||
settings = JsonConvert.DeserializeObject<Settings>(settingsText);
|
||||
if (settings == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var password = new PasswordEncryptionClass().Decrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl);
|
||||
settings.JiraPassword = password;
|
||||
}
|
||||
catch (JsonReaderException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
var password = new PasswordEncryptionClass().Encrypt(this.JiraUserName, this.JiraPassword, this.JiraUrl);
|
||||
this.JiraPassword = password;
|
||||
|
||||
var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, "");
|
||||
var settingsPath = Path.Combine(configDir, _settingsFileName);
|
||||
var settingsString = JsonConvert.SerializeObject(this);
|
||||
File.WriteAllText(settingsPath, settingsString);
|
||||
}
|
||||
|
||||
private static string _settingsFileName = "settings.json";
|
||||
}
|
||||
|
||||
public enum WorkType
|
||||
{
|
||||
Mercurial = 0,
|
||||
JiraLogs = 1,
|
||||
public WorkType WorkType { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using JiraTimeBot.Core.Encryption;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace JiraTimeBot.Core.Configuration
|
||||
{
|
||||
public class SettingsManager : ISettingsManager
|
||||
{
|
||||
private static string _settingsFileName = "settings.json";
|
||||
|
||||
public Settings Load()
|
||||
{
|
||||
var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, "");
|
||||
var settingsPath = Path.Combine(configDir, _settingsFileName);
|
||||
if (!File.Exists(settingsPath))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var settingsText = File.ReadAllText(settingsPath);
|
||||
|
||||
Settings settings;
|
||||
|
||||
try
|
||||
{
|
||||
settings = JsonConvert.DeserializeObject<Settings>(settingsText);
|
||||
if (settings == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var password = new PasswordEncryptionClass().Decrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl);
|
||||
settings.JiraPassword = password;
|
||||
}
|
||||
catch (JsonReaderException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
|
||||
public Settings LoadAndCheck(Action settingsSource, Action<string> errorMessageReporter)
|
||||
{
|
||||
Settings settings;
|
||||
bool settingsValid;
|
||||
|
||||
do
|
||||
{
|
||||
settings = Load();
|
||||
settingsValid = SettingsIsValid(settings, out var message);
|
||||
|
||||
if (!settingsValid)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(message))
|
||||
{
|
||||
errorMessageReporter(message);
|
||||
}
|
||||
|
||||
settingsSource();
|
||||
}
|
||||
|
||||
} while (!settingsValid);
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
public void Save(Settings settings)
|
||||
{
|
||||
var password = new PasswordEncryptionClass().Encrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl);
|
||||
settings.JiraPassword = password;
|
||||
|
||||
var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, "");
|
||||
var settingsPath = Path.Combine(configDir, _settingsFileName);
|
||||
var settingsString = JsonConvert.SerializeObject(settings);
|
||||
File.WriteAllText(settingsPath, settingsString);
|
||||
}
|
||||
private static bool SettingsIsValid(Settings settings, out string message)
|
||||
{
|
||||
if (settings == null)
|
||||
{
|
||||
message = "Заполните настройки";
|
||||
return false;
|
||||
}
|
||||
|
||||
var errors = new List<string>();
|
||||
message = null;
|
||||
|
||||
if (settings.RoundToMinutes == default(int))
|
||||
{
|
||||
errors.Add("Укажите округление времени, например, 10 (минут)");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(settings.JiraPassword))
|
||||
{
|
||||
errors.Add("Укажите Password от Jira");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(settings.JiraUserName))
|
||||
{
|
||||
errors.Add("Укажите UserName от Jira");
|
||||
}
|
||||
|
||||
if (settings.WorkType == WorkType.Mercurial && (string.IsNullOrEmpty(settings.RepositoryPath) || !Directory.Exists(settings.RepositoryPath)))
|
||||
{
|
||||
errors.Add("Укажите верный RepositoryPath");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.TimeControlTask) && !settings.TimeControlTask.Contains("-"))
|
||||
{
|
||||
errors.Add("Укажите верно зажачу контроля времени. Она джолжна содержать знак '-', например, SV-1211");
|
||||
}
|
||||
|
||||
var hasErrors = errors.Any();
|
||||
if (hasErrors)
|
||||
{
|
||||
message = string.Join(Environment.NewLine, errors);
|
||||
}
|
||||
|
||||
return !hasErrors;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace JiraTimeBot.Core.Configuration
|
||||
{
|
||||
public enum WorkType
|
||||
{
|
||||
Mercurial = 0,
|
||||
JiraLogs = 1,
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,6 @@ namespace JiraTimeBot.Core.TaskTime.Objects
|
||||
public string Branch { get; set; }
|
||||
public TimeSpan Time { get; set; }
|
||||
public int Commits { get; set; }
|
||||
|
||||
public DateTime StartTime { get; set; }
|
||||
public DateTime EndTime { get; set; }
|
||||
}
|
||||
|
||||
@@ -32,11 +32,11 @@ namespace JiraTimeBot.Core.TaskTime
|
||||
}
|
||||
|
||||
//если кол-во коммитов более чем кол-во интервалов - то уменьшим интервал вдвое.
|
||||
while (totalCommitsCount > (8 * (60.0 / settings.RountToMinutes)))
|
||||
while (totalCommitsCount > (8 * (60.0 / settings.RoundToMinutes)))
|
||||
{
|
||||
settings.RountToMinutes = (int)RoundTo((decimal)(settings.RountToMinutes / 2.0), 5);
|
||||
_log.Info($"Слишком много задач - уменьшаю интервал до {settings.RountToMinutes}.");
|
||||
if (settings.RountToMinutes == 5)
|
||||
settings.RoundToMinutes = (int)RoundTo((decimal)(settings.RoundToMinutes / 2.0), 5);
|
||||
_log.Info($"Слишком много задач - уменьшаю интервал до {settings.RoundToMinutes}.");
|
||||
if (settings.RoundToMinutes == 5)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -66,7 +66,7 @@ namespace JiraTimeBot.Core.TaskTime
|
||||
}
|
||||
|
||||
int currentTaskCommits = taskGroup.Count();
|
||||
int currentTaskTime = (int)RoundTo(minutesPerWorkDay / totalCommitsCount * currentTaskCommits, settings.RountToMinutes);
|
||||
int currentTaskTime = (int)RoundTo(minutesPerWorkDay / totalCommitsCount * currentTaskCommits, settings.RoundToMinutes);
|
||||
remainMinutes = remainMinutes - currentTaskTime;
|
||||
|
||||
var orderedTasks = taskGroup.OrderBy(f => f.Time).ToArray();
|
||||
@@ -126,9 +126,14 @@ namespace JiraTimeBot.Core.TaskTime
|
||||
private decimal RoundTo(decimal value, decimal to = 15, bool up = true)
|
||||
{
|
||||
if ((value % to) == 0)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
if (up)
|
||||
{
|
||||
return (value - (value % to) + to);
|
||||
}
|
||||
|
||||
return (value - (value % to));
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/CodeInspection/CodeAnnotations/NamespacesWithAnnotations/=JiraTimeBot_002EUi_002EAnnotations/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Jira/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Jira/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Worklog/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
@@ -4,6 +4,7 @@ using JiraTimeBot.UI.Tray;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using JiraTimeBot.Core;
|
||||
using JiraTimeBot.Core.Configuration;
|
||||
using JiraTimeBot.Core.JiraIntegration;
|
||||
using JiraTimeBot.Core.JiraIntegration.Comments;
|
||||
using JiraTimeBot.Core.Mercurial;
|
||||
@@ -62,6 +63,7 @@ namespace JiraTimeBot.DI
|
||||
|
||||
_builder.RegisterType<AutoStartUp>().AsSelf().AsImplementedInterfaces();
|
||||
_builder.RegisterType<frmSettings>().AsSelf().AsImplementedInterfaces();
|
||||
_builder.RegisterType<SettingsManager>().AsSelf().AsImplementedInterfaces().SingleInstance();
|
||||
|
||||
var container = _builder.Build();
|
||||
return container;
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace JiraTimeBot.UI
|
||||
|
||||
_settingsWindowShow = () =>
|
||||
{
|
||||
var frmSettings = new frmSettings(_container.Resolve<AutoStartUp>());
|
||||
var frmSettings = new frmSettings(_container.Resolve<AutoStartUp>(), _container.Resolve<ISettingsManager>());
|
||||
frmSettings.ShowDialog(this);
|
||||
};
|
||||
_settingsErrorReporter = msg => MessageBox.Show(msg, "Загрузка настроек", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);;
|
||||
@@ -85,7 +85,9 @@ namespace JiraTimeBot.UI
|
||||
|
||||
public Settings ReadSettingsAndLock()
|
||||
{
|
||||
_settings = Settings.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter);
|
||||
var settingsManager = _container.Resolve<ISettingsManager>();
|
||||
|
||||
_settings = settingsManager.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter);
|
||||
|
||||
LockUnlock(false);
|
||||
|
||||
@@ -123,7 +125,8 @@ namespace JiraTimeBot.UI
|
||||
|
||||
private void PrintStartMessage()
|
||||
{
|
||||
_settings = Settings.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter);
|
||||
var settingsManager = _container.Resolve<ISettingsManager>();
|
||||
_settings = settingsManager.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter);
|
||||
_log.Info($"Загружен бот для {_settings.JiraUserName}, Режим: {_settings.WorkType.ToString()}, работаем в {_settings.RepositoryPath}");
|
||||
}
|
||||
|
||||
|
||||
@@ -8,16 +8,18 @@ namespace JiraTimeBot.UI
|
||||
public partial class frmSettings : Form
|
||||
{
|
||||
private readonly AutoStartUp _autoStart;
|
||||
private readonly ISettingsManager _settingsManager;
|
||||
|
||||
public frmSettings(AutoStartUp autoStart)
|
||||
public frmSettings(AutoStartUp autoStart, ISettingsManager settingsManager)
|
||||
{
|
||||
_autoStart = autoStart;
|
||||
_settingsManager = settingsManager;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void frmSettings_Load(object sender, EventArgs e)
|
||||
{
|
||||
var settings = Settings.Load();
|
||||
var settings = _settingsManager.Load();
|
||||
if (settings != null)
|
||||
{
|
||||
SetSettings(settings);
|
||||
@@ -34,7 +36,7 @@ namespace JiraTimeBot.UI
|
||||
txtRepoPath.Text = settings.RepositoryPath;
|
||||
actTime.Text = settings.ActivationTime.ToString("hh\\:mm\\:ss");
|
||||
chkAddComments.Checked = settings.AddCommentsToWorklog;
|
||||
txtRoundTo.Text = settings.RountToMinutes.ToString();
|
||||
txtRoundTo.Text = settings.RoundToMinutes.ToString();
|
||||
cboWorkType.SelectedIndex = (int) settings.WorkType;
|
||||
txtTimeControlTask.Text = settings.TimeControlTask;
|
||||
txtJQL.Text = settings.JiraQuery;
|
||||
@@ -57,7 +59,7 @@ namespace JiraTimeBot.UI
|
||||
ActivationTime = TimeSpan.Parse(actTime.Text),
|
||||
RepositoryPath = txtRepoPath.Text,
|
||||
AddCommentsToWorklog = chkAddComments.Checked,
|
||||
RountToMinutes = roundTo,
|
||||
RoundToMinutes = roundTo,
|
||||
WorkType = (WorkType) cboWorkType.SelectedIndex,
|
||||
JiraQuery = txtJQL.Text,
|
||||
TimeControlTask = txtTimeControlTask.Text,
|
||||
@@ -71,7 +73,7 @@ namespace JiraTimeBot.UI
|
||||
private void btnSave_Click(object sender, EventArgs e)
|
||||
{
|
||||
var settings = ReadSettingsAndLock();
|
||||
settings.Save();
|
||||
_settingsManager.Save(settings);
|
||||
_autoStart.Set(chkAutostart.Checked);
|
||||
|
||||
MessageBox.Show("Настройки сохранены.");
|
||||
|
||||
Reference in New Issue
Block a user