예제 #1
0
        public FeedSettingsInfo(IDictionary <string, string> kv)
        {
            if (kv.ContainsKey(PersonSetting.FEED_START_DATE))
            {
                FromDate = DateTimeTools.ParseExactNullable(kv[PersonSetting.FEED_START_DATE]);
            }
            if (kv.ContainsKey(PersonSetting.FEED_END_DATE))
            {
                ToDate = DateTimeTools.ParseExactNullable(kv[PersonSetting.FEED_END_DATE]);
            }

            if (kv.ContainsKey(PersonSetting.FEED_GRADING_PERIOD_ID) && !string.IsNullOrWhiteSpace(kv[PersonSetting.FEED_GRADING_PERIOD_ID]))
            {
                GradingPeriodId = int.Parse(kv[PersonSetting.FEED_GRADING_PERIOD_ID]);
            }

            if (kv.ContainsKey(PersonSetting.FEED_ANNOUNCEMENT_TYPE) && !string.IsNullOrWhiteSpace(kv[PersonSetting.FEED_ANNOUNCEMENT_TYPE]))
            {
                AnnouncementType = int.Parse(kv[PersonSetting.FEED_ANNOUNCEMENT_TYPE]);
            }

            if (kv.ContainsKey(PersonSetting.FEED_SORTING) && !string.IsNullOrWhiteSpace(kv[PersonSetting.FEED_SORTING]))
            {
                SortType = int.Parse(kv[PersonSetting.FEED_SORTING]);
            }

            AnyDate = !GradingPeriodId.HasValue && !FromDate.HasValue && !ToDate.HasValue;
        }
예제 #2
0
        public void GetDayEndTest()
        {
            DateTime expected = new DateTime(1999, 12, 31, 23, 59, 59);
            DateTime test     = new DateTime(1999, 12, 31, 14, 54, 57);

            Assert.AreEqual(expected, DateTimeTools.GetDayEnd(test));
        }
예제 #3
0
        public void GetHourBeginningTest()
        {
            DateTime expected = new DateTime(2005, 6, 3, 10, 0, 0);
            DateTime test     = new DateTime(2005, 6, 3, 10, 45, 36);

            Assert.AreEqual(expected, DateTimeTools.GetHourBeginning(test));
        }
예제 #4
0
        public void ValidateDateTimeStringToFail_1()
        {
            // Should fail due to valid datetime issues.
            var ex = Assert.Throws <FormatException>(() => DateTimeTools.ValidateDateTimeString("1985-11-32 22:26:38"));

            Assert.IsTrue(ex.Message.Contains("Invalid SQL DateTime Format When Parsing."));
        }
예제 #5
0
        public void GetHourEndTest()
        {
            DateTime expected = new DateTime(2005, 6, 3, 10, 59, 59);
            DateTime test     = new DateTime(2005, 6, 3, 10, 45, 36);

            Assert.AreEqual(expected, DateTimeTools.GetHourEnd(test));
        }
예제 #6
0
    public static DateTime hoursLater(DateTime date, double h)
    {
        long   unixEpoch    = DateTimeTools.ToUnixTime(date);
        double newUnixEpoch = unixEpoch + h * dayMs / 24;

        return(DateTimeTools.FromUnixTime((long)newUnixEpoch));
    }
예제 #7
0
        public void GetDayBeginningTest()
        {
            DateTime expected = new DateTime(1999, 12, 31, 0, 0, 0);
            DateTime test     = new DateTime(1999, 12, 31, 14, 54, 57);

            Assert.AreEqual(expected, DateTimeTools.GetDayBeginning(test));
        }
예제 #8
0
        IScalableDataManager CreateRandomDataManager(int trynumber = 0)
        {
            //В зависимости от типа мэнеджера должен выбираться нужный тайм-фрейм
            Period[] values      = { /* Period.Minute, */ Period.Hour, Period.Day };
            Period   randomValue = values[UnityEngine.Random.Range(0, values.Length)];

            int[] availablePeriodSizes;
            switch (randomValue)
            {
            case Period.Minute:
            {
                availablePeriodSizes = new int[] { 1, 5 };         // { 1, 5 ,10,15,20,30};
            }
            break;

            case Period.Hour:
            {
                availablePeriodSizes = new int[] { 1, 3, 4 };        //{ 1, 3, 4, 6, 12 };
            }
            break;

            case Period.Day:
            {
                availablePeriodSizes = new int[] { 1, 3 };
            }
            break;

            default: { throw new ArgumentOutOfRangeException("Enum присвоено не верное значение"); }
            }

            int periodSize  = availablePeriodSizes[UnityEngine.Random.Range(0, availablePeriodSizes.Length)];
            int randAssetId = UnityEngine.Random.Range(0, assets.Length);

            /*////////////////////////////
             * //Для теста рабочей области//
             * //////////////////////////////
             * randomValue = Period.Minute;
             * periodSize = 1;
             * //*/
            TimeFrame timeFrame = new TimeFrame(randomValue, periodSize);


            //TODO: Здесь должен быть случайный выбор из любых доступных менеджеров
            IScalableDataManager dm = new CryptoCompareDataManager(timeFrame, assets[randAssetId].base_currency, assets[randAssetId].reciprocal_currency, assets[randAssetId].exchange);
            int fluctuations        = DateTimeTools.CountFramesInPeriod(dm.TFrame, dm.DataBeginTime, dm.DataEndTime, TimeSpan.Zero);

            if (fluctuations < MIN_FLUCTUATIONS_AMOUNT && trynumber < 10)
            {
                Debug.Log("Недостаточное количество свечей пробуем загрузить другой");
                dm = CreateRandomDataManager(trynumber++);
            }

            if (trynumber > 10)
            {
                Debug.LogError("Не удалось загрузить подходящий условиям график");
                return(null);
            }
            return(dm);
        }
