├── .gitattributes ├── .gitignore ├── EveChatNotifier.sln ├── EveChatNotifier ├── App_Readme │ └── Spring.Rest.txt ├── AutoUpdate │ └── AutoUpdater.xml ├── Autostart │ └── ManageAutostart.cs ├── Cleanup.cs ├── EveChatNotifier.csproj ├── Extensions.cs ├── FormMain.Designer.cs ├── FormMain.cs ├── FormMain.resx ├── GithubUpdater │ ├── GithubRelease.cs │ ├── GithubReleaseRestSharp.cs │ ├── GithubUpdateCheck.cs │ └── UpdaterXml.cs ├── HelperControls │ ├── FileChooser.Designer.cs │ ├── FileChooser.cs │ ├── FileChooser.resx │ ├── FolderChooser.Designer.cs │ ├── FolderChooser.cs │ └── FolderChooser.resx ├── IdleDetector │ └── LastInput.cs ├── License.txt ├── LogFile.cs ├── LogHeaderReader.cs ├── LogReader.cs ├── Logging.cs ├── NotificationIcon.cs ├── Notifier.cs ├── PathHelper.cs ├── Program.cs ├── Properties.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ ├── Settings.settings │ └── app.manifest ├── Props │ └── Program.cs ├── Resources │ └── eve-logo-landing2.png ├── Screenshots │ ├── NotifyIcon.png │ ├── Settings.png │ └── Toast.png ├── Settings.Designer.cs ├── Settings.cs ├── Settings.resx ├── ShowAllNotifications.Designer.cs ├── ShowAllNotifications.cs ├── ShowAllNotifications.resx ├── app.config ├── notify.mp3 ├── packages.config └── preferences_desktop_notification_bell.ico ├── README.md └── log.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | project.fragment.lock.json 46 | artifacts/ 47 | 48 | *_i.c 49 | *_p.c 50 | *_i.h 51 | *.ilk 52 | *.meta 53 | *.obj 54 | *.pch 55 | *.pdb 56 | *.pgc 57 | *.pgd 58 | *.rsp 59 | *.sbr 60 | *.tlb 61 | *.tli 62 | *.tlh 63 | *.tmp 64 | *.tmp_proj 65 | *.log 66 | *.vspscc 67 | *.vssscc 68 | .builds 69 | *.pidb 70 | *.svclog 71 | *.scc 72 | 73 | # Chutzpah Test files 74 | _Chutzpah* 75 | 76 | # Visual C++ cache files 77 | ipch/ 78 | *.aps 79 | *.ncb 80 | *.opendb 81 | *.opensdf 82 | *.sdf 83 | *.cachefile 84 | *.VC.db 85 | *.VC.VC.opendb 86 | 87 | # Visual Studio profiler 88 | *.psess 89 | *.vsp 90 | *.vspx 91 | *.sap 92 | 93 | # TFS 2012 Local Workspace 94 | $tf/ 95 | 96 | # Guidance Automation Toolkit 97 | *.gpState 98 | 99 | # ReSharper is a .NET coding add-in 100 | _ReSharper*/ 101 | *.[Rr]e[Ss]harper 102 | *.DotSettings.user 103 | 104 | # JustCode is a .NET coding add-in 105 | .JustCode 106 | 107 | # TeamCity is a build add-in 108 | _TeamCity* 109 | 110 | # DotCover is a Code Coverage Tool 111 | *.dotCover 112 | 113 | # NCrunch 114 | _NCrunch_* 115 | .*crunch*.local.xml 116 | nCrunchTemp_* 117 | 118 | # MightyMoose 119 | *.mm.* 120 | AutoTest.Net/ 121 | 122 | # Web workbench (sass) 123 | .sass-cache/ 124 | 125 | # Installshield output folder 126 | [Ee]xpress/ 127 | 128 | # DocProject is a documentation generator add-in 129 | DocProject/buildhelp/ 130 | DocProject/Help/*.HxT 131 | DocProject/Help/*.HxC 132 | DocProject/Help/*.hhc 133 | DocProject/Help/*.hhk 134 | DocProject/Help/*.hhp 135 | DocProject/Help/Html2 136 | DocProject/Help/html 137 | 138 | # Click-Once directory 139 | publish/ 140 | 141 | # Publish Web Output 142 | *.[Pp]ublish.xml 143 | *.azurePubxml 144 | # TODO: Comment the next line if you want to checkin your web deploy settings 145 | # but database connection strings (with potential passwords) will be unencrypted 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 150 | # checkin your Azure Web App publish settings, but sensitive information contained 151 | # in these scripts will be unencrypted 152 | PublishScripts/ 153 | 154 | # NuGet Packages 155 | *.nupkg 156 | # The packages folder can be ignored because of Package Restore 157 | **/packages/* 158 | # except build/, which is used as an MSBuild target. 159 | !**/packages/build/ 160 | # Uncomment if necessary however generally it will be regenerated when needed 161 | #!**/packages/repositories.config 162 | # NuGet v3's project.json files produces more ignoreable files 163 | *.nuget.props 164 | *.nuget.targets 165 | 166 | # Microsoft Azure Build Output 167 | csx/ 168 | *.build.csdef 169 | 170 | # Microsoft Azure Emulator 171 | ecf/ 172 | rcf/ 173 | 174 | # Windows Store app package directories and files 175 | AppPackages/ 176 | BundleArtifacts/ 177 | Package.StoreAssociation.xml 178 | _pkginfo.txt 179 | 180 | # Visual Studio cache files 181 | # files ending in .cache can be ignored 182 | *.[Cc]ache 183 | # but keep track of directories ending in .cache 184 | !*.[Cc]ache/ 185 | 186 | # Others 187 | ClientBin/ 188 | ~$* 189 | *~ 190 | *.dbmdl 191 | *.dbproj.schemaview 192 | *.jfm 193 | *.pfx 194 | *.publishsettings 195 | node_modules/ 196 | orleans.codegen.cs 197 | 198 | # Since there are multiple workflows, uncomment next line to ignore bower_components 199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 200 | #bower_components/ 201 | 202 | # RIA/Silverlight projects 203 | Generated_Code/ 204 | 205 | # Backup & report files from converting an old project file 206 | # to a newer Visual Studio version. Backup files are not needed, 207 | # because we have git ;-) 208 | _UpgradeReport_Files/ 209 | Backup*/ 210 | UpgradeLog*.XML 211 | UpgradeLog*.htm 212 | 213 | # SQL Server files 214 | *.mdf 215 | *.ldf 216 | 217 | # Business Intelligence projects 218 | *.rdl.data 219 | *.bim.layout 220 | *.bim_*.settings 221 | 222 | # Microsoft Fakes 223 | FakesAssemblies/ 224 | 225 | # GhostDoc plugin setting file 226 | *.GhostDoc.xml 227 | 228 | # Node.js Tools for Visual Studio 229 | .ntvs_analysis.dat 230 | 231 | # Visual Studio 6 build log 232 | *.plg 233 | 234 | # Visual Studio 6 workspace options file 235 | *.opt 236 | 237 | # Visual Studio LightSwitch build output 238 | **/*.HTMLClient/GeneratedArtifacts 239 | **/*.DesktopClient/GeneratedArtifacts 240 | **/*.DesktopClient/ModelManifest.xml 241 | **/*.Server/GeneratedArtifacts 242 | **/*.Server/ModelManifest.xml 243 | _Pvt_Extensions 244 | 245 | # Paket dependency manager 246 | .paket/paket.exe 247 | paket-files/ 248 | 249 | # FAKE - F# Make 250 | .fake/ 251 | 252 | # JetBrains Rider 253 | .idea/ 254 | *.sln.iml 255 | 256 | # CodeRush 257 | .cr/ 258 | 259 | # Python Tools for Visual Studio (PTVS) 260 | __pycache__/ 261 | *.pyc -------------------------------------------------------------------------------- /EveChatNotifier.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.32112.339 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EveChatNotifier", "EveChatNotifier\EveChatNotifier.csproj", "{F95A2A9C-5ACF-49DA-8AE8-0B909042D425}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {F95A2A9C-5ACF-49DA-8AE8-0B909042D425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {F95A2A9C-5ACF-49DA-8AE8-0B909042D425}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {F95A2A9C-5ACF-49DA-8AE8-0B909042D425}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {F95A2A9C-5ACF-49DA-8AE8-0B909042D425}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {DF5C93DF-991F-465A-AC96-FE2DFBEBF090} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /EveChatNotifier/App_Readme/Spring.Rest.txt: -------------------------------------------------------------------------------- 1 | Spring.NET REST Client Framework 2 | -------------------------------- 3 | Download full package with sources, documentation and examples at 4 | http://www.springframework.net/rest/ 5 | -------------------------------------------------------------------------------- /EveChatNotifier/AutoUpdate/AutoUpdater.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 2.8.6.0 4 | https://github.com/MyUncleSam/EveChatNotifier/releases/download/2.8.6.0/EveChatNotifier.2.8.6.0.zip 5 | https://github.com/MyUncleSam/EveChatNotifier/releases 6 | false 7 | -------------------------------------------------------------------------------- /EveChatNotifier/Autostart/ManageAutostart.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Windows.Forms; 6 | using Microsoft.Win32.TaskScheduler; 7 | 8 | namespace EveChatNotifier.Autostart 9 | { 10 | /// 11 | /// this class manages the autostart of the current software using the scheduler logon option 12 | /// It creates an entry for the current user which executes the program on logon. This entry 13 | /// is always enabled because it seems to be a hard 14 | /// 15 | public sealed class ManageAutostart 16 | { 17 | private static ManageAutostart _Instance = null; 18 | 19 | /// 20 | /// get the singleton instance 21 | /// 22 | /// 23 | public static ManageAutostart Instance 24 | { 25 | get 26 | { 27 | if (_Instance == null) 28 | { 29 | _Instance = new ManageAutostart(); 30 | } 31 | return _Instance; 32 | } 33 | } 34 | 35 | private const string ActionIdentifier = "EveChatNotifierAutoStart"; 36 | private const string Description = "EveChatNotifier AutoStart"; 37 | private Task AutostartTask = null; 38 | 39 | /// 40 | /// initialize the autostart entries (creates them if needed) 41 | /// 42 | private ManageAutostart() 43 | { 44 | AutostartTask = GetTask; 45 | if(GetTask == null) 46 | { 47 | CreateTask(); 48 | } 49 | 50 | CheckTask(); 51 | } 52 | 53 | /// 54 | /// checks if there is already a known task which should start the evechatnotifier 55 | /// 56 | /// 57 | public bool HasTask() 58 | { 59 | return GetTask != null; 60 | } 61 | 62 | /// 63 | /// checks the task if the execution path is up2date (because the application should be portable) 64 | /// 65 | public void CheckTask() 66 | { 67 | if(GetTask.Definition.Actions.Count != 1 || GetTask.Definition.Triggers.Count != 1) 68 | { 69 | // no idea what happened - recreate the task 70 | Logging.WriteLine("Task is no longer valid. Removing the complete task and readding it."); 71 | TaskService.Instance.RootFolder.DeleteTask(GetTask.Name); 72 | CreateTask(); 73 | } 74 | 75 | // check action 76 | ExecAction ea = (ExecAction)GetTask.Definition.Actions.First(); 77 | if(!ea.Path.Equals(Application.ExecutablePath)) 78 | { 79 | // need to update the current task path 80 | Logging.WriteLine("Task action path does not match current path - updating action path."); 81 | ea.Path = Application.ExecutablePath; 82 | ea.WorkingDirectory = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 83 | GetTask.RegisterChanges(); 84 | } 85 | } 86 | 87 | public void ChangeDelay(int minutes) 88 | { 89 | CheckTask(); 90 | 91 | // recreate the trigger 92 | GetTask.Definition.Triggers.Clear(); 93 | GetTask.Definition.Triggers.Add(GenerateLogonTrigger(minutes)); 94 | GetTask.RegisterChanges(); 95 | } 96 | 97 | /// 98 | /// registers the startup task (load on logon) for the current user 99 | /// 100 | private void CreateTask() 101 | { 102 | Logging.WriteLine("Creating the scheduler autostart task"); 103 | TaskDefinition td = TaskService.Instance.NewTask(); 104 | td.RegistrationInfo.Description = Description; 105 | td.Settings.Enabled = false; // not enabled by default 106 | td.Triggers.Add(GenerateLogonTrigger(Properties.Settings.Default.AutoStartDelayMinutes)); 107 | 108 | td.Actions.Add(Application.ExecutablePath, null, System.IO.Path.GetDirectoryName(Application.ExecutablePath)); 109 | AutostartTask = TaskService.Instance.RootFolder.RegisterTaskDefinition(Description, td); 110 | } 111 | 112 | private LogonTrigger GenerateLogonTrigger(int minutes) 113 | { 114 | LogonTrigger lt = new LogonTrigger(); 115 | lt.Enabled = true; // action is always enabled, active or not is managed using the task definition 116 | lt.Id = ActionIdentifier; 117 | lt.UserId = Environment.UserName; 118 | 119 | if (minutes > 0) 120 | lt.Delay = new TimeSpan(0, minutes, 0); 121 | else 122 | lt.Delay = new TimeSpan(0, 0, 0); 123 | 124 | return lt; 125 | } 126 | 127 | /// 128 | /// gets the task or null if not found 129 | /// 130 | public Task GetTask 131 | { 132 | get 133 | { 134 | if(AutostartTask != null) 135 | { 136 | return AutostartTask; 137 | } 138 | return TaskService.Instance.RootFolder.Tasks.Where(w => w.Name.Equals(Description, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); 139 | } 140 | } 141 | 142 | /// 143 | /// is the logon task enabled or not? 144 | /// (if it is not there it is going to be created) 145 | /// 146 | /// 147 | public bool Enabled 148 | { 149 | get 150 | { 151 | //return GetTask.Definition.Triggers[0].Enabled; 152 | return GetTask.Definition.Settings.Enabled; 153 | } 154 | set 155 | { 156 | if (GetTask.Definition.Settings.Enabled != value) 157 | { 158 | Logging.WriteLine(string.Format("Updating the logon scheduler task - switching autostart '{0}'", value ? "on" : "off")); 159 | GetTask.Definition.Settings.Enabled = value; 160 | GetTask.RegisterChanges(); 161 | } 162 | return; 163 | 164 | // old logic 165 | //if (GetTask.Definition.Triggers[0].Enabled != value) 166 | //{ 167 | // LogonTrigger lt = (LogonTrigger)GetTask.Definition.Triggers[0].Clone(); 168 | 169 | // // remove old trigger 170 | // GetTask.Definition.Triggers.Remove(GetTask.Definition.Triggers[0]); 171 | // GetTask.RegisterChanges(); 172 | 173 | // // add new one 174 | // lt.Enabled = value; 175 | // GetTask.Definition.Triggers.Add(lt); 176 | // GetTask.RegisterChanges(); 177 | 178 | // Logging.WriteLine(string.Format("Updated the logon scheduler task - switched '{0}'", lt.Enabled ? "on" : "off")); 179 | //} 180 | } 181 | } 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /EveChatNotifier/Cleanup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace EveChatNotifier 7 | { 8 | public class Cleanup 9 | { 10 | private static Cleanup _Instance = null; 11 | 12 | private Cleanup() { } 13 | 14 | public static Cleanup GetInstance() 15 | { 16 | if(_Instance == null) 17 | { 18 | _Instance = new Cleanup(); 19 | _Instance.FilesToDelete = new List(); 20 | } 21 | return _Instance; 22 | } 23 | 24 | /// 25 | /// Files which should be delete before the program closes 26 | /// 27 | public List FilesToDelete { get; set; } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /EveChatNotifier/EveChatNotifier.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {F95A2A9C-5ACF-49DA-8AE8-0B909042D425} 8 | WinExe 9 | EveChatNotifier 10 | EveChatNotifier 11 | v4.5.2 12 | 512 13 | 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | false 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | false 35 | 36 | 37 | preferences_desktop_notification_bell.ico 38 | 39 | 40 | 41 | ..\packages\Autoupdater.NET.Official.1.7.0\lib\net45\AutoUpdater.NET.dll 42 | 43 | 44 | ..\packages\TaskScheduler.2.10.0\lib\net452\Microsoft.Win32.TaskScheduler.dll 45 | 46 | 47 | ..\packages\NAudio.1.8.4\lib\net35\NAudio.dll 48 | 49 | 50 | ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll 51 | 52 | 53 | 54 | ..\packages\RestSharp.106.12.0\lib\net452\RestSharp.dll 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | ..\packages\Tulpep.NotificationWindow.1.1.38\lib\net40\Tulpep.NotificationWindow.dll 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | UserControl 89 | 90 | 91 | FileChooser.cs 92 | 93 | 94 | Form 95 | 96 | 97 | FormMain.cs 98 | 99 | 100 | UserControl 101 | 102 | 103 | FolderChooser.cs 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | Form 114 | 115 | 116 | Settings.cs 117 | 118 | 119 | Form 120 | 121 | 122 | ShowAllNotifications.cs 123 | 124 | 125 | FileChooser.cs 126 | 127 | 128 | FormMain.cs 129 | 130 | 131 | FolderChooser.cs 132 | 133 | 134 | ResXFileCodeGenerator 135 | Resources.Designer.cs 136 | Designer 137 | 138 | 139 | True 140 | Resources.resx 141 | True 142 | 143 | 144 | Settings.cs 145 | 146 | 147 | ShowAllNotifications.cs 148 | 149 | 150 | 151 | 152 | SettingsSingleFileGenerator 153 | Settings.Designer.cs 154 | 155 | 156 | True 157 | Settings.settings 158 | True 159 | 160 | 161 | 162 | 163 | 164 | Always 165 | 166 | 167 | 168 | 169 | 170 | 171 | Always 172 | 173 | 174 | 175 | 176 | -------------------------------------------------------------------------------- /EveChatNotifier/Extensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace EveChatNotifier 7 | { 8 | public static class Extensions 9 | { 10 | public static void AddIfNotExist(this List theList, T entry) 11 | { 12 | if(!theList.Contains(entry)) 13 | { 14 | theList.Add(entry); 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /EveChatNotifier/FormMain.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace EveChatNotifier 2 | { 3 | partial class FormMain 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Windows Form-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain)); 33 | this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); 34 | this.SuspendLayout(); 35 | // 36 | // notifyIcon 37 | // 38 | this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); 39 | this.notifyIcon.Text = "notifyIcon1"; 40 | this.notifyIcon.Visible = true; 41 | this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick); 42 | // 43 | // FormMain 44 | // 45 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 46 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 47 | this.ClientSize = new System.Drawing.Size(0, 0); 48 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 49 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 50 | this.MaximizeBox = false; 51 | this.MinimizeBox = false; 52 | this.Name = "FormMain"; 53 | this.Text = "Loading ..."; 54 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMain_FormClosing); 55 | this.Load += new System.EventHandler(this.FormMain_Load); 56 | this.Shown += new System.EventHandler(this.FormMain_Shown); 57 | this.ResumeLayout(false); 58 | 59 | } 60 | 61 | #endregion 62 | 63 | private System.Windows.Forms.NotifyIcon notifyIcon; 64 | } 65 | } 66 | 67 | -------------------------------------------------------------------------------- /EveChatNotifier/FormMain.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Media; 9 | using System.Text; 10 | using System.Windows.Forms; 11 | using AutoUpdaterDotNET; 12 | 13 | namespace EveChatNotifier 14 | { 15 | public partial class FormMain : Form 16 | { 17 | private Timer t = new Timer(); 18 | private List _LogFiles = new List(); 19 | private DateTime lastNotified = DateTime.Now; 20 | private Settings _Settings = null; 21 | 22 | private string PathEveChatLogs; 23 | private string PathMoveOldLogs; 24 | private string PathSoundFile; 25 | 26 | public FormMain() 27 | { 28 | // properties upgrade logic 29 | if (Properties.Settings.Default.NeedsUpgrade) 30 | { 31 | Properties.Settings.Default.Upgrade(); 32 | Properties.Settings.Default.NeedsUpgrade = false; 33 | Properties.Settings.Default.Save(); 34 | Properties.Settings.Default.Reload(); 35 | } 36 | 37 | // bugfix for empty paths 38 | bool pathFix = false; 39 | if (string.IsNullOrWhiteSpace(Properties.Settings.Default.MoveOldLogsPath)) 40 | { 41 | Properties.Settings.Default.MoveOldLogsPath = "%DEFAULT_EVEOLDPATH%"; 42 | pathFix = true; 43 | } 44 | if (string.IsNullOrWhiteSpace(Properties.Settings.Default.EveChatLogsPath)) 45 | { 46 | Properties.Settings.Default.EveChatLogsPath = "%DEFAULT_EVELOGPATH%"; 47 | pathFix = true; 48 | } 49 | if (pathFix) 50 | { 51 | Properties.Settings.Default.Save(); 52 | Properties.Settings.Default.Reload(); 53 | } 54 | 55 | // first launch ask for move logs 56 | if (!Properties.Settings.Default.AskedToMoveLogs) 57 | { 58 | if (!Properties.Settings.Default.MoveOldLogs) 59 | { 60 | if (MessageBox.Show(string.Format("Do you want to let the program move your old log files?{0}{0}Moving the log files is a huge performance boost and highly recommended! If you do not move the logs, this program could need a lot of cpu power.{0}{0}This can be enabled/disabled in the settings at any time.", Environment.NewLine), "Activate log moving", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) 61 | { 62 | Properties.Settings.Default.MoveOldLogs = true; 63 | } 64 | } 65 | 66 | Properties.Settings.Default.AskedToMoveLogs = true; 67 | Properties.Settings.Default.Save(); 68 | Properties.Settings.Default.Reload(); 69 | } 70 | 71 | // set real paths 72 | PathEveChatLogs = PathHelper.DecryptPath(Properties.Settings.Default.EveChatLogsPath); 73 | PathMoveOldLogs = PathHelper.DecryptPath(Properties.Settings.Default.MoveOldLogsPath); 74 | PathSoundFile = PathHelper.DecryptPath(Properties.Settings.Default.SoundFilePath); 75 | 76 | // create old log folder if needed (and move logs) 77 | if (Properties.Settings.Default.MoveOldLogs) 78 | { 79 | if (!System.IO.Directory.Exists(PathMoveOldLogs)) 80 | { 81 | System.IO.Directory.CreateDirectory(PathMoveOldLogs); 82 | } 83 | 84 | // move old logs 85 | string[] logFiles = System.IO.Directory.GetFiles(PathEveChatLogs, "*.txt", SearchOption.TopDirectoryOnly); 86 | foreach (string logFile in logFiles) 87 | { 88 | string moveDestination = System.IO.Path.Combine(PathMoveOldLogs, System.IO.Path.GetFileName(logFile)); 89 | try 90 | { 91 | System.IO.File.Move(logFile, moveDestination); 92 | Logging.WriteLine(string.Format("Moved old log file '{0}' to '{1}'", logFile, moveDestination)); 93 | } 94 | catch (Exception ex) 95 | { 96 | Logging.WriteLine(string.Format("Unable to move old log '{0}' to '{1}'", logFile, moveDestination)); 97 | } 98 | } 99 | } 100 | 101 | // delete old logs 102 | if (Properties.Settings.Default.DeleteLogs) 103 | { 104 | string[] logFIles = System.IO.Directory.GetFiles(PathEveChatLogs, "*.txt", SearchOption.TopDirectoryOnly); 105 | foreach (string logFIle in logFIles) 106 | { 107 | try 108 | { 109 | System.IO.File.Delete(logFIle); 110 | Logging.WriteLine(string.Format("Deleted old log file '{0}'", logFIle)); 111 | } 112 | catch(Exception ex) 113 | { 114 | Logging.WriteLine(string.Format("Unablt to delete old log '{1}':{0}´{1}", Environment.NewLine, logFIle, ex.ToString())); 115 | } 116 | } 117 | } 118 | 119 | Logging.WriteLine("Starting chat notifier."); 120 | 121 | this.StartPosition = FormStartPosition.Manual; 122 | this.Location = new Point(int.MinValue, int.MinValue); 123 | InitializeComponent(); 124 | 125 | // set version information 126 | notifyIcon.Text = string.Format("EveChatNotifier - v{0}", Application.ProductVersion); 127 | 128 | // initialize timer - this timer has to watch all folders for log files 129 | Logging.WriteLine("Starting log watcher timer"); 130 | t.Tick += T_Tick; 131 | t.Interval = Properties.Settings.Default.EveChatLogCheckInterval * 1000; // check all X seconds for new log files 132 | t.Start(); 133 | T_Tick(null, null); 134 | 135 | // generate notify menu entries 136 | ContextMenu cm = new ContextMenu(); 137 | MenuItem cmExit = new MenuItem("Exit"); 138 | MenuItem cmSettings = new MenuItem("Settings"); 139 | MenuItem cmHomepage = new MenuItem("Homepage"); 140 | MenuItem cmVersion = new MenuItem(string.Format("v{0}", Application.ProductVersion)); 141 | MenuItem cmCheckUpdate = new MenuItem("Check for update"); 142 | MenuItem cmContributors = new MenuItem("Contributors"); 143 | 144 | // version 145 | cmVersion.Enabled = false; 146 | cm.MenuItems.Add(cmVersion); 147 | 148 | // auto update check 149 | cmCheckUpdate.Click += CmCheckUpdate_Click; 150 | cm.MenuItems.Add(cmCheckUpdate); 151 | 152 | cm.MenuItems.Add("-"); 153 | 154 | // settings 155 | cmSettings.Click += CmSettings_Click; 156 | cm.MenuItems.Add(cmSettings); 157 | 158 | cm.MenuItems.Add("-"); 159 | 160 | // homepage 161 | cmHomepage.Click += CmHomepage_Click; 162 | cm.MenuItems.Add(cmHomepage); 163 | 164 | // made by / contributors 165 | cmContributors.Click += CmContributors_Click; 166 | cm.MenuItems.Add(cmContributors); 167 | 168 | cm.MenuItems.Add("-"); 169 | 170 | // exit 171 | cmExit.Click += CmExit_Click; 172 | cm.MenuItems.Add(cmExit); 173 | 174 | notifyIcon.ContextMenu = cm; 175 | 176 | // autostart 177 | try 178 | { 179 | Autostart.ManageAutostart.Instance.CheckTask(); 180 | } 181 | catch (Exception ex) 182 | { 183 | Logging.WriteLine(string.Format("Error checking for autostart:{0}{1}", Environment.NewLine, ex.ToString())); 184 | } 185 | } 186 | 187 | private void CmContributors_Click(object sender, EventArgs e) 188 | { 189 | System.Diagnostics.Process.Start("https://github.com/MyUncleSam/EveChatNotifier/graphs/contributors"); 190 | } 191 | 192 | private void CmCheckUpdate_Click(object sender, EventArgs e) 193 | { 194 | Notifier.GetInstance().Notify("Update check", "Checking for update - if there is a new version you get a new window appears leading your throught the update process."); 195 | CheckForUpdate(); 196 | } 197 | 198 | private void CmHomepage_Click(object sender, EventArgs e) 199 | { 200 | System.Diagnostics.Process.Start("https://github.com/MyUncleSam/EveChatNotifier"); 201 | } 202 | 203 | private void CmSettings_Click(object sender, EventArgs e) 204 | { 205 | notifyIcon_DoubleClick(null, null); 206 | } 207 | 208 | private void CmExit_Click(object sender, EventArgs e) 209 | { 210 | this.Close(); 211 | } 212 | 213 | /// 214 | /// timer to check for log files 215 | /// 216 | /// 217 | /// 218 | private void T_Tick(object sender, EventArgs e) 219 | { 220 | t.Stop(); 221 | 222 | try 223 | { 224 | string[] logFiles = System.IO.Directory.GetFiles(PathEveChatLogs, "*.txt", SearchOption.TopDirectoryOnly); 225 | 226 | // iterate throught all files and generat logfire entries 227 | foreach (string curLogFile in logFiles) 228 | { 229 | if (_LogFiles.Exists(exist => exist.FilePath == curLogFile)) 230 | { 231 | continue; // already known log file 232 | } 233 | 234 | // only add logfiles which are last modified in the past X hour 235 | if ((DateTime.Now - System.IO.File.GetLastWriteTime(curLogFile)).TotalHours > Properties.Settings.Default.MaxAgeForWatchingLogs) 236 | { 237 | continue; 238 | } 239 | 240 | // new log file - add to list 241 | LogFile toAdd = new LogFile(curLogFile); 242 | toAdd.NewChatLines += NewChatLines; 243 | toAdd.RemovedLog += ToAdd_RemovedLog; 244 | 245 | _LogFiles.Add(toAdd); 246 | 247 | Logging.WriteLine(string.Format("Watching new log file: {0}", curLogFile)); 248 | } 249 | } 250 | catch (Exception ex) 251 | { 252 | Logging.WriteLine(string.Format("Error getting log files:{0}{1}", Environment.NewLine, ex.ToString())); 253 | } 254 | finally 255 | { 256 | t.Start(); 257 | } 258 | } 259 | 260 | private void ToAdd_RemovedLog(object sender, LogFile.EveChatEventArgs e) 261 | { 262 | Logging.WriteLine(string.Format("Removed log file from watching: {0}", ((LogFile)sender).FilePath)); 263 | _LogFiles.Remove((LogFile)sender); 264 | } 265 | 266 | private void NewChatLines(object sender, LogFile.EveChatEventArgs e) 267 | { 268 | LogFile curLog = (LogFile)sender; 269 | 270 | // check for channel ignore list 271 | if (IsIgnoredChannel(curLog)) 272 | { 273 | return; 274 | } 275 | 276 | string logLines = e.NewLogLines; 277 | 278 | // check log lines - line for line 279 | StringReader sr = new StringReader(logLines); 280 | 281 | string curLine = null; 282 | while ((curLine = sr.ReadLine()) != null) 283 | { 284 | curLine = curLine.Trim(); 285 | 286 | LogEntry le = LogReader.GetLogEntry(curLine); 287 | 288 | if (Properties.Settings.Default.LogAllMessages) 289 | { 290 | Logging.WriteLine(string.Format("{3}: Message from '{0}' in '{1}': {2}", le.Sender, curLog.LogInfo.ChannelName, le.Text, curLog.LogInfo.PilotName)); 291 | } 292 | 293 | // unable to read sender - but we need it so do nothing 294 | if (string.IsNullOrWhiteSpace(le.Sender)) 295 | { 296 | continue; 297 | } 298 | 299 | // check if sender is current user (ignore if user wants to ignore this messages) 300 | if (Properties.Settings.Default.IgnoreOwnMessages && le.Sender.Equals(curLog.LogInfo.PilotName, StringComparison.OrdinalIgnoreCase)) 301 | { 302 | continue; 303 | } 304 | // check if sender is "EVE-System" to prevent MOTD notifications 305 | if (Properties.Settings.Default.IgnoreMotd && le.Sender.Equals(Properties.Settings.Default.MotdUsername.Trim(), StringComparison.OrdinalIgnoreCase)) 306 | { 307 | continue; 308 | } 309 | // check if the sender is on the ignore list 310 | if (IsIgnoredPilot(le)) 311 | { 312 | continue; 313 | } 314 | bool needsNotify = false; 315 | // check if sender or channel is in always list 316 | if (IsAlwaysPilot(le) || IsAlwaysChannel(curLog)) 317 | { 318 | needsNotify = true; 319 | } 320 | // check if notification is needed 321 | if (le.Text.ToLower().Contains(curLog.LogInfo.PilotName.ToLower())) 322 | { 323 | needsNotify = true; 324 | } 325 | if (!string.IsNullOrWhiteSpace(Properties.Settings.Default.NotifyKeywords)) 326 | { 327 | string[] alsoCheck = Properties.Settings.Default.NotifyKeywords.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 328 | foreach (string toCheck in alsoCheck) 329 | { 330 | if (le.Text.ToLower().Contains(toCheck.Trim().ToLower())) 331 | { 332 | needsNotify = true; 333 | break; 334 | } 335 | } 336 | } 337 | 338 | // if notification is needed 339 | if (needsNotify) // isPlaying is managing the notification using sound (only one at a time) 340 | { 341 | Logging.WriteLine(string.Format("{3}: Notify for chat message of '{0}' in '{1}': {2}", le.Sender, curLog.LogInfo.ChannelName, le.Text, curLog.LogInfo.PilotName)); 342 | Notifier.GetInstance().Notify(string.Format("{0} in '{1}'", le.Sender, curLog.LogInfo.ChannelName), le.Text, PathHelper.DecryptPath(Properties.Settings.Default.SoundFilePath)); 343 | } 344 | } 345 | } 346 | 347 | /// 348 | /// check if the current logfile is on the ignore list for channels 349 | /// 350 | /// 351 | /// 352 | public bool IsIgnoredChannel(LogFile lf) 353 | { 354 | if (string.IsNullOrWhiteSpace(Properties.Settings.Default.IgnoreChannels)) 355 | { 356 | return false; 357 | } 358 | 359 | string[] ignoreChannels = Properties.Settings.Default.IgnoreChannels.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 360 | return ignoreChannels.Any(a => a.Trim().Equals(lf.LogInfo.ChannelName, StringComparison.OrdinalIgnoreCase)); 361 | } 362 | 363 | /// 364 | /// check if the sender is on the ignore list 365 | /// 366 | /// 367 | /// 368 | public bool IsIgnoredPilot(LogEntry le) 369 | { 370 | if (string.IsNullOrWhiteSpace(Properties.Settings.Default.IgnorePilots)) 371 | { 372 | return false; 373 | } 374 | 375 | string[] ignorePilots = Properties.Settings.Default.IgnorePilots.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 376 | return ignorePilots.Any(a => a.Trim().Equals(le.Sender.Trim(), StringComparison.OrdinalIgnoreCase)); 377 | } 378 | /// 379 | /// check if the current logfile is on the Always list for channels 380 | /// 381 | /// 382 | /// 383 | public bool IsAlwaysChannel(LogFile lf) 384 | { 385 | if (string.IsNullOrWhiteSpace(Properties.Settings.Default.AlwaysChannels)) 386 | { 387 | return false; 388 | } 389 | 390 | string[] alwaysChannels = Properties.Settings.Default.AlwaysChannels.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 391 | return alwaysChannels.Any(a => a.Trim().Equals(lf.LogInfo.ChannelName, StringComparison.OrdinalIgnoreCase)); 392 | } 393 | 394 | /// 395 | /// check if the sender is on the always list 396 | /// 397 | /// 398 | /// 399 | public bool IsAlwaysPilot(LogEntry le) 400 | { 401 | if (string.IsNullOrWhiteSpace(Properties.Settings.Default.AlwaysPilots)) 402 | { 403 | return false; 404 | } 405 | 406 | string[] alwaysPilots = Properties.Settings.Default.AlwaysPilots.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 407 | return alwaysPilots.Any(a => a.Trim().Equals(le.Sender.Trim(), StringComparison.OrdinalIgnoreCase)); 408 | } 409 | 410 | private void notifyIcon_DoubleClick(object sender, EventArgs e) 411 | { 412 | if (_Settings == null) 413 | { 414 | _Settings = new Settings(); 415 | _Settings.ShowDialog(); 416 | _Settings = null; 417 | } 418 | else 419 | { 420 | _Settings.Focus(); 421 | } 422 | } 423 | 424 | private void FormMain_Shown(object sender, EventArgs e) 425 | { 426 | this.Hide(); 427 | CheckForUpdate(); 428 | } 429 | 430 | public void CheckForUpdate() 431 | { 432 | // check for new version 433 | if (Properties.Settings.Default.CheckForUpdates) 434 | { 435 | Github.GithubUpdateCheck.UpdateUsingLocalXmlFile("MyUncleSam", "EveChatNotifier"); 436 | } 437 | } 438 | 439 | private void FormMain_FormClosing(object sender, FormClosingEventArgs e) 440 | { 441 | Logging.WriteLine("Cleanup ..."); 442 | foreach (string file in Cleanup.GetInstance().FilesToDelete) 443 | { 444 | try 445 | { 446 | Logging.WriteLine(string.Format("Deleting file '{0}'", file)); 447 | System.IO.File.Delete(file); 448 | } 449 | catch (Exception ex) 450 | { 451 | Logging.WriteLine(string.Format("Unable to delete file: {0}", ex.Message)); 452 | } 453 | } 454 | 455 | Logging.WriteLine("Stopping chat notifier."); 456 | Properties.Settings.Default.Save(); 457 | } 458 | 459 | private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) 460 | { 461 | if (_Settings == null) 462 | { 463 | _Settings = new Settings(); 464 | _Settings.ShowDialog(); 465 | _Settings = null; 466 | } 467 | else 468 | { 469 | _Settings.Focus(); 470 | } 471 | } 472 | 473 | private void FormMain_Load(object sender, EventArgs e) 474 | { 475 | 476 | } 477 | } 478 | } 479 | -------------------------------------------------------------------------------- /EveChatNotifier/GithubUpdater/GithubRelease.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace EveChatNotifier.Github 7 | { 8 | public class GithubRelease 9 | { 10 | public string url { get; set; } 11 | public string assets_url { get; set; } 12 | public string upload_url { get; set; } 13 | public string html_url { get; set; } 14 | public int id { get; set; } 15 | public string tag_name { get; set; } 16 | public string target_commitish { get; set; } 17 | public string name { get; set; } 18 | public bool draft { get; set; } 19 | public Author author { get; set; } 20 | public bool prerelease { get; set; } 21 | public DateTime created_at { get; set; } 22 | public DateTime published_at { get; set; } 23 | public Asset[] assets { get; set; } 24 | public string tarball_url { get; set; } 25 | public string zipball_url { get; set; } 26 | public string body { get; set; } 27 | } 28 | 29 | public class Author 30 | { 31 | public string login { get; set; } 32 | public int id { get; set; } 33 | public string avatar_url { get; set; } 34 | public string gravatar_id { get; set; } 35 | public string url { get; set; } 36 | public string html_url { get; set; } 37 | public string followers_url { get; set; } 38 | public string following_url { get; set; } 39 | public string gists_url { get; set; } 40 | public string starred_url { get; set; } 41 | public string subscriptions_url { get; set; } 42 | public string organizations_url { get; set; } 43 | public string repos_url { get; set; } 44 | public string events_url { get; set; } 45 | public string received_events_url { get; set; } 46 | public string type { get; set; } 47 | public bool site_admin { get; set; } 48 | } 49 | 50 | public class Asset 51 | { 52 | public string url { get; set; } 53 | public int id { get; set; } 54 | public string name { get; set; } 55 | public object label { get; set; } 56 | public Uploader uploader { get; set; } 57 | public string content_type { get; set; } 58 | public string state { get; set; } 59 | public int size { get; set; } 60 | public int download_count { get; set; } 61 | public DateTime created_at { get; set; } 62 | public DateTime updated_at { get; set; } 63 | public string browser_download_url { get; set; } 64 | } 65 | 66 | public class Uploader 67 | { 68 | public string login { get; set; } 69 | public int id { get; set; } 70 | public string avatar_url { get; set; } 71 | public string gravatar_id { get; set; } 72 | public string url { get; set; } 73 | public string html_url { get; set; } 74 | public string followers_url { get; set; } 75 | public string following_url { get; set; } 76 | public string gists_url { get; set; } 77 | public string starred_url { get; set; } 78 | public string subscriptions_url { get; set; } 79 | public string organizations_url { get; set; } 80 | public string repos_url { get; set; } 81 | public string events_url { get; set; } 82 | public string received_events_url { get; set; } 83 | public string type { get; set; } 84 | public bool site_admin { get; set; } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /EveChatNotifier/GithubUpdater/GithubReleaseRestSharp.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace EveChatNotifier.GithubUpdater 10 | { 11 | public class GithubReleaseRestSharp 12 | { 13 | public string url { get; set; } 14 | public string assets_url { get; set; } 15 | public string upload_url { get; set; } 16 | public string html_url { get; set; } 17 | public int id { get; set; } 18 | public string tag_name { get; set; } 19 | public string target_commitish { get; set; } 20 | public string name { get; set; } 21 | public bool draft { get; set; } 22 | public Author author { get; set; } 23 | public bool prerelease { get; set; } 24 | public DateTime created_at { get; set; } 25 | public DateTime published_at { get; set; } 26 | public List assets { get; set; } 27 | public string tarball_url { get; set; } 28 | public string zipball_url { get; set; } 29 | public string body { get; set; } 30 | } 31 | 32 | public class Author 33 | { 34 | public string login { get; set; } 35 | public int id { get; set; } 36 | public string avatar_url { get; set; } 37 | public string gravatar_id { get; set; } 38 | public string url { get; set; } 39 | public string html_url { get; set; } 40 | public string followers_url { get; set; } 41 | public string following_url { get; set; } 42 | public string gists_url { get; set; } 43 | public string starred_url { get; set; } 44 | public string subscriptions_url { get; set; } 45 | public string organizations_url { get; set; } 46 | public string repos_url { get; set; } 47 | public string events_url { get; set; } 48 | public string received_events_url { get; set; } 49 | public string type { get; set; } 50 | public bool site_admin { get; set; } 51 | } 52 | 53 | public class Uploader 54 | { 55 | public string login { get; set; } 56 | public int id { get; set; } 57 | public string avatar_url { get; set; } 58 | public string gravatar_id { get; set; } 59 | public string url { get; set; } 60 | public string html_url { get; set; } 61 | public string followers_url { get; set; } 62 | public string following_url { get; set; } 63 | public string gists_url { get; set; } 64 | public string starred_url { get; set; } 65 | public string subscriptions_url { get; set; } 66 | public string organizations_url { get; set; } 67 | public string repos_url { get; set; } 68 | public string events_url { get; set; } 69 | public string received_events_url { get; set; } 70 | public string type { get; set; } 71 | public bool site_admin { get; set; } 72 | } 73 | 74 | public class Asset 75 | { 76 | public string url { get; set; } 77 | public int id { get; set; } 78 | public string name { get; set; } 79 | public object label { get; set; } 80 | public Uploader uploader { get; set; } 81 | public string content_type { get; set; } 82 | public string state { get; set; } 83 | public int size { get; set; } 84 | public int download_count { get; set; } 85 | public DateTime created_at { get; set; } 86 | public DateTime updated_at { get; set; } 87 | public string browser_download_url { get; set; } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /EveChatNotifier/GithubUpdater/GithubUpdateCheck.cs: -------------------------------------------------------------------------------- 1 | using AutoUpdaterDotNET; 2 | using RestSharp; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Net; 8 | using System.Text; 9 | using System.Xml.Serialization; 10 | 11 | namespace EveChatNotifier.Github 12 | { 13 | public static class GithubUpdateCheck 14 | { 15 | private static WebClient wc = new WebClient(); 16 | private static string releaseUrl = "https://github.com/{0}/{1}/releases"; 17 | 18 | /// 19 | /// extracts the version information from github (version = tag) and create an AutoUpdate.NET compatible xml file for update procedure 20 | /// 21 | /// 22 | /// 23 | public static void UpdateUsingLocalXmlFile(string gitUserName, string repoName) 24 | { 25 | releaseUrl = string.Format(releaseUrl, gitUserName, repoName); 26 | 27 | try 28 | { 29 | // no idea why but we need to fallback to TSL1.2 in order to retrieve github information ... 30 | //ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; 31 | //ServicePointManager.Expect100Continue = true; 32 | ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 33 | 34 | Uri reqUri = new Uri(string.Format(@"http://api.github.com/repos/{0}/{1}/releases/latest", gitUserName, repoName)); 35 | 36 | RestClient client = new RestClient(@"https://api.github.com"); 37 | RestRequest request = new RestRequest("repos/{username}/{reponame}/releases/latest", Method.GET); 38 | request.AddUrlSegment("username", gitUserName); 39 | request.AddUrlSegment("reponame", repoName); 40 | request.AddHeader("user-agent", repoName); 41 | request.RequestFormat = DataFormat.Json; 42 | request.JsonSerializer = new RestSharp.Serialization.Json.JsonSerializer(); 43 | 44 | client.ExecuteAsync(request, (response) => 45 | { 46 | if(response.IsSuccessful) 47 | { 48 | RestReleaseCheck(response.Data); 49 | } 50 | else 51 | { 52 | Logging.WriteLine(string.Format("Unable to start update procedure:{0}{1}", Environment.NewLine, response.ErrorMessage)); 53 | } 54 | }); 55 | } 56 | catch (Exception ex) 57 | { 58 | Logging.WriteLine(string.Format("Unable to start async version check:{0}{1}", Environment.NewLine, ex.ToString())); 59 | } 60 | } 61 | 62 | /// 63 | /// RestSharp update detection 64 | /// 65 | /// 66 | private static void RestReleaseCheck(GithubUpdater.GithubReleaseRestSharp release) 67 | { 68 | try 69 | { 70 | // generate update information object 71 | UpdaterXml.item update = new UpdaterXml.item(); 72 | update.url = release.assets.Where(w => w.browser_download_url.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)).First().browser_download_url; 73 | update.version = release.tag_name; 74 | update.changelog = releaseUrl; 75 | update.mandatory = false; 76 | 77 | // generate xml file 78 | string updateUrl = null; 79 | do 80 | { 81 | updateUrl = System.IO.Path.Combine(System.IO.Path.GetTempPath(), string.Format("{0}.xml", Guid.NewGuid().ToString("N"))); 82 | } while (System.IO.File.Exists(updateUrl)); 83 | 84 | // add file to cleanup job 85 | Cleanup.GetInstance().FilesToDelete.AddIfNotExist(updateUrl); 86 | 87 | // serialize to file 88 | using (TextWriter writer = new StreamWriter(updateUrl, false)) 89 | { 90 | XmlSerializer serializer = new XmlSerializer(typeof(UpdaterXml.item)); 91 | serializer.Serialize(writer, update); 92 | writer.Close(); 93 | } 94 | 95 | // start update procedure 96 | if (Properties.Settings.Default.CheckForUpdates) 97 | { 98 | Logging.WriteLine("AutoUpdater feature enabled - checking for update in the background."); 99 | 100 | AutoUpdater.ShowRemindLaterButton = true; 101 | AutoUpdater.ReportErrors = false; 102 | AutoUpdater.Mandatory = false; 103 | AutoUpdater.ShowSkipButton = true; 104 | AutoUpdater.Start(updateUrl); 105 | } 106 | } 107 | catch(Exception ex) 108 | { 109 | Logging.WriteLine(string.Format("Unable to start update procedure:{0}{1}", Environment.NewLine, ex.ToString())); 110 | } 111 | } 112 | 113 | /// 114 | /// start auto update after download 115 | /// 116 | /// 117 | /// 118 | private static void Wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 119 | { 120 | try 121 | { 122 | GithubRelease release = Newtonsoft.Json.JsonConvert.DeserializeObject(e.Result); 123 | 124 | // generate update information object 125 | UpdaterXml.item update = new UpdaterXml.item(); 126 | update.url = release.assets.Where(w => w.browser_download_url.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)).First().browser_download_url; 127 | update.version = release.tag_name; 128 | update.changelog = releaseUrl; 129 | update.mandatory = false; 130 | 131 | // generate xml file 132 | string updateUrl = null; 133 | do 134 | { 135 | updateUrl = System.IO.Path.Combine(System.IO.Path.GetTempPath(), string.Format("{0}.xml", Guid.NewGuid().ToString("N"))); 136 | } while (System.IO.File.Exists(updateUrl)); 137 | 138 | // add file to cleanup job 139 | Cleanup.GetInstance().FilesToDelete.AddIfNotExist(updateUrl); 140 | 141 | // serialize to file 142 | using (TextWriter writer = new StreamWriter(updateUrl, false)) 143 | { 144 | XmlSerializer serializer = new XmlSerializer(typeof(UpdaterXml.item)); 145 | serializer.Serialize(writer, update); 146 | writer.Close(); 147 | } 148 | 149 | // start update procedure 150 | if (Properties.Settings.Default.CheckForUpdates) 151 | { 152 | Logging.WriteLine("AutoUpdater feature enabled - checking for update in the background."); 153 | 154 | AutoUpdater.ShowRemindLaterButton = true; 155 | AutoUpdater.ReportErrors = false; 156 | AutoUpdater.Mandatory = false; 157 | AutoUpdater.ShowSkipButton = true; 158 | AutoUpdater.Start(updateUrl); 159 | } 160 | 161 | // we cannot delete the xml file because we have no idea when the check is done by the auto updater 162 | //try 163 | //{ 164 | // System.IO.File.Delete(updateUrl); 165 | //} 166 | //catch { } 167 | } 168 | catch (Exception ex) 169 | { 170 | Logging.WriteLine(string.Format("Unable to start update procedure:{0}{1}", Environment.NewLine, ex.ToString())); 171 | } 172 | } 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /EveChatNotifier/GithubUpdater/UpdaterXml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace EveChatNotifier.Github.UpdaterXml 7 | { 8 | 9 | /// 10 | [System.SerializableAttribute()] 11 | [System.ComponentModel.DesignerCategoryAttribute("code")] 12 | [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 13 | [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 14 | public partial class item 15 | { 16 | 17 | private string versionField; 18 | 19 | private string urlField; 20 | 21 | private string changelogField; 22 | 23 | private bool mandatoryField; 24 | 25 | /// 26 | public string version 27 | { 28 | get 29 | { 30 | return this.versionField; 31 | } 32 | set 33 | { 34 | this.versionField = value; 35 | } 36 | } 37 | 38 | /// 39 | public string url 40 | { 41 | get 42 | { 43 | return this.urlField; 44 | } 45 | set 46 | { 47 | this.urlField = value; 48 | } 49 | } 50 | 51 | /// 52 | public string changelog 53 | { 54 | get 55 | { 56 | return this.changelogField; 57 | } 58 | set 59 | { 60 | this.changelogField = value; 61 | } 62 | } 63 | 64 | /// 65 | public bool mandatory 66 | { 67 | get 68 | { 69 | return this.mandatoryField; 70 | } 71 | set 72 | { 73 | this.mandatoryField = value; 74 | } 75 | } 76 | } 77 | 78 | 79 | } 80 | -------------------------------------------------------------------------------- /EveChatNotifier/HelperControls/FileChooser.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace EveChatNotifier.HelperControls 2 | { 3 | partial class FileChooser 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Komponenten-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.tbFile = new System.Windows.Forms.TextBox(); 32 | this.btnChoose = new System.Windows.Forms.Button(); 33 | this.SuspendLayout(); 34 | // 35 | // tbFile 36 | // 37 | this.tbFile.Location = new System.Drawing.Point(1, 1); 38 | this.tbFile.Name = "tbFile"; 39 | this.tbFile.ReadOnly = true; 40 | this.tbFile.Size = new System.Drawing.Size(163, 20); 41 | this.tbFile.TabIndex = 0; 42 | // 43 | // btnChoose 44 | // 45 | this.btnChoose.Location = new System.Drawing.Point(169, 0); 46 | this.btnChoose.Name = "btnChoose"; 47 | this.btnChoose.Size = new System.Drawing.Size(31, 22); 48 | this.btnChoose.TabIndex = 1; 49 | this.btnChoose.Text = "..."; 50 | this.btnChoose.UseVisualStyleBackColor = true; 51 | this.btnChoose.Click += new System.EventHandler(this.button1_Click); 52 | // 53 | // FileChooser 54 | // 55 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 56 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 57 | this.BackColor = System.Drawing.SystemColors.Window; 58 | this.Controls.Add(this.btnChoose); 59 | this.Controls.Add(this.tbFile); 60 | this.Name = "FileChooser"; 61 | this.Size = new System.Drawing.Size(200, 22); 62 | this.Resize += new System.EventHandler(this.FileChooser_Resize); 63 | this.ResumeLayout(false); 64 | this.PerformLayout(); 65 | 66 | } 67 | 68 | #endregion 69 | 70 | private System.Windows.Forms.TextBox tbFile; 71 | private System.Windows.Forms.Button btnChoose; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /EveChatNotifier/HelperControls/FileChooser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Drawing; 5 | using System.Data; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Windows.Forms; 9 | 10 | namespace EveChatNotifier.HelperControls 11 | { 12 | public partial class FileChooser : UserControl 13 | { 14 | private OpenFileDialog FileDialog { get; set; } 15 | 16 | public FileChooser() 17 | { 18 | Init(); 19 | } 20 | 21 | public void Init() 22 | { 23 | InitializeComponent(); 24 | FileDialog = new OpenFileDialog(); 25 | } 26 | 27 | private void button1_Click(object sender, EventArgs e) 28 | { 29 | if(FileDialog.ShowDialog() == DialogResult.OK) 30 | { 31 | if(FileDialog.CheckFileExists) 32 | { 33 | tbFile.Text = FileDialog.FileName; 34 | } 35 | else 36 | { 37 | tbFile.Text = ""; 38 | } 39 | } 40 | } 41 | 42 | public string SelectedFile 43 | { 44 | get 45 | { 46 | return tbFile.Text; 47 | } 48 | set 49 | { 50 | FileDialog.FileName = value; 51 | tbFile.Text = value; 52 | } 53 | } 54 | 55 | private void FileChooser_Resize(object sender, EventArgs e) 56 | { 57 | int newTbWidth = this.Size.Width - btnChoose.Size.Width - 1 - 5; 58 | tbFile.Size = new Size(newTbWidth, tbFile.Height); 59 | 60 | btnChoose.Location = new Point(tbFile.Location.X + tbFile.Size.Width + 5); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /EveChatNotifier/HelperControls/FileChooser.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /EveChatNotifier/HelperControls/FolderChooser.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace EveChatNotifier.HelperControls 2 | { 3 | partial class FolderChooser 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Komponenten-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.btnChoose = new System.Windows.Forms.Button(); 32 | this.tbFolder = new System.Windows.Forms.TextBox(); 33 | this.SuspendLayout(); 34 | // 35 | // btnChoose 36 | // 37 | this.btnChoose.Location = new System.Drawing.Point(169, 0); 38 | this.btnChoose.Name = "btnChoose"; 39 | this.btnChoose.Size = new System.Drawing.Size(31, 22); 40 | this.btnChoose.TabIndex = 3; 41 | this.btnChoose.Text = "..."; 42 | this.btnChoose.UseVisualStyleBackColor = true; 43 | this.btnChoose.Click += new System.EventHandler(this.btnChoose_Click); 44 | // 45 | // tbFolder 46 | // 47 | this.tbFolder.Location = new System.Drawing.Point(1, 1); 48 | this.tbFolder.Name = "tbFolder"; 49 | this.tbFolder.ReadOnly = true; 50 | this.tbFolder.Size = new System.Drawing.Size(163, 20); 51 | this.tbFolder.TabIndex = 2; 52 | // 53 | // FolderChooser 54 | // 55 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 56 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 57 | this.Controls.Add(this.btnChoose); 58 | this.Controls.Add(this.tbFolder); 59 | this.Name = "FolderChooser"; 60 | this.Size = new System.Drawing.Size(200, 22); 61 | this.Resize += new System.EventHandler(this.FolderChooser_Resize); 62 | this.ResumeLayout(false); 63 | this.PerformLayout(); 64 | 65 | } 66 | 67 | #endregion 68 | 69 | private System.Windows.Forms.Button btnChoose; 70 | private System.Windows.Forms.TextBox tbFolder; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /EveChatNotifier/HelperControls/FolderChooser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Drawing; 5 | using System.Data; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Windows.Forms; 9 | 10 | namespace EveChatNotifier.HelperControls 11 | { 12 | public partial class FolderChooser : UserControl 13 | { 14 | private FolderBrowserDialog FolderDialog { get; set; } 15 | 16 | public FolderChooser() 17 | { 18 | Init(); 19 | } 20 | 21 | public void Init() 22 | { 23 | InitializeComponent(); 24 | FolderDialog = new FolderBrowserDialog(); 25 | } 26 | 27 | private void btnChoose_Click(object sender, EventArgs e) 28 | { 29 | if(FolderDialog.ShowDialog() == DialogResult.OK) 30 | { 31 | if(System.IO.Directory.Exists(FolderDialog.SelectedPath)) 32 | { 33 | tbFolder.Text = FolderDialog.SelectedPath; 34 | } 35 | else 36 | { 37 | tbFolder.Text = ""; 38 | } 39 | } 40 | } 41 | 42 | public string SelectedFolder 43 | { 44 | get 45 | { 46 | if(FolderDialog.SelectedPath != null) 47 | { 48 | if(System.IO.Directory.Exists(FolderDialog.SelectedPath)) 49 | { 50 | return FolderDialog.SelectedPath; 51 | } 52 | } 53 | 54 | return ""; 55 | } 56 | set 57 | { 58 | FolderDialog.SelectedPath = value; 59 | tbFolder.Text = value; 60 | } 61 | } 62 | 63 | private void FolderChooser_Resize(object sender, EventArgs e) 64 | { 65 | int newTbWidth = this.Size.Width - btnChoose.Size.Width - 1 - 5; 66 | tbFolder.Size = new Size(newTbWidth, tbFolder.Height); 67 | 68 | btnChoose.Location = new Point(tbFolder.Location.X + tbFolder.Size.Width + 5); 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /EveChatNotifier/HelperControls/FolderChooser.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /EveChatNotifier/IdleDetector/LastInput.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.InteropServices; 5 | using System.Text; 6 | 7 | namespace EveChatNotifier.IdleDetector 8 | { 9 | public static class LastInput 10 | { 11 | #region pinvoke.net 12 | // thanks to: 13 | // - http://www.pinvoke.net/default.aspx/user32.getlastinputinfo 14 | // - http://www.pinvoke.net/default.aspx/Structures/LASTINPUTINFO.html 15 | 16 | [DllImport("user32.dll")] 17 | private static extern Boolean GetLastInputInfo(ref LASTINPUTINFO plii); 18 | 19 | [StructLayout(LayoutKind.Sequential)] 20 | struct LASTINPUTINFO 21 | { 22 | public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); 23 | 24 | [MarshalAs(UnmanagedType.U4)] 25 | public UInt32 cbSize; 26 | [MarshalAs(UnmanagedType.U4)] 27 | public UInt32 dwTime; 28 | } 29 | 30 | private static uint GetLastInputTime() 31 | { 32 | uint idleTime = 0; 33 | LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); 34 | lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo); 35 | lastInputInfo.dwTime = 0; 36 | 37 | uint envTicks = (uint)Environment.TickCount; 38 | 39 | if (GetLastInputInfo(ref lastInputInfo)) 40 | { 41 | uint lastInputTick = lastInputInfo.dwTime; 42 | 43 | idleTime = envTicks - lastInputTick; 44 | } 45 | 46 | return ((idleTime > 0) ? (idleTime / 1000) : 0); 47 | } 48 | #endregion 49 | 50 | /// 51 | /// returns the last intputtime / idletime of the system 52 | /// 53 | /// idletime 54 | public static TimeSpan GetAway() 55 | { 56 | return new TimeSpan(0, 0, (int)GetLastInputTime()); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /EveChatNotifier/License.txt: -------------------------------------------------------------------------------- 1 | EveChatNotifier: 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2017 Stefan Ruepp 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 11 | 12 | 13 | ####################### 14 | 15 | Icons: 16 | 17 | TrayIcon: https://findicons.com/icon/237957/preferences_desktop_notification_bell 18 | GNU/GPL: https://www.gnu.org/licenses/ (no detail information which one) 19 | 20 | ####################### 21 | 22 | notify.mp3: 23 | http://soundbible.com/2156-Text-Message-Alert-3.html 24 | 25 | Attribution 3.0 26 | https://creativecommons.org/licenses/by/3.0/ 27 | 28 | ####################### 29 | 30 | NAudio: 31 | 32 | Microsoft Public License (Ms-PL) 33 | 34 | This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. 35 | 36 | 1. Definitions 37 | 38 | The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. 39 | 40 | A "contribution" is the original software, or any additions or changes to the software. 41 | 42 | A "contributor" is any person that distributes its contribution under this license. 43 | 44 | "Licensed patents" are a contributor's patent claims that read directly on its contribution. 45 | 46 | 2. Grant of Rights 47 | 48 | (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. 49 | 50 | (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. 51 | 52 | 3. Conditions and Limitations 53 | 54 | (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. 55 | 56 | (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. 57 | 58 | (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. 59 | 60 | (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. 61 | 62 | (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. 63 | 64 | ####################### 65 | 66 | Tulpep Notification: 67 | https://raw.githubusercontent.com/Tulpep/Notification-Popup-Window/master/LICENSE 68 | 69 | The Code Project Open License 70 | http://www.codeproject.com/info/cpol10.aspx 71 | 72 | ####################### 73 | 74 | Newtonsoft.Json: 75 | https://raw.githubusercontent.com/JamesNK/Newtonsoft.Json/master/LICENSE.md 76 | 77 | The MIT License (MIT) 78 | 79 | Copyright (c) 2007 James Newton-King 80 | 81 | Permission is hereby granted, free of charge, to any person obtaining a copy of 82 | this software and associated documentation files (the "Software"), to deal in 83 | the Software without restriction, including without limitation the rights to 84 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 85 | the Software, and to permit persons to whom the Software is furnished to do so, 86 | subject to the following conditions: 87 | 88 | The above copyright notice and this permission notice shall be included in all 89 | copies or substantial portions of the Software. 90 | 91 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 92 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 93 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 94 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 95 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 96 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 97 | 98 | ####################### 99 | 100 | TaskScheduler: 101 | https://github.com/dahall/TaskScheduler/blob/master/license.md 102 | 103 | MIT Copyright (c) 2003-2010 David Hall 104 | 105 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 106 | 107 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 108 | 109 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 110 | 111 | ####################### 112 | 113 | CommandLineArgumentsParser: 114 | https://github.com/j-maly/CommandLineParser/blob/master/LICENCE.md 115 | 116 | The MIT License (MIT) 117 | 118 | Copyright (c) 2016 Jakub Malý 119 | 120 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 121 | 122 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 123 | 124 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 125 | 126 | ####################### 127 | 128 | AutoUpdater.NET: 129 | MIT License 130 | 131 | Copyright (c) 2012-2017 RBSoft 132 | 133 | Permission is hereby granted, free of charge, to any person obtaining a copy 134 | of this software and associated documentation files (the "Software"), to deal 135 | in the Software without restriction, including without limitation the rights 136 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 137 | copies of the Software, and to permit persons to whom the Software is 138 | furnished to do so, subject to the following conditions: 139 | 140 | The above copyright notice and this permission notice shall be included in all 141 | copies or substantial portions of the Software. 142 | 143 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 144 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 145 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 146 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 147 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 148 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 149 | SOFTWARE. 150 | -------------------------------------------------------------------------------- /EveChatNotifier/LogFile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Windows.Forms; 7 | 8 | namespace EveChatNotifier 9 | { 10 | public class LogFile 11 | { 12 | public string FilePath { get; private set; } 13 | public DateTime LastModified { get; set; } 14 | public HeaderInfo LogInfo { get; private set; } 15 | 16 | private Timer t = new Timer(); 17 | private long _LastSize; 18 | 19 | public LogFile(string file) 20 | { 21 | FilePath = file; 22 | LogInfo = LogHeaderReader.GetLogObject(file); 23 | _LastSize = (new FileInfo(FilePath)).Length; 24 | 25 | t.Tick += T_Tick; 26 | t.Interval = Properties.Settings.Default.FileCheckInterval * 1000; // check all 2 seconds for new log entries 27 | t.Start(); 28 | } 29 | 30 | private void T_Tick(object sender, EventArgs e) 31 | { 32 | t.Stop(); 33 | 34 | try 35 | { 36 | if(!System.IO.File.Exists(FilePath)) 37 | { 38 | Logging.WriteLine(string.Format("Logfile no longer exists: {0}", FilePath)); 39 | EveChatEventArgs eceh = new EveChatEventArgs(null); 40 | RemovedLog(this, eceh); 41 | } 42 | 43 | FileInfo fi = new FileInfo(FilePath); 44 | long curLenght = fi.Length; 45 | if ((curLenght != _LastSize)) 46 | { 47 | // open file in read only mode 48 | System.IO.FileStream fs = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite); 49 | fs.Seek(_LastSize - curLenght, System.IO.SeekOrigin.End); // jump to the last saved position 50 | _LastSize = curLenght; 51 | 52 | System.IO.StreamReader sr = new System.IO.StreamReader(fs, Encoding.UTF8, true, 512); 53 | 54 | // start reading the last part (the one who was added) 55 | // as we check every X seconds it could be more then one line per log file! 56 | string changesStr = null; 57 | while (!sr.EndOfStream) 58 | { 59 | if (changesStr == null) 60 | { 61 | changesStr = sr.ReadLine(); 62 | } 63 | else 64 | { 65 | changesStr += string.Format("{0}{1}", Environment.NewLine, sr.ReadLine()); 66 | } 67 | } 68 | 69 | // fire our event with only changes 70 | EveChatEventArgs args = new EveChatEventArgs(changesStr); 71 | NewChatLines(this, args); 72 | } 73 | } 74 | catch (Exception ex) 75 | { 76 | Logging.WriteLine(string.Format("Unable to pare log file:{0}{1}", Environment.NewLine, ex.ToString())); 77 | } 78 | 79 | t.Start(); 80 | } 81 | 82 | public class EveChatEventArgs : EventArgs 83 | { 84 | public string NewLogLines { get; private set; } 85 | 86 | public EveChatEventArgs(string changes) 87 | { 88 | NewLogLines = changes; 89 | } 90 | } 91 | 92 | public delegate void EveChatEventHandler(object sender, EveChatEventArgs e); 93 | public event EveChatEventHandler NewChatLines; 94 | public event EveChatEventHandler RemovedLog; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /EveChatNotifier/LogHeaderReader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | 7 | namespace EveChatNotifier 8 | { 9 | public static class LogHeaderReader 10 | { 11 | public static HeaderInfo GetLogObject(string filePath) 12 | { 13 | string headerInfo = GetHeaderFromFile(filePath); 14 | 15 | HeaderInfo retInfo = new HeaderInfo(); 16 | StringReader sr = new StringReader(headerInfo); 17 | 18 | string curLine = null; 19 | while((curLine = sr.ReadLine()) != null) 20 | { 21 | curLine = curLine.Trim(); 22 | if(curLine.Length <= 0 || !curLine.Contains(":")) 23 | { 24 | continue; 25 | } 26 | 27 | // get position of first ":" 28 | int splitterPos = curLine.IndexOf(':'); 29 | 30 | string key = curLine.Substring(0, splitterPos).Trim(); 31 | string value = curLine.Substring(splitterPos + 1).Trim(); 32 | 33 | if(key.Equals("Channel ID", StringComparison.OrdinalIgnoreCase)) 34 | { 35 | retInfo.ChannelId = value; 36 | } 37 | if(key.Equals("Channel Name", StringComparison.OrdinalIgnoreCase)) 38 | { 39 | retInfo.ChannelName = value; 40 | } 41 | if(key.Equals("Listener", StringComparison.OrdinalIgnoreCase)) 42 | { 43 | retInfo.PilotName = value; 44 | } 45 | if(key.Equals("Session started", StringComparison.OrdinalIgnoreCase)) 46 | { 47 | DateTime sessTime; 48 | if(DateTime.TryParse(value, out sessTime)) 49 | { 50 | retInfo.SessionDate = sessTime; 51 | } 52 | } 53 | } 54 | 55 | return retInfo; 56 | } 57 | 58 | public static string GetHeaderFromFile(string filePath) 59 | { 60 | FileStream fStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 61 | StreamReader sReader = new StreamReader(fStream, Encoding.UTF8, true, 512); 62 | 63 | string retString = ""; 64 | string curLine = null; 65 | while ((curLine = sReader.ReadLine()) != null && !curLine.StartsWith("[")) 66 | { 67 | curLine = curLine.Trim(); 68 | 69 | if(string.IsNullOrWhiteSpace(curLine)) 70 | { 71 | continue; 72 | } 73 | 74 | if(retString == null) 75 | { 76 | retString = curLine; 77 | } 78 | else 79 | { 80 | retString += string.Format("{0}{1}", Environment.NewLine, curLine); 81 | } 82 | } 83 | 84 | return retString; 85 | } 86 | } 87 | 88 | public class HeaderInfo 89 | { 90 | public string ChannelName { get; set; } 91 | public string PilotName { get; set; } 92 | public DateTime SessionDate { get; set; } 93 | public string ChannelId { get; set; } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /EveChatNotifier/LogReader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Text.RegularExpressions; 6 | 7 | namespace EveChatNotifier 8 | { 9 | public static class LogReader 10 | { 11 | private static Regex _GetLogEntryRegex = null; 12 | 13 | /// 14 | /// extract information from one entry! 15 | /// 16 | /// 17 | /// 18 | public static LogEntry GetLogEntry(string logLine) 19 | { 20 | if(_GetLogEntryRegex == null) 21 | { 22 | _GetLogEntryRegex = new Regex(Properties.Settings.Default.ChatEntryRegex, RegexOptions.Compiled | RegexOptions.Singleline); 23 | } 24 | 25 | LogEntry retEntry = new LogEntry(); 26 | 27 | if(Properties.Settings.Default.UseRegex) 28 | { 29 | Match regMatch = _GetLogEntryRegex.Match(logLine); 30 | if (regMatch.Success) 31 | { 32 | string sendDateStr = regMatch.Groups["senddate"].Value; 33 | string sender = regMatch.Groups["sender"].Value; 34 | string sendText = regMatch.Groups["text"].Value; 35 | 36 | DateTime sendDate; 37 | if (DateTime.TryParse(sendDateStr, out sendDate)) 38 | { 39 | retEntry.SendDate = sendDate; 40 | } 41 | retEntry.Sender = sender; 42 | retEntry.Text = sendText; 43 | } 44 | } 45 | else 46 | { 47 | // string acrobatic 48 | if(logLine.Contains("[") && logLine.Contains("]") && logLine.Contains(">")) 49 | { 50 | int startDate = logLine.IndexOf("["); 51 | int endDateStartSender = logLine.IndexOf("]"); 52 | int endSenderStartText = logLine.IndexOf(">"); 53 | 54 | string sendDateStr = logLine.Substring(startDate + 1, endDateStartSender - (startDate + 1)).Trim(); 55 | string sender = logLine.Substring(endDateStartSender + 1, endSenderStartText - (endDateStartSender + 1)).Trim(); 56 | string sendText = logLine.Substring(endSenderStartText + 1).Trim(); 57 | 58 | DateTime sendDate; 59 | if(DateTime.TryParse(sendDateStr, out sendDate)) 60 | { 61 | retEntry.SendDate = sendDate; 62 | } 63 | retEntry.Sender = sender; 64 | retEntry.Text = sendText; 65 | } 66 | } 67 | 68 | return retEntry; 69 | } 70 | } 71 | 72 | public class LogEntry 73 | { 74 | public string Sender { get; set; } 75 | public string Text { get; set; } 76 | public DateTime SendDate { get; set; } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /EveChatNotifier/Logging.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace EveChatNotifier 7 | { 8 | public static class Logging 9 | { 10 | private static string logPath = PathHelper.DecryptPath(Properties.Settings.Default.LogFile); 11 | 12 | public static void WriteLine(string text) 13 | { 14 | if(!Properties.Settings.Default.EnableLogging) 15 | { 16 | return; 17 | } 18 | 19 | try 20 | { 21 | System.IO.File.AppendAllText(logPath, string.Format("{0}: {1}{2}", DateTime.Now.ToString(), text, Environment.NewLine), Encoding.UTF8); 22 | } 23 | catch { } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /EveChatNotifier/NotificationIcon.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Drawing; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Windows.Forms; 7 | 8 | namespace EveChatNotifier 9 | { 10 | public class NotificationIcon 11 | { 12 | private static NotificationIcon _Instance = null; 13 | private Icon DefaultIcon = Properties.Resources.preferences_desktop_notification_bell; 14 | 15 | private NotificationIcon() { } 16 | 17 | public static NotificationIcon GetInstance() 18 | { 19 | if(_Instance == null) 20 | { 21 | _Instance = new NotificationIcon(); 22 | } 23 | return _Instance; 24 | } 25 | 26 | /// 27 | /// gets the default icon 28 | /// 29 | /// 30 | public Icon GetIcon() 31 | { 32 | return GetIcon(0); 33 | } 34 | 35 | /// 36 | /// writes a text at the default icon and returns it 37 | /// 38 | /// 39 | /// 40 | public Icon GetIcon(int messageCount) 41 | { 42 | if(messageCount <= 0) 43 | { 44 | return DefaultIcon; 45 | } 46 | 47 | return WriteMissingText(messageCount); 48 | } 49 | 50 | /// 51 | /// writes a text to the icon and returns it 52 | /// 53 | /// 54 | /// 55 | private Icon WriteMissingText(int count) 56 | { 57 | Brush b = new SolidBrush(Color.White); 58 | Bitmap bmp = new Bitmap(DefaultIcon.ToBitmap()); 59 | Graphics g = Graphics.FromImage(bmp); 60 | 61 | TextRenderer.DrawText(g, count.ToString(), new Font(SystemFonts.DefaultFont.FontFamily, bmp.Height * 0.7F, FontStyle.Bold), new Rectangle(0, 0, bmp.Width, bmp.Height), Color.White, Color.Transparent, 62 | TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.GlyphOverhangPadding); 63 | 64 | IntPtr hIcon = bmp.GetHicon(); 65 | Icon i = Icon.FromHandle(hIcon); 66 | return i; 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /EveChatNotifier/Notifier.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using Tulpep.NotificationWindow; 6 | using NAudio; 7 | using NAudio.Wave; 8 | using System.Drawing; 9 | 10 | namespace EveChatNotifier 11 | { 12 | public sealed class Notifier 13 | { 14 | // singleton elements 15 | private static Notifier _instance = null; 16 | 17 | // class variables 18 | private IWavePlayer wp = new WaveOut(); 19 | 20 | /// 21 | /// singleton private initializer 22 | /// 23 | private Notifier() { } 24 | 25 | /// 26 | /// returns the singleton instance of the notifier object 27 | /// 28 | public static Notifier GetInstance() 29 | { 30 | if (_instance == null) 31 | { 32 | _instance = new Notifier(); 33 | } 34 | return _instance; 35 | } 36 | 37 | /// 38 | /// sends a notification without audio 39 | /// 40 | /// 41 | /// 42 | public void Notify(string title, string message) 43 | { 44 | Notify(title, message, null); 45 | } 46 | 47 | /// 48 | /// sends a notification 49 | /// 50 | /// 51 | /// 52 | /// null/empty if no sound should be played 53 | public void Notify(string title, string message, string soundFile) 54 | { 55 | if(Properties.Settings.Default.ShowToast) 56 | { 57 | PopupNotifier pn = CreateNotify(); 58 | pn.TitleText = title; 59 | pn.ContentText = message; 60 | pn.Size = Properties.Settings.Default.ToastSize; 61 | pn.Popup(); 62 | } 63 | 64 | // send audio notification 65 | if(!string.IsNullOrWhiteSpace(soundFile)) 66 | { 67 | try 68 | { 69 | if (wp.PlaybackState == PlaybackState.Stopped) 70 | { 71 | // try playing the file 72 | AudioFileReader afr = new AudioFileReader(soundFile); 73 | afr.Volume = Convert.ToSingle(Properties.Settings.Default.SoundVolume / 100.0); 74 | wp.Init(afr); 75 | wp.Play(); 76 | } 77 | } 78 | catch (Exception ex) 79 | { 80 | Logging.WriteLine(string.Format("Unable to play sound file '{0}' - removing sound file:{1}{2}", soundFile, Environment.NewLine, ex.ToString())); 81 | 82 | // fallback to windows sounds if we are unable to play the given sound file 83 | Properties.Settings.Default.SoundFilePath = null; 84 | Properties.Settings.Default.Save(); 85 | Properties.Settings.Default.Reload(); 86 | } 87 | } 88 | } 89 | 90 | /// 91 | /// stops current playback (if any) 92 | /// 93 | public void StopPlayback() 94 | { 95 | if(wp.PlaybackState != PlaybackState.Stopped) 96 | { 97 | wp.Stop(); 98 | } 99 | } 100 | 101 | /// 102 | /// creates a new popup notification element 103 | /// 104 | /// 105 | private PopupNotifier CreateNotify() 106 | { 107 | PopupNotifier pn = new PopupNotifier(); 108 | ApplySettings(pn); 109 | pn.Click += Notifier_Click; 110 | 111 | return pn; 112 | } 113 | 114 | /// 115 | /// applies all notification settings 116 | /// 117 | /// 118 | private void ApplySettings(PopupNotifier Notifier) 119 | { 120 | // popup notifier settings 121 | Notifier.IsRightToLeft = false; 122 | Notifier.ShowCloseButton = true; 123 | Notifier.ShowGrip = false; 124 | Notifier.Image = Properties.Resources.eve_logo_landing2; 125 | 126 | Notifier.Delay = Properties.Settings.Default.ToastDelay; 127 | Notifier.AnimationDuration = 500; 128 | 129 | Notifier.BodyColor = Properties.Settings.Default.ToastBodyColor; 130 | Notifier.BorderColor = Properties.Settings.Default.ToastBorderColor; 131 | Notifier.ContentColor = Properties.Settings.Default.ToastContentColor; 132 | Notifier.ContentHoverColor = Properties.Settings.Default.ToastContentHoverColor; 133 | Notifier.HeaderColor = Properties.Settings.Default.ToastHeaderColor; 134 | Notifier.TitleColor = Properties.Settings.Default.ToastTitleColor; 135 | 136 | // font part 137 | Notifier.TitleFont = new Font(Notifier.TitleFont.FontFamily, Convert.ToSingle(Properties.Settings.Default.ToastFontSizeTitle)); 138 | Notifier.ContentFont = new Font(Notifier.ContentFont.FontFamily, Convert.ToSingle(Properties.Settings.Default.ToastFontSizeContent)); 139 | } 140 | 141 | /// 142 | /// closes the popup and stops playing the sound 143 | /// 144 | /// 145 | /// 146 | private void Notifier_Click(object sender, EventArgs e) 147 | { 148 | try 149 | { 150 | PopupNotifier pn = (PopupNotifier)sender; 151 | pn.Hide(); 152 | 153 | try 154 | { 155 | if (wp.PlaybackState != PlaybackState.Stopped) 156 | { 157 | wp.Stop(); 158 | } 159 | } 160 | catch (Exception ex) 161 | { 162 | Logging.WriteLine(string.Format("Unable to stop playback of sound file: {0}", ex.ToString())); 163 | } 164 | } 165 | catch { } 166 | } 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /EveChatNotifier/PathHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Text.RegularExpressions; 6 | 7 | namespace EveChatNotifier 8 | { 9 | public static class PathHelper 10 | { 11 | public static Dictionary KnownPaths = new Dictionary() 12 | { 13 | { "%EXEPATH%", System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) }, 14 | { "%MY_DOCUMENTS%", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }, 15 | { "%MY_MUSIC%", Environment.GetFolderPath(Environment.SpecialFolder.MyMusic) }, 16 | { "%MY_PICTURES%", Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) }, 17 | { "%MY_VIDEOS", Environment.GetFolderPath(Environment.SpecialFolder.MyVideos) }, 18 | { "%PROGRAM_DATA%", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) }, 19 | { "%APPDATA_LOCAL%", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) }, 20 | { "%DESKTOP%", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) }, 21 | { "%USERPATH%", Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) }, 22 | { "%DEFAULT_EVELOGPATH%", System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"EVE\logs\Chatlogs") }, 23 | { "%DEFAULT_EVEOLDPATH%", System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"EVE\logs\Chatlogs\old") } 24 | }; 25 | 26 | /// 27 | /// remove place holders with real paths 28 | /// 29 | /// 30 | /// 31 | public static string DecryptPath(string path) 32 | { 33 | foreach (KeyValuePair entry in KnownPaths) 34 | { 35 | path = path.Replace(entry.Key, entry.Value); 36 | } 37 | 38 | return path; 39 | } 40 | 41 | /// 42 | /// replace path beginning with place holder (longest wins) 43 | /// 44 | /// 45 | /// 46 | public static string EncryptedPath(string path) 47 | { 48 | if(string.IsNullOrWhiteSpace(path)) 49 | { 50 | return null; 51 | } 52 | 53 | List> matches = KnownPaths.Where(w => path.StartsWith(w.Value, StringComparison.OrdinalIgnoreCase)).ToList(); 54 | 55 | if (matches.Count <= 0) 56 | { 57 | return path; 58 | } 59 | 60 | KeyValuePair match = matches.OrderByDescending(o => o.Value.Length).First(); 61 | return Regex.Replace(path, Regex.Escape(match.Value), Regex.Escape(match.Key), RegexOptions.IgnoreCase); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /EveChatNotifier/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Windows.Forms; 5 | 6 | namespace EveChatNotifier 7 | { 8 | static class Program 9 | { 10 | /// 11 | /// Der Haupteinstiegspunkt für die Anwendung. 12 | /// 13 | [STAThread] 14 | static void Main() 15 | { 16 | Application.EnableVisualStyles(); 17 | Application.SetCompatibleTextRenderingDefault(false); 18 | Application.Run(new FormMain()); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace EveChatNotifier 7 | { 8 | public class GlobalProperties 9 | { 10 | public string SoundFilePath { get; set; } 11 | public string EveChatLogsPath { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die einer Assembly zugeordnet sind. 8 | [assembly: AssemblyTitle("EveChatNotifier")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("EveChatNotifier")] 13 | [assembly: AssemblyCopyright("Copyright © Stefan Ruepp 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly 18 | // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("f95a2a9c-5acf-49da-8ae8-0b909042d425")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, 33 | // übernehmen, indem Sie "*" eingeben: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("2.10.3.0")] 36 | [assembly: AssemblyFileVersion("2.10.3.0")] 37 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace EveChatNotifier.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EveChatNotifier.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap eve_logo_landing2 { 67 | get { 68 | object obj = ResourceManager.GetObject("eve_logo_landing2", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). 75 | /// 76 | internal static System.Drawing.Icon preferences_desktop_notification_bell { 77 | get { 78 | object obj = ResourceManager.GetObject("preferences_desktop_notification_bell", resourceCulture); 79 | return ((System.Drawing.Icon)(obj)); 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\eve-logo-landing2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\preferences_desktop_notification_bell.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace EveChatNotifier.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.1.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("%EXEPATH%\\notify.mp3")] 29 | public string SoundFilePath { 30 | get { 31 | return ((string)(this["SoundFilePath"])); 32 | } 33 | set { 34 | this["SoundFilePath"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("%DEFAULT_EVELOGPATH%")] 41 | public string EveChatLogsPath { 42 | get { 43 | return ((string)(this["EveChatLogsPath"])); 44 | } 45 | set { 46 | this["EveChatLogsPath"] = value; 47 | } 48 | } 49 | 50 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 52 | [global::System.Configuration.DefaultSettingValueAttribute("\\[(?(.+))\\](?(.*))\\>(?(.*))")] 53 | public string ChatEntryRegex { 54 | get { 55 | return ((string)(this["ChatEntryRegex"])); 56 | } 57 | } 58 | 59 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 60 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 61 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 62 | public bool UseRegex { 63 | get { 64 | return ((bool)(this["UseRegex"])); 65 | } 66 | } 67 | 68 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 69 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 70 | [global::System.Configuration.DefaultSettingValueAttribute("1")] 71 | public int FileCheckInterval { 72 | get { 73 | return ((int)(this["FileCheckInterval"])); 74 | } 75 | } 76 | 77 | [global::System.Configuration.UserScopedSettingAttribute()] 78 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 79 | [global::System.Configuration.DefaultSettingValueAttribute("@all,@enemy")] 80 | public string NotifyKeywords { 81 | get { 82 | return ((string)(this["NotifyKeywords"])); 83 | } 84 | set { 85 | this["NotifyKeywords"] = value; 86 | } 87 | } 88 | 89 | [global::System.Configuration.UserScopedSettingAttribute()] 90 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 91 | [global::System.Configuration.DefaultSettingValueAttribute("True")] 92 | public bool ShowToast { 93 | get { 94 | return ((bool)(this["ShowToast"])); 95 | } 96 | set { 97 | this["ShowToast"] = value; 98 | } 99 | } 100 | 101 | [global::System.Configuration.UserScopedSettingAttribute()] 102 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 103 | [global::System.Configuration.DefaultSettingValueAttribute("%EXEPATH%\\log.txt")] 104 | public string LogFile { 105 | get { 106 | return ((string)(this["LogFile"])); 107 | } 108 | set { 109 | this["LogFile"] = value; 110 | } 111 | } 112 | 113 | [global::System.Configuration.UserScopedSettingAttribute()] 114 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 115 | [global::System.Configuration.DefaultSettingValueAttribute("True")] 116 | public bool NeedsUpgrade { 117 | get { 118 | return ((bool)(this["NeedsUpgrade"])); 119 | } 120 | set { 121 | this["NeedsUpgrade"] = value; 122 | } 123 | } 124 | 125 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 126 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 127 | [global::System.Configuration.DefaultSettingValueAttribute("True")] 128 | public bool EnableLogging { 129 | get { 130 | return ((bool)(this["EnableLogging"])); 131 | } 132 | } 133 | 134 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 135 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 136 | [global::System.Configuration.DefaultSettingValueAttribute("8")] 137 | public int MaxAgeForWatchingLogs { 138 | get { 139 | return ((int)(this["MaxAgeForWatchingLogs"])); 140 | } 141 | } 142 | 143 | [global::System.Configuration.UserScopedSettingAttribute()] 144 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 145 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 146 | public bool MoveOldLogs { 147 | get { 148 | return ((bool)(this["MoveOldLogs"])); 149 | } 150 | set { 151 | this["MoveOldLogs"] = value; 152 | } 153 | } 154 | 155 | [global::System.Configuration.UserScopedSettingAttribute()] 156 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 157 | [global::System.Configuration.DefaultSettingValueAttribute("%DEFAULT_EVEOLDPATH%")] 158 | public string MoveOldLogsPath { 159 | get { 160 | return ((string)(this["MoveOldLogsPath"])); 161 | } 162 | set { 163 | this["MoveOldLogsPath"] = value; 164 | } 165 | } 166 | 167 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 168 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 169 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 170 | public bool LogAllMessages { 171 | get { 172 | return ((bool)(this["LogAllMessages"])); 173 | } 174 | } 175 | 176 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 177 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 178 | [global::System.Configuration.DefaultSettingValueAttribute("Black")] 179 | public global::System.Drawing.Color ToastBodyColor { 180 | get { 181 | return ((global::System.Drawing.Color)(this["ToastBodyColor"])); 182 | } 183 | } 184 | 185 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 186 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 187 | [global::System.Configuration.DefaultSettingValueAttribute("DimGray")] 188 | public global::System.Drawing.Color ToastBorderColor { 189 | get { 190 | return ((global::System.Drawing.Color)(this["ToastBorderColor"])); 191 | } 192 | } 193 | 194 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 195 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 196 | [global::System.Configuration.DefaultSettingValueAttribute("Orange")] 197 | public global::System.Drawing.Color ToastContentColor { 198 | get { 199 | return ((global::System.Drawing.Color)(this["ToastContentColor"])); 200 | } 201 | } 202 | 203 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 204 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 205 | [global::System.Configuration.DefaultSettingValueAttribute("DarkOrange")] 206 | public global::System.Drawing.Color ToastContentHoverColor { 207 | get { 208 | return ((global::System.Drawing.Color)(this["ToastContentHoverColor"])); 209 | } 210 | } 211 | 212 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 213 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 214 | [global::System.Configuration.DefaultSettingValueAttribute("LightGray")] 215 | public global::System.Drawing.Color ToastHeaderColor { 216 | get { 217 | return ((global::System.Drawing.Color)(this["ToastHeaderColor"])); 218 | } 219 | } 220 | 221 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 222 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 223 | [global::System.Configuration.DefaultSettingValueAttribute("White")] 224 | public global::System.Drawing.Color ToastTitleColor { 225 | get { 226 | return ((global::System.Drawing.Color)(this["ToastTitleColor"])); 227 | } 228 | } 229 | 230 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 231 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 232 | [global::System.Configuration.DefaultSettingValueAttribute("5000")] 233 | public int ToastDelay { 234 | get { 235 | return ((int)(this["ToastDelay"])); 236 | } 237 | } 238 | 239 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 240 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 241 | [global::System.Configuration.DefaultSettingValueAttribute("5")] 242 | public int EveChatLogCheckInterval { 243 | get { 244 | return ((int)(this["EveChatLogCheckInterval"])); 245 | } 246 | } 247 | 248 | [global::System.Configuration.UserScopedSettingAttribute()] 249 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 250 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 251 | public bool AskedToMoveLogs { 252 | get { 253 | return ((bool)(this["AskedToMoveLogs"])); 254 | } 255 | set { 256 | this["AskedToMoveLogs"] = value; 257 | } 258 | } 259 | 260 | [global::System.Configuration.UserScopedSettingAttribute()] 261 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 262 | [global::System.Configuration.DefaultSettingValueAttribute("100")] 263 | public int SoundVolume { 264 | get { 265 | return ((int)(this["SoundVolume"])); 266 | } 267 | set { 268 | this["SoundVolume"] = value; 269 | } 270 | } 271 | 272 | [global::System.Configuration.UserScopedSettingAttribute()] 273 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 274 | [global::System.Configuration.DefaultSettingValueAttribute("True")] 275 | public bool CheckForUpdates { 276 | get { 277 | return ((bool)(this["CheckForUpdates"])); 278 | } 279 | set { 280 | this["CheckForUpdates"] = value; 281 | } 282 | } 283 | 284 | [global::System.Configuration.UserScopedSettingAttribute()] 285 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 286 | [global::System.Configuration.DefaultSettingValueAttribute("9")] 287 | public int ToastFontSizeTitle { 288 | get { 289 | return ((int)(this["ToastFontSizeTitle"])); 290 | } 291 | set { 292 | this["ToastFontSizeTitle"] = value; 293 | } 294 | } 295 | 296 | [global::System.Configuration.UserScopedSettingAttribute()] 297 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 298 | [global::System.Configuration.DefaultSettingValueAttribute("8")] 299 | public int ToastFontSizeContent { 300 | get { 301 | return ((int)(this["ToastFontSizeContent"])); 302 | } 303 | set { 304 | this["ToastFontSizeContent"] = value; 305 | } 306 | } 307 | 308 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 309 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 310 | [global::System.Configuration.DefaultSettingValueAttribute("400, 100")] 311 | public global::System.Drawing.Size ToastSize { 312 | get { 313 | return ((global::System.Drawing.Size)(this["ToastSize"])); 314 | } 315 | } 316 | 317 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 318 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 319 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 320 | public bool AutoUpdateManually { 321 | get { 322 | return ((bool)(this["AutoUpdateManually"])); 323 | } 324 | } 325 | 326 | [global::System.Configuration.UserScopedSettingAttribute()] 327 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 328 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 329 | public bool IgnoreMotd { 330 | get { 331 | return ((bool)(this["IgnoreMotd"])); 332 | } 333 | set { 334 | this["IgnoreMotd"] = value; 335 | } 336 | } 337 | 338 | [global::System.Configuration.UserScopedSettingAttribute()] 339 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 340 | [global::System.Configuration.DefaultSettingValueAttribute("True")] 341 | public bool IgnoreOwnMessages { 342 | get { 343 | return ((bool)(this["IgnoreOwnMessages"])); 344 | } 345 | set { 346 | this["IgnoreOwnMessages"] = value; 347 | } 348 | } 349 | 350 | [global::System.Configuration.UserScopedSettingAttribute()] 351 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 352 | [global::System.Configuration.DefaultSettingValueAttribute("EVE-System")] 353 | public string MotdUsername { 354 | get { 355 | return ((string)(this["MotdUsername"])); 356 | } 357 | set { 358 | this["MotdUsername"] = value; 359 | } 360 | } 361 | 362 | [global::System.Configuration.UserScopedSettingAttribute()] 363 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 364 | [global::System.Configuration.DefaultSettingValueAttribute("")] 365 | public string IgnorePilots { 366 | get { 367 | return ((string)(this["IgnorePilots"])); 368 | } 369 | set { 370 | this["IgnorePilots"] = value; 371 | } 372 | } 373 | 374 | [global::System.Configuration.UserScopedSettingAttribute()] 375 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 376 | [global::System.Configuration.DefaultSettingValueAttribute("")] 377 | public string IgnoreChannels { 378 | get { 379 | return ((string)(this["IgnoreChannels"])); 380 | } 381 | set { 382 | this["IgnoreChannels"] = value; 383 | } 384 | } 385 | 386 | [global::System.Configuration.UserScopedSettingAttribute()] 387 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 388 | [global::System.Configuration.DefaultSettingValueAttribute("")] 389 | public string AlwaysPilots { 390 | get { 391 | return ((string)(this["AlwaysPilots"])); 392 | } 393 | set { 394 | this["AlwaysPilots"] = value; 395 | } 396 | } 397 | 398 | [global::System.Configuration.UserScopedSettingAttribute()] 399 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 400 | [global::System.Configuration.DefaultSettingValueAttribute("")] 401 | public string AlwaysChannels { 402 | get { 403 | return ((string)(this["AlwaysChannels"])); 404 | } 405 | set { 406 | this["AlwaysChannels"] = value; 407 | } 408 | } 409 | 410 | [global::System.Configuration.UserScopedSettingAttribute()] 411 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 412 | [global::System.Configuration.DefaultSettingValueAttribute("0")] 413 | public int AutoStartDelayMinutes { 414 | get { 415 | return ((int)(this["AutoStartDelayMinutes"])); 416 | } 417 | set { 418 | this["AutoStartDelayMinutes"] = value; 419 | } 420 | } 421 | 422 | [global::System.Configuration.UserScopedSettingAttribute()] 423 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 424 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 425 | public bool DeleteLogs { 426 | get { 427 | return ((bool)(this["DeleteLogs"])); 428 | } 429 | set { 430 | this["DeleteLogs"] = value; 431 | } 432 | } 433 | } 434 | } 435 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | %EXEPATH%\notify.mp3 7 | 8 | 9 | %DEFAULT_EVELOGPATH% 10 | 11 | 12 | \[(?<senddate>(.+))\](?<sender>(.*))\>(?<text>(.*)) 13 | 14 | 15 | False 16 | 17 | 18 | 1 19 | 20 | 21 | @all,@enemy 22 | 23 | 24 | True 25 | 26 | 27 | %EXEPATH%\log.txt 28 | 29 | 30 | True 31 | 32 | 33 | True 34 | 35 | 36 | 8 37 | 38 | 39 | False 40 | 41 | 42 | %DEFAULT_EVEOLDPATH% 43 | 44 | 45 | False 46 | 47 | 48 | Black 49 | 50 | 51 | DimGray 52 | 53 | 54 | Orange 55 | 56 | 57 | DarkOrange 58 | 59 | 60 | LightGray 61 | 62 | 63 | White 64 | 65 | 66 | 5000 67 | 68 | 69 | 5 70 | 71 | 72 | False 73 | 74 | 75 | 100 76 | 77 | 78 | True 79 | 80 | 81 | 9 82 | 83 | 84 | 8 85 | 86 | 87 | 400, 100 88 | 89 | 90 | False 91 | 92 | 93 | False 94 | 95 | 96 | True 97 | 98 | 99 | EVE-System 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 0 115 | 116 | 117 | False 118 | 119 | 120 | -------------------------------------------------------------------------------- /EveChatNotifier/Properties/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 48 | 55 | 56 | 70 | -------------------------------------------------------------------------------- /EveChatNotifier/Props/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | 7 | namespace EveChatNotifier.Props 8 | 9 | { 10 | class Program 11 | { 12 | [System.ComponentModel.DefaultValue(false)] 13 | public bool UseRegex { get; set; } 14 | 15 | [System.ComponentModel.DefaultValue(@"\[(?(.+))\](?(.*))\>(?(.*))")] 16 | public string RegexMatch { get; set; } 17 | } 18 | } -------------------------------------------------------------------------------- /EveChatNotifier/Resources/eve-logo-landing2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/EveChatNotifier/Resources/eve-logo-landing2.png -------------------------------------------------------------------------------- /EveChatNotifier/Screenshots/NotifyIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/EveChatNotifier/Screenshots/NotifyIcon.png -------------------------------------------------------------------------------- /EveChatNotifier/Screenshots/Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/EveChatNotifier/Screenshots/Settings.png -------------------------------------------------------------------------------- /EveChatNotifier/Screenshots/Toast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/EveChatNotifier/Screenshots/Toast.png -------------------------------------------------------------------------------- /EveChatNotifier/Settings.cs: -------------------------------------------------------------------------------- 1 | using NAudio.Wave; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Data; 6 | using System.Drawing; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Windows.Forms; 10 | 11 | namespace EveChatNotifier 12 | { 13 | public partial class Settings : Form 14 | { 15 | private IWavePlayer wp = new WaveOut(); 16 | private bool initializationFinished = false; 17 | 18 | public Settings() 19 | { 20 | InitializeComponent(); 21 | 22 | this.Text = string.Format("Settings - v{0}", Application.ProductVersion); 23 | 24 | cbNotify.DataSource = Enum.GetValues(typeof(NotifyOptions)); 25 | 26 | // set eve chat path 27 | folderEveChatLogs.SelectedFolder = PathHelper.DecryptPath(Properties.Settings.Default.EveChatLogsPath); 28 | 29 | // set program log path 30 | fileLog.SelectedFile = PathHelper.DecryptPath(Properties.Settings.Default.LogFile); 31 | 32 | // set move old logs 33 | cbMoveLog.Checked = Properties.Settings.Default.MoveOldLogs; 34 | 35 | // set move old logs path 36 | folderMoveLogs.SelectedFolder = PathHelper.DecryptPath(Properties.Settings.Default.MoveOldLogsPath); 37 | 38 | // set delete logs 39 | cbDeleteLogs.Checked = Properties.Settings.Default.DeleteLogs; 40 | 41 | // set notify option 42 | NotifyOptions curOption = NotifyOptions.Toast; 43 | 44 | if (Properties.Settings.Default.ShowToast && string.IsNullOrWhiteSpace(Properties.Settings.Default.SoundFilePath)) 45 | { 46 | curOption = NotifyOptions.Toast; 47 | } 48 | if (Properties.Settings.Default.ShowToast && !string.IsNullOrWhiteSpace(Properties.Settings.Default.SoundFilePath)) 49 | { 50 | curOption = NotifyOptions.Both; 51 | } 52 | if (!Properties.Settings.Default.ShowToast && !string.IsNullOrWhiteSpace(Properties.Settings.Default.SoundFilePath)) 53 | { 54 | curOption = NotifyOptions.Sound; 55 | } 56 | cbNotify.SelectedItem = curOption; 57 | 58 | // sound file to play 59 | if (curOption == NotifyOptions.Both || curOption == NotifyOptions.Sound) 60 | { 61 | fileNotifySound.SelectedFile = PathHelper.DecryptPath(Properties.Settings.Default.SoundFilePath); 62 | } 63 | else 64 | { 65 | fileNotifySound.SelectedFile = ""; 66 | } 67 | 68 | // set notify keywords 69 | tbNotifyKeywords.Text = Properties.Settings.Default.NotifyKeywords; 70 | 71 | // set update check 72 | cbUpdates.Checked = Properties.Settings.Default.CheckForUpdates; 73 | 74 | // set motd username 75 | tbMotdUsername.Text = Properties.Settings.Default.MotdUsername; 76 | 77 | // set ignore pilot and channel 78 | tbIgnoreChannels.Text = Properties.Settings.Default.IgnoreChannels; 79 | tbIgnorePilots.Text = Properties.Settings.Default.IgnorePilots; 80 | 81 | // set always pilot and channel 82 | tbAlwaysPilots.Text = Properties.Settings.Default.AlwaysPilots; 83 | tbAlwaysChannels.Text = Properties.Settings.Default.AlwaysChannels; 84 | 85 | // set autostart object 86 | try 87 | { 88 | cbAutoStart.Checked = Autostart.ManageAutostart.Instance.Enabled; 89 | } 90 | catch (Exception ex) 91 | { 92 | Logging.WriteLine(string.Format("Error getting autostart enabled state:{0}{1}", Environment.NewLine, ex.ToString())); 93 | cbAutoStart.Enabled = false; 94 | } 95 | nudAutoStartDelay.Value = Properties.Settings.Default.AutoStartDelayMinutes; 96 | 97 | // set font size 98 | nudFontSizeTitle.Value = Convert.ToDecimal(Properties.Settings.Default.ToastFontSizeTitle); 99 | nudFontSizeContent.Value = Convert.ToDecimal(Properties.Settings.Default.ToastFontSizeContent); 100 | 101 | // set ignore motd and ignore own messages 102 | cbIgnoreMotd.Checked = Properties.Settings.Default.IgnoreMotd; 103 | cbIgnoreOwn.Checked = Properties.Settings.Default.IgnoreOwnMessages; 104 | 105 | initializationFinished = true; 106 | } 107 | 108 | private void cbMoveLog_CheckedChanged(object sender, EventArgs e) 109 | { 110 | CheckBox curCb = (CheckBox)sender; 111 | folderMoveLogs.Enabled = curCb.Checked; 112 | 113 | // disable delete checkbox and uncheck it if move is enabled 114 | cbDeleteLogs.Enabled = !curCb.Checked; 115 | if (curCb.Checked) 116 | cbDeleteLogs.Checked = false; 117 | } 118 | 119 | public enum NotifyOptions 120 | { 121 | Toast = 0, 122 | Sound = 1, 123 | Both = 2 124 | } 125 | 126 | private void cbNotify_SelectedValueChanged(object sender, EventArgs e) 127 | { 128 | NotifyOptions curOption = (NotifyOptions)Enum.Parse(typeof(NotifyOptions), cbNotify.SelectedValue.ToString()); 129 | 130 | switch (curOption) 131 | { 132 | case NotifyOptions.Toast: 133 | fileNotifySound.Enabled = false; 134 | tbarVolume.Enabled = false; 135 | btnTest.Enabled = false; 136 | break; 137 | case NotifyOptions.Sound: 138 | fileNotifySound.Enabled = true; 139 | tbarVolume.Enabled = true; 140 | btnTest.Enabled = true; 141 | break; 142 | case NotifyOptions.Both: 143 | fileNotifySound.Enabled = true; 144 | tbarVolume.Enabled = true; 145 | btnTest.Enabled = true; 146 | break; 147 | } 148 | } 149 | 150 | private void btnCancel_Click(object sender, EventArgs e) 151 | { 152 | this.Close(); 153 | } 154 | 155 | private void btnSave_Click(object sender, EventArgs e) 156 | { 157 | SaveChanges(); 158 | 159 | // restart the application to apply all new settings 160 | Application.Restart(); 161 | } 162 | 163 | private void fileNotifySound_EnabledChanged(object sender, EventArgs e) 164 | { 165 | if (!fileNotifySound.Enabled) 166 | { 167 | fileNotifySound.SelectedFile = ""; 168 | } 169 | } 170 | 171 | private void lblEveChatLogs_MouseEnter(object sender, EventArgs e) 172 | { 173 | tbHelp.Text = "Path to the folder where all eve chat logs are located in. This folder is watched for new logs and each log is monitored by this tool for changes."; 174 | } 175 | 176 | private void lblLogFile_MouseEnter(object sender, EventArgs e) 177 | { 178 | tbHelp.Text = "Path to the file this program is writing its logfile into. All actions done by this tool are protocolled in there. (You can see all actions in here - even possible errors for support reasons.)"; 179 | } 180 | 181 | private void lblMoveLogs_MouseEnter(object sender, EventArgs e) 182 | { 183 | tbHelp.Text = "If activated the programm tries to move all eve chat log files to the old folder directory. Highly recommended to save computer ressources!"; 184 | } 185 | 186 | private void lblNotifyOption_Enter(object sender, EventArgs e) 187 | { 188 | tbHelp.Text = string.Format("Kind of notification:{0}Toast: Outlook like notification; Sound: only play the sound file; and both", Environment.NewLine); 189 | } 190 | 191 | private void lblSoundFile_MouseEnter(object sender, EventArgs e) 192 | { 193 | tbHelp.Text = string.Format("The sound file which should be played. Keep in mind that as long the playback needs there will be no new notifications!{0}Supported files are e.g.: mp3, wav, ogg", Environment.NewLine); 194 | } 195 | 196 | private void lblNotifyKeywords_MouseEnter(object sender, EventArgs e) 197 | { 198 | tbHelp.Text = "Here you can add additional keywords you want to use for notification. Please seperate them using ',' - not case sensitive. (e.g. if you have nickname everyone uses"; 199 | } 200 | 201 | private void lblVolume_MouseEnter(object sender, EventArgs e) 202 | { 203 | tbHelp.Text = "Here you can set the volume of your sound notification."; 204 | } 205 | 206 | private void lblUpdateCheck_MouseEnter(object sender, EventArgs e) 207 | { 208 | tbHelp.Text = string.Format("If enabled the program checks on startup for new versions by calling the github release api.{0}(Simple get request - no information are sent)", Environment.NewLine); 209 | } 210 | 211 | private void lblAutostart_MouseEnter(object sender, EventArgs e) 212 | { 213 | tbHelp.Text = string.Format("If you want this program can add itselfe to autostart by checking this box.{0}Please enable 'move old logs' to avoid high cpu and hdd usage of this tool!", Environment.NewLine); 214 | } 215 | 216 | private void fontSize_MouseEnter(object sender, EventArgs e) 217 | { 218 | tbHelp.Text = string.Format("Choose a font size between 6 and 30 points."); 219 | } 220 | 221 | private void ignoreMotd_MouseEnter(object sender, EventArgs e) 222 | { 223 | tbHelp.Text = string.Format("If you set the MOTD you get informed every time your client starts (see 'MOTD Username')."); 224 | } 225 | 226 | private void ignoreOwnMessages(object sender, EventArgs e) 227 | { 228 | tbHelp.Text = string.Format("This ignores all messages which are sent from the logged in user. This only affects each pilot itselfe."); 229 | } 230 | 231 | private void motdUserName(object sender, EventArgs e) 232 | { 233 | tbHelp.Text = string.Format("MOTD can only be detected by username. It should be something like 'EVE-System'. Check the log files to get the correct one."); 234 | } 235 | 236 | private void btnTestVolume_Click(object sender, EventArgs e) 237 | { 238 | SaveChanges(); 239 | Properties.Settings.Default.Reload(); 240 | 241 | Notifier.GetInstance().StopPlayback(); 242 | Notifier.GetInstance().Notify("Test User in 'Alliance'", "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.", fileNotifySound.SelectedFile); 243 | } 244 | 245 | private void SaveChanges() 246 | { 247 | Properties.Settings.Default.EveChatLogsPath = PathHelper.EncryptedPath(folderEveChatLogs.SelectedFolder); 248 | Properties.Settings.Default.LogFile = PathHelper.EncryptedPath(fileLog.SelectedFile); 249 | Properties.Settings.Default.MoveOldLogs = cbMoveLog.Checked; 250 | Properties.Settings.Default.MoveOldLogsPath = PathHelper.EncryptedPath(folderMoveLogs.SelectedFolder); 251 | Properties.Settings.Default.DeleteLogs = cbDeleteLogs.Checked; 252 | Properties.Settings.Default.NotifyKeywords = tbNotifyKeywords.Text; 253 | Properties.Settings.Default.SoundVolume = tbarVolume.Value; 254 | Properties.Settings.Default.CheckForUpdates = cbUpdates.Checked; 255 | Properties.Settings.Default.ToastFontSizeTitle = Convert.ToInt32(nudFontSizeTitle.Value); 256 | Properties.Settings.Default.ToastFontSizeContent = Convert.ToInt32(nudFontSizeContent.Value); 257 | Properties.Settings.Default.IgnoreMotd = cbIgnoreMotd.Checked; 258 | Properties.Settings.Default.IgnoreOwnMessages = cbIgnoreOwn.Checked; 259 | Properties.Settings.Default.MotdUsername = tbMotdUsername.Text; 260 | Properties.Settings.Default.IgnoreChannels = tbIgnoreChannels.Text; 261 | Properties.Settings.Default.IgnorePilots = tbIgnorePilots.Text; 262 | Properties.Settings.Default.AlwaysPilots = tbAlwaysPilots.Text; 263 | Properties.Settings.Default.AlwaysChannels = tbAlwaysChannels.Text; 264 | Properties.Settings.Default.AutoStartDelayMinutes = Convert.ToInt32(nudAutoStartDelay.Value); 265 | 266 | NotifyOptions no = (NotifyOptions)cbNotify.SelectedItem; 267 | switch (no) 268 | { 269 | case NotifyOptions.Toast: 270 | Properties.Settings.Default.ShowToast = true; 271 | Properties.Settings.Default.SoundFilePath = null; 272 | break; 273 | case NotifyOptions.Sound: 274 | Properties.Settings.Default.ShowToast = false; 275 | Properties.Settings.Default.SoundFilePath = PathHelper.EncryptedPath(fileNotifySound.SelectedFile); 276 | break; 277 | case NotifyOptions.Both: 278 | Properties.Settings.Default.ShowToast = true; 279 | Properties.Settings.Default.SoundFilePath = PathHelper.EncryptedPath(fileNotifySound.SelectedFile); 280 | break; 281 | } 282 | 283 | Properties.Settings.Default.Save(); 284 | 285 | if (cbAutoStart.Enabled) 286 | { 287 | try 288 | { 289 | Autostart.ManageAutostart.Instance.Enabled = cbAutoStart.Checked; 290 | Autostart.ManageAutostart.Instance.ChangeDelay(Properties.Settings.Default.AutoStartDelayMinutes); 291 | } 292 | catch (Exception ex) 293 | { 294 | Logging.WriteLine(string.Format("Error changing autostart enabled:{0}{1}", Environment.NewLine, ex.ToString())); 295 | } 296 | } 297 | } 298 | 299 | private void lblIgnorePilots_MouseEnter(object sender, EventArgs e) 300 | { 301 | tbHelp.Text = string.Format("Here you can specify pilotnames (sender) which are ignored for notification. Please seperate them using ',' - not case sensitive."); 302 | } 303 | 304 | private void lblIgnoreChannels_MouseEnter(object sender, EventArgs e) 305 | { 306 | tbHelp.Text = string.Format("Here you can specify channelname which are ignored for notification. Please seperate them using ',' - not case sensitive."); 307 | } 308 | private void lblAlwaysChannels_MouseEnter(object sender, EventArgs e) 309 | { 310 | tbHelp.Text = string.Format("Here you can specify channelname which are always notified. Please seperate them using ',' - not case sensitive."); 311 | } 312 | 313 | private void lblAlwaysPilots_MouseEnter(object sender, EventArgs e) 314 | { 315 | tbHelp.Text = string.Format("Here you can specify pilotnames (sender) which are always notified. Please seperate them using ',' - not case sensitive."); 316 | } 317 | 318 | private void LblAutostartDelay_MouseEnter(object sender, EventArgs e) 319 | { 320 | tbHelp.Text = string.Format("You can add an auto start delay in minutes here (e.g. reduce startup load, wait for network drive, cloud space, ...)"); 321 | } 322 | 323 | private void lblDeleteLogs_MouseEnter(object sender, EventArgs e) 324 | { 325 | tbHelp.Text = String.Format("ATTENTION:{0}Enabling this deletes all logfiles in the eve log folder. This cannot be undone so use on your own risk! (This was made to prevent your storage space to be filled with eve logs", Environment.NewLine); 326 | } 327 | 328 | private void cbDeleteLogs_CheckedChanged(object sender, EventArgs e) 329 | { 330 | if (!initializationFinished) 331 | return; 332 | 333 | CheckBox curBox = (CheckBox)sender; 334 | 335 | if(curBox.Checked) 336 | { 337 | if(MessageBox.Show(String.Format("ATTENTION{0}Enabling this deletes all logfiles in the eve log folder.{0}This cannot be undone so use on your own risk!{0}{0}(This was made to prevent your storage space to be filled with eve logs.){0}{0}Do you want to continue enabling it?", Environment.NewLine) 338 | , "Are you sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) 339 | { 340 | curBox.Checked = false; 341 | return; 342 | } 343 | } 344 | 345 | // disable move checkbox if this is enabled 346 | cbMoveLog.Enabled = !curBox.Checked; 347 | if (curBox.Checked) 348 | cbMoveLog.Checked = false; 349 | } 350 | } 351 | } 352 | -------------------------------------------------------------------------------- /EveChatNotifier/Settings.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAMMUAADDFAAAAAAAAAAA 124 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAwbCAAWHxEAFR4VABQdFgAUHRYAFB0WABQdFgAU 125 | HRYAFB0WABQdFgAUHRYAFB0WABQdFgAUHRYAFB0WABQdFgAUHRYAFB0WABQdFgAUHRYAFB0WABQdFgAU 126 | HRYAFB0WABQdFgAUHRYAFB0WABQdFgAVHhUAFR8SAA4aCQAACwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 127 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBgJDRlcRBEWgZ4PFHyoDhR8qg4U 128 | faoOFH2qDhR9qg4UfaoOFH2qDhR9qg4UfaoOFH2qDhR9qg4UfaoOFH2qDhR9qg4UfaoOFH2qDhR9qg4U 129 | faoOFH2qDhR9qg4UfaoOFH2qDhR9qg4UfaoOFH2qDhR8qg8UfKkRFoCgDBlYSgAPGwwAAAAAAAAAAAAA 130 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBsWEhaFpRoX 131 | p/8gHbH/IB2x/yAdsf8gHbH/IB2x/yAdsf8gHbH/IB2x/yAdsf8gHbH/IB2x/yAdsf8gHbH/IB2x/yAd 132 | sf8gHbH/IB2x/yAdsf8gHbH/IB2x/yAdsf8gHbH/IB2x/yAdsf8gHbH/IB2x/zMxpf8vLaD/EhaBrAAT 133 | HhwAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 134 | AAAADxkaERWCrSIetf8lIbj/JiG5/yYhuf8mIbn/JiG5/yYhuf8mIbn/JiG5/yYhuf8mIbn/JiK6/yYi 135 | uv8mIrr/JiK6/yYiuv8mIrr/JiK6/yYiuv8mIrr/JiK6/yYiu/8mIrv/JiK7/yYiu/8mIrv/JiK7/5+e 136 | qv+goLL/ERZ+tQARHCIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 137 | AAAAAAAAAAAAAAAAAAEAFSAaEheEriMfuP8mIrz/KCTC/ygkwv8oJML/KCTC/ygkwv8oJML/KCTC/ygk 138 | wv8oJML/KCTC/ygkwv8oJML/KCTC/ygkwv8oJML/KCTC/ygkwv8oJML/KCTC/ygkwv8oJML/KCTC/ygk 139 | wv8oJML/KCTC/1lWxv9GQ7D/EheAtgAWISIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFiEbExiGriQgvP8mIsD/KSTG/ykkxv8pJMb/KSTG/ykk 141 | xv8pJMb/KSTG/ykkxv8pJMb/KSTG/ykkxv8pJMb/KSTG/ykkxv8pJMb/KSTG/ykkxv8pJMb/KSTG/ykk 142 | xv8pJMb/KSTG/ykkxv8pJMb/KSTG/ygkxf8jH7n/EhiDtgAYIyMAAAACAAAAAAAAAAAAAAAAAAAAAAAA 143 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFiEbFRmJriUgv/8oI8T/KiXK/yol 144 | yv8qJcr/KiXK/yolyv8qJcr/KiXK/yolyv8qJcr/KiXK/yolyv8qJcr/KiXK/yolyv8qJcr/KiXK/yol 145 | yv8qJcr/KiXK/yolyv8qJcr/KiXK/yolyv8qJcr/KiXK/yolyf8kIL3/FBmFtgAYIyMAAAACAAAAAAAA 146 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFiEbFhqMriUh 147 | w/8oI8f/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yol 148 | zv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzf8lIMH/FRqItgAY 149 | IyMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 150 | AAEAFiEbFhuOriYhxP8oI8f/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yol 151 | zf8qJc7/KiXO/yolzv8qJc7/KiXN/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXO/yol 152 | zf8lIML/FRyLtwAYIyMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 153 | AAAAAAAAAAAAAAAAAAEAEx8aFxuPriYixf8oI8f/KiXO/yolzv8qJc7/KiXO/yolzv8qJc7/KiXN/ykk 154 | zP8pJMv/KCTJ/ygjyP8oI8j/JyLH/ycix/8oI8j/KCPI/ygkyv8pJMv/KiXM/yolzf8qJc7/KiXO/yol 155 | zv8qJc7/KiXO/yolzf8lIcP/Ekmz8AFFYzMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 156 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxkaGByRrTg0t/91c7z/LyrL/yolzv8qJc7/KiXN/ykk 157 | y/8oI8n/JyLF/yUhwf8jH7z/Ih63/yAdsv8fHK//Hxyu/x8crv8gHLH/IR21/yIeuf8kIL7/JiHC/yci 158 | xv8oJMn/KSTL/yolzf8qJc7/KiXO/yolzf8mIsT/KGDF/xSNwbsAQFYDAAAAAAAAAAAAAAAAAAAAAAAA 159 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBsUGx2ZpXFuu/+xsbH/Qz/C/ygj 160 | x/8nIsX/JiHC/yQfvP8hHbT/HRup/xkZmv8WGIz/FReI/xYWhv8VFob/FRaG/xUWhv8VFob/FRaH/xUX 161 | i/8YGJn/HBmn/x8csf8iHrn/JSDA/ycixf8oI8j/KSTK/ykky/8nIsb/S3bX/kOv3P8QjsN0AAAAAAAA 162 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChQIIB+ujikl 163 | wf8/O8L/KCPH/ycixf8lIcD/Ih63/x0cpv8YGpD/FxiJ/xkYjv8bGJb/Gxia/xwYnP8cGZ7/HBmf/xwZ 164 | nv8cGJz/GxiZ/xoYlf8YGIv/FhiH/xcYkP8cGqT/IByy/yMfuv8lIcD/JyLF/ygjx/8lIcL/LDq6p3DM 165 | 8OwvotL6C4rBNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 166 | AAAAAAABIyC1IiQgvX4kH7qDIx+5gyEetYQcHKCSFhqHyBgYiv4bGJX/HBmc/xwZov8dGqb/HRqq/x4a 167 | rP8eG63/Hhut/x4brf8eGqz/HRqq/x0apv8cGaL/Gxmc/xoYk/8XGIj3FhmHrhwbo4wgHbKDIh63gyMf 168 | uYMkIL1+IyCxI3HM701lxez+HpfJ3AWGvQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 169 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwVBQMWMCwUGHesGhiU/RwZnv8dGqX/HRqr/x4b 170 | r/8eG7H/Hhuy/x4bsv8eG7P/Hhuz/x4bs/8eG7L/Hhuy/x4bsf8eG6//HRqr/x0apf8cGZ3/GhiQ7xAa 171 | aX4AGSoZAAgIAgAAAAAAAAAAAAAAAAAAAAB10POVTbXg/xGOw5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 172 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChcICRdHRhgYhtwbGJr/HBmj/x0a 173 | q/8eG7D/Hhuy/x4bs/8eG7T/Hhu1/x4btf8eG7b/Hhu2/x4btv8eG7X/Hhu1/x4btP8eG7P/Hhuy/x4b 174 | sP8dGqv/HBqj/xoem/8UIH+yARkqJAAGEQMAAAAAAAAAAAAAAABbwOcNcc3x4i+i0f0Iib84AAAAAAAA 175 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGAcLF09RGRiL6xwZ 176 | nP8dGqf/Hhuv/x4bsv8eG7T/Hhu1/x4btv8eG7f/Hhu4/x4buf8eG7n/Hhu5/x4buf8eG7n/Hhu4/x4b 177 | t/8eG7b/Hhu1/x4btP8eG7L/Hhuv/xwhqf8aI6D/FhqDxQMVLSgABw0CAAAAAAAAAAAAAAAAb8zwTF3A 178 | 6P8VkcXEAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4SBAgX 179 | RUQZGIrpHBme/x0aqf8eG7H/Hhuz/x4btf8eG7f/Hhu4/x4buv8eG7v/Hhu8/x4bvP8eG73/Hhu9/x4b 180 | vf8eG7z/Hhu8/x4bu/8eG7r/Hhu4/x4bt/8eG7X/Hhu0/x0gs/8bJ63/Gx2e/xYYf70AFB8eAAANAQAA 181 | AAAAAAAAAAAAAHDM8cUypNP/CIi/RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 182 | AAAAAAsBAhUqJxcXhNYbGZ3/HRqp/x4bsv8eG7T/Hhu2/x4buP8eG7r/Hhu8/x4bvf8eG77/Hhu//x4b 183 | wP8eG8D/HhvB/x4bwP8eG8D/Hhu//x4bvv8eG73/Hhu8/x4buv8eG7j/Hhu2/x4etf8cKbb/GyOs/xsZ 184 | nP8TGHKZABEcEQAAAAAAAAAAAAAAAGzK70Vavub/Eo/EvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 185 | AAAAAAAAAAAAAAAAAAAAERwQExhzoRsYmf8dGqj/Hhux/x4btf8eG7f/Hhu5/x4bu/8eG73/Hhu//x4b 186 | wf8eG8L/HhvD/x4bxP8eG8T/HhvE/x4bxP8eG8T/HhvD/x4bwv8eG8H/Hhu//x4bvf8eG7v/Hhu5/x4c 187 | t/8cJLj/HCq2/xwdqP8bGJf7DBdVWwAJEgUAAAAAAAAAAAAAAABqye7bIprM/gOGvB0AAAAAAAAAAAAA 188 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFDgQKF0xOGhiS+hwZpP8eG7D/Hhu1/x4bt/8eG7r/Hhu8/x4b 189 | vv8eG8D/HhvC/x4bxP8eG8X/HRrG/x0axv8dGsb/HRrG/x0axv8dGsb/HRrG/x4bxf8eG8T/HhvC/x4b 190 | wP8eG77/Hhu8/x4buv8dILn/HC26/xwls/8cGqP/GBiJ1gAUHx8AAAAAAAAAAAAAAABxzfGLOanX/weH 191 | vmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASHhQVF3y6Gxid/x0arP8eG7T/Hhu3/x4b 192 | uv8eG7z/Hhu+/x4bwf8eG8P/HhvF/x0axv8dGsb/HRrH/x0ax/8dGsf/HRrH/x0ax/8dGsf/HRrH/x0a 193 | xv8eGsb/HhvF/x4bw/8eG8H/Hhu//x4bvP8eHLr/HCe7/xwuuv8cH63/Gxic/w8YY3IACBIGAAAAAAAA 194 | AABwzPBPTbbg/wuLwJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAggWQUEaGJP7HBml/x4b 195 | sv8eG7f/Hhu5/x4bvP8eG77/HhvB/x4bxP8eG8b/HRrH/x0ax/8dGsj/HRrI/x0axv8cGcT/HRrH/x0a 196 | yf8dGsj/HRrI/x0ayP8dGsf/HhrH/x4bxv8eG8T/HhvB/x4bv/8eG7z/HiC7/xwvvP8dKbb/HBul/xcY 197 | h88AEx8ZAAAAAAAAAABXueEsT7DX/w2FucIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0WCRMY 198 | cJMbGJv/Hhqs/x8btv8fG7j/Hxu7/x8bvv8fG8H/HxvD/x4bxv8eGsf/HhrI/x4ayf8eGsn/HhrH/xsX 199 | u/8aFrb/Gxe7/x0Zxv8eGsr/HhrK/x4ayf8eGsn/HhrI/x4ax/8eG8b/HxvE/x8bwf8fG77/Hxy8/x0p 200 | vP8dM7z/HCKu/xsYmv0JGEdHAAAIAgAAAABCoskGLoGl/wlwnN4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 201 | AAAAAAAAABIgFxcYg9EcGaL/Hhux/x8bt/8fG7r/Hxu9/x8bwP8fG8P/HhvG/x4bx/8eGsj/HhrJ/x4a 202 | yf8eGsr/HBjC/xgVsP8XFK3/FxWu/xoXuv8dGsr/HhrL/x4ayv8eGsr/HhrJ/x4ayP8eG8j/HhvG/x8b 203 | w/8fG8D/Hxu9/x4ivP8dNL//HC63/xwcov8TGHGLAAsUBwAAAAALl9NJD4W3/wmHvfYMmNVqEaDaBwAA 204 | AAAAAAAAAAAAAAAAAAAAAAABARUmLBoYkvkdGab/Hxu0/x8buf8fG7z/Hxu+/x8bwf8fG8T/HhvH/x4a 205 | yP8eGsn/HhrK/x4ay/8eGsv/Ghe+/xYUqP8WE6f/FhOn/xYUq/8bGMT/HRrM/x4by/8eG8v/HhvK/x4b 206 | yf8eG8n/HhvI/x8bxf8fHML/Hxy+/x4ivf8dN8D/HTm9/xwkqf8XGYXAABMdEAqFzoQPmdr/DJrX/wmW 207 | 0/8Ondr/EJ7bxRCe3AkAAAAAAAAAAAAAAAAAAAACDBhSURsYmP8dGqr/Hxy2/x8cuv8fHL3/HxzA/x8c 208 | w/8eG8b/HhvI/x4byv8eG8r/HhvL/x4bzP8dGsz/GRe7/xYUo/8bGKv/HRqx/xoYrP8ZFrj/HRrM/x0a 209 | zf8eG8z/HhvL/x4byv8eG8n/HhvI/x4bxv8fHMP/Hx3A/x4owP8dPcP/HEHC/xwzs/8YH5HfBWKMRgx4 210 | 0f4YmuX/H7T0/x6y8v8br+7/Fqfm/w+c2XQAAAAAAAAAAAAAAAAAABADEBdjbBsYmv8eGq3/Hxy4/x8c 211 | u/8fHL7/HxzB/x8cxP8eG8f/HhvJ/x4byv8eG8v/HhvM/x4bzf8dGs7/Ghe7/x0ar/8eG8L/HhrG/x4b 212 | wf8cGbX/HBnL/x0azv8eG83/HhvM/x4by/8eG8r/HhvJ/x4bx/8fHMT/Hx3B/x4pwf8dP8X/HUXE/xxB 213 | uv8aL6L2Bm2rlxJ32f8eq/D/Fqfm/xOk4/8ZrOz/ILLx/xWi37kAAAAAAAAAAAAAAAAABBAEERdrexwY 214 | nP8eGq7/Hxy4/x8cvP8fHL7/HxzC/x8cxf8eG8j/HhvK/x4byv8eG8z/HhvM/x0bzf8dGs7/HBm6/yIf 215 | v/8mI83/JiPR/ysozv8iH7z/HBnI/x0azv8eG87/HhvN/x4bzP8eG8v/HhvK/x4byP8fHMX/HxzC/x8h 216 | wP8eNML/HUHE/xxBvP8bMKb8BmallyyA2/9JvvP/PLPk/z+z4f9Yxu//dNb5/ymq4LUAAAAAAAAAAAAA 217 | AAAABBAEEhdufhwYnf8eGq//Hxy5/x8cvP8fHL//HxzC/x8cxv8eG8j/HhvK/x4by/8eG8z/HhvN/x0b 218 | zv8dGs//HRrB/z88xf9ua+D/i4ro/5aV6v9FQ8j/HRrN/x0az/8eG87/HhvN/x4bzP8eG8v/HhvL/x4b 219 | yf8fHMb/HxzC/x8cv/8fH73/Hia8/x0os/8bH579A0prSSR90vpgwPL/dNLy/4La8v+R6fv/huP4/xif 220 | 12QAAAAAAAAAAAAAAAAAABADEBdnbxsYnP8eGq7/Hxy6/x8cvf8fHMD/HxzC/x8cxv8eG8n/HhvL/x4b 221 | zP8eG8z/HhvO/x4bzv8dGs//HRrQ/zMwu/9+fN7/q6nt/8C/8P8vK8r/HhrQ/x4az/8eG87/HhvO/x8b 222 | zP8fG8z/HxvL/x8byf8fHMb/IBzD/yAcwP8gHL3/IBy6/x4brv8bGZn4ABUhJg+Dy2BGsOH8d9b2/4ni 223 | +v+G4/b/QbnhphOm4QIAAAAAAAAAAAAAAAAAAAACDhhdVxwYmv8eGq3/IBy5/yAcvf8gHMD/IBzD/x8c 224 | xv8fG8n/HxvL/x8bzP8fG83/HxvO/x4bz/8eGs//HhrQ/x4a0P8tKsb/R0TO/yonzP8eGtH/HhrQ/x4a 225 | 0P8eG8//HxvO/x8bzf8fG8z/HxvM/x8byf8fHMb/IBzD/yAcwP8gHL3/IBy5/x4arP8aGZPmABQfHAAA 226 | AAAIks0lIJ7TeC+m1n8TmdJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBU0MBsYl/0eGqr/IBy4/yAc 227 | vf8gHL//IBzC/x8cxf8fG8j/HxvL/x8bzP8fG83/HxvO/x4bz/8eG8//HhrQ/x4a0P8eGtH/HhrR/x4a 228 | 0f8eGtH/HhrQ/x4bz/8eG8//HxvO/x8bzf8fG83/HxvL/x8byf8fHMb/IBzD/yAcwP8gHL3/IBy4/x0a 229 | qv8YGIvIABIdEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIfGBkY 230 | jNwdGqf/Hxu2/yAcvf8gHL//IBzC/x8cxf8fHMj/HxvL/x8bzP8fG83/HxvO/x8bzv8eG8//HhvQ/x4b 231 | 0P8eGtD/HhrQ/x4a0P8eG9D/HhvQ/x4bz/8fG8//HxvO/x8bzf8fG8z/HxvL/x8cyP8gHMX/IBzC/yAc 232 | wP8gHL3/Hxu1/x0Zpv8VGH2XAAsUBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 233 | AAAAAAAAAA4VCRYYfqMcGaH/Hhuy/yAcvP8gHL//IBzB/yAcxP8fHMf/HxvK/x8bzP8fG83/HxvO/x8b 234 | z/8fG8//HhvQ/x4b0P8eG9D/HhvQ/x4b0P8eG9D/HhvQ/x8bz/8fG8//HxvO/x8bzv8fG8z/HxvK/x8c 235 | x/8gHMT/IBzC/yAcv/8gHLz/Hhux/xwZoP8OGF9UAAAIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 236 | AAAAAAAAAAAAAAAAAAAAAAAAAAAIAg4XW08cGJv/Hhqs/yAcuv8gHL7/IBzA/yAcw/8hHcb/IB3J/x8b 237 | y/8fG83/HxvO/x8bzv8fG8//HxvP/x8b0P8fG9D/HxvQ/x8b0P8fG9D/HxvP/x8cz/8fHM//HxzO/x8c 238 | zv8fHMv/JCHK/yMgx/8gHcT/IB3B/yAdvv8fHLn/Hhqs/xoZlOAAEyAaAAAAAAAAAAAAAAAAAAAAAAAA 239 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASHRUZGIvQHRql/x8ctP8gHb3/IB3A/yIf 240 | wv8oJMf/LSrL/yYjy/8fHMz/HxzO/x8czv8fHM//HxzP/x8cz/8fHM//HxzQ/x8c0P8fHND/HxzP/x8c 241 | z/8fHM//HxzO/yEezP82M9D/OznP/zIvyv8nJMX/IB7A/yAdvf8eHLT/HBqk/xQYe4gAChEGAAAAAAAA 242 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDQQSGGtjHBmc/x4b 243 | rf8fHLr/Ih/A/ykmxP8wLcj/NzPM/z060P83NND/JCHN/x8czv8fHM//HxzP/x8cz/8fHM//HxzQ/x8c 244 | z/8fHM//HxzP/x8cz/8fHM7/NTLR/1NR1/9UUtb/TEnS/0E/zf81Msf/KCXB/yAduv8eGqz/GxmY6gUU 245 | NiUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 246 | AAAAERwRGBmJvhwao/8gHbP/KCS//zAtxf83NMn/PjzN/0VC0P9MSdT/UU7X/0VC1f8xLtH/Ih/P/yAc 247 | z/8gHM//IBzP/yAcz/8gHM//LCnR/0ZD1v9mZN3/cW/f/2xq3P9lYtn/XFnV/1JO0P9FQcv/NjLD/yQg 248 | s/8dGqL/FBh2dQAJFAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 249 | AAAAAAAAAAAAAAAAAAAAAAkCCxdPNBsZlewfHKn/LCm6/zYyxP8+O8n/RkLN/0xK0f9UUdT/W1jY/2Jf 250 | 2v9oZd3/bGne/2Zj3f9jYN3/Y2Dd/21q4P96eOP/hYPl/4aE5P+EguP/gX/i/3x64P91c9z/bGrZ/2Be 251 | 1P9ST87/QT7B/yEeqf8ZGY28ABIdEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 252 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0QBRIYbVwcGZv6JiOu/zo3wP9DQMn/TEjO/1NQ 253 | 0f9bWNX/YmDY/2ln2/9wbt3/d3Xg/3174v+DgeP/iYbl/42L5v+Rj+f/k5Hn/5ST5/+Ukub/kZDl/4yK 254 | 4/+Fg+D/e3nc/29s1/9fXMz/Mi6x/xsZlt0JF0YoAAANAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 255 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGAgUGHZwHBmc/C4r 256 | sf9GQ8P/UE3N/1lW0v9hXtX/aWbY/3Bu2/93dd7/fnzg/4aE4/+Mi+X/kpHm/5iX6P+cm+n/oJ/p/6Oh 257 | 6v+jour/oZ/o/5yb5/+Vk+T/iojf/3x51v9CP7j/GxmZ5Q0XWjgABhEDAAAAAAAAAAAAAAAAAAAAAAAA 258 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 259 | AAAADRkIFBh0ZhwZmvYvLK//UE7F/1tZzv9lYtX/bWvY/3Zz2/9+fN7/hoTh/42M5P+Uk+b/m5ro/6Kg 260 | 6v+opuv/rKvs/7Cu7f+xsO3/sK/s/6yr6v+ko+b/k5Hd/0NBtv8bGZbZDRdZNAAFFAMAAAAAAAAAAAAA 261 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 262 | AAAAAAAAAAAAAAAAAAAAAAAAAAsUBhAXZkIaGZTZJyOn/09MwP9nZM7/cG7W/3l32v+CgN7/i4nh/5OR 263 | 5P+bmef/o6Hp/6qp6/+xsO3/t7bu/7y78P+/vvD/v77v/7u67P+Lidf/MS6q/hkZja0IFkMfAAgIAgAA 264 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 265 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAIFFjUYFxmEihwZmvIzMK3/W1jE/3p4 266 | 1P+Egtr/jYvf/5aV4v+fneb/qKbp/7Cv6/+4t+3/v77v/8bF8f/IyPH/mZjc/0pIt/8bGZfaFBh2WgAP 267 | HAsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 268 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwVBQsW 269 | TiMXGIaHGxmX3CYjpP9EQbX/YF7E/3h2z/+KiNf/lpXc/5mX3f+RkNn/fnzQ/1tYvv8rKKb8GhmTwxUY 270 | fWQBFCURAAYTAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 271 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 272 | AAAAAAAAAAAAAAAAAAAACRIEABEgDhIYbDwXGIV6GRiOphoYlMYaGZbTGxmX2hoZlc8aGZO+GBiLmRYY 273 | gGcNF1koABAdCgAJEQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 274 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAA4VBQAOHwgAEx0KABUcCwAR 276 | HQkADh4HAA0VBAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 277 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAf8AAPwAAAAB/wAA/AAAAAD/ 278 | AAD8AAAAAP8AAPgAAAAA/wAA+AAAAAD/AAD4AAAAAP8AAPgAAAAA/wAA+AAAAAD/AAD4AAAAAP8AAPwA 279 | AAAA/wAA/AAAAAD/AAD8AAAAAH8AAPwAAAAAPwAA/8AAAB4/AAD/gAAADh8AAP8AAAAHHwAA/gAAAAOP 280 | AAD8AAAAA48AAPwAAAABxwAA+AAAAAHHAAD4AAAAAMcAAPAAAAAAxwAA8AAAAABHAADwAAAAAEEAAOAA 281 | AAAAAAAA4AAAAAAAAADgAAAAAAAAAOAAAAAAAAAA4AAAAAAAAADgAAAAAAAAAOAAAAAAQwAA4AAAAAB/ 282 | AADwAAAAAH8AAPAAAAAAfwAA8AAAAAD/AAD4AAAAAP8AAPgAAAAA/wAA/AAAAAH/AAD8AAAAA/8AAP4A 283 | AAAD/wAA/wAAAAf/AAD/gAAAD/8AAP/AAAAf/wAA/+AAAD//AAD/+AAA//8AAP/+AAP//wAA///AH/// 284 | AAA= 285 | 286 | 287 | -------------------------------------------------------------------------------- /EveChatNotifier/ShowAllNotifications.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace EveChatNotifier 2 | { 3 | partial class ShowAllNotifications 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.dgvMain = new System.Windows.Forms.DataGridView(); 32 | ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).BeginInit(); 33 | this.SuspendLayout(); 34 | // 35 | // dgvMain 36 | // 37 | this.dgvMain.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 38 | this.dgvMain.Dock = System.Windows.Forms.DockStyle.Fill; 39 | this.dgvMain.Location = new System.Drawing.Point(0, 0); 40 | this.dgvMain.Name = "dgvMain"; 41 | this.dgvMain.Size = new System.Drawing.Size(1049, 476); 42 | this.dgvMain.TabIndex = 0; 43 | // 44 | // ShowAllNotifications 45 | // 46 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 47 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 48 | this.ClientSize = new System.Drawing.Size(1049, 476); 49 | this.Controls.Add(this.dgvMain); 50 | this.Name = "ShowAllNotifications"; 51 | this.Text = "ShowAllNotifications"; 52 | ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).EndInit(); 53 | this.ResumeLayout(false); 54 | 55 | } 56 | 57 | #endregion 58 | 59 | private System.Windows.Forms.DataGridView dgvMain; 60 | } 61 | } -------------------------------------------------------------------------------- /EveChatNotifier/ShowAllNotifications.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Windows.Forms; 9 | 10 | namespace EveChatNotifier 11 | { 12 | public partial class ShowAllNotifications : Form 13 | { 14 | public ShowAllNotifications() 15 | { 16 | InitializeComponent(); 17 | this.Icon = Properties.Resources.preferences_desktop_notification_bell; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /EveChatNotifier/ShowAllNotifications.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /EveChatNotifier/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | %EXEPATH%\notify.mp3 15 | 16 | 17 | %DEFAULT_EVELOGPATH% 18 | 19 | 20 | @all,@enemy 21 | 22 | 23 | True 24 | 25 | 26 | %EXEPATH%\log.txt 27 | 28 | 29 | True 30 | 31 | 32 | False 33 | 34 | 35 | %DEFAULT_EVEOLDPATH% 36 | 37 | 38 | False 39 | 40 | 41 | 100 42 | 43 | 44 | True 45 | 46 | 47 | 9 48 | 49 | 50 | 8 51 | 52 | 53 | False 54 | 55 | 56 | True 57 | 58 | 59 | EVE-System 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 0 75 | 76 | 77 | False 78 | 79 | 80 | 81 | 82 | 83 | 84 | \[(?<senddate>(.+))\](?<sender>(.*))\>(?<text>(.*)) 85 | 86 | 87 | False 88 | 89 | 90 | 1 91 | 92 | 93 | True 94 | 95 | 96 | 8 97 | 98 | 99 | False 100 | 101 | 102 | Black 103 | 104 | 105 | DimGray 106 | 107 | 108 | Orange 109 | 110 | 111 | DarkOrange 112 | 113 | 114 | LightGray 115 | 116 | 117 | White 118 | 119 | 120 | 5000 121 | 122 | 123 | 5 124 | 125 | 126 | 400, 100 127 | 128 | 129 | False 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /EveChatNotifier/notify.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/EveChatNotifier/notify.mp3 -------------------------------------------------------------------------------- /EveChatNotifier/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /EveChatNotifier/preferences_desktop_notification_bell.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/EveChatNotifier/preferences_desktop_notification_bell.ico -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Basic information / FAQ 2 | 3 | - This tool is not interacting in any way with eve online directly. It is just monitoring and reading log files written by the eve online client. 4 | - It can only notify for chat messages you receive during playing! 5 | - There is no way to detect something like someone enters your system or something else - only chat messages :-) 6 | - Like every free or open source software: use at your own risk. 7 | 8 | ## What it does 9 | 10 | By starting the tool, it starts to monitor your chat channels. If in any chat your complete pilot name is written, you get some notifications about that. You do not need to add an api key or something else. All you need ist a started eve client (compatible to multi clients). 11 | 12 | ## Notifications 13 | 14 | It is always going to notify you with the default windows notification method in the lower right of your screen. Optional you can open the tool and enter a full path to a sound file. If the file is valid it plays it in addition to the screen notification. 15 | 16 | To modify the settings you have to press twice on the program icon next to your clock: 17 | 18 | ![](https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/master/EveChatNotifier/Screenshots/NotifyIcon.png) 19 | 20 | And how does the Notification looks like? 21 | 22 | ![](https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/master/EveChatNotifier/Screenshots/Toast.png) 23 | (Colors can be changed using the properties - see Change settings below.) 24 | 25 | Or you can play a sound file - depends on you :-). 26 | 27 | ## Close the program 28 | 29 | Just open the context menu on the icon shown above (right mouse button) and choose "Exit". 30 | 31 | ## Autostart information 32 | 33 | Since version 2.7.0.0 there is a built in autostart function. You can enable it at the properties page. Be sure to remove any other autostart entries which have been set manually. 34 | The autostart is done using the windows scheduler function (logon trigger). Choosing this option has a lot of benefits. Some are: 35 | - If autostart is disabled the exe is not called at all, so no performance issues here. 36 | - This option can be managed easier by code. 37 | - No ugly registry settings needed. 38 | - Can be viewed by the user opening the windows scheduler manager (is inside the root folder called "EveChatNotifier AutoStart"). 39 | 40 | ## Auto updater 41 | 42 | Introduced as beta feature with version 2.7.1.0. This function should be able to update your EveChatNotifier with one click. Currently this function is still in beta phase, so please report any errors using the Issue page: https://github.com/MyUncleSam/EveChatNotifier/issues 43 | 44 | ## Performance 45 | 46 | Eve creates daily new chat log files. So if you are playing regular there could be a lot of chat files in your log folder. As this tool needs to monitor this files this coul lead into heavy CPU and HDD usage. To avoid that you can try: 47 | 48 | Option | Benefit 49 | ------ | ------- 50 | **HIGHLY RECOMMENDED:**
Switching the move log function on inside the settings UI | Huge performance boost because only the active logs needs to be checked. 51 | Increasing `FileCHeckInterval` | Files are checked not as often - this delays the notification 52 | Increasing `EveChatLogCheckInterval` | Folder with log files are not checked frequently - needs more time to start watching of new log files (new group, conversation, chat, ...) 53 | 54 | ## Change settings 55 | 56 | Since version 2.0.0.0 there is a complete rewritten settings editor. You can open it by double click on the icon or opening the context menu -> Settings. If you want to know more about a setting you just need to hover the text in front of the setting and there will be some help in the footer: 57 | 58 | ![](https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/master/EveChatNotifier/Screenshots/Settings.png) 59 | 60 | ## Custom properties 61 | 62 | These settings should only be set if you know what you are doing! 63 | 64 | You can change some general properties by modifying the `EveChatNotifier.exe.config` inside the folder of the program itself. Keep in mind, that all properties are only loaded on program start. So you have to restart if you made changes to this file. 65 | 66 | Setting name | Description 67 | ------------ | ----------- 68 | UseRegex | It can be switched to use regular expression. Be careful, this is slower then the default logic! Should only be used if there is a new log format and there is no update currently! 69 | ChatEntryRegex | The regex to detect a logline. You need to specify the following groups:
- senddate: date when the post was sent
- sender: pilot who sent the message
- text: the chat tex 70 | EveChatLogCheckInterval | Interval of seconds to scan for new log files (which can appear if you enter a new chat, conversation or group) 71 | FileCheckInterval | If your pc is very slow, please increase this value. The amount set here specifies how often the log files are checked for new entries. A check only retrieves the current filesize and not the content! 72 | EnableLogging | If you want to disable the logging you can turn it off in here. If you do wo please turn it back on if you need support to log error messages! 73 | MaxAgeForWatchingLogs | Only relevant if you do not let the program clean your log folder: The watcher only checks files where the last change date is X hours old (the setting). 74 | ToastDelay | How many seconds the default toast notification should stay before it disappears 75 | LogAllMessages | Logs into the program all detected chat messages (just for debugging purpose) 76 | Toast...Color | All possible color settings can be modified using default .net color names which can be found e.g. here: http://yorktown.cbe.wwu.edu/sandvig/shared/netcolors.aspx (only names are suppoerted) 77 | ToastSize | The size of the popup (width; height) - default is 400; 100 78 | AutoUpdateManually | If set to true and if AutoUpdate is enabled the program is going to open the release page instead of doing the update automatically (if user choose to update) 79 | 80 | ## Download 81 | 82 | See release page of github project: [https://github.com/MyUncleSam/EveChatNotifier/releases](https://github.com/MyUncleSam/EveChatNotifier/releases) 83 | 84 | ## Requirements 85 | 86 | * Windows (not tested on other systems - but I think it is not going to work on non Windows systems) 87 | * .Net Framework 4.0 88 | * Enabled logging in the eve client (Settings -> chat -> chat -> log to file) 89 | 90 | ## License and warranty 91 | 92 | ### License 93 | 94 | MIT license: [https://tldrlegal.com/license/mit-license#fulltext](https://tldrlegal.com/license/mit-license#fulltext) 95 | 96 | The MIT License (MIT) 97 | 98 | Copyright (c) 2017 Stefan Ruepp 99 | 100 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 101 | 102 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 103 | 104 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 105 | 106 | ## Changelog 107 | 108 | [https://github.com/MyUncleSam/EveChatNotifier/commits/master](https://github.com/MyUncleSam/EveChatNotifier/commits/master) 109 | 110 | 111 | ## Support 112 | 113 | If you wanna support my work feel free to donate ISK ingame to "Wolf Tongue". 114 | -------------------------------------------------------------------------------- /log.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyUncleSam/EveChatNotifier/48fc49e4c1ef2708a21667eb7a5f85930d3d5796/log.txt --------------------------------------------------------------------------------