跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

提交记录
修改Core/Servicers/Instances/Data.cs+63 −116看文件
@@ -13,6 +13,8 @@ using Npoi.Mapper;
1313using System.IO;
1414using CsvHelper;
1515using System.Globalization;
16新增:using System.Threading.Tasks;
17新增:using NPOI.SS.Formula.Functions;
1618
1719namespace Core.Servicers.Instances
1820{
@@ -26,156 +28,101 @@ namespace Core.Servicers.Instances
2628 _appData = appData_;
2729 _database = database_;
2830 }
29删除: public void Set(string processName, int seconds, DateTime? time_ = null)
31新增:
32新增: public void SaveAppDuration(string processName_, int duration_, DateTime startDateTime_)
3033 {
31删除: lock (setLock)
32删除: {
33删除: DateTime time = !time_.HasValue ? DateTime.Now : time_.Value;
34删除: var today = time.Date;
34新增: // 过滤无效数据
35新增: if (string.IsNullOrEmpty(processName_) || duration_ <= 0) return;
3536
36删除: if (string.IsNullOrEmpty(processName) || seconds <= 0)
37新增: Task.Run(() =>
38新增: {
39新增: try
3740 {
38删除: return;
39删除: }
41新增: if (startDateTime_.Minute == 59 && startDateTime_.Second >= 58)
42新增: {
43新增: // 当记录开始时间接近59分59秒时划到下一个小时时段
44新增: startDateTime_ = startDateTime_.AddSeconds(2);
45新增: startDateTime_ = new DateTime(startDateTime_.Year, startDateTime_.Month, startDateTime_.Day, startDateTime_.Hour, 0, 0);
46新增: }
4047
41删除: AppModel app = _appData.GetApp(processName);
48新增: using (var db = _database.GetWriterContext())
49新增: {
50新增: var app = db.App.Where(m => m.Name == processName_).FirstOrDefault();
51新增: if (app == null)
52新增: {
53新增: _database.CloseWriter();
54新增: return;
55新增: }
4256
43删除: if (app == null)
44删除: {
45删除: return;
46删除: }
47删除: // 统计app累计使用时长
48删除: app.TotalTime += seconds;
49删除: _appData.UpdateApp(app);
57新增: // 当前时段最大可记录时长
58新增: int nowHoursMaxDuration = (60 - startDateTime_.Minute) * 60;
59新增: duration_ = duration_ > nowHoursMaxDuration ? nowHoursMaxDuration : duration_;
5060
61新增: // 更新app累计时长
62新增: app.TotalTime += duration_;
5163
52删除: //using (var db = _database.GetReaderContext())
53删除: using (var db = _database.GetWriterContext())
54删除: {
55删除: using (var transcation = db.Database.BeginTransaction())
56删除: {
57删除: try
64新增: // 更新每日数据
65新增: var dailyLog = db.DailyLog.SingleOrDefault(m => m.Date == startDateTime_.Date && m.AppModelID == app.ID);
66新增: if (dailyLog == null)
5867 {
59删除: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.AppModelID == app.ID);
60删除: if (res == null)
68新增: //数据库中没有时则创建
69新增: db.DailyLog.Add(new DailyLogModel()
6170 {
62删除: //数据库中没有时则创建
63删除: db.DailyLog.Add(new Models.DailyLogModel()
64删除: {
65删除: Date = today,
66删除: AppModelID = app.ID,
67删除: Time = seconds,
68删除: });
71新增: Date = startDateTime_.Date,
72新增: AppModelID = app.ID,
73新增: Time = duration_ > 86400 ? 86400 : duration_,
74新增: });
75新增: }
76新增: else
77新增: {
78新增: if (dailyLog.Time + duration_ > 86400)
79新增: {
80新增: dailyLog.Time = 86400;
6981 }
7082 else
7183 {
72删除: res.Time += seconds;
84新增: dailyLog.Time += duration_;
7385 }
74删除:
75删除: db.SaveChanges();
76删除: transcation.Commit();
77删除: }
78删除: catch (Exception e)
79删除: {
80删除: Logger.Error(e.ToString());
81删除: transcation.Rollback();
8286 }
83删除: finally
84删除: {
85删除: _database.CloseWriter();
86删除: }
87删除: }
88删除: }
89删除:
90删除: SetHoursTime(app, seconds, time);
91删除: }
92删除: }
9387
94删除:
95删除: private void SetHoursTime(AppModel app, int seconds, DateTime time)
96删除: {
97删除: string processName = app.Name;
98删除: // 当前时段
99删除: var nowtime = new DateTime(time.Year, time.Month, time.Day, time.Hour, 0, 0);
100删除:
101删除: if (time.Minute == 59 && time.Second == 59)
102删除: {
103删除: SetHoursTime(app, seconds, nowtime.AddHours(1));
104删除: return;
105删除: }
106删除:
107删除: if (seconds <= 0 || time > DateTime.Now)
108删除: {
109删除: return;
110删除: }
111删除:
112删除:
113删除: //using (var db = _database.GetReaderContext())
114删除: using (var db = _database.GetWriterContext())
115删除: {
116删除: using (var transcation = db.Database.BeginTransaction())
117删除: {
118删除: try
119删除: {
120删除: var hourslog = db.HoursLog.SingleOrDefault(
121删除: m =>
122删除: m.DataTime == nowtime
123删除: && m.AppModelID == app.ID
124删除: );
125删除:
126删除: int overflowSeconds = 0;
127删除:
128删除: if (hourslog == null)
88新增: // 更新时段数据
89新增: var time = new DateTime(startDateTime_.Year, startDateTime_.Month, startDateTime_.Day, startDateTime_.Hour, 0, 0);
90新增: var hoursLog = db.HoursLog.SingleOrDefault(m => m.DataTime == time && m.AppModelID == app.ID);
91新增: if (hoursLog == null)
12992 {
130删除: // 没有时创建
131删除:
132删除: if (seconds > 3600)
93新增: // 没有记录时创建
94新增: db.HoursLog.Add(new HoursLogModel()
13395 {
134删除: overflowSeconds = seconds - 3600;
135删除: seconds = 3600;
136删除: }
137删除:
138删除: db.HoursLog.Add(new Models.HoursLogModel()
139删除: {
140删除: DataTime = nowtime,
96新增: DataTime = time,
14197 AppModelID = app.ID,
142删除: Time = seconds
98新增: Time = duration_
14399 });
144100 }
145101 else
146102 {
147删除: if (hourslog.Time + seconds > 3600)
103新增: if (hoursLog.Time + duration_ > 3600)
148104 {
149删除: hourslog.Time = 3600;
150删除: overflowSeconds = hourslog.Time + seconds - 3600;
105新增: hoursLog.Time = 3600;
151106 }
152107 else
153108 {
154删除: hourslog.Time += seconds;
109新增: hoursLog.Time += duration_;
155110 }
156111 }
157112
158113 db.SaveChanges();
159删除: transcation.Commit();
160删除:
161删除: if (overflowSeconds > 0)
162删除: {
163删除: SetHoursTime(app, overflowSeconds, nowtime.AddHours(1));
164删除: }
165删除: }
166删除: catch (Exception e)
167删除: {
168删除: Logger.Error(e.ToString());
169删除: transcation.Rollback();
170删除: }
171删除: finally
172删除: {
173114 _database.CloseWriter();
115新增: Logger.Info($"Save app time done.Process:{processName_},Duration:{duration_},StartDateTime:{startDateTime_},AppID:{app.ID}");
174116 }
175117 }
176删除: //_database.Close();
177删除: }
118新增: catch (Exception e)
119新增: {
120新增: Logger.Error($"Save app time error!Process:{processName_},Duration:{duration_},StartDateTime:{startDateTime_}.\r\nError:\r\n{e.Message}");
121新增:
122新增: }
123新增: });
178124 }
125新增:
179126 public List<DailyLogModel> GetTodaylogList()
180127 {
181128
修改Core/Servicers/Instances/Main.cs+54 −35看文件
@@ -9,6 +9,7 @@ using System;
99using System.Collections.Generic;
1010using System.Data.Entity;
1111using System.Diagnostics;
12新增:using System.IO;
1213using System.Linq;
1314using System.Text;
1415using System.Text.RegularExpressions;
@@ -148,13 +149,13 @@ namespace Core.Servicers.Instances
148149 {
149150 await Task.Run(() =>
150151 {
151删除: Debug.WriteLine("db self check start");
152新增: CreateDirectory();
153新增:
152154 // 数据库自检
153155 using (var db = new TaiDbContext())
154156 {
155157 db.SelfCheck();
156158 }
157删除: Debug.WriteLine("db self check over!");
158159
159160 // 加载app信息
160161 appData.Load();
@@ -172,14 +173,14 @@ namespace Core.Servicers.Instances
172173 config = appConfig.GetConfig();
173174 UpdateConfigIgnoreProcess();
174175
175删除:
176新增:
176177
177178 // 启动睡眠监测
178179 sleepdiscover.Start();
179删除:
180新增:
180181 // 初始化过滤器
181182 _webFilter.Init();
182删除:
183新增:
183184 // 启动主服务
184185 Start();
185186
@@ -208,6 +209,14 @@ namespace Core.Servicers.Instances
208209 appObserver?.Stop();
209210 }
210211
212新增: /// <summary>
213新增: /// 创建程序目录
214新增: /// </summary>
215新增: private void CreateDirectory()
216新增: {
217新增: string dir = Path.Combine(FileHelper.GetRootDirectory(), "Data");
218新增: Directory.CreateDirectory(dir);
219新增: }
211220
212221 private void UpdateConfigIgnoreProcess()
213222 {
@@ -335,8 +344,12 @@ namespace Core.Servicers.Instances
335344 return;
336345 }
337346
347新增: string lastActiveProcess = activeProcess != null ? activeProcess.ToString() : "";
348新增:
338349 bool isCheck = IsCheckApp(args.ProcessName, args.Description, args.File);
339350
351新增: Logger.Info($"Active[{isCheck}]:" + args.ProcessName + ",Last:" + lastActiveProcess + ",Time:" + activeStartTime.ToString());
352新增:
340353 if (activeProcess != args.ProcessName)
341354 {
342355 UpdateTime();
@@ -354,41 +367,45 @@ namespace Core.Servicers.Instances
354367 {
355368 activeProcess = null;
356369 }
370新增:
357371 }
358372
359删除: private void HandleLinks(string processName, int seconds, DateTime? time = null)
373新增: private void HandleLinks(string processName, int seconds, DateTime time)
360374 {
361删除: try
375新增: Task.Run(() =>
362376 {
363删除: List<LinkModel> links = config.Links != null ? config.Links : new List<LinkModel>();
364删除: foreach (LinkModel link in links)
377新增: try
365378 {
366删除: if (link.ProcessList != null
367删除: && link.ProcessList.Count >= 2
368删除: && link.ProcessList.Contains(processName))
379新增: List<LinkModel> links = config.Links != null ? config.Links : new List<LinkModel>();
380新增: foreach (LinkModel link in links)
369381 {
370删除: // 属于关联进程
371删除: foreach (string linkProcess in link.ProcessList)
382新增: if (link.ProcessList != null
383新增: && link.ProcessList.Count >= 2
384新增: && link.ProcessList.Contains(processName))
372385 {
373删除: if (linkProcess != processName)
386新增: // 属于关联进程
387新增: foreach (string linkProcess in link.ProcessList)
374388 {
375删除: if (IsProcessRuning(linkProcess))
389新增: if (linkProcess != processName)
376390 {
377删除: // 同步更新
378删除: data.Set(linkProcess, seconds, time);
379删除: }
391新增: if (IsProcessRuning(linkProcess))
392新增: {
393新增: // 同步更新
394新增: data.SaveAppDuration(linkProcess, seconds, time);
395新增: }
380396
397新增: }
381398 }
399新增: break;
382400 }
383删除: break;
384401 }
385删除: }
386删除: }
387删除: catch (Exception ex)
388删除: {
389删除: Logger.Error(ex.Message + ",关联进程更新错误,Process Name: " + processName + ",Time: " + seconds);
390删除: }
391402
403新增: }
404新增: catch (Exception ex)
405新增: {
406新增: Logger.Error(ex.Message + ",关联进程更新错误,Process Name: " + processName + ",Time: " + seconds);
407新增: }
408新增: });
392409 }
393410
394411 #region 判断进程是否在运行中
@@ -410,10 +427,10 @@ namespace Core.Servicers.Instances
410427
411428 if (!string.IsNullOrEmpty(app))
412429 {
413删除: var time = activeStartTime;
430新增: var time = new DateTime(activeStartTime.Ticks);
414431
415432 // 更新计时
416删除: TimeSpan timeSpan = DateTime.Now - activeStartTime;
433新增: TimeSpan timeSpan = DateTime.Now - time;
417434
418435 int seconds = (int)timeSpan.TotalSeconds;
419436
@@ -425,15 +442,12 @@ namespace Core.Servicers.Instances
425442
426443 if (seconds > 0)
427444 {
428删除: Task.Run(() =>
429删除: {
430删除: data.Set(app, seconds, time);
445新增: data.SaveAppDuration(app, seconds, time);
431446
432删除: // 关联进程更新
433删除: HandleLinks(app, seconds, time);
447新增: // 关联进程更新
448新增: HandleLinks(app, seconds, time);
434449
435删除: Logger.Info("status:" + sleepStatus + ",process:" + app + ",seconds:" + seconds + ",start:" + activeStartTime.ToString() + ",end:" + DateTime.Now.ToString() + ",time:" + time.ToString());
436删除: });
450新增: //Logger.Info("status:" + sleepStatus + ",process:" + app + ",seconds:" + seconds + ",start:" + activeStartTime.ToString() + ",end:" + DateTime.Now.ToString() + ",time:" + time.ToString());
437451 }
438452
439453 activeStartTime = DateTime.Now;
@@ -447,6 +461,11 @@ namespace Core.Servicers.Instances
447461 /// </summary>
448462 private void HandleWebServiceConfig()
449463 {
464新增: if (config == null)
465新增: {
466新增: return;
467新增: }
468新增:
450469 if (config.General.IsWebEnabled)
451470 {
452471 browserObserver.Start();
修改Core/Servicers/Interfaces/IData.cs+5 −4看文件
@@ -12,11 +12,12 @@ namespace Core.Servicers.Interfaces
1212 {
1313
1414 /// <summary>
15删除: /// 设置进程数据
15新增: /// 保存APP使用时长数据
1616 /// </summary>
17删除: /// <param name="processName">进程名称</param>
18删除: /// <param name="seconds">时长(秒)</param>
19删除: void Set(string processName, int seconds, DateTime? time = null);
17新增: /// <param name="processName_">进程名称</param>
18新增: /// <param name="duration_">时长(秒)</param>
19新增: /// <param name="startDateTime_">记录开始时间</param>
20新增: void SaveAppDuration(string processName_, int duration_, DateTime startDateTime_);
2021
2122 /// <summary>
2223 /// 获取今天的数据