예제 #9
0
        public void LoadGame(Mode mode = Mode.Simple)
        {
            gameMode = mode;
            switch (gameMode)
            {
            case Mode.Simple:
            {
                //Создаём отрисовщик графика
                chartDataManager = CreateRandomDataManager();
                //Задаём рандомную временнУю область игры. Некоторое количество свечей предыстории, некоторое количество свечей на игру
                int fluctuationCount = DateTimeTools.CountFramesInPeriod(chartDataManager.TFrame, chartDataManager.DataBeginTime, chartDataManager.DataEndTime, TimeSpan.Zero);
                SetRandomGameTime(fluctuationCount);
                chartDataManager.SetWorkDataRange(fluctuation1ID, fluctuationsCountToLoad);
            }
            break;

            default:
            {
                Debug.LogError("Не создан сценарий для данного мода");
            }
            break;
            }

            //задаём систему координат
            coordGrid = new CoordinateGrid(chartDataManager.WorkBeginTime, chartDataManager.TFrame);

            chartDrawer.ReloadData();
            chartDrawer.ChartDataManager = chartDataManager;
            chartDrawer.CoordGrid        = coordGrid;
            chartDrawer.CalculateMovingAverage(0, gamePrefs.Fast_ma_length);
            chartDrawer.CalculateMovingAverage(1, gamePrefs.Slow_ma_length);

            coordGrid.OnScaleChange += chartDrawer.UpdateInNextFrame;

            //Передаём ссылки на необходимые классы контроллеру навигации на графике
            NavigationController.Instance.ChartDataManager = chartDataManager;
            NavigationController.Instance.CoordGrid        = coordGrid;
            NavigationController.Instance.Initialize();
            PlayerManager.Instance.InitializeData(chartDataManager);
            PlayerManager.Instance.TradeIsClosed += ClosedTradeEffect;
            PlayerManager.Instance.TradeIsOpened += (price, position) =>
            {
                current_price = (double)price;
            };

            UpdatePlayersInfoFields();

            chartDataManager.WorkFlowChanged += () => { chartDrawer.UpdateMovingAverage(0, gamePrefs.Fast_ma_length); };
            chartDataManager.WorkFlowChanged += () => { chartDrawer.UpdateMovingAverage(1, gamePrefs.Slow_ma_length); };

            gamePrefs.FastMALengthChanged += (x) => { chartDrawer.CalculateMovingAverage(0, x); };
            gamePrefs.SlowMALengthChanged += (x) => { chartDrawer.CalculateMovingAverage(1, x); };

            GameButtonsSetActive(true);
            chartInterface.InterfaceSetActive(true);
        }
예제 #10
0
        public string GetReportName(Transaction transaction)
        {
            int    monthNumber = transaction.TransactionDate.Month;
            string monthName   = DateTimeTools.GetMonthName(monthNumber).GetWithNoPolishLetters();

            int year = transaction.TransactionDate.Year;

            string sheetName = string.Format("{0} {1}", monthName, year);

            return(sheetName);
        }
예제 #11
0
        public List <DatabasePerHourStat> CalculateHourlyAverages(List <DateTime> hoursToCalulate)
        {
            List <DatabasePerHourStat> perHourStats = new List <DatabasePerHourStat>();

            DatabasePerHourStat          hourStat             = null;
            List <DatabasePerSecondStat> tempAllSecondsInHour = null;
            int minPeopleInHour = -1;
            int maxPeopleInHour = -1;
            int tempSum         = 0;

            foreach (DateTime hour in hoursToCalulate)
            {
                tempAllSecondsInHour = _dbQueryService.GetAllSecondsForHour(hour);

                if (tempAllSecondsInHour.Count != 3600)
                {
                    // Write to log that this hour is missing PerSecondStats.
                    return(null);
                }

                minPeopleInHour = tempAllSecondsInHour.First().NumDetectedObjects;
                maxPeopleInHour = tempAllSecondsInHour.First().NumDetectedObjects;
                tempSum         = 0;

                // Calculate average, min and max. Create DatabasePerHourStat.
                foreach (DatabasePerSecondStat second in tempAllSecondsInHour)
                {
                    tempSum += second.NumDetectedObjects;

                    if (second.NumDetectedObjects < minPeopleInHour)
                    {
                        minPeopleInHour = second.NumDetectedObjects;
                    }

                    if (second.NumDetectedObjects > maxPeopleInHour)
                    {
                        maxPeopleInHour = second.NumDetectedObjects;
                    }
                }

                hourStat = new DatabasePerHourStat
                {
                    Day  = DateTimeTools.GetHourBeginning(hour),
                    Hour = hour.Hour,
                    AverageDetectedObjects = (tempSum / tempAllSecondsInHour.Count),
                    MaximumDetectedObjects = maxPeopleInHour,
                    MinimumDetectedObjects = minPeopleInHour
                };

                perHourStats.Add(hourStat);
            }

            return(perHourStats);
        }
예제 #12
0
        /// <summary>
        /// Checks the validity of the attributes of the PerSecondStat object.
        /// </summary>
        /// <returns>Boolean indicating if the PerSecondStat object is valid.</returns>
        public bool isValidSecondStat()
        {
            if (NumTrackedPeople < 0 || DateTime.CheckIfSQLFormat() == false)
            {
                return(false);
            }

            DateTime toValidate = MySqlDateTimeConverter.ToDateTime(DateTime);

            return(DateTimeTools.ValidateDateTime(toValidate));
        }
