示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="perspective">排名、間隔</param>
        /// <param name="resolution_time">month、week、hour、day、minute</param>
        /// <param name="restrict_kind">要取得的資料類型 category、ApiActivityResponse、productivity..etc</param>
        /// <param name="restrict_begin">時間begin</param>
        /// <param name="restrict_end">時間end</param>
        /// <param name="restrict_thing">要取得的物件名稱 ex.domain name、程式名稱,用了這個選項,會回傳視窗標題,而不是domain name</param>
        /// <param name="restrict_thingy">用來搜尋視窗標題,好像沒有用</param>
        /// <returns></returns>
        private static string BuildQueryString(
            EnumModule.perspective perspective         = EnumModule.perspective.rank,
            EnumModule.resolution_time resolution_time = EnumModule.resolution_time.hour,
            EnumModule.restrict_kind restrict_kind     = EnumModule.restrict_kind.document,
            string restrict_begin         = "", string restrict_end = "", string restrict_thing = "", string restrict_thingy = "",
            ConfigModel.JsonConfig config = null)
        {
            if (config == null)
            {
                config = ConfigUtil.GetJsonConfigData();
            }

            var queryParams = new NameValueCollection()
            {
                { "key", config.Apikey },
                { "perspective", perspective.ToString() },
                { "resolution_time", resolution_time.ToString() },
                { "restrict_kind", restrict_kind.ToString() },
                { "restrict_begin", restrict_begin },
                { "restrict_end", restrict_end },
                { "restrict_thing", restrict_thing },
                { "restrict_thingy", restrict_thingy },
            };

            return(AnalyticDataAPI_URL + ToQueryString(queryParams));
        }
 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);
     }
 }
示例#3
0
        public string DisplayAlertProcess(List <ApiActivityResponse> data, ConfigModel.JsonConfig config = null)
        {
            string alertMsg = string.Empty;

            if (config == null)
            {
                config = ConfigUtil.GetJsonConfigData();
            }

            foreach (var alertRule in config.Alert)
            {
                var IsShowAlert       = CheckTimeSpendIsExceedByAlertTypeAndPeriod(alertRule, data, config);
                var HasShowAlertToday = CheckAlertHasDisplayToday(alertRule.alertName);
                if (IsShowAlert && !HasShowAlertToday)
                {
                    //組回傳字串
                    alertMsg += "\n" + BuildAlertMessage(alertRule);
                    //紀錄到AlertRecord
                    ConfigUtil.InsertUpdateAlertRecord(new ConfigModel.AlertRecord(alertRule.alertName, DateTime.Now.Date));
                }
            }

            return(alertMsg);
        }
 void RefreshConfig()
 {
     this.IsConfigModify = true;
     this._config        = ConfigUtil.GetJsonConfigData();
 }
 public static ConfigModel.PeriodRule GetPeriodRuleByPeriodName(string periodName, ConfigModel.JsonConfig config = null)
 {
     if (config == null)
     {
         config = GetJsonConfigData();
     }
     return(ErrorHandle.Execute(() => _config.GetPeriodRuleByPeriodName(config, periodName)));
 }
示例#6
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);
        }