コード例 #1
0
ファイル: Seanse.cs プロジェクト: Empty322/LinkChecker
        private void FireEvents(SeanseState prevState, SeanseState state)
        {
            // Eсли перешел в активный
            if (isActiveEnded && prevState != SeanseState.Active && state == SeanseState.Active)
            {
                isActiveEnded = false;
                ActiveStart.Invoke(this, new EventArgs());
            }

            // Если Вышел из активного
            IEnumerable <SignalEntry> activeEntries = signalEntries.Where(x => x.Type != EntryType.Error && x.Size - x.Errors > (int)Mode);

            if (!isActiveEnded && activeEntries.Any() && !(activeEntries.Last().Time > (DateTime.Now - delay).AddMinutes(-config.MinutesToAwaitAfterEnd) && activeEntries.Last().Time <= (DateTime.Now - delay)))
            {
                isActiveEnded = true;
                ActiveEnd.Invoke(this, new EventArgs());
            }

            // Если начал работу
            if (isEnded && state != SeanseState.WorkingLevel0)
            {
                isEnded = false;
                WorkingStart.Invoke(this, new EventArgs());
            }
            // Если окончил работу
            if (!isEnded && signalEntries.Where(x => x.Time > (DateTime.Now - delay).AddMinutes(-config.MinutesToAwaitAfterEnd) && x.Time <= DateTime.Now - delay).Count() == 0)
            {
                isEnded = true;
                WorkingEnd.Invoke(this, new EventArgs());
            }
        }
コード例 #2
0
ファイル: Seanse.cs プロジェクト: Empty322/LinkChecker
 public Seanse(string directory, Configuration config, IParser parser, ILogger logger)
 {
     this.Directory       = new DirectoryInfo(directory);
     this.DirectoryExists = Directory.Exists;
     if (!DirectoryExists)
     {
         throw new LogFileNotFoundException();
     }
     this.TuningChartUnits  = new List <TuningChartUnit>();
     this.WorkingChartUnits = new List <WorkingChartUnit>();
     this.activeEntries     = new List <ActiveEntry>();
     this.remark            = "";
     this.logger            = logger;
     this.signalEntries     = new List <SignalEntry>();
     this.parser            = parser;
     this.config            = config;
     this.mode                    = Mode.Unknown;
     this.prevState               = SeanseState.WorkingLevel0;
     this.state                   = SeanseState.WorkingLevel0;
     this.isEnded                 = true;
     this.isActiveEnded           = true;
     this.lastUpdateLogFileLength = 0;
     this.abonents                = new List <AbonentInfo>();
     this.ChannelInfo             = new Channel {
         Server = "не известен"
     };
     Update();
 }
コード例 #3
0
ファイル: Seanse.cs プロジェクト: Empty322/LinkChecker
        private SeanseState GetState()
        {
            SeanseState result = SeanseState.WorkingLevel0;

            if (signalEntries.Any())
            {
                List <SignalEntry> lastEntries = signalEntries.Where(x =>
                                                                     (DateTime.Now - delay - new TimeSpan(0, 3, 0)) < x.Time &&
                                                                     x.Time <= (DateTime.Now - delay)).ToList();
                if (lastEntries.Where(x => x.Type != EntryType.Error && ((x.Size - x.Errors) > (int)Mode)).Any())
                {
                    result = SeanseState.Active;
                }
                else if (lastEntries.Count >= countForWorkingLevel5)
                {
                    result = SeanseState.WorkingLevel5;
                }
                else if (lastEntries.Count >= countForWorkingLevel4)
                {
                    result = SeanseState.WorkingLevel4;
                }
                else if (lastEntries.Count >= countForWorkingLevel3)
                {
                    result = SeanseState.WorkingLevel3;
                }
                else if (lastEntries.Count >= countForWorkingLevel2)
                {
                    result = SeanseState.WorkingLevel2;
                }
                else if (lastEntries.Count >= 1 && signalEntries.Where(x => x.Type != EntryType.Error).Count() > config.Trashold)
                {
                    result = SeanseState.WorkingLevel1;
                }
            }
            return(result);
        }
