public AlertRuleForm(ConfigModel.JsonConfig config, EnumModule.formType formType, string alertName) { this._config = config; this.formType = formType; InitializeComponent(); cbPeriodName.DataSource = _config.Period; cbPeriodName.DisplayMember = "PeriodName"; cbPeriodName.ValueMember = "PeriodName"; cbEnablePeriodName.DataSource = _config.Period; cbEnablePeriodName.DisplayMember = "PeriodName"; cbEnablePeriodName.ValueMember = "PeriodName"; cbEnableDays.DataSource = Enum.GetValues(typeof(EnumModule.WeekDays)); cbAlertType.DataSource = Enum.GetValues(typeof(EnumModule.AlertType)); if (formType == EnumModule.formType.Edit) { this.alertRule = config.Alert.FirstOrDefault(x => x.alertName == alertName); tbAlertName.Visible = false; initData(); } else { //auto choose default weekday for (int count = 0; count < cbEnableDays.Items.Count; count++) { if ((EnumModule.WeekDays)cbEnableDays.Items[count] != EnumModule.WeekDays.Saturday && (EnumModule.WeekDays)cbEnableDays.Items[count] != EnumModule.WeekDays.Sunday) { cbEnableDays.SetItemChecked(count, true); } } //auto select default period cbPeriodName.SetItemChecked(0, true); cbEnablePeriodName.SetItemChecked(0, true); } }
private string BuildAlertMessage(ConfigModel.AlertRule alertRule) { string activitys = string.Empty; switch (alertRule.AlertType) { case EnumModule.AlertType.All: activitys = "總使用時間"; break; case EnumModule.AlertType.AllDistractingTime: activitys = "總Distracting使用時間"; break; case EnumModule.AlertType.AllProductiveTime: activitys = "總Productive使用時間"; break; case EnumModule.AlertType.SpecificActivity: case EnumModule.AlertType.SpecificCategory: case EnumModule.AlertType.SpecificCategoryOrActivity: activitys = string.Join(",", alertRule.SpecificName); break; } return($"【{activitys}】\n於 〔{string.Join(",",alertRule.PeriodName)}〕\n已滿 {alertRule.Hour} 小時 {alertRule.Minute} 分 \n{alertRule.CustomMessage}"); }
public void CheckTimeSpendIsExceedByAlertTypeAndPeriodTest() { List <ApiActivityResponse> MockData = RescueTimeAPI.ConvertStringArrayToClass(jsonString); ConfigModel.AlertRule alertRule = new ConfigModel.AlertRule(); alertRule.Hour = 1; alertRule.Minute = 0; alertRule.AlertType = EnumModule.AlertType.SpecificCategoryOrActivity; alertRule.SpecificName = new string[] { "ptt.cc", "ptt.cc - Google Chrome", "PttChrome - Google Chrome", "批踢踢實業坊" }; alertRule.PeriodName = new String[] { "全天" }; alertRule.EnablePeriodName = new string[] { "全天" }; alertRule.EnableDays = new List <EnumModule.WeekDays>() { EnumModule.WeekDays.Monday, EnumModule.WeekDays.Tuesday, EnumModule.WeekDays.Wednesday, EnumModule.WeekDays.Thursday, EnumModule.WeekDays.Friday, EnumModule.WeekDays.Saturday, EnumModule.WeekDays.Sunday }; bool result = new Alert().CheckTimeSpendIsExceedByAlertTypeAndPeriod(alertRule, MockData); Assert.IsInstanceOfType(result, typeof(Boolean)); }
public static void InsertUpdateAlertRule(ConfigModel.AlertRule alertRule) { ErrorHandle.Execute(() => _config.InsertUpdateAlertRule(alertRule)); }
/// <summary> /// 取得在指定period中,指定的AlertType所花費的時間 /// </summary> /// <param name="alertRule"></param> /// <param name="data"></param> /// <returns>如果累計時間超過alertRule指定的時間,就回傳true</returns> public bool CheckTimeSpendIsExceedByAlertTypeAndPeriod(ConfigModel.AlertRule alertRule, List <ApiActivityResponse> data, ConfigModel.JsonConfig config = null) { bool result = false; if (config == null) { config = ConfigUtil.GetJsonConfigData(); } //取得Period by period name List <ConfigModel.PeriodRule> periodList = alertRule.PeriodName.Select(x => ConfigUtil.GetPeriodRuleByPeriodName(x, config)).Where(x => x != null).ToList(); //會觸發Alert的時段 List <ConfigModel.PeriodRule> EnableAlertPeriodList = alertRule.EnablePeriodName.Select(x => ConfigUtil.GetPeriodRuleByPeriodName(x, config)).Where(x => x != null).ToList(); //判斷是否執行Alert bool IsEnableAlert = false; var TodayWeekDay = (EnumModule.WeekDays)((int)DateTime.Now.DayOfWeek); if (alertRule.EnableDays.Contains(TodayWeekDay)) { foreach (var period in EnableAlertPeriodList) { if (CheckTimeBetweenTwoHour(DateTime.Now.Hour, period.Hour_begin, period.Hour_end)) { IsEnableAlert = true; } } } if (!IsEnableAlert) { return(false); } //Func<> 用在where條件,依照period,取得總花費時間 Func <ApiActivityResponse, bool> FilterDataByPeriod = (ApiActivityResponse x) => { bool filterResult = false; if (periodList.Count == 0) { return(true); } foreach (var period in periodList) { //p.s. 這裡的hour_end判斷是用小於,沒有等於 filterResult = CheckTimeBetweenTwoHour(x.Date.Hour, period.Hour_begin, period.Hour_end); } return(filterResult); }; //依照AlertType跟period,取得data switch (alertRule.AlertType) { case EnumModule.AlertType.SpecificCategory: data = data .Where(x => alertRule.SpecificName.Contains(x.Category, StringComparer.OrdinalIgnoreCase) && FilterDataByPeriod(x)) .ToList(); break; case EnumModule.AlertType.SpecificActivity: data = data .Where(x => ( alertRule.SpecificName.Contains(x.Activity, StringComparer.OrdinalIgnoreCase) || (x.Activity == "Google Chrome" && alertRule.SpecificName.Any(s => s.Equals(x.Document, StringComparison.OrdinalIgnoreCase)) ) ) && FilterDataByPeriod(x)) .ToList(); break; case EnumModule.AlertType.SpecificCategoryOrActivity: data = data .Where(x => (alertRule.SpecificName.Contains(x.Category, StringComparer.OrdinalIgnoreCase) || alertRule.SpecificName.Contains(x.Activity, StringComparer.OrdinalIgnoreCase) || (x.Activity == "Google Chrome" && alertRule.SpecificName.Any(s => s.Equals(x.Document, StringComparison.OrdinalIgnoreCase)) ) ) && FilterDataByPeriod(x)) .ToList(); break; case EnumModule.AlertType.All: data = data.Where(x => FilterDataByPeriod(x)).ToList(); break; case EnumModule.AlertType.AllDistractingTime: data = data.Where(x => x.Productivity < 0 && FilterDataByPeriod(x)).ToList(); break; case EnumModule.AlertType.AllProductiveTime: data = data.Where(x => x.Productivity > 0 && FilterDataByPeriod(x)).ToList(); break; } int TotalSpendTime = data.Sum(x => x.TimeSpent); //判斷總花費時間有沒有超過 int limitTime = (alertRule.Hour * 60 + alertRule.Minute) * 60; if (TotalSpendTime > limitTime) { result = true; } return(result); }