예제 #13
0
        public void GetDaysBetween_SameDateNonHoliday()
        {
            var curYear = DateTime.Now.Year;

            var startDate = new DateTime(curYear, 1, 4);
            var endDate   = new DateTime(curYear, 1, 4);

            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate, GetDaysReturnType.BusinessDaysExcludeHolidays), 0);
            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate), 0);
        }
예제 #14
0
        public void GetDaysBetween_OneDayWithoutBankHoliday()
        {
            var curYear = DateTime.Now.Year;

            var startDate = new DateTime(curYear, 1, 2);
            var endDate   = new DateTime(curYear, 1, 3);

            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate, GetDaysReturnType.BusinessDaysExcludeHolidays), 1);
            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate), 1);
        }
예제 #15
0
        public void GetDaysBetween_HalfYearLateHalf()
        {
            var curYear = DateTime.Now.Year;

            var startDate = new DateTime(curYear, 6, 1);
            var endDate   = new DateTime(curYear, 12, 31);

            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate, GetDaysReturnType.BusinessDaysExcludeHolidays), 145);
            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate), 213);
        }
예제 #16
0
        public void GetDaysBetween_FullYear()
        {
            var curYear = DateTime.Now.Year;

            var startDate = new DateTime(curYear, 1, 1);
            var endDate   = new DateTime(curYear, 12, 31);

            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate, GetDaysReturnType.BusinessDaysExcludeHolidays), 250);
            Assert.AreEqual(DateTimeTools.GetDaysBetween(startDate,
                                                         endDate), 364);
        }
예제 #17
0
        protected CurrentPersonViewData(PersonDetails person, District district, School school, SchoolYear schoolYear, IList <ClaimInfo> claimInfos)
            : base(person)
        {
            CurrentSchoolYearId   = schoolYear.Id;
            CurrentSchoolYearName = schoolYear.Name;

            SchoolLocalId    = school.LocalId;
            SchoolName       = school.Name;
            DistrictId       = district.Id;
            DistrictTimeZone = DateTimeTools.WindowsToIana(district.TimeZone);
            DistrictName     = district.Name;
            StateCode        = district.StateCode;
            Email            = person.Email;
            Claims           = PersonClaimViewData.Create(claimInfos);
        }
예제 #18
0
        private IEnumerable <DateTime> GetVisibleDatesList()
        {
            //Вычисляем точки на временнОй сетке и отрисовываем их
            DateTime dt0 = CoordGrid.FromXAxisToDate(worldPointInLeftDownCorner.x);
            DateTime dt1 = CoordGrid.FromXAxisToDate(worldPointInRightUpCorner.x);

            if (CoordGrid is CoordinateGrid)
            {
                dt0 = (CoordGrid as CoordinateGrid).DateCorrection(dt0, dt1);
            }

            IEnumerable <DateTime> dateList = DateTimeTools.DividePeriodByKeyPoints(dt0, dt1, dateTextPool.FieldsAmount);

            return(dateList);
        }
예제 #19
0
        public ROIDocumentCalculations(ROIDocument roiDocument)
        {
            RoiDocument = roiDocument;

            WorkHoursInADay = 8;

            var curYear   = DateTime.Now.Year;
            var startDate = new DateTime(curYear, 1, 1);
            var endDate   = new DateTime(curYear, 12, 31);

            WorkDaysInAYear = DateTimeTools.GetDaysBetween(startDate, endDate, GetDaysReturnType.BusinessDaysExcludeHolidays);

            WorkDaysInAMonth = (double)WorkDaysInAYear / 12;

            WorkDaysInAWeek = 5; //Keep is simple, no compensation for holidays
        }
예제 #20
0
        public FeedReportSettingsInfo(IDictionary <string, string> keyValue)
        {
            if (keyValue.ContainsKey(PersonSetting.FEED_REPORT_START_DATE))
            {
                StartDate = DateTimeTools.ParseExactNullable(keyValue[PersonSetting.FEED_REPORT_START_DATE]);
            }
            if (keyValue.ContainsKey(PersonSetting.FEED_REPORT_END_DATE))
            {
                EndDate = DateTimeTools.ParseExactNullable(keyValue[PersonSetting.FEED_REPORT_END_DATE]);
            }

            IncludeDetails          = GetBoolFromDictionary(PersonSetting.FEED_REPORT_INCLUDE_DETAILS, keyValue);
            IncludeAttachments      = GetBoolFromDictionary(PersonSetting.FEED_REPORT_INCLUDE_ATTACHMENTS, keyValue);
            IncludeHiddenAttributes = GetBoolFromDictionary(PersonSetting.FEED_REPORT_INCLUDE_HIDDEN_ATTRIBUTES, keyValue);
            IncludeHiddenActivities = GetBoolFromDictionary(PersonSetting.FEED_REPORT_INCLUDE_HIDDEN_ACTIVITIES, keyValue);
            LessonPlanOnly          = GetBoolFromDictionary(PersonSetting.FEED_REPORT_LP_ONLY, keyValue);
            GroupByStandards        = GetBoolFromDictionary(PersonSetting.FEED_REPORT_GROUP_BY_STANDARDS, keyValue);
        }
