using Google.Apis.Auth.OAuth2; using Google.Apis.Services; using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3.Data; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml; using Windows.ApplicationModel.Background; using Windows.Storage; using Windows.UI.Notifications; namespace FoxTube.Background { public delegate void NotificationHandler(object sender, Notification item); public sealed class BackgroundProcessor : IBackgroundTask { public static event NotificationHandler NotificationRecieved; List Notifications = new List(); private DateTime lastCheck = DateTime.Now; private ApplicationDataContainer settings = ApplicationData.Current.LocalSettings; private ClientSecrets Secrets => new ClientSecrets() { ClientId = "349735264870-2ekqlm0a4mkg3mmrfcv90s3qp3o15dq0.apps.googleusercontent.com", ClientSecret = "BkVZOAaCU2Zclf0Zlicg6y2_" }; private YouTubeService Service => new YouTubeService(new BaseClientService.Initializer() { ApiKey = "AIzaSyBgHrCnrlzlVmk0cJKL8RqP9Y8x6XSuk_0", ApplicationName = "FoxTube" }); XmlDocument doc = new XmlDocument(); BackgroundTaskDeferral def; public void Run(IBackgroundTaskInstance taskInstance) { def = taskInstance.GetDeferral(); if (settings.Values["lastCheck"] == null) settings.Values.Add("lastCheck", XmlConvert.ToString(DateTime.Now, "YYYY-MM-DDThh:mm:ss")); else lastCheck = XmlConvert.ToDateTime(settings.Values["lastCheck"] as string, XmlDateTimeSerializationMode.Unspecified); try { doc.LoadXml(settings.Values["notificationsHistory"] as string); } catch { return; } CheckAnnouncements(); CheckAccount(); SendNSave(); def.Complete(); } async void CheckAccount() { UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(Secrets, new[] { Google.Apis.Oauth2.v2.Oauth2Service.Scope.UserinfoProfile, YouTubeService.Scope.YoutubeForceSsl }, "user", CancellationToken.None); if (credential == null) return; SubscriptionsResource.ListRequest subRequest = new YouTubeService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "FoxTube" }).Subscriptions.List("snippet"); subRequest.Mine = true; subRequest.MaxResults = 50; SubscriptionListResponse subResponse = await subRequest.ExecuteAsync(); Dictionary subs = new Dictionary(); foreach (Subscription s in subResponse.Items) subs.Add(s.Snippet.ResourceId.ChannelId, s.Snippet.Thumbnails.Standard.Url); string nextToken = subResponse.NextPageToken; while (nextToken != null) { subRequest.PageToken = nextToken; subResponse = await subRequest.ExecuteAsync(); nextToken = subResponse.NextPageToken; foreach (Subscription s in subResponse.Items) subs.Add(s.Snippet.ResourceId.ChannelId, s.Snippet.Thumbnails.Standard.Url); } foreach(var s in subs) { SearchResource.ListRequest request = Service.Search.List("snippet"); request.PublishedAfter = lastCheck; request.ChannelId = s.Key; request.Type = "video"; SearchListResponse response = await request.ExecuteAsync(); foreach (var i in response.Items) Notifications.Add(new Notification("video", i.Id.VideoId, i.Snippet.ChannelTitle, i.Snippet.Title, i.Snippet.PublishedAt.Value, i.Snippet.Thumbnails.Standard.Url, s.Value)); } } void CheckAnnouncements() { XmlDocument doc = new XmlDocument(); doc.Load(XmlReader.Create("http://foxgame.hol.es/foxtube-messages.xml")); if ((XmlConvert.ToDateTimeOffset((doc["posts"].FirstChild as XmlElement).GetAttribute("time"), "YYYY-MM-DDThh:mm:ss") - lastCheck.ToUniversalTime()).TotalSeconds > 0) Notifications.Add(new Notification("internal", (doc["posts"].FirstChild as XmlElement).GetAttribute("id"), doc["posts"].FirstChild["header"].InnerText, doc["posts"].FirstChild["notificationHeader"].InnerText, XmlConvert.ToDateTimeOffset((doc["posts"].FirstChild as XmlElement).GetAttribute("time"), "YYYY-MM-DDThh:mm:ss"), (doc["posts"].FirstChild as XmlElement).GetAttribute("image"), (doc["posts"].FirstChild as XmlElement).GetAttribute("avatar"))); } void SendNotification(Notification notification) { ToastNotificationManager.CreateToastNotifier().Show(notification.GetToast()); } void SendNSave() { foreach (Notification n in Notifications) { NotificationRecieved.Invoke(this, n); doc["history"].InnerXml += n.GetXml(); } settings.Values.Add("notificationsHistory", doc.InnerXml); foreach (Notification n in Notifications) switch (n.Type) { case NotificationType.Video: if ((bool)settings.Values["newVideoNotification"]) SendNotification(n); break; case NotificationType.Internal: SendNotification(n); break; } } } }