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

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);
}
}
+17 -134
View File
@@ -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));
}
+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">
<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.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;
+6 -3
View File
@@ -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}");
}
+7 -5
View File
@@ -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("Настройки сохранены.");