예제 #21
0
        /// <summary>
        /// 寫入 後台使用者操作 Log 紀錄
        /// </summary>
        /// <param name="requestModel"></param>
        /// <returns></returns>
        public APIReturn AddAdminLog(AdminLog requestModel)
        {
            var rtnMessage = "";
            var res        = new APIReturn(APIReturnCode.Fail, rtnMessage);

            try
            {
                //找出該 操作人員
                var admin = db.TblAdmin.Find(requestModel.Operator);

                //如果有找到
                if (admin?.Id != null)
                {
                    var log = new TblOperationLog()
                    {
                        Operator    = admin.Id,
                        Type        = requestModel.Type,
                        Code        = requestModel.Code,
                        Name        = requestModel.Name,
                        Remark      = requestModel.Remark,
                        Parameter   = requestModel.Parameter,
                        Ip          = requestModel.Ip,
                        RequestTime = DateTimeTools.Now(),
                    };

                    db.TblOperationLog.Add(log);

                    db.SaveChanges();

                    res = new APIReturn(APIReturnCode.Success, "後台 Log 寫入成功");
                }
                else
                {
                    res = new APIReturn(APIReturnCode.Fail, "無該使用者");
                }

                return(res);
            }
            catch (Exception ex)
            {
                res = new APIReturn(APIReturnCode.Exception, ex);
                return(res);
            }
        }
예제 #22
0
 /// <summary>
 /// 监听开奖是否达到指定期数未出现同号  例如100期开出1 号 101期开出 1号 就是开出跟上一期一样号码 就会自动开始启动
 /// </summary>
 /// <returns></returns>
 public override OpenNext GetNextOpenModel(string cateNo = "")
 {
     try
     {
         HttpItem item = new HttpItem()
         {
             URL         = base.Url + "/member/period?lottery=" + cateNo,
             Method      = "GET",
             Host        = GetHost(Url),
             UserAgent   = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0",
             Cookie      = base.Cookie,
             Accept      = "*/*",
             ContentType = "application/json;charset=UTF-8"
         };
         item.Header.Add("X-Requested-With", "XMLHttpRequest");
         var res = helper.GetHtml(item);
         if (res.Html == "")
         {
             return(null);
         }
         //{"closeTime":1555557445000,"currentTime":1555557368000,"drawDate":1555516800000,"drawNumber":"20580085","drawTime":1555557540000,"openTime":1555557240000,"pnumber":"20580084","status":1}
         var j           = JObject.Parse(res.Html);
         var closeTime   = j["closeTime"].ToString();
         var currentTime = j["currentTime"].ToString();
         var openTime    = j["openTime"].ToString();
         var expectNo    = j["drawNumber"].ToString();
         var pnumber     = j["pnumber"].ToString();
         Config.CurrentTime = DateTimeTools.GetTime(currentTime, false); //赋值当前时间
         var model = new OpenNext()
         {
             NextCloseTime = DateTimeTools.GetTime(closeTime, false),
             NextExpectNo  = expectNo,
             NextOpenTime  = DateTimeTools.GetTime(openTime, false),
             CurrTime      = Config.CurrentTime,
             CurrExpectNo  = pnumber
         };
         return(model);
     }
     catch (Exception ee) { return(null); }
 }
예제 #23
0
        // Before processing a request for a DataMessage with all PerSecondStat objects within a TimeInterval, this method is used to validate the received TimeInterval.
        public bool CheckTimeIntervalValidity(TimeInterval timeInterval)
        {
            if (timeInterval.StartDateTime.CheckIfSQLFormat() == false || timeInterval.EndDateTime.CheckIfSQLFormat() == false)
            {
                return(false);
            }

            DateTime start = timeInterval.StartDateTime.ToDateTime();
            DateTime end   = timeInterval.EndDateTime.ToDateTime();

            if (DateTimeTools.ValidateDateTime(start) == false || DateTimeTools.ValidateDateTime(end) == false)
            {
                return(false);
            }

            // The start time must be before the end time or the start time must be identical to the end time.
            if (DateTime.Compare(start, end) > 0)
            {
                return(false);
            }

            return(true);
        }
예제 #24
0
        public void DrawVolume(Rect camRect)
        {
            if (!IsSettingsSet)
            {
                return;
            }

            float worldRealToScreen = (CoordGrid.FromDateToXAxis(visibleEndDate) - CoordGrid.FromDateToXAxis(visibleStartDate)) / (worldPointInRightUpCorner.x - worldPointInLeftDownCorner.x);


            int   count            = DateTimeTools.CountFramesInPeriod(chartDataManager.TFrame, visibleStartDate, visibleEndDate, TimeSpan.Zero);
            float pixelLenghtFrame = camRect.width * worldRealToScreen / count;
            float maxVolume        = (float)visibleFluctuations.Max(x => x.Volume);

            //Если свечка видна только частично, то необходимо смещать отрисовку объёма на равную долю видимости
            float   diff = (worldPointInLeftDownCorner.x - CoordGrid.FromDateToXAxis(visibleStartDate)) * camRect.width / (worldPointInRightUpCorner.x - worldPointInLeftDownCorner.x);
            Vector2 barLeftDownCorner = camRect.min - new Vector2(diff + pixelLenghtFrame / 2, 0);
            Vector2 barRightUpCorner;
            Vector2 bordersOffset = new Vector2((20 / count < 1 ? 1 : 20 / count), 0);

            if (chartDataManager.WorkBeginTime > visibleStartDate)
            {
                int shift = DateTimeTools.CountFramesInPeriod(chartDataManager.TFrame, visibleStartDate, chartDataManager.WorkBeginTime, TimeSpan.Zero);
                barLeftDownCorner += new Vector2(shift * pixelLenghtFrame, 0);
            }

            foreach (var fluctuation in visibleFluctuations)
            {
                float pixelHeightFrame = (float)fluctuation.Volume / maxVolume * camRect.height;
                barRightUpCorner = barLeftDownCorner + new Vector2(pixelLenghtFrame, pixelHeightFrame);

                DrawTools.DrawRectangle(barLeftDownCorner + bordersOffset, barRightUpCorner - bordersOffset, fluctuation.Close - fluctuation.Open > 0 ? volumeUpColor : volumeDownColor);

                barLeftDownCorner = new Vector2(barRightUpCorner.x, camRect.min.y);
            }
        }
