public UserStatsDataModel(IPreferenceSet prefs, IXmlStatsDataContainer dataContainer)
        {
            _updateTimer          = new System.Timers.Timer();
            _updateTimer.Elapsed += UpdateTimerElapsed;

            _prefs = prefs;
            _prefs.PreferenceChanged += (s, e) =>
            {
                if (e.Preference == Preference.EnableUserStats)
                {
                    ControlsVisible = _prefs.Get <bool>(Preference.EnableUserStats);
                    if (ControlsVisible)
                    {
                        _dataContainer.GetEocXmlData(false);
                        StartTimer();
                    }
                    else
                    {
                        StopTimer();
                    }
                }
            };
            _dataContainer = dataContainer;
            _dataContainer.XmlStatsDataChanged += delegate
            {
                AutoMapper.Mapper.Map(_dataContainer.XmlStatsData, this);
                OnPropertyChanged(null);
            };

            // apply data container to the model
            ControlsVisible = _prefs.Get <bool>(Preference.EnableUserStats);
            if (ControlsVisible)
            {
                DateTime nextUpdateTime = _dataContainer.GetNextUpdateTime();
                if (nextUpdateTime < DateTime.UtcNow)
                {
                    _dataContainer.GetEocXmlData(false);
                }
                StartTimer();
            }
            AutoMapper.Mapper.Map(_dataContainer.XmlStatsData, this);
        }
Пример #2
0
      public UserStatsDataModel(IPreferenceSet prefs, IXmlStatsDataContainer dataContainer)
      {
         _updateTimer = new System.Timers.Timer();
         _updateTimer.Elapsed += UpdateTimerElapsed;

         _prefs = prefs;
         _prefs.PreferenceChanged += (s, e) =>
                                     {
                                        if (e.Preference == Preference.EnableUserStats)
                                        {
                                           ControlsVisible = _prefs.Get<bool>(Preference.EnableUserStats);
                                           if (ControlsVisible)
                                           {
                                              _dataContainer.GetEocXmlData(false);
                                              StartTimer();
                                           }
                                           else
                                           {
                                              StopTimer();
                                           }
                                        }
                                     };
         _dataContainer = dataContainer;
         _dataContainer.XmlStatsDataChanged += delegate
                                               {
                                                  AutoMapper.Mapper.Map(_dataContainer.XmlStatsData, this);
                                                  OnPropertyChanged(null);
                                               };

         // apply data container to the model
         ControlsVisible = _prefs.Get<bool>(Preference.EnableUserStats);
         if (ControlsVisible)
         {
            DateTime nextUpdateTime = _dataContainer.GetNextUpdateTime();
            if (nextUpdateTime < DateTime.UtcNow)
            {
               _dataContainer.GetEocXmlData(false);
            }
            StartTimer();
         }
         AutoMapper.Mapper.Map(_dataContainer.XmlStatsData, this);
      }
        private void StartTimer()
        {
            DateTime nextUpdateTime = _dataContainer.GetNextUpdateTime();

            if (nextUpdateTime < DateTime.UtcNow)
            {
                // if a recent update interval cannot be determined then default to 3 hours from now.
                _updateTimer.Interval = TimeSpan.FromHours(3).TotalMilliseconds;
            }
            else
            {
                // get the length of time from now until the next update STARTS
                TimeSpan nextUpdateInterval = nextUpdateTime.Subtract(DateTime.UtcNow);
                // now ADD a random number of minutes (15 to 30) to the interval to
                // allow time for the update to finish and also some staggering
                // between all HFM instances so the EOC servers aren't bombarded
                // all at the same time.
                nextUpdateInterval = nextUpdateInterval.Add(TimeSpan.FromMinutes(GetRandomMinutes()));

                double interval = nextUpdateInterval.TotalMilliseconds;
                // Check the value before setting it in the timer.  The value must be positive and less than Int32.MaxValue.
                // Otherwise an exception is thrown when calling Start() on the timer.
                // Issue 276 - http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework/2006-10/msg00228.html
                if (interval > TimeSpan.FromMinutes(1).TotalMilliseconds&& interval < Int32.MaxValue)
                {
                    _updateTimer.Interval = interval;
                }
                else
                {
                    // if a recent update interval cannot be determined then default to 3 hours from now.
                    _updateTimer.Interval = TimeSpan.FromHours(3).TotalMilliseconds;
                }
            }

            Logger.InfoFormat("Starting EOC Stats Update Timer Loop: {0} Minutes", Convert.ToInt32(TimeSpan.FromMilliseconds(_updateTimer.Interval).TotalMinutes));
            _updateTimer.Start();
        }