всякая мелочевка

This commit is contained in:
Anton Volkov
2019-04-09 15:58:16 +03:00
parent bb8b6723ec
commit 8afc05266e
10 changed files with 192 additions and 149 deletions
@@ -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);
}
}
+16 -133
View File
@@ -1,148 +1,31 @@
using System; 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 namespace JiraTimeBot.Core.Configuration
{ {
public class Settings public class Settings
{ {
public int MinuterPerWorkDay = 8 * 60;
public int RountToMinutes { get; set; }
public string JiraUrl = "https://myteam.aeroclub.ru"; public string JiraUrl = "https://myteam.aeroclub.ru";
public string RepositoryPath { get; set; } public int MinuterPerWorkDay = 8 * 60;
public string MercurialAuthorEmail { get; set; }
public string JiraUserName { get; set; }
public string JiraPassword { get; set; }
public TimeSpan ActivationTime { get; set; } public TimeSpan ActivationTime { get; set; }
public bool AddCommentsToWorklog { get; set; } public bool AddCommentsToWorklog { get; set; }
public WorkType WorkType { get; set; }
public string JiraPassword { get; set; }
public string JiraQuery { 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 string TimeControlTask { get; set; }
public static Settings LoadAndCheck(Action settingsSource, Action<string> errorMessageReporter) public WorkType WorkType { get; set; }
{
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,
} }
} }
@@ -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 string Branch { get; set; }
public TimeSpan Time { get; set; } public TimeSpan Time { get; set; }
public int Commits { get; set; } public int Commits { get; set; }
public DateTime StartTime { get; set; } public DateTime StartTime { get; set; }
public DateTime EndTime { 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); settings.RoundToMinutes = (int)RoundTo((decimal)(settings.RoundToMinutes / 2.0), 5);
_log.Info($"Слишком много задач - уменьшаю интервал до {settings.RountToMinutes}."); _log.Info($"Слишком много задач - уменьшаю интервал до {settings.RoundToMinutes}.");
if (settings.RountToMinutes == 5) if (settings.RoundToMinutes == 5)
{ {
break; break;
} }
@@ -66,7 +66,7 @@ namespace JiraTimeBot.Core.TaskTime
} }
int currentTaskCommits = taskGroup.Count(); 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; remainMinutes = remainMinutes - currentTaskTime;
var orderedTasks = taskGroup.OrderBy(f => f.Time).ToArray(); 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) private decimal RoundTo(decimal value, decimal to = 15, bool up = true)
{ {
if ((value % to) == 0) if ((value % to) == 0)
{
return value; return value;
}
if (up) if (up)
{
return (value - (value % to) + to); return (value - (value % to) + to);
}
return (value - (value % to)); return (value - (value % to));
} }
+2 -1
View File
@@ -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"> <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/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>
+2
View File
@@ -4,6 +4,7 @@ using JiraTimeBot.UI.Tray;
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using JiraTimeBot.Core; using JiraTimeBot.Core;
using JiraTimeBot.Core.Configuration;
using JiraTimeBot.Core.JiraIntegration; using JiraTimeBot.Core.JiraIntegration;
using JiraTimeBot.Core.JiraIntegration.Comments; using JiraTimeBot.Core.JiraIntegration.Comments;
using JiraTimeBot.Core.Mercurial; using JiraTimeBot.Core.Mercurial;
@@ -62,6 +63,7 @@ namespace JiraTimeBot.DI
_builder.RegisterType<AutoStartUp>().AsSelf().AsImplementedInterfaces(); _builder.RegisterType<AutoStartUp>().AsSelf().AsImplementedInterfaces();
_builder.RegisterType<frmSettings>().AsSelf().AsImplementedInterfaces(); _builder.RegisterType<frmSettings>().AsSelf().AsImplementedInterfaces();
_builder.RegisterType<SettingsManager>().AsSelf().AsImplementedInterfaces().SingleInstance();
var container = _builder.Build(); var container = _builder.Build();
return container; return container;
+6 -3
View File
@@ -72,7 +72,7 @@ namespace JiraTimeBot.UI
_settingsWindowShow = () => _settingsWindowShow = () =>
{ {
var frmSettings = new frmSettings(_container.Resolve<AutoStartUp>()); var frmSettings = new frmSettings(_container.Resolve<AutoStartUp>(), _container.Resolve<ISettingsManager>());
frmSettings.ShowDialog(this); frmSettings.ShowDialog(this);
}; };
_settingsErrorReporter = msg => MessageBox.Show(msg, "Загрузка настроек", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);; _settingsErrorReporter = msg => MessageBox.Show(msg, "Загрузка настроек", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);;
@@ -85,7 +85,9 @@ namespace JiraTimeBot.UI
public Settings ReadSettingsAndLock() public Settings ReadSettingsAndLock()
{ {
_settings = Settings.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter); var settingsManager = _container.Resolve<ISettingsManager>();
_settings = settingsManager.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter);
LockUnlock(false); LockUnlock(false);
@@ -123,7 +125,8 @@ namespace JiraTimeBot.UI
private void PrintStartMessage() 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}"); _log.Info($"Загружен бот для {_settings.JiraUserName}, Режим: {_settings.WorkType.ToString()}, работаем в {_settings.RepositoryPath}");
} }
+7 -5
View File
@@ -8,16 +8,18 @@ namespace JiraTimeBot.UI
public partial class frmSettings : Form public partial class frmSettings : Form
{ {
private readonly AutoStartUp _autoStart; private readonly AutoStartUp _autoStart;
private readonly ISettingsManager _settingsManager;
public frmSettings(AutoStartUp autoStart) public frmSettings(AutoStartUp autoStart, ISettingsManager settingsManager)
{ {
_autoStart = autoStart; _autoStart = autoStart;
_settingsManager = settingsManager;
InitializeComponent(); InitializeComponent();
} }
private void frmSettings_Load(object sender, EventArgs e) private void frmSettings_Load(object sender, EventArgs e)
{ {
var settings = Settings.Load(); var settings = _settingsManager.Load();
if (settings != null) if (settings != null)
{ {
SetSettings(settings); SetSettings(settings);
@@ -34,7 +36,7 @@ namespace JiraTimeBot.UI
txtRepoPath.Text = settings.RepositoryPath; txtRepoPath.Text = settings.RepositoryPath;
actTime.Text = settings.ActivationTime.ToString("hh\\:mm\\:ss"); actTime.Text = settings.ActivationTime.ToString("hh\\:mm\\:ss");
chkAddComments.Checked = settings.AddCommentsToWorklog; chkAddComments.Checked = settings.AddCommentsToWorklog;
txtRoundTo.Text = settings.RountToMinutes.ToString(); txtRoundTo.Text = settings.RoundToMinutes.ToString();
cboWorkType.SelectedIndex = (int) settings.WorkType; cboWorkType.SelectedIndex = (int) settings.WorkType;
txtTimeControlTask.Text = settings.TimeControlTask; txtTimeControlTask.Text = settings.TimeControlTask;
txtJQL.Text = settings.JiraQuery; txtJQL.Text = settings.JiraQuery;
@@ -57,7 +59,7 @@ namespace JiraTimeBot.UI
ActivationTime = TimeSpan.Parse(actTime.Text), ActivationTime = TimeSpan.Parse(actTime.Text),
RepositoryPath = txtRepoPath.Text, RepositoryPath = txtRepoPath.Text,
AddCommentsToWorklog = chkAddComments.Checked, AddCommentsToWorklog = chkAddComments.Checked,
RountToMinutes = roundTo, RoundToMinutes = roundTo,
WorkType = (WorkType) cboWorkType.SelectedIndex, WorkType = (WorkType) cboWorkType.SelectedIndex,
JiraQuery = txtJQL.Text, JiraQuery = txtJQL.Text,
TimeControlTask = txtTimeControlTask.Text, TimeControlTask = txtTimeControlTask.Text,
@@ -71,7 +73,7 @@ namespace JiraTimeBot.UI
private void btnSave_Click(object sender, EventArgs e) private void btnSave_Click(object sender, EventArgs e)
{ {
var settings = ReadSettingsAndLock(); var settings = ReadSettingsAndLock();
settings.Save(); _settingsManager.Save(settings);
_autoStart.Set(chkAutostart.Checked); _autoStart.Set(chkAutostart.Checked);
MessageBox.Show("Настройки сохранены."); MessageBox.Show("Настройки сохранены.");