예제 #25
0
        public static void ExcelSave(ExportType exportType, EncounterBase data, TeraData teraData)
        {
            if ((exportType & (ExportType.Excel | ExportType.ExcelTemp)) == 0)
            {
                return;
            }
            lock (Savelock) //can't save 2 excel files at one time
            {
                NpcInfo boss = teraData.NpcDatabase.GetOrPlaceholder(ushort.Parse(data.areaId), uint.Parse(data.bossId));
                var     dir  =
                    Path.Combine(
                        exportType.HasFlag(ExportType.Excel)//if regular export, save in documents, otherwise temp
                            ? SettingsHelper.Instance.GetDocumentsPath()
                            : SettingsHelper.Instance.GetTempFolderPath(), $"exports/{boss.Area.Replace(":", "-")}");
                Directory.CreateDirectory(dir);
                var      fname = Path.Combine(dir, $"{boss.Name.Replace(":", "-")} {DateTimeTools.UnixTimeStampToDateTime(data.encounterUnixEpoch).ToString("yyyy-MM-dd HH-mm-ss", CultureInfo.InvariantCulture)}.xlsx");
                FileInfo file  = new FileInfo(fname);
                if (!file.Exists)
                {
                    using (ExcelPackage package = new ExcelPackage(file))
                    {
                        ExcelWorksheet ws        = package.Workbook.Worksheets.Add("Boss");
                        var            linkStyle = package.Workbook.Styles.CreateNamedStyle("HyperLink");
                        //This one is language dependent
                        linkStyle.Style.Font.UnderLine = true;
                        linkStyle.Style.Font.Color.SetColor(Color.Blue);
                        ws.DefaultRowHeight      = 30;
                        ws.Cells.Style.Font.Size = 14;
                        ws.Cells.Style.Font.Name = "Arial";
                        ws.Cells[1, 1].Value     =
                            $"{boss.Area}: {boss.Name} {TimeSpan.FromSeconds(double.Parse(data.fightDuration)).ToString(@"mm\:ss")}";
                        ws.Cells[1, 1, 1, 6].Merge           = true;
                        ws.Cells[1, 1, 1, 8].Style.Font.Bold = true;
                        ws.Cells[1, 7].Value = long.Parse(data.partyDps);
                        ws.Cells[1, 7].Style.Numberformat.Format = @"#,#00,\k\/\s";
                        ws.Cells[2, 1].Value = "Ic";
                        ws.Cells[2, 1].Style.Font.Color.SetColor(Color.Transparent);
                        ws.Cells[2, 2].Value = "Name";
                        ws.Cells[2, 3].Value = "Deaths";
                        ws.Cells[2, 4].Value = "Death time";
                        ws.Cells[2, 5].Value = "Damage %";
                        ws.Cells[2, 6].Value = "Crit %";
                        ws.Cells[2, 7].Value = "DPS";
                        ws.Cells[2, 8].Value = "Damage";
                        int i = 2;
                        foreach (var user in data.members.OrderByDescending(x => long.Parse(x.playerTotalDamage)))
                        {
                            i++;
                            ws.Cells[i, 1].Value = i - 2;
                            AddImage(ws, i, 1,
                                     Invert(
                                         new Bitmap(
                                             SettingsHelper.Instance.GetImage(
                                                 (PlayerClass)Enum.Parse(typeof(PlayerClass), user.playerClass)))));
                            ws.Cells[i, 2].Value     = $"{user.playerServer}: {user.playerName}";
                            ws.Cells[i, 2].Hyperlink = CreateUserSheet(package.Workbook, user, teraData);
                            ws.Cells[i, 3].Value     = long.Parse(user.playerDeaths);
                            ws.Cells[i, 4].Value     = long.Parse(user.playerDeathDuration);
                            ws.Cells[i, 4].Style.Numberformat.Format = @"0\s";
                            ws.Cells[i, 5].Value = double.Parse(user.playerTotalDamagePercentage) / 100;
                            ws.Cells[i, 5].Style.Numberformat.Format = "0.0%";
                            ws.Cells[i, 6].Value = double.Parse(user.playerAverageCritRate) / 100;
                            ws.Cells[i, 6].Style.Numberformat.Format = "0.0%";
                            ws.Cells[i, 7].Value = long.Parse(user.playerDps);
                            ws.Cells[i, 7].Style.Numberformat.Format = @"#,#0,\k\/\s";
                            ws.Cells[i, 8].Value = long.Parse(user.playerTotalDamage);
                            ws.Cells[i, 8].Style.Numberformat.Format = @"#,#0,\k";
                        }
                        ws.Cells[1, 8].Formula = $"SUM(H3:H{i})";
                        ws.Cells[1, 8].Style.Numberformat.Format = @"#,#0,\k";
                        var border = ws.Cells[1, 1, i, 8].Style.Border;
                        border.Bottom.Style             =
                            border.Top.Style            = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;
                        ws.Cells[2, 1, i, 8].AutoFilter = true;

                        int j = i + 3;
                        ws.Cells[j, 1].Value = "Ic";
                        ws.Cells[j, 1].Style.Font.Color.SetColor(Color.Transparent);
                        ws.Cells[j, 2].Value                 = "Debuff name";
                        ws.Cells[j, 2, j, 7].Merge           = true;
                        ws.Cells[j, 8].Value                 = "%";
                        ws.Cells[j, 2, j, 8].Style.Font.Bold = true;
                        foreach (var buf in data.debuffUptime)
                        {
                            j++;
                            var hotdot = teraData.HotDotDatabase.Get(int.Parse(buf.Key));
                            ws.Cells[j, 1].Value = j - i - 3;
                            AddImage(ws, j, 1, BTD.Icons.GetBitmap(hotdot.IconName));
                            ws.Cells[j, 2].Value = hotdot.Name;
                            if (!string.IsNullOrEmpty(hotdot.Tooltip))
                            {
                                ws.Cells[j, 2].AddComment("" + hotdot.Tooltip, "info");
                            }
                            ws.Cells[j, 2, j, 7].Merge = true;
                            ws.Cells[j, 8].Value       = double.Parse(buf.Value) / 100;
                            ws.Cells[j, 8].Style.Numberformat.Format = "0%";
                        }
                        border = ws.Cells[i + 3, 1, j, 8].Style.Border;
                        border.Bottom.Style  =
                            border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;

                        ws.Column(1).Width = 5.6;
                        ws.Column(2).AutoFit();
                        ws.Column(3).AutoFit();
                        ws.Column(4).AutoFit();
                        ws.Column(5).AutoFit();
                        ws.Column(6).AutoFit();
                        ws.Column(7).AutoFit();
                        ws.Column(8).Width = 17;
                        ws.Column(2).Width = GetTrueColumnWidth(ws.Column(2).Width);
                        ws.Column(3).Width = GetTrueColumnWidth(ws.Column(3).Width);
                        ws.Column(4).Width = GetTrueColumnWidth(ws.Column(4).Width);
                        ws.Column(5).Width = GetTrueColumnWidth(ws.Column(5).Width);
                        ws.Column(6).Width = GetTrueColumnWidth(ws.Column(6).Width);
                        ws.Column(7).Width = GetTrueColumnWidth(ws.Column(7).Width);
                        ws.Cells[1, 1, j, 8].Style.VerticalAlignment   = ExcelVerticalAlignment.Center;
                        ws.Cells[1, 1, j, 8].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                        ws.PrinterSettings.FitToPage        = true;
                        package.Workbook.Properties.Title   = boss.Name;
                        package.Workbook.Properties.Author  = "CasualMeter";
                        package.Workbook.Properties.Company = "github.com/lunyx github.com/Gl0 github.com/neowutran";
                        package.Save();
                    }
                }
                if (exportType == ExportType.ExcelTemp && File.Exists(fname))
                {
                    Process.Start(fname);
                }
            }
        }
