From d56094febbb1c7fc3eb0daec6aefff9c9096f9ee Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Fri, 15 Mar 2019 17:49:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20+=20DI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JiraTimeBotForm/App.config | 4 + .../PasswordEncryptionClass.cs} | 6 +- JiraTimeBotForm/Configuration/Settings.cs | 32 +++++++ JiraTimeBotForm/DI/ContainerBuilder.cs | 42 +++++++++ JiraTimeBotForm/JiraIntegration/JiraApi.cs | 19 ++-- JiraTimeBotForm/JiraTimeBotForm.csproj | 23 ++++- JiraTimeBotForm/Job.cs | 6 +- JiraTimeBotForm/Mercurial/CommitSkipper.cs | 24 ++++++ JiraTimeBotForm/Mercurial/ICommitSkipper.cs | 12 +++ JiraTimeBotForm/Mercurial/IMercurialLog.cs | 12 +++ JiraTimeBotForm/Mercurial/MercurialLog.cs | 25 ++---- .../TasksProcessors/ITasksProcessors.cs | 15 ++++ .../TasksProcessors/MeetingProcessor.cs | 10 +-- .../TasksProcessors/WorkLogTasksProcessor.cs | 9 +- JiraTimeBotForm/UI/TrayMenu.cs | 65 ++++++++++++++ JiraTimeBotForm/{ => UI}/frmMain.Designer.cs | 0 JiraTimeBotForm/{ => UI}/frmMain.cs | 86 +++++++------------ JiraTimeBotForm/{ => UI}/frmMain.resx | 0 JiraTimeBotForm/packages.config | 3 + 19 files changed, 288 insertions(+), 105 deletions(-) rename JiraTimeBotForm/{Passwords/EncryptionClass.cs => Configuration/PasswordEncryptionClass.cs} (93%) create mode 100644 JiraTimeBotForm/DI/ContainerBuilder.cs create mode 100644 JiraTimeBotForm/Mercurial/CommitSkipper.cs create mode 100644 JiraTimeBotForm/Mercurial/ICommitSkipper.cs create mode 100644 JiraTimeBotForm/Mercurial/IMercurialLog.cs create mode 100644 JiraTimeBotForm/TasksProcessors/ITasksProcessors.cs create mode 100644 JiraTimeBotForm/UI/TrayMenu.cs rename JiraTimeBotForm/{ => UI}/frmMain.Designer.cs (100%) rename JiraTimeBotForm/{ => UI}/frmMain.cs (69%) rename JiraTimeBotForm/{ => UI}/frmMain.resx (100%) diff --git a/JiraTimeBotForm/App.config b/JiraTimeBotForm/App.config index be09118..4abcc95 100644 --- a/JiraTimeBotForm/App.config +++ b/JiraTimeBotForm/App.config @@ -13,6 +13,10 @@ + + + + diff --git a/JiraTimeBotForm/Passwords/EncryptionClass.cs b/JiraTimeBotForm/Configuration/PasswordEncryptionClass.cs similarity index 93% rename from JiraTimeBotForm/Passwords/EncryptionClass.cs rename to JiraTimeBotForm/Configuration/PasswordEncryptionClass.cs index cef64da..7f1cf30 100644 --- a/JiraTimeBotForm/Passwords/EncryptionClass.cs +++ b/JiraTimeBotForm/Configuration/PasswordEncryptionClass.cs @@ -1,10 +1,10 @@ using System; -using System.Text; using System.Security.Cryptography; +using System.Text; -namespace JiraTimeBotForm.Passwords +namespace JiraTimeBotForm.Configuration { - public class EncryptionClass + public class PasswordEncryptionClass { private byte[] GetEntropy(string EntropyString) { diff --git a/JiraTimeBotForm/Configuration/Settings.cs b/JiraTimeBotForm/Configuration/Settings.cs index 6505967..9c609ed 100644 --- a/JiraTimeBotForm/Configuration/Settings.cs +++ b/JiraTimeBotForm/Configuration/Settings.cs @@ -1,4 +1,7 @@ using System; +using System.IO; +using System.Windows.Forms; +using Newtonsoft.Json; namespace JiraTimeBotForm.Configuration { @@ -14,5 +17,34 @@ namespace JiraTimeBotForm.Configuration public TimeSpan ActivationTime { get; set; } public bool DummyMode { get; set; } public bool AddCommentsToWorklog { get; set; } + + + public static Settings Load() + { + var settingsPath = Path.Combine(Application.UserAppDataPath, _settingsFileName); + if (!File.Exists(settingsPath)) + { + return null; + } + + var settingsText = File.ReadAllText(settingsPath); + var settings = JsonConvert.DeserializeObject(settingsText); + + var password = new PasswordEncryptionClass().Decrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl); + settings.JiraPassword = password; + return settings; + } + + public void Save() + { + var password = new PasswordEncryptionClass().Encrypt(this.JiraUserName, this.JiraPassword, this.JiraUrl); + this.JiraPassword = password; + + var settingsPath = Path.Combine(Application.UserAppDataPath, _settingsFileName); + var settingsString = JsonConvert.SerializeObject(this); + File.WriteAllText(settingsPath, settingsString); + } + + private static string _settingsFileName = "settings.json"; } } diff --git a/JiraTimeBotForm/DI/ContainerBuilder.cs b/JiraTimeBotForm/DI/ContainerBuilder.cs new file mode 100644 index 0000000..77dba65 --- /dev/null +++ b/JiraTimeBotForm/DI/ContainerBuilder.cs @@ -0,0 +1,42 @@ +using System.Windows.Forms; +using Autofac; +using Autofac.Extras.AggregateService; +using JiraTimeBotForm.JiraIntegration; +using JiraTimeBotForm.Mercurial; +using JiraTimeBotForm.TaskProcessors; +using JiraTimeBotForm.TasksProcessors; +using JiraTimeBotForm.TaskTime; +using JiraTimeBotForm.UI; + +namespace JiraTimeBotForm.DI +{ + public class Bootstrapper + { + private readonly ContainerBuilder _builder; + public Bootstrapper() + { + _builder = new ContainerBuilder(); + } + + public IContainer Build(TextBox logTextBox) + { + _builder.Register(f => new Logger(logTextBox)).As().AsSelf(); + + _builder.Register(f => new TrayMenu()).As().AsSelf(); + _builder.Register(c => new CommitSkipper()).As(); + + _builder.Register(c => new MercurialLog(c.Resolve(), c.Resolve())).As().AsSelf(); + _builder.Register(c => new TaskTimeDiscoverer(c.Resolve())).As().AsSelf(); + + _builder.RegisterType().AsSelf().As(); + _builder.RegisterType().AsSelf().As(); + _builder.RegisterAggregateService(); + + _builder.Register(c => new JiraApi(c.Resolve())).AsSelf().AsImplementedInterfaces(); + + _builder.Register(c => new Job(c.Resolve(), c.Resolve(), c.Resolve())).AsSelf(); + + return _builder.Build(); + } + } +} diff --git a/JiraTimeBotForm/JiraIntegration/JiraApi.cs b/JiraTimeBotForm/JiraIntegration/JiraApi.cs index 5066279..4a76445 100644 --- a/JiraTimeBotForm/JiraIntegration/JiraApi.cs +++ b/JiraTimeBotForm/JiraIntegration/JiraApi.cs @@ -9,9 +9,7 @@ namespace JiraTimeBotForm.JiraIntegration { public class JiraApi { - private readonly Settings _settings; private readonly ILog _log; - private Jira _jira; private readonly List _dummyComments = new List { @@ -19,18 +17,17 @@ namespace JiraTimeBotForm.JiraIntegration "кодинг", "написание кода и тестов" }; - public JiraApi(Settings settings, ILog log = null) + public JiraApi(ILog log = null) { - _settings = settings; _log = log; - _jira = Jira.CreateRestClient(_settings.JiraUrl, _settings.JiraUserName, _settings.JiraPassword); } - public string GetTaskName(string branch) + public string GetTaskName(string branch, Settings settings) { + var jira = Jira.CreateRestClient(settings.JiraUrl, settings.JiraUserName, settings.JiraPassword); try { - var issue = _jira.Issues.Queryable.FirstOrDefault(f => f.Key == branch); + var issue = jira.Issues.Queryable.FirstOrDefault(f => f.Key == branch); return issue?.Summary; } catch (Exception) @@ -39,8 +36,10 @@ namespace JiraTimeBotForm.JiraIntegration } } - public void SetTodayWorklog(List taskTimeItems, DateTime? date = null, bool dummy = false, bool addCommentsToWorklog = false) + public void SetTodayWorklog(List taskTimeItems, Settings settings, DateTime? date = null, bool dummy = false, bool addCommentsToWorklog = false) { + var jira = Jira.CreateRestClient(settings.JiraUrl, settings.JiraUserName, settings.JiraPassword); + if (date == null) { date = DateTime.Now.Date; @@ -52,7 +51,7 @@ namespace JiraTimeBotForm.JiraIntegration Issue issue = null; try { - issue = _jira.Issues.Queryable.FirstOrDefault(f => f.Key == taskTimeItem.Branch); + issue = jira.Issues.Queryable.FirstOrDefault(f => f.Key == taskTimeItem.Branch); } catch (Exception) { @@ -69,7 +68,7 @@ namespace JiraTimeBotForm.JiraIntegration foreach (var workLog in workLogs) { var timeSpent = TimeSpan.FromSeconds(workLog.TimeSpentInSeconds); - if (workLog.CreateDate.GetValueOrDefault().Date == date && workLog.Author == _settings.JiraUserName) + if (workLog.CreateDate.GetValueOrDefault().Date == date && workLog.Author == settings.JiraUserName) { var timeDiff = Math.Abs((timeSpent - taskTimeItem.Time).TotalMinutes); if (timeDiff > 1) diff --git a/JiraTimeBotForm/JiraTimeBotForm.csproj b/JiraTimeBotForm/JiraTimeBotForm.csproj index fc9fa84..c5d1598 100644 --- a/JiraTimeBotForm/JiraTimeBotForm.csproj +++ b/JiraTimeBotForm/JiraTimeBotForm.csproj @@ -38,6 +38,15 @@ ..\packages\Atlassian.SDK.10.4.0\lib\net452\Atlassian.Jira.dll + + ..\packages\Autofac.4.9.1\lib\net45\Autofac.dll + + + ..\packages\Autofac.Extras.AggregateService.4.1.0\lib\net45\Autofac.Extras.AggregateService.dll + + + ..\packages\Castle.Core.4.0.0\lib\net45\Castle.Core.dll + ..\packages\Mercurial.Net.1.1.1.607\lib\net35-Client\Mercurial.Net.dll @@ -71,20 +80,25 @@ + - + + + + + Form - + frmMain.cs - + @@ -93,7 +107,8 @@ - + + frmMain.cs diff --git a/JiraTimeBotForm/Job.cs b/JiraTimeBotForm/Job.cs index fcc507a..f0ed5c0 100644 --- a/JiraTimeBotForm/Job.cs +++ b/JiraTimeBotForm/Job.cs @@ -13,11 +13,11 @@ namespace JiraTimeBotForm { class Job { - private readonly MercurialLog _mercurialLog; - private readonly TaskTimeDiscoverer _taskTimeDiscoverer; + private readonly IMercurialLog _mercurialLog; + private readonly ITaskTimeDiscoverer _taskTimeDiscoverer; private readonly ILog _log; - public Job(MercurialLog mercurialLog, TaskTimeDiscoverer taskTimeDiscoverer, ILog log) + public Job(IMercurialLog mercurialLog, ITaskTimeDiscoverer taskTimeDiscoverer, ILog log) { _mercurialLog = mercurialLog; _taskTimeDiscoverer = taskTimeDiscoverer; diff --git a/JiraTimeBotForm/Mercurial/CommitSkipper.cs b/JiraTimeBotForm/Mercurial/CommitSkipper.cs new file mode 100644 index 0000000..cee2ca4 --- /dev/null +++ b/JiraTimeBotForm/Mercurial/CommitSkipper.cs @@ -0,0 +1,24 @@ +using System; + +namespace JiraTimeBotForm.Mercurial +{ + public class CommitSkipper : ICommitSkipper + { + public bool IsNeedToSkip(string branch, string commitMessage) + { + if (!branch.Contains("-")) + { + return true; + } + + //Пропускаем Close и Merge коммиты + if (commitMessage.StartsWith($"Close {branch} ", StringComparison.InvariantCultureIgnoreCase) || + commitMessage.StartsWith($"Merge with ", StringComparison.InvariantCultureIgnoreCase)) + { + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/JiraTimeBotForm/Mercurial/ICommitSkipper.cs b/JiraTimeBotForm/Mercurial/ICommitSkipper.cs new file mode 100644 index 0000000..198f6d3 --- /dev/null +++ b/JiraTimeBotForm/Mercurial/ICommitSkipper.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JiraTimeBotForm.Mercurial +{ + public interface ICommitSkipper + { + bool IsNeedToSkip(string branch, string commitMessage); + } +} diff --git a/JiraTimeBotForm/Mercurial/IMercurialLog.cs b/JiraTimeBotForm/Mercurial/IMercurialLog.cs new file mode 100644 index 0000000..130d395 --- /dev/null +++ b/JiraTimeBotForm/Mercurial/IMercurialLog.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using JiraTimeBotForm.Configuration; + +namespace JiraTimeBotForm.Mercurial +{ + public interface IMercurialLog + { + List GetMercurialLog(Settings settings, DateTime? date = null, CancellationToken cancellationToken = default(CancellationToken)); + } +} \ No newline at end of file diff --git a/JiraTimeBotForm/Mercurial/MercurialLog.cs b/JiraTimeBotForm/Mercurial/MercurialLog.cs index 576547d..48f0979 100644 --- a/JiraTimeBotForm/Mercurial/MercurialLog.cs +++ b/JiraTimeBotForm/Mercurial/MercurialLog.cs @@ -9,13 +9,15 @@ using Mercurial; namespace JiraTimeBotForm.Mercurial { - public class MercurialLog + public class MercurialLog: IMercurialLog { private readonly ILog _log; + private readonly ICommitSkipper _commitSkipper; - public MercurialLog(ILog log) + public MercurialLog(ILog log, ICommitSkipper commitSkipper) { _log = log; + _commitSkipper = commitSkipper; } public List GetMercurialLog(Settings settings, DateTime? date = null, CancellationToken cancellationToken = default(CancellationToken)) @@ -54,7 +56,7 @@ namespace JiraTimeBotForm.Mercurial } var commitMessage = FixEncoding(changeset.CommitMessage); - if (IsNeedToSkip(changeset.Branch, commitMessage)) + if (_commitSkipper.IsNeedToSkip(changeset.Branch, commitMessage)) { continue; } @@ -113,23 +115,6 @@ namespace JiraTimeBotForm.Mercurial return message; } - private bool IsNeedToSkip(string branch, string commitMessage) - { - if (!branch.Contains("-")) - { - return true; - } - - //Пропускаем Close и Merge коммиты - if (commitMessage.StartsWith($"Close {branch} ", StringComparison.InvariantCultureIgnoreCase) || - commitMessage.StartsWith($"Merge with ", StringComparison.InvariantCultureIgnoreCase)) - { - return true; - } - - return false; - } - private string FixEncoding(string source) { //перекодируем сообщение - ибо оно криво забирается в 1252 diff --git a/JiraTimeBotForm/TasksProcessors/ITasksProcessors.cs b/JiraTimeBotForm/TasksProcessors/ITasksProcessors.cs new file mode 100644 index 0000000..8ff5dcd --- /dev/null +++ b/JiraTimeBotForm/TasksProcessors/ITasksProcessors.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JiraTimeBotForm.TasksProcessors +{ + public interface ITasksProcessors + { + WorkLogTasksProcessor WorkLogTasksProcessor { get; } + + MeetingProcessor MeetingProcessor { get; } + } +} diff --git a/JiraTimeBotForm/TasksProcessors/MeetingProcessor.cs b/JiraTimeBotForm/TasksProcessors/MeetingProcessor.cs index b337f2d..ee5c992 100644 --- a/JiraTimeBotForm/TasksProcessors/MeetingProcessor.cs +++ b/JiraTimeBotForm/TasksProcessors/MeetingProcessor.cs @@ -8,24 +8,24 @@ using JiraTimeBotForm.TaskTime; namespace JiraTimeBotForm.TasksProcessors { - class MeetingProcessor : ITasksProcessor + public class MeetingProcessor : ITasksProcessor { private readonly ILog _log; + private readonly JiraApi _jiraApi; - public MeetingProcessor(ILog log) + public MeetingProcessor(ILog log, JiraApi jiraApi) { _log = log; + _jiraApi = jiraApi; } public void Process(DateTime date, List taskTimes, Settings settings) { - var jira = new JiraApi(settings, _log); - _log.Trace($"На реальную дату {date:dd.MM.yyyy} распределение по задачам:"); foreach (var taskTime in taskTimes.OrderByDescending(f => f.Time)) { - var taskName = jira.GetTaskName(taskTime.Branch); + var taskName = _jiraApi.GetTaskName(taskTime.Branch, settings); _log.Trace($" - [{taskTime.Branch}, коммитов {taskTime.Commits}]: {taskName} - {taskTime.Time}"); } } diff --git a/JiraTimeBotForm/TasksProcessors/WorkLogTasksProcessor.cs b/JiraTimeBotForm/TasksProcessors/WorkLogTasksProcessor.cs index 93cc81d..bf88a54 100644 --- a/JiraTimeBotForm/TasksProcessors/WorkLogTasksProcessor.cs +++ b/JiraTimeBotForm/TasksProcessors/WorkLogTasksProcessor.cs @@ -7,13 +7,15 @@ using JiraTimeBotForm.TaskTime; namespace JiraTimeBotForm.TasksProcessors { - class WorkLogTasksProcessor : ITasksProcessor + public class WorkLogTasksProcessor : ITasksProcessor { private readonly ILog _log; + private readonly JiraApi _jiraApi; - public WorkLogTasksProcessor(ILog log) + public WorkLogTasksProcessor(ILog log, JiraApi jiraApi) { _log = log; + _jiraApi = jiraApi; } public void Process(DateTime date, List taskTimes, Settings settings) @@ -24,8 +26,7 @@ namespace JiraTimeBotForm.TasksProcessors _log.Trace($"- {taskTime.Branch} (коммитов {taskTime.Commits}): {taskTime.Time}"); } - var jira = new JiraApi(settings, _log); - jira.SetTodayWorklog(taskTimes, dummy: settings.DummyMode, addCommentsToWorklog: settings.AddCommentsToWorklog); + _jiraApi.SetTodayWorklog(taskTimes, settings, dummy: settings.DummyMode, addCommentsToWorklog: settings.AddCommentsToWorklog); } } } diff --git a/JiraTimeBotForm/UI/TrayMenu.cs b/JiraTimeBotForm/UI/TrayMenu.cs new file mode 100644 index 0000000..e5753f6 --- /dev/null +++ b/JiraTimeBotForm/UI/TrayMenu.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JiraTimeBotForm.UI +{ + public class TrayMenu: ITrayMenu + { + private NotifyIcon _trayIcon; + + public NotifyIcon Create(frmMain form) + { + var trayMenu = new ContextMenu(); + trayMenu.MenuItems.Add("Exit", OnExit); + + _trayIcon = new NotifyIcon + { + Text = "JiraTimeBot", + Icon = form.Icon, + ContextMenu = trayMenu, + Visible = false, + Tag = form + }; + _trayIcon.Click += btnTray_Click; + _trayIcon.DoubleClick += btnTray_Click; + + return _trayIcon; + } + + public void Show() + { + _trayIcon.Visible = true; + } + + public void Hide() + { + _trayIcon.Visible = false; + } + + private void OnExit(object sender, EventArgs e) + { + Application.Exit(); + } + + private void btnTray_Click(object sender, EventArgs e) + { + var icon = (NotifyIcon) sender; + var form = (frmMain) icon.Tag; + form.Visible = true; + form.Activate(); + form.BringToFront(); + Extensions.Extensions.Restore(form); + } + } + + public interface ITrayMenu + { + NotifyIcon Create(frmMain form); + void Show(); + void Hide(); + } +} diff --git a/JiraTimeBotForm/frmMain.Designer.cs b/JiraTimeBotForm/UI/frmMain.Designer.cs similarity index 100% rename from JiraTimeBotForm/frmMain.Designer.cs rename to JiraTimeBotForm/UI/frmMain.Designer.cs diff --git a/JiraTimeBotForm/frmMain.cs b/JiraTimeBotForm/UI/frmMain.cs similarity index 69% rename from JiraTimeBotForm/frmMain.cs rename to JiraTimeBotForm/UI/frmMain.cs index c8f4526..0574fd0 100644 --- a/JiraTimeBotForm/frmMain.cs +++ b/JiraTimeBotForm/UI/frmMain.cs @@ -4,11 +4,13 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using Autofac; using JiraTimeBotForm.Configuration; +using JiraTimeBotForm.DI; using JiraTimeBotForm.Mercurial; -using JiraTimeBotForm.Passwords; using JiraTimeBotForm.TasksProcessors; using JiraTimeBotForm.TaskTime; +using JiraTimeBotForm.UI; using Newtonsoft.Json; // This is the code for your desktop app. @@ -18,11 +20,12 @@ namespace JiraTimeBotForm { public partial class frmMain : Form { - private readonly string _settingsPath; private readonly ILog _log; - private readonly NotifyIcon _trayIcon; - private Job _job; + private readonly Job _job; private readonly IReadOnlyList _controls; + private readonly IContainer _container; + private readonly ITasksProcessors _tasksProcessors; + private readonly ITrayMenu _trayIcon; private CancellationTokenSource _tokenSource; private CancellationTokenSource GetTokenSource() @@ -40,46 +43,21 @@ namespace JiraTimeBotForm public frmMain() { InitializeComponent(); - _settingsPath = Path.Combine(Application.UserAppDataPath, "settings.json"); - _log = new Logger(txtLog); + _container = new Bootstrapper().Build(txtLog); - var trayMenu = new ContextMenu(); - trayMenu.MenuItems.Add("Exit", OnExit); + _trayIcon = _container.Resolve(); + _trayIcon.Create(this); - _trayIcon = new NotifyIcon - { - Text = "JiraTimeBot", - Icon = this.Icon, - ContextMenu = trayMenu, - Visible = false, - - }; - _trayIcon.Click += btnTray_Click; - _trayIcon.DoubleClick += btnTray_Click; - - var mercurialLog = new MercurialLog(_log); - var taskTimeDiscoverer = new TaskTimeDiscoverer(_log); - _job = new Job(mercurialLog, taskTimeDiscoverer, _log); + _job = _container.Resolve(); + _log = _container.Resolve(); + _tasksProcessors = _container.Resolve(); _controls = new Control[] { txtJiraLogin, txtJiraPassword, txtMercurialEmail, actTime, txtRepoPath, txtDummyMode, btnSave, btnStart, btnMeeting, chkAddComments }; } private void frmMain_FormClosing(object sender, FormClosingEventArgs e) { - _trayIcon.Visible = false; - } - - private void OnExit(object sender, EventArgs e) - { - Application.Exit(); - } - - private void btnTray_Click(object sender, EventArgs e) - { - this.Visible = true; - this.Activate(); - this.BringToFront(); - Extensions.Extensions.Restore(this); + _trayIcon.Hide(); } public Settings ReadSettingsAndLock() @@ -116,33 +94,29 @@ namespace JiraTimeBotForm var settings = ReadSettingsAndLock(); LockUnlock(true); - var password = new EncryptionClass().Encrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl); - settings.JiraPassword = password; - - var settingsString = JsonConvert.SerializeObject(settings); - File.WriteAllText(_settingsPath, settingsString); + settings.Save(); MessageBox.Show("Settings saved."); - LoadSettings(); + settings = Settings.Load(); + if (settings != null) + { + SetSettings(settings); + } } private void Form1_Load(object sender, EventArgs e) { - if (File.Exists(_settingsPath)) + var settings = Settings.Load(); + if (settings != null) { - LoadSettings(); + SetSettings(settings); } } - private void LoadSettings() + private void SetSettings(Settings settings) { - var settingsText = File.ReadAllText(_settingsPath); - var settings = JsonConvert.DeserializeObject(settingsText); - - var password = new EncryptionClass().Decrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl); - txtJiraLogin.Text = settings.JiraUserName; - txtJiraPassword.Text = password; + txtJiraPassword.Text = settings.JiraPassword; txtMercurialEmail.Text = settings.MercurialAuthorEmail; txtRepoPath.Text = settings.RepositoryPath; actTime.Text = settings.ActivationTime.ToString("hh\\:mm\\:ss"); @@ -162,7 +136,7 @@ namespace JiraTimeBotForm using (_tokenSource = GetTokenSource()) { - await _job.DoTheJob(settings, new WorkLogTasksProcessor(_log), _tokenSource.Token); + await _job.DoTheJob(settings, _tasksProcessors.WorkLogTasksProcessor, _tokenSource.Token); } LockUnlock(true); @@ -172,13 +146,13 @@ namespace JiraTimeBotForm { if (FormWindowState.Minimized == this.WindowState) { - _trayIcon.Visible = true; + _trayIcon.Show(); this.Hide(); } else if (FormWindowState.Normal == this.WindowState) { - _trayIcon.Visible = false; + _trayIcon.Hide(); } } @@ -208,7 +182,7 @@ namespace JiraTimeBotForm using (var tokenSource = GetTokenSource()) { - await _job.DoTheJob(settings, new WorkLogTasksProcessor(_log), tokenSource.Token); + await _job.DoTheJob(settings, _tasksProcessors.WorkLogTasksProcessor, tokenSource.Token); } LockUnlock(true); @@ -227,7 +201,7 @@ namespace JiraTimeBotForm using (_tokenSource = GetTokenSource()) { - await _job.DoTheJob(settings, new MeetingProcessor(_log), _tokenSource.Token); + await _job.DoTheJob(settings, _tasksProcessors.MeetingProcessor, _tokenSource.Token); } LockUnlock(true); diff --git a/JiraTimeBotForm/frmMain.resx b/JiraTimeBotForm/UI/frmMain.resx similarity index 100% rename from JiraTimeBotForm/frmMain.resx rename to JiraTimeBotForm/UI/frmMain.resx diff --git a/JiraTimeBotForm/packages.config b/JiraTimeBotForm/packages.config index 5f9a3fa..d5d27db 100644 --- a/JiraTimeBotForm/packages.config +++ b/JiraTimeBotForm/packages.config @@ -1,6 +1,9 @@  + + +