コード例 #4
0
ファイル: Seanse.cs プロジェクト: Empty322/LinkChecker
        public void Update()
        {
            // Если директория существует
            if (!System.IO.Directory.Exists(Directory.FullName))
            {
                DirectoryExists = false;
                return;
            }

            DirectoryExists = true;

            // Размер лог файла
            long logFileLength = new FileInfo(Directory + "\\log.txt").Length;

            if (logFileLength != lastUpdateLogFileLength)
            {
                // Загрузить log.txt
                LoadAllLog();

                // Загрузить allLog.txt
                LoadLog();

                // Получить данные для графика расстройки
                TuningChartUnits = GetTuningChartUnits(config.SmoothValue);

                // Получить данные для графика объема
                SizeChartUnits = GetSizeChartUnits();

                // Получить данные для графика работы
                WorkingChartUnits = GetWorkingChartUnits(new TimeSpan(0, 1, 0));

                // Получить вхождения с объемом, превышающим норму
                List <ActiveEntry> newActiveEntries = signalEntries
                                                      .Where(x =>
                                                             x.Type != EntryType.Error &&
                                                             ((x.Size - x.Errors) > (int)Mode))
                                                      .Select(x =>
                                                              new ActiveEntry {
                    Time = x.Time, Size = x.Size - x.Errors
                })
                                                      .ToList();
                ActiveEntries = newActiveEntries;

                // Получить абонентов
                Abonents = GetAbonents(signalEntries.First().Time, signalEntries.Last().Time, config.AbonentsK);

                // Установить время начала
                StartWorkingTime = signalEntries.First().Time;

                // Обновить конечное время
                for (int index = signalEntries.Count - 1; index >= 0; index--)
                {
                    if (signalEntries[index].Type != EntryType.Error)
                    {
                        lastWorkingTime = signalEntries[index].Time;
                        break;
                    }
                }

                // Обновить сторку с интервалами
                string calculatedIntervals = "";
                var    intervalEntries     = GetIntervals().OrderByDescending(interval => interval.Value).Take(3);
                foreach (var interval in intervalEntries)
                {
                    calculatedIntervals += interval.Key + "(" + interval.Value + ") ";
                }
                this.Intervals = calculatedIntervals;

                // Обновить процент приема
                int notErrorsCount = signalEntries.Where(x => x.Type != EntryType.Error).Count();
                if (notErrorsCount > 0)
                {
                    PercentReceiving = (int)Math.Round(100f / signalEntries.Count() * notErrorsCount);
                }
                else
                {
                    PercentReceiving = 0;
                }

                // Обновить задержку
                DateTime lastEntryTime = signalEntries.Last().Time;

                //   В ОТДЕЛЬНЫХ СЛУЧАЯХ НЕ ВЕРНО ВРЕМЯ ПОСЛЕДНЕЙ ЗАПИСИ В ФАЙЛ
                var lastWriteTime = File.GetLastWriteTime(Path.Combine(Directory.FullName, "log.txt"));
                delay = lastWriteTime - lastEntryTime;

                // Обновить переменные объема
                MaxSize            = GetMaxInFrames();
                MaxSizeInBytes     = (float)Math.Round(MaxSize * 3.75f, 2);
                AverageSize        = (float)Math.Round(GetAverageSizeInFrames());
                AverageSizeInBytes = (float)Math.Round(AverageSize * 3.75f, 2);

                // Обновить время последнего обновления
                LastUpdate = DateTime.Now;
                // Обновить размер лога при последнем обновлении
                lastUpdateLogFileLength = logFileLength;
            }

            // Обновить видимость
            if (config.HideEmptySeanses && !(signalEntries.Where(e => e.Type != EntryType.Error).Count() > config.Trashold))
            {
                Visible = false;
            }
            else
            {
                Visible = true;
            }

            // Узнать состояние сеанса
            State = GetState();

            // Запустить уведомления
            FireEvents(prevState, state);

            prevState = state;
        }