diff options
| author | Luke <luke.pulverenti@gmail.com> | 2016-10-23 18:45:47 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-10-23 18:45:47 -0400 |
| commit | 931f5f2e6a7e790dd28e3c35f6b7fd49ad00fed1 (patch) | |
| tree | 9fb45a97f22c1d0c5ef4f8dbc88fec851be6792a /MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs | |
| parent | b9b70da03eeb324d8661f4b2fa5615091e23cc45 (diff) | |
| parent | ee1c536171a9d45009fdb68bcd8b3141a3390c5e (diff) | |
Merge pull request #2254 from MediaBrowser/dev
Dev
Diffstat (limited to 'MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs')
| -rw-r--r-- | MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs new file mode 100644 index 0000000000..318802e07d --- /dev/null +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs @@ -0,0 +1,116 @@ +using System; +using System.Threading; +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Tasks; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// <summary> + /// Represents a task trigger that fires on a weekly basis + /// </summary> + public class WeeklyTrigger : ITaskTrigger + { + /// <summary> + /// Get the time of day to trigger the task to run + /// </summary> + /// <value>The time of day.</value> + public TimeSpan TimeOfDay { get; set; } + + /// <summary> + /// Gets or sets the day of week. + /// </summary> + /// <value>The day of week.</value> + public DayOfWeek DayOfWeek { get; set; } + + /// <summary> + /// Gets the execution properties of this task. + /// </summary> + /// <value> + /// The execution properties of this task. + /// </value> + public TaskExecutionOptions TaskOptions { get; set; } + + /// <summary> + /// Gets or sets the timer. + /// </summary> + /// <value>The timer.</value> + private Timer Timer { get; set; } + + /// <summary> + /// Stars waiting for the trigger action + /// </summary> + /// <param name="lastResult">The last result.</param> + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) + { + DisposeTimer(); + + var triggerDate = GetNextTriggerDateTime(); + + Timer = new Timer(state => OnTriggered(), null, triggerDate - DateTime.Now, TimeSpan.FromMilliseconds(-1)); + } + + /// <summary> + /// Gets the next trigger date time. + /// </summary> + /// <returns>DateTime.</returns> + private DateTime GetNextTriggerDateTime() + { + var now = DateTime.Now; + + // If it's on the same day + if (now.DayOfWeek == DayOfWeek) + { + // It's either later today, or a week from now + return now.TimeOfDay < TimeOfDay ? now.Date.Add(TimeOfDay) : now.Date.AddDays(7).Add(TimeOfDay); + } + + var triggerDate = now.Date; + + // Walk the date forward until we get to the trigger day + while (triggerDate.DayOfWeek != DayOfWeek) + { + triggerDate = triggerDate.AddDays(1); + } + + // Return the trigger date plus the time offset + return triggerDate.Add(TimeOfDay); + } + + /// <summary> + /// Stops waiting for the trigger action + /// </summary> + public void Stop() + { + DisposeTimer(); + } + + /// <summary> + /// Disposes the timer. + /// </summary> + private void DisposeTimer() + { + if (Timer != null) + { + Timer.Dispose(); + } + } + + /// <summary> + /// Occurs when [triggered]. + /// </summary> + public event EventHandler<GenericEventArgs<TaskExecutionOptions>> Triggered; + + /// <summary> + /// Called when [triggered]. + /// </summary> + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, new GenericEventArgs<TaskExecutionOptions>(TaskOptions)); + } + } + } +} |
