├── .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 | 
19 |
20 | And how does the Notification looks like?
21 |
22 | 
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 | 
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
--------------------------------------------------------------------------------