예제 #26
0
        public static void ToTeraDpsApi(ExportType exportType, DamageTracker damageTracker, TeraData teraData)
        {
            if (exportType == ExportType.None)
            {
                return;
            }

            //if we want to upload, primary target must be dead
            if (exportType.HasFlag(ExportType.Upload) && !damageTracker.IsPrimaryTargetDead)
            {
                return;
            }

            var exportToExcel = (exportType & (ExportType.Excel | ExportType.ExcelTemp)) != 0;
            //if we're not exporting to excel and credentials aren't fully entered, return
            //if (!exportToExcel
            //    && (string.IsNullOrEmpty(SettingsHelper.Instance.Settings.TeraDpsToken)
            //        || string.IsNullOrEmpty(SettingsHelper.Instance.Settings.TeraDpsUser)))
            //    return;

            //ignore if not a boss
            var entity = damageTracker.PrimaryTarget;

            if (!(entity?.Info.Boss ?? false))
            {
                return;
            }

            var abnormals = damageTracker.Abnormals;

            bool timedEncounter = false;

            //Nightmare desolarus
            if (entity.Info.HuntingZoneId == 759 && entity.Info.TemplateId == 1003)
            {
                timedEncounter = true;
            }

            var firstHit  = damageTracker.StatsByUser.SelectMany(x => x.SkillLog).Where(x => x.Target == entity).Min(x => x.Time as DateTime?) ?? new DateTime(0);
            var lastHit   = damageTracker.StatsByUser.SelectMany(x => x.SkillLog).Where(x => x.Target == entity).Max(x => x.Time as DateTime?) ?? new DateTime(0);
            var firstTick = firstHit.Ticks;
            var lastTick  = lastHit.Ticks;
            var interval  = lastTick - firstTick;
            var seconds   = interval / TimeSpan.TicksPerSecond;

            if (seconds == 0)
            {
                return;
            }
            long totaldamage;

            if (timedEncounter)
            {
                totaldamage =
                    damageTracker.StatsByUser.SelectMany(x => x.SkillLog)
                    .Where(x => x.Time >= firstHit && x.Time <= lastHit)
                    .Sum(x => (long)x.Damage);
            }
            else
            {
                totaldamage =
                    damageTracker.StatsByUser.SelectMany(x => x.SkillLog)
                    .Where(x => x.Target == entity)
                    .Sum(x => (long)x.Damage);
            }

            var partyDps    = TimeSpan.TicksPerSecond * totaldamage / interval;
            var teradpsData = new EncounterBase
            {
                encounterUnixEpoch = DateTimeTools.DateTimeToUnixTimestamp(damageTracker.LastAttack?.ToUniversalTime() ?? DateTime.UtcNow),
                areaId             = entity.Info.HuntingZoneId + "",
                bossId             = entity.Info.TemplateId + "",
                fightDuration      = seconds + "",
                partyDps           = partyDps + ""
            };

            foreach (var debuff in abnormals.Get(entity).OrderByDescending(x => x.Value.Duration(firstTick, lastTick)))
            {
                long percentage = debuff.Value.Duration(firstTick, lastTick) * 100 / interval;
                if (percentage == 0)
                {
                    continue;
                }
                teradpsData.debuffUptime.Add(new KeyValuePair <string, string>(
                                                 debuff.Key.Id + "", percentage + ""
                                                 ));
            }

            foreach (var user in damageTracker.StatsByUser.OrderByDescending(x => x.Dealt.Damage))
            {
                var filteredSkillog = timedEncounter
                    ? user.SkillLog.Where(x => x.Time >= firstHit && x.Time <= lastHit).ToList()
                    : user.SkillLog.Where(x => x.Target == entity).ToList();

                long damage = filteredSkillog.Sum(x => x.Damage);
                if (damage <= 0)
                {
                    continue;
                }

                var teradpsUser = new Members();

                teradpsUser.playerTotalDamage = damage + "";
                var buffs = abnormals.Get(user.Player);
                teradpsUser.playerClass           = user.Class.ToString();
                teradpsUser.playerName            = user.Name;
                teradpsUser.playerServer          = SettingsHelper.Instance.BasicTeraData.Servers.GetServerName(user.Player.ServerId);
                teradpsUser.playerAverageCritRate = Math.Round(100 * (double)filteredSkillog.Count(x => x.IsCritical && x.Damage > 0) / filteredSkillog.Count(x => x.Damage > 0)) + "";
                teradpsUser.healCrit  = user.Player.IsHealer ? Math.Round(100 * (double)filteredSkillog.Count(x => x.IsCritical && x.Heal > 0) / filteredSkillog.Count(x => x.Heal > 0)) + "" : null;
                teradpsUser.playerDps = TimeSpan.TicksPerSecond * damage / interval + "";
                teradpsUser.playerTotalDamagePercentage = damage * 100 / totaldamage + "";

                var death = buffs.Death;
                teradpsUser.playerDeaths        = death.Count(firstTick, lastTick) + "";
                teradpsUser.playerDeathDuration = death.Duration(firstTick, lastTick) / TimeSpan.TicksPerSecond + "";

                var aggro = buffs.Aggro(entity);
                teradpsUser.aggro = 100 * aggro.Duration(firstTick, lastTick) / interval + "";

                foreach (var buff in buffs.Times.OrderByDescending(x => x.Value.Duration(firstTick, lastTick)))
                {
                    long percentage = (buff.Value.Duration(firstTick, lastTick) * 100 / interval);
                    if (percentage == 0)
                    {
                        continue;
                    }
                    teradpsUser.buffUptime.Add(new KeyValuePair <string, string>(
                                                   buff.Key.Id + "", percentage + ""
                                                   ));
                }

                var aggregated = new List <AggregatedSkillResult>();
                var collection = new SynchronizedObservableCollection <SkillResult>();
                foreach (var skill in filteredSkillog)
                {
                    collection.Add(skill);
                    if (aggregated.All(asr => !skill.IsSameSkillAs(asr)))
                    {
                        aggregated.Add(new AggregatedSkillResult(skill.SkillShortName, skill.IsHeal,
                                                                 AggregationType.Name, collection));
                    }
                }
                foreach (var skill in aggregated.OrderByDescending(x => x.Damage))
                {
                    var skillLog    = new SkillLog();
                    var skilldamage = skill.Damage;
                    if (skilldamage == 0)
                    {
                        continue;
                    }

                    skillLog.skillAverageCrit   = skill.AverageCrit + "";
                    skillLog.skillAverageWhite  = skill.AverageWhite + "";
                    skillLog.skillCritRate      = Math.Round(skill.CritRate * 100) + "";
                    skillLog.skillDamagePercent = Math.Round(skill.DamagePercent * 100) + "";
                    skillLog.skillHighestCrit   = skill.HighestCrit + "";
                    skillLog.skillHits          = skill.Hits + "";
                    skillLog.skillId            = teraData.SkillDatabase.GetSkillByPetName(skill.NpcInfo?.Name, user.Player.RaceGenderClass)?.Id.ToString() ?? skill.SkillId.ToString();
                    skillLog.skillLowestCrit    = skill.LowestCrit + "";
                    skillLog.skillTotalDamage   = skilldamage + "";

                    teradpsUser.skillLog.Add(skillLog);
                }
                teradpsData.members.Add(teradpsUser);
            }

            //export to excel if specified
            if (exportToExcel)
            {
                Task.Run(() => ExcelExport.ExcelSave(exportType, teradpsData, teraData));
            }

            //return if we don't need to upload
            if (!exportType.HasFlag(ExportType.Upload))
            {
                return;
            }

            /*
             * Validation, without that, the server cpu will be burning \o
             */
            var areaId = int.Parse(teradpsData.areaId);

            if (
                //areaId != 886 &&
                //areaId != 467 &&
                //areaId != 767 &&
                //areaId != 768 &&
                //areaId != 468 &&
                areaId != 770 &&
                areaId != 769 &&
                areaId != 916 &&
                areaId != 969 &&
                areaId != 970 &&
                areaId != 950
                )
            {
                return;
            }

            try
            {
                using (var client = new HttpClient())
                {
                    client.Timeout = TimeSpan.FromSeconds(40);
                    var response = client.GetAsync("http://moongourd.com/shared/servertime");
                    var timediff = (response.Result.Headers.Date.Value.UtcDateTime.Ticks - DateTime.UtcNow.Ticks) / TimeSpan.TicksPerSecond;
                    teradpsData.encounterUnixEpoch += timediff;
                }
            }
            catch (Exception)
            {
                Debug.WriteLine("Get server time error");
                return;
            }
            var json = JsonConvert.SerializeObject(teradpsData, new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore
            });

            Task.Run(() => Send(entity, json, 3));
        }
