123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- using MediaBrowser.Common.Configuration;
- using MediaBrowser.Common.Net;
- using MediaBrowser.Controller.Library;
- using MediaBrowser.Controller.Notifications;
- using MediaBrowser.Controller.Plugins;
- using MediaBrowser.Model.Logging;
- using MediaBrowser.Model.Notifications;
- using MediaBrowser.Model.Serialization;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
- {
- public class RemoteNotifications : IServerEntryPoint
- {
- private const string Url = "http://www.mb3admin.com/admin/service/MB3ServerNotifications.json";
- private Timer _timer;
- private readonly IHttpClient _httpClient;
- private readonly IApplicationPaths _appPaths;
- private readonly ILogger _logger;
- private readonly IJsonSerializer _json;
- private readonly INotificationsRepository _notificationsRepo;
- private readonly IUserManager _userManager;
- private readonly TimeSpan _frequency = TimeSpan.FromHours(6);
- private readonly TimeSpan _maxAge = TimeSpan.FromDays(31);
- public RemoteNotifications(IApplicationPaths appPaths, ILogger logger, IHttpClient httpClient, IJsonSerializer json, INotificationsRepository notificationsRepo, IUserManager userManager)
- {
- _appPaths = appPaths;
- _logger = logger;
- _httpClient = httpClient;
- _json = json;
- _notificationsRepo = notificationsRepo;
- _userManager = userManager;
- }
- /// <summary>
- /// Runs this instance.
- /// </summary>
- public void Run()
- {
- _timer = new Timer(OnTimerFired, null, TimeSpan.FromMilliseconds(500), _frequency);
- }
- /// <summary>
- /// Called when [timer fired].
- /// </summary>
- /// <param name="state">The state.</param>
- private async void OnTimerFired(object state)
- {
- var dataPath = Path.Combine(_appPaths.DataPath, "remotenotifications.json");
- var lastRunTime = File.Exists(dataPath) ? File.GetLastWriteTimeUtc(dataPath) : DateTime.MinValue;
- try
- {
- await DownloadNotifications(dataPath, lastRunTime).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error downloading remote notifications", ex);
- }
- }
- /// <summary>
- /// Downloads the notifications.
- /// </summary>
- /// <param name="dataPath">The data path.</param>
- /// <param name="lastRunTime">The last run time.</param>
- /// <returns>Task.</returns>
- private async Task DownloadNotifications(string dataPath, DateTime lastRunTime)
- {
- using (var stream = await _httpClient.Get(new HttpRequestOptions
- {
- Url = Url
- }).ConfigureAwait(false))
- {
- var notifications = _json.DeserializeFromStream<RemoteNotification[]>(stream);
- File.WriteAllText(dataPath, string.Empty);
- await CreateNotifications(notifications, lastRunTime).ConfigureAwait(false);
- }
- }
- /// <summary>
- /// Creates the notifications.
- /// </summary>
- /// <param name="notifications">The notifications.</param>
- /// <param name="lastRunTime">The last run time.</param>
- /// <returns>Task.</returns>
- private async Task CreateNotifications(IEnumerable<RemoteNotification> notifications, DateTime lastRunTime)
- {
- // Only show notifications that are active, new since last download, and not older than max age
- var notificationList = notifications
- .Where(i => string.Equals(i.active, "1") && i.date.ToUniversalTime() > lastRunTime && (DateTime.UtcNow - i.date.ToUniversalTime()) <= _maxAge)
- .ToList();
- foreach (var user in _userManager.Users.ToList())
- {
- foreach (var notification in notificationList)
- {
- await _notificationsRepo.AddNotification(new Notification
- {
- Category = notification.category,
- Date = notification.date,
- Name = notification.name,
- Description = notification.description,
- Url = notification.url,
- UserId = user.Id
- }, CancellationToken.None).ConfigureAwait(false);
- }
- }
- }
- public void Dispose()
- {
- if (_timer != null)
- {
- _timer.Dispose();
- _timer = null;
- }
- }
- private class RemoteNotification
- {
- public string id { get; set; }
- public DateTime date { get; set; }
- public string name { get; set; }
- public string description { get; set; }
- public string category { get; set; }
- public string url { get; set; }
- public object imageUrl { get; set; }
- public string active { get; set; }
- }
- }
- }
|