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);
     }
 }
Ejemplo n.º 2
0
        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}");
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
 public static void InsertUpdateAlertRule(ConfigModel.AlertRule alertRule)
 {
     ErrorHandle.Execute(() => _config.InsertUpdateAlertRule(alertRule));
 }
Ejemplo n.º 5
0
        /// <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);
        }