예제 #27
0
 public static DateTime fromJulian(double j)
 {
     return(DateTimeTools.FromUnixTime((long)((j + 0.5 - J1970) * dayMs)));
 }
예제 #28
0
 public static double toJulian(DateTime date)
 {
     return(DateTimeTools.ToUnixTime(date) / (double)dayMs - 0.5 + J1970);
 }
예제 #29
0
        public void ValidateDateTimeToFail()
        {
            DateTime test = new DateTime(1899, 12, 31, 23, 59, 59);

            Assert.IsFalse(DateTimeTools.ValidateDateTime(test));
        }
예제 #30
0
        public void GenerateSheets()
        {
            int YEAR = 2017;

            object[] headers =
            {
                @"Project/Activity", "Feature",  "Employee", "Comment", "Business Line (BL)",
                "Time(date)",        "Location", "Work Units"
            };

            string PATH = @"c:\Maciek\Timesheets\2017";

            int COL_FIRST      = 1;
            int COL_LAST       = 8;
            int ROW_FIRST      = 1;
            int ROW_DATA_FIRST = 2;

            ExcelApp excel = new ExcelApp();

            excel.CreateNewInstance();

            for (int m = 12; m >= 1; m--)
            {
                IExcelWorkbook workbook     = excel.CreateAndActivateNewWorkbook();
                string         workBookName = $"Protokol_MSzczudlo_{YEAR}_{m:D2}.xlsx";
                string         workBookPath = Path.Combine(PATH, workBookName);

                int daysInMonth = DateTime.DaysInMonth(YEAR, m);
                int ROW_LAST    = daysInMonth + 1;
                int ROW_SUM     = ROW_LAST + 1;

                ExcelSheetData sheetData     = new ExcelSheetData();
                ExcelRowData   headerRowData = new ExcelRowData(COL_FIRST, ROW_FIRST, COL_LAST, ROW_FIRST);
                headerRowData.Values = headers.ToList();
                sheetData.Rows.Add(headerRowData);
                ExcelFormatData headerRowFormat = new ExcelFormatData(COL_FIRST, ROW_FIRST, COL_LAST, ROW_FIRST);
                headerRowFormat.Background          = Color.LightGray;
                headerRowFormat.IsFontBold          = true;
                headerRowFormat.HorizontalAlignment = ExcelHorizontalAlignmentType.Center;
                sheetData.Formats.Add(headerRowFormat);

                for (int d = 1; d <= daysInMonth; d++)
                {
                    object[] values = new object[8];


                    int      row  = d + 1;
                    DateTime iDay = new DateTime(YEAR, m, d);

                    values[5] = iDay.ToShortDateString();

                    bool isFreeDay = iDay.DayOfWeek == DayOfWeek.Saturday || iDay.DayOfWeek == DayOfWeek.Sunday;
                    if (isFreeDay)
                    {
                        ExcelFormatData iFormatData = new ExcelFormatData(COL_FIRST, row, COL_LAST, row);
                        iFormatData.Background = Color.Salmon;
                        sheetData.Formats.Add(iFormatData);
                        ExcelRowData iRow = new ExcelRowData(COL_FIRST, row, COL_LAST, row);
                        iRow.Values = values.ToList();
                        sheetData.Rows.Add(iRow);
                    }
                    else
                    {
                        values[0] = "IS Treasury";
                        values[2] = "Maciej Szczudło";
                        values[7] = 8;

                        ExcelRowData iRow = new ExcelRowData(COL_FIRST, row, COL_LAST, row);
                        iRow.Values = values.ToList();
                        sheetData.Rows.Add(iRow);
                    }


                    ExcelBorderData borderData = new ExcelBorderData(COL_FIRST, ROW_FIRST, COL_LAST, ROW_LAST);
                    borderData.Borders.AddBorder(ExcelBordersIndex.xlAround, ExcelBorderWeight.xlThin, ExcelLineStyle.xlContinuous);
                    borderData.Borders.AddBorder(ExcelBordersIndex.xlInside, ExcelBorderWeight.xlThin, ExcelLineStyle.xlContinuous);
                    sheetData.Borders.Add(borderData);

                    ExcelFormatData fontFormatData = new ExcelFormatData(borderData.Range);
                    fontFormatData.FontSize = 10;
                    sheetData.Formats.Add(fontFormatData);
                }


                string monthName = DateTimeTools.GetMonthName(m);
                string sheetName = $"{monthName} {YEAR}";

                IExcelSheet newSheet = workbook.CreateSheet(sheetName);

                ExcelRangeInfo sumRange = new ExcelRangeInfo(ROW_DATA_FIRST, COL_LAST, ROW_LAST, COL_LAST);
                ExcelFormula   formula  = ExcelFormulaHelper.GetSum(ROW_SUM, COL_LAST, sumRange);
                sheetData.Formulas.Add(formula);
                ExcelBorderData borderSumData = new ExcelBorderData(formula.Range);
                borderSumData.Borders.AddBorder(ExcelBordersIndex.xlAround, ExcelBorderWeight.xlThin, ExcelLineStyle.xlContinuous);
                sheetData.Borders.Add(borderSumData);

                newSheet.InsertSheetData(sheetData);
                newSheet.SetColumnsAutoFit(COL_FIRST, COL_LAST);
                newSheet.SetCellName(ROW_SUM, COL_LAST, "godziny");

                excel.SetDisplayGridlines(false);

                workbook.Save(workBookPath);
            }
        }