コード例 #1
0
        protected override void OnCreate(Bundle bundle)
        {
            platformSpecificHandler = new PlatformSpecificHandler();

            platformSpecificHandler.StorageInterface = new AndroidStorage();
            platformSpecificHandler.ViewHandler      = new AndroidViewHandler();
            platformSpecificHandler.ToastManager     = new AndroidToastManager();
            platformSpecificHandler.FileReader       = new AndroidFileReader();



            handler    = new AnimalAdjectiveHandler(platformSpecificHandler);
            favourites = new FavouritesManager(platformSpecificHandler);

            this.sharedGeneralGUIHandler   = new SharedGeneralGUIHandler(platformSpecificHandler);
            this.sharedFavouriteGUIHandler = new SharedFavouritesGUIHandler(platformSpecificHandler, sharedGeneralGUIHandler);
            this.sharedHomeGUIHandler      = new SharedHomeGUIHandler(platformSpecificHandler, sharedGeneralGUIHandler);

            base.OnCreate(bundle);

            this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

            this.AddTab("", Resource.Drawable.ic_action_play, new HomeFragment(handler, favourites, sharedGeneralGUIHandler, sharedHomeGUIHandler));
            this.AddTab("", Resource.Drawable.ic_action_favorite2, new FavouritesFragment(handler, favourites, sharedGeneralGUIHandler, sharedFavouriteGUIHandler));
            this.AddTab("", Resource.Drawable.ic_action_settings, new SettingsFragment());

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
        }
コード例 #2
0
ファイル: MainActivity.cs プロジェクト: rohitjha/MALClient
        protected override void OnPause()
        {
            _videoAd.Pause(this);
            MemoryWatcher.Watcher.Pause();
#pragma warning disable 4014
            if (Settings.IsCachingEnabled)
            {
                if (AnimeUpdateQuery.UpdatedSomething)
                {
                    DataCache.SaveDataForUser(Credentials.UserName,
                                              ResourceLocator.AnimeLibraryDataStorage.AllLoadedAnimeItemAbstractions.Select(
                                                  abstraction => abstraction.EntryData), AnimeListWorkModes.Anime);
                    AnimeUpdateQuery.UpdatedSomething = false;
                }
                if (MangaUpdateQuery.UpdatedSomething)
                {
                    DataCache.SaveDataForUser(Credentials.UserName,
                                              ResourceLocator.AnimeLibraryDataStorage.AllLoadedMangaItemAbstractions.Select(
                                                  abstraction => abstraction.EntryData), AnimeListWorkModes.Manga);
                    MangaUpdateQuery.UpdatedSomething = false;
                }
            }
            DataCache.SaveVolatileData();
            DataCache.SaveHumMalIdDictionary();
            ViewModelLocator.ForumsMain.SavePinnedTopics();
            FavouritesManager.SaveData();
            AnimeImageQuery.SaveData();
            ResourceLocator.HandyDataStorage.SaveData();
#pragma warning restore 4014
            base.OnPause();
        }
コード例 #3
0
 public static void SetFavouritesManager(this BlockEditorControlBase becb,
                                         FavouritesManager favouritesManager)
 {
     Reflector.SetInstanceFieldByName(becb,
                                      "m_FavouritesManager",
                                      favouritesManager,
                                      ReflectionWays.SystemReflection);;
 }
コード例 #4
0
        public FavouritesFragment(AnimalAdjectiveHandler aaHandler, FavouritesManager favs,
                                  SharedGeneralGUIHandler sharedGUIHandler, SharedFavouritesGUIHandler favouritesGUIHandler)
        {
            this.handler    = aaHandler;
            this.favourites = favs;

            this._sharedGUIHandler     = sharedGUIHandler;
            this._favouritesGUIHandler = favouritesGUIHandler;
        }
 public void CheckIfFavourite(object favouriteButton, FavouritesManager favouritesManager, CombinedAnimalAdjective animalAdjective)
 {
     if (favouritesManager.IsFavourite(animalAdjective))
     {
         platformHandler.ViewHandler.SetFavouriteSelectedImage(true, favouriteButton);
     }
     else
     {
         platformHandler.ViewHandler.SetFavouriteSelectedImage(false, favouriteButton);
     }
 }
コード例 #6
0
ファイル: App.xaml.cs プロジェクト: keobrien08/MALClient
        /// <summary>
        ///     Invoked when application execution is being suspended.  Application state is saved
        ///     without knowing whether the application will be terminated or resumed with the contents
        ///     of memory still intact.
        /// </summary>
        /// <param name="sender">The source of the suspend request.</param>
        /// <param name="e">Details about the suspend request.</param>
        private async void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();

            if (Settings.IsCachingEnabled)
            {
                if (AnimeUpdateQuery.UpdatedSomething)
                {
                    await
                    DataCache.SaveDataForUser(Credentials.UserName,
                                              ResourceLocator.AnimeLibraryDataStorage.AllLoadedAnimeItemAbstractions.Select(
                                                  abstraction => abstraction.EntryData), AnimeListWorkModes.Anime);
                }
                if (MangaUpdateQuery.UpdatedSomething)
                {
                    await
                    DataCache.SaveDataForUser(Credentials.UserName,
                                              ResourceLocator.AnimeLibraryDataStorage.AllLoadedMangaItemAbstractions.Select(
                                                  abstraction => abstraction.EntryData), AnimeListWorkModes.Manga);
                }
            }
            try
            {
                foreach (
                    var file in
                    await ApplicationData.Current.TemporaryFolder.GetFilesAsync(CommonFileQuery.DefaultQuery))
                {
                    if (file.Name.Contains("_cropTemp"))
                    {
                        await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
                    }
                }
            }
            catch (Exception)
            {
                //well...
            }
            await DataCache.SaveVolatileData();

            await DataCache.SaveHumMalIdDictionary();

            await ViewModelLocator.ForumsMain.SavePinnedTopics();

            await FavouritesManager.SaveData();

            await AnimeImageQuery.SaveData();

            await ResourceLocator.HandyDataStorage.SaveData();

            deferral.Complete();
        }
コード例 #7
0
 public AppStartupLoginHandler(ILoginHandler loginHandler, BlockedApiLoginHandler blockedApiLoginHandler, ServersUpdateTimer serversUpdateTimer, ServiceWatcher serviceWatcher, INotificationProvider notificationProvider, AutoConnectManager autoConnectManager, OpenVpnConfigsUpdateTimer openVpnConfigsUpdateTimer, VpnConnectionWatcher wcfServiceWatcher, SettingsServiceClientManager settingsServiceClientManager, FavouritesManager favouriteServersUpdater, CyberSecHostsStorage cyberSecHostsStorage)
 {
     this._serversUpdateTimer           = serversUpdateTimer;
     this._serviceWatcher               = serviceWatcher;
     this._notificationProvider         = notificationProvider;
     this._autoConnectManager           = autoConnectManager;
     this._openVpnConfigsUpdateTimer    = openVpnConfigsUpdateTimer;
     this._wcfServiceWatcher            = wcfServiceWatcher;
     this._settingsServiceClientManager = settingsServiceClientManager;
     this._favouriteServersUpdater      = favouriteServersUpdater;
     this._loginHandler           = loginHandler;
     this._blockedApiLoginHandler = blockedApiLoginHandler;
     this._cyberSecHostsStorage   = cyberSecHostsStorage;
 }
 public void HandleFavouriteButtonClick(object favouriteButton, FavouritesManager favouritesManager, CombinedAnimalAdjective animalAdjective)
 {
     if (favouritesManager.IsFavourite(animalAdjective))
     {
         platformHandler.ViewHandler.SetFavouriteSelectedImage(false, favouriteButton);
         favouritesManager.RemoveFromFavourites(animalAdjective);
         this.platformHandler.ToastManager.ShowToast(animalAdjective.FullWord + " added to favourites.");
     }
     else
     {
         platformHandler.ViewHandler.SetFavouriteSelectedImage(true, favouriteButton);
         favouritesManager.AddToFavourites(animalAdjective);
         this.platformHandler.ToastManager.ShowToast(animalAdjective.FullWord + " removed from favourites.");
     }
 }
コード例 #9
0
 public static void InitApp()
 {
     Credentials.Init();
     HtmlClassMgr.Init();
     FavouritesManager.LoadData();
     AnimeImageQuery.Init();
     ViewModelLocator.ForumsMain.LoadPinnedTopics();
     if (Settings.NotificationCheckInRuntime && Credentials.Authenticated)
     {
         ResourceLocator.SchdeuledJobsManger.StartJob(ScheduledJob.FetchNotifications, 5, () =>
         {
             ResourceLocator.NotificationsTaskManager.CallTask(BgTasks.Notifications);
         });
     }
     ResourceLocator.HandyDataStorage.Init();
 }
コード例 #10
0
        public static async Task InitApp()
        {
            ResourceLocator.ConnectionInfoProvider.Init();
            Credentials.Init();
            FavouritesManager.LoadData();
            AnimeImageQuery.Init();
            ViewModelLocator.ForumsMain.LoadPinnedTopics();
            await ResourceLocator.AiringInfoProvider.Init(false);

            if (Settings.NotificationCheckInRuntime && Credentials.Authenticated)
            {
                ResourceLocator.SchdeuledJobsManger.StartJob(ScheduledJob.FetchNotifications, 5, () =>
                {
                    ResourceLocator.NotificationsTaskManager.CallTask(BgTasks.Notifications);
                });
            }
            ResourceLocator.HandyDataStorage.Init();
            AwaitableCompletion.SetResult(true);
        }
 public ServerSidePanelViewModel(VpnConnector vpnConnector, BestUserServerProvider bestServerProvider, ApiServerProvider apiServerProvider, VpnConnectionSpeedTracker speedTracker, ISettings userSettings, FavouritesManager favouritesManager, UserContext userContext, EventFacade eventFacade)
 {
     this._vpnConnector       = vpnConnector;
     this._bestServerProvider = bestServerProvider;
     this._apiServerProvider  = apiServerProvider;
     this._settings           = userSettings;
     this._favouritesManager  = favouritesManager;
     this._userContext        = userContext;
     this._eventFacade        = eventFacade;
     this._bestServerProvider.ServersChanged             += new EventHandler(this.OnServersChanged);
     this._vpnConnector.GeoServerConnectionStatusChanged += new ConnectionEventHandler <GeographicalServer>(this.OnServerConnectionStatusChanged);
     this._userContext.add_UserChanged(delegate(object s, UserEventArgs e)
     {
         this.UpdateCurrentServerViewModel();
     });
     this._favouritesManager.FavouriteServersChanged += new EventHandler <FavouriteServersChangedEventArgs>(this.ChangeCurrentServerFavouriteStatus);
     speedTracker.SpeedChanged = (EventHandler <VpnConnectionSpeedChangeEventArgs>)Delegate.Combine(speedTracker.SpeedChanged, new EventHandler <VpnConnectionSpeedChangeEventArgs>(this.UpdateSpeeds));
     this._settings.Observe <UserSettings, DistanceUnits>((UserSettings s) => s.DistanceUnits, delegate(DistanceUnits d)
     {
         this.UpdateCurrentServerViewModel();
     });
 }
コード例 #12
0
 private bool ShowNextWord(String text, object textView, object favsButton, AnimalAdjectiveHandler handler, FavouritesManager favsManager)
 {
     if (!String.IsNullOrEmpty(text))
     {
         this.platformHandler.ViewHandler.ChangeTextOfView(textView, text);
         this._sharedGUIHandler.CheckIfFavourite(favsButton, favsManager, handler.CurrentAnimalAdjective);
         return(true);
     }
     else
     {
         return(false);
     }
 }
 public bool ShowCurrentFavourite(FavouritesManager favsManager, object textView, object favsButton)
 {
     return(this.SetNewFavourite(favsManager.GetCurrentFavourite().FullWord, textView, favsButton, favsManager));
 }
 private bool SetNewFavourite(String text, object textView, object favsButton, FavouritesManager favsManager)
 {
     if (!String.IsNullOrEmpty(text))
     {
         this.platformHandler.ViewHandler.ChangeTextOfView(textView, text);
         this._generalGUIHandler.CheckIfFavourite(favsButton, favsManager, favsManager.GetCurrentFavourite());
         return(true);
     }
     else
     {
         return(false);
     }
 }
コード例 #15
0
        public async Task <ProfileData> GetProfileData(bool force = false, bool updateFavsOnly = false)
        {
            try
            {
                ProfileData possibleData = null;
                if (!force)
                {
                    possibleData = await DataCache.RetrieveProfileData(_userName);
                }
                if (possibleData != null)
                {
                    possibleData.Cached = true;
                    return(possibleData);
                }
                var raw = !updateFavsOnly
                    ? await(await (await ResourceLocator.MalHttpContextProvider.GetHttpContextAsync())
                            .GetAsync($"/profile/{_userName}")).Content.ReadAsStringAsync()
                    : await GetRequestResponse();

                var doc = new HtmlDocument();
                doc.LoadHtml(raw);
                var current = new ProfileData {
                    User = { Name = _userName }
                };

                #region Recents

                try
                {
                    var i = 1;
                    foreach (
                        var recentNode in
                        doc.DocumentNode.Descendants("div")
                        .Where(
                            node =>
                            node.Attributes.Contains("class") &&
                            node.Attributes["class"].Value ==
                            "statistics-updates di-b w100 mb8"))
                    {
                        if (i <= 3)
                        {
                            current.RecentAnime.Add(
                                int.Parse(
                                    recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8)
                                    .Split('/')[2]));
                        }
                        else
                        {
                            current.RecentManga.Add(
                                int.Parse(
                                    recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8)
                                    .Split('/')[2]));
                        }
                        i++;
                    }
                }
                catch (Exception)
                {
                    //no recents
                }

                #endregion

                #region FavChar

                try
                {
                    foreach (
                        var favCharNode in
                        doc.DocumentNode.Descendants("ul")
                        .First(
                            node =>
                            node.Attributes.Contains("class") &&
                            node.Attributes["class"].Value ==
                            "favorites-list characters")
                        .Descendants("li"))
                    {
                        var curr        = new AnimeCharacter();
                        var imgNode     = favCharNode.Descendants("a").First();
                        var styleString = imgNode.Attributes["style"].Value.Substring(22);
                        curr.ImgUrl = styleString.Replace("/r/80x120", "");
                        curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?'));
                        var infoNode = favCharNode.Descendants("div").Skip(1).First();
                        var nameNode = infoNode.Descendants("a").First();
                        curr.Name = nameNode.InnerText.Trim();
                        curr.Id   = nameNode.Attributes["href"].Value.Substring(9).Split('/')[2];
                        var originNode = infoNode.Descendants("a").Skip(1).First();
                        curr.Notes     = originNode.InnerText.Trim();
                        curr.ShowId    = originNode.Attributes["href"].Value.Split('/')[2];
                        curr.FromAnime = originNode.Attributes["href"].Value.Split('/')[1] == "anime";
                        current.FavouriteCharacters.Add(curr);
                    }
                }
                catch (Exception)
                {
                    //no favs
                }

                #endregion

                #region FavManga

                try
                {
                    foreach (
                        var favMangaNode in
                        doc.DocumentNode.Descendants("ul")
                        .First(
                            node =>
                            node.Attributes.Contains("class") &&
                            node.Attributes["class"].Value ==
                            "favorites-list manga")
                        .Descendants("li"))
                    {
                        current.FavouriteManga.Add(
                            int.Parse(
                                favMangaNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2
                                ]));
                    }
                }
                catch (Exception)
                {
                    //no favs
                }

                #endregion

                #region FavAnime

                try
                {
                    foreach (
                        var favAnimeNode in
                        doc.DocumentNode.Descendants("ul")
                        .First(
                            node =>
                            node.Attributes.Contains("class") &&
                            node.Attributes["class"].Value ==
                            "favorites-list anime")
                        .Descendants("li"))
                    {
                        current.FavouriteAnime.Add(
                            int.Parse(
                                favAnimeNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2
                                ]));
                    }
                }
                catch (Exception)
                {
                    //no favs
                }

                #endregion

                #region FavPpl

                try
                {
                    foreach (
                        var favPersonNode in
                        doc.DocumentNode.Descendants("ul")
                        .First(
                            node =>
                            node.Attributes.Contains("class") &&
                            node.Attributes["class"].Value ==
                            "favorites-list people")
                        .Descendants("li"))
                    {
                        var curr        = new AnimeStaffPerson();
                        var aElems      = favPersonNode.Descendants("a");
                        var styleString = aElems.First().Attributes["style"].Value.Substring(22);
                        curr.ImgUrl = styleString.Replace("/r/80x120", "");
                        curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?'));

                        curr.Name = aElems.Skip(1).First().InnerText.Trim();
                        curr.Id   = aElems.Skip(1).First().Attributes["href"].Value.Substring(9).Split('/')[2];

                        current.FavouritePeople.Add(curr);
                    }
                }
                catch (Exception)
                {
                    //no favs
                }

                #endregion

                #region Stats

                if (!updateFavsOnly)
                {
                    try
                    {
                        var animeStats   = doc.FirstOfDescendantsWithClass("div", "stats anime");
                        var generalStats = animeStats.Descendants("div").First().Descendants("div");
                        current.AnimeDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim(),
                                                        NumberStyles.Any, CultureInfo.InvariantCulture);
                        current.AnimeMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim(),
                                                        NumberStyles.Any, CultureInfo.InvariantCulture);
                        var i = 0;

                        #region AnimeStats

                        foreach (
                            var htmlNode in
                            animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li"))
                        {
                            switch (i)
                            {
                            case 0:
                                current.AnimeWatching =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 1:
                                current.AnimeCompleted =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 2:
                                current.AnimeOnHold =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 3:
                                current.AnimeDropped =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 4:
                                current.AnimePlanned =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;
                            }
                            i++;
                        }
                        //left stats done now right
                        i = 0;
                        foreach (
                            var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r")
                            .Descendants("li"))
                        {
                            switch (i)
                            {
                            case 0:
                                current.AnimeTotal =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 1:
                                current.AnimeRewatched =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 2:
                                current.AnimeEpisodes =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;
                            }
                            i++;
                        }
                        //we are done with anime

                        #endregion

                        i                 = 0;
                        animeStats        = doc.FirstOfDescendantsWithClass("div", "stats manga");
                        generalStats      = animeStats.Descendants("div").First().Descendants("div");
                        current.MangaDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim(),
                                                        NumberStyles.Any, CultureInfo.InvariantCulture);
                        current.MangaMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim(),
                                                        NumberStyles.Any, CultureInfo.InvariantCulture);

                        #region MangaStats

                        foreach (
                            var htmlNode in
                            animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li"))
                        {
                            switch (i)
                            {
                            case 0:
                                current.MangaReading =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 1:
                                current.MangaCompleted =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 2:
                                current.MangaOnHold =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 3:
                                current.MangaDropped =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 4:
                                current.MangaPlanned =
                                    int.Parse(htmlNode.Descendants("span").First().InnerText.Trim()
                                              .Replace(",", ""));
                                break;
                            }
                            i++;
                        }
                        //left stats done now right
                        i = 0;
                        foreach (
                            var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r")
                            .Descendants("li"))
                        {
                            switch (i)
                            {
                            case 0:
                                current.MangaTotal =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 1:
                                current.MangaReread =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 2:
                                current.MangaChapters =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;

                            case 3:
                                current.MangaVolumes =
                                    int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim()
                                              .Replace(",", ""));
                                break;
                            }
                            i++;
                        }
                        //we are done with manga

                        #endregion
                    }
                    catch (Exception e)
                    {
                        //hatml
                    }
                }

                #endregion

                #region LeftSideBar

                if (!updateFavsOnly)
                {
                    try
                    {
                        var sideInfo =
                            doc.FirstOfDescendantsWithClass("ul", "user-status border-top pb8 mb4").Descendants("li")
                            .ToList();
                        try
                        {
                            foreach (var htmlNode in sideInfo)
                            {
                                var left = WebUtility.HtmlDecode(htmlNode.FirstChild.InnerText);
                                if (left == "Supporter")
                                {
                                    continue;
                                }
                                current.Details.Add(new Tuple <string, string>(left,
                                                                               WebUtility.HtmlDecode(htmlNode.LastChild.InnerText)));
                            }
                        }
                        catch (Exception)
                        {
                        }
                        current.User.ImgUrl =
                            doc.FirstOfDescendantsWithClass("div", "user-image mb8").Descendants("img").First()
                            .Attributes["src"].Value;
                    }
                    catch (Exception)
                    {
                        //???
                    }
                }

                #endregion

                #region Friends

                if (!updateFavsOnly)
                {
                    try
                    {
                        var friends = doc.FirstOfDescendantsWithClass("div", "user-friends pt4 pb12").Descendants("a");
                        foreach (var friend in friends)
                        {
                            var curr        = new MalUser();
                            var styleString = friend.Attributes["data-bg"].Value;
                            curr.ImgUrl = styleString.Replace("/r/76x120", "");
                            curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?'));

                            curr.Name = friend.InnerText;
                            current.Friends.Add(curr);
                        }
                    }
                    catch (Exception)
                    {
                        //
                    }
                }

                #endregion

                #region Comments

                if (!updateFavsOnly)
                {
                    try
                    {
                        var commentBox = doc.FirstOfDescendantsWithClass("div", "user-comments mt24 pt24");
                        foreach (var comment in commentBox.WhereOfDescendantsWithClass("div", "comment clearfix"))
                        {
                            var curr    = new MalComment();
                            var imgNode = comment.Descendants("img").First();
                            if (imgNode.Attributes.Contains("srcset"))
                            {
                                curr.User.ImgUrl = imgNode.Attributes["srcset"].Value.Split(',').Last()
                                                   .Replace("2x", "").Trim();
                            }
                            else if (imgNode.Attributes.Contains("data-src"))
                            {
                                curr.User.ImgUrl = imgNode.Attributes["data-src"].Value;
                            }


                            var textBlock = comment.Descendants("div").First();
                            var header    = textBlock.Descendants("div").First();
                            curr.User.Name = header.ChildNodes[1].InnerText;
                            curr.Date      = header.ChildNodes[3].InnerText;
                            curr.Content   =
                                WebUtility.HtmlDecode(textBlock.Descendants("div").Skip(1).First().InnerText.Trim());
                            var postActionNodes = comment.WhereOfDescendantsWithClass("a", "ml8");
                            var convNode        =
                                postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Conversation");
                            if (convNode != null)
                            {
                                curr.ComToCom =
                                    WebUtility.HtmlDecode(convNode.Attributes["href"].Value.Split('?').Last());
                            }
                            var deleteNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Delete");
                            if (deleteNode != null)
                            {
                                curr.CanDelete = true;
                                curr.Id        =
                                    deleteNode.Attributes["onclick"].Value.Split(new char[] { '(', ')' },
                                                                                 StringSplitOptions.RemoveEmptyEntries).Last();
                            }
                            foreach (var img in comment.Descendants("img").Skip(1))
                            {
                                if (img.Attributes.Contains("src"))
                                {
                                    curr.Images.Add(img.Attributes["src"].Value);
                                }
                            }
                            current.Comments.Add(curr);
                        }
                    }
                    catch (Exception e)
                    {
                        //no comments
                    }
                }

                #endregion

                try
                {
                    current.ProfileMemId = doc.DocumentNode.Descendants("input")
                                           .First(node => node.Attributes.Contains("name") &&
                                                  node.Attributes["name"].Value == "profileMemId")
                                           .Attributes["value"].Value;
                }
                catch (Exception)
                {
                    //restricted
                }

                try
                {
                    current.HtmlContent = doc.FirstOfDescendantsWithClass("div", "profile-about-user js-truncate-inner").OuterHtml;
                }
                catch (Exception)
                {
                    //
                }


                if (_userName.Equals(Credentials.UserName, StringComparison.CurrentCultureIgnoreCase)) //umm why do we need someone's favs?
                {
                    FavouritesManager.ForceNewSet(FavouriteType.Anime,
                                                  current.FavouriteAnime.Select(i => i.ToString()).ToList());
                    FavouritesManager.ForceNewSet(FavouriteType.Manga,
                                                  current.FavouriteManga.Select(i => i.ToString()).ToList());
                    FavouritesManager.ForceNewSet(FavouriteType.Character,
                                                  current.FavouriteCharacters.Select(i => i.Id).ToList());
                    FavouritesManager.ForceNewSet(FavouriteType.Person,
                                                  current.FavouritePeople.Select(i => i.Id).ToList());
                }

                current.IsFriend =
                    doc.FirstOrDefaultOfDescendantsWithClass("a", "icon-user-function icon-remove js-user-function") != null;

                current.CanAddFriend =
                    doc.FirstOrDefaultOfDescendantsWithClass("a", "icon-user-function icon-request js-user-function") != null;

                if (!updateFavsOnly)
                {
                    DataCache.SaveProfileData(_userName, current);
                }
                return(current);
            }
            catch (Exception e)
            {
                ResourceLocator.TelemetryProvider.LogEvent($"Profile Query Crash: {_userName}, {e}");
                ResourceLocator.MessageDialogProvider.ShowMessageDialog(
                    "Hmm, you have encountered bug that'm hunting. I've just sent report to myself. If everything goes well it should be gone in next release :). Sorry for inconvenience!",
                    "Ooopsies!");
            }
            return(new ProfileData());
        }
 public bool PreviousFavourite(FavouritesManager favsManager, object textView, object favsButton)
 {
     return(this.SetNewFavourite(favsManager.GetPreviousFavourite(), textView, favsButton, favsManager));
 }
コード例 #17
0
 public bool PreviousWord(AnimalAdjectiveHandler handler, object textView, object favsButton, FavouritesManager favsManager)
 {
     return(this.ShowNextWord(handler.GetPreviousWord(), textView, favsButton, handler, favsManager));
 }
コード例 #18
0
ファイル: ProfileQuery.cs プロジェクト: Latawiec/MALClient
        public async Task <ProfileData> GetProfileData(bool force = false, bool updateFavsOnly = false)
        {
            ProfileData possibleData = null;

            if (!force)
            {
                possibleData = await DataCache.RetrieveProfileData(_userName);
            }
            if (possibleData != null)
            {
                return(possibleData);
            }
            var raw = !updateFavsOnly
                ? await(await (await MalHttpContextProvider.GetHttpContextAsync()).GetAsync($"/profile/{_userName}")).Content.ReadAsStringAsync()
                : await GetRequestResponse();

            var doc = new HtmlDocument();

            doc.LoadHtml(raw);
            var current = new ProfileData {
                User = { Name = _userName }
            };

            #region Recents
            try
            {
                var i = 1;
                foreach (
                    var recentNode in
                    doc.DocumentNode.Descendants("div")
                    .Where(
                        node =>
                        node.Attributes.Contains("class") &&
                        node.Attributes["class"].Value ==
                        HtmlClassMgr.ClassDefs["#Profile:recentUpdateNode:class"]))
                {
                    if (i <= 3)
                    {
                        current.RecentAnime.Add(
                            int.Parse(
                                recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8).Split('/')[2]));
                    }
                    else
                    {
                        current.RecentManga.Add(
                            int.Parse(
                                recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8).Split('/')[2]));
                    }
                    i++;
                }
            }
            catch (Exception)
            {
                //no recents
            }

            #endregion

            #region FavChar

            try
            {
                foreach (
                    var favCharNode in
                    doc.DocumentNode.Descendants("ul")
                    .First(
                        node =>
                        node.Attributes.Contains("class") &&
                        node.Attributes["class"].Value ==
                        HtmlClassMgr.ClassDefs["#Profile:favCharacterNode:class"])
                    .Descendants("li"))
                {
                    var curr        = new AnimeCharacter();
                    var imgNode     = favCharNode.Descendants("a").First();
                    var styleString = imgNode.Attributes["style"].Value.Substring(22);
                    curr.ImgUrl = styleString.Replace("/r/80x120", "");
                    curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?'));
                    var infoNode = favCharNode.Descendants("div").Skip(1).First();
                    var nameNode = infoNode.Descendants("a").First();
                    curr.Name = nameNode.InnerText.Trim();
                    curr.Id   = nameNode.Attributes["href"].Value.Substring(9).Split('/')[2];
                    var originNode = infoNode.Descendants("a").Skip(1).First();
                    curr.Notes     = originNode.InnerText.Trim();
                    curr.ShowId    = originNode.Attributes["href"].Value.Split('/')[2];
                    curr.FromAnime = originNode.Attributes["href"].Value.Split('/')[1] == "anime";
                    current.FavouriteCharacters.Add(curr);
                }
            }
            catch (Exception)
            {
                //no favs
            }

            #endregion

            #region FavManga

            try
            {
                foreach (
                    var favMangaNode in
                    doc.DocumentNode.Descendants("ul")
                    .First(
                        node =>
                        node.Attributes.Contains("class") &&
                        node.Attributes["class"].Value ==
                        HtmlClassMgr.ClassDefs["#Profile:favMangaNode:class"])
                    .Descendants("li"))
                {
                    current.FavouriteManga.Add(
                        int.Parse(
                            favMangaNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2
                            ]));
                }
            }
            catch (Exception)
            {
                //no favs
            }

            #endregion

            #region FavAnime

            try
            {
                foreach (
                    var favAnimeNode in
                    doc.DocumentNode.Descendants("ul")
                    .First(
                        node =>
                        node.Attributes.Contains("class") &&
                        node.Attributes["class"].Value ==
                        HtmlClassMgr.ClassDefs["#Profile:favAnimeNode:class"])
                    .Descendants("li"))
                {
                    current.FavouriteAnime.Add(
                        int.Parse(
                            favAnimeNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2
                            ]));
                }
            }
            catch (Exception)
            {
                //no favs
            }

            #endregion

            #region FavPpl

            try
            {
                foreach (
                    var favPersonNode in
                    doc.DocumentNode.Descendants("ul")
                    .First(
                        node =>
                        node.Attributes.Contains("class") &&
                        node.Attributes["class"].Value ==
                        HtmlClassMgr.ClassDefs["#Profile:favPeopleNode:class"])
                    .Descendants("li"))
                {
                    var curr        = new AnimeStaffPerson();
                    var aElems      = favPersonNode.Descendants("a");
                    var styleString = aElems.First().Attributes["style"].Value.Substring(22);
                    curr.ImgUrl = styleString.Replace("/r/80x120", "");
                    curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?'));

                    curr.Name = aElems.Skip(1).First().InnerText.Trim();
                    curr.Id   = aElems.Skip(1).First().Attributes["href"].Value.Substring(9).Split('/')[2];

                    current.FavouritePeople.Add(curr);
                }
            }
            catch (Exception)
            {
                //no favs
            }

            #endregion

            #region Stats
            if (!updateFavsOnly)
            {
                try
                {
                    var animeStats   = doc.FirstOfDescendantsWithClass("div", "stats anime");
                    var generalStats = animeStats.Descendants("div").First().Descendants("div");
                    current.AnimeDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim());
                    current.AnimeMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim());
                    var i = 0;

                    #region AnimeStats

                    foreach (
                        var htmlNode in
                        animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li"))
                    {
                        switch (i)
                        {
                        case 0:
                            current.AnimeWatching =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 1:
                            current.AnimeCompleted =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 2:
                            current.AnimeOnHold =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 3:
                            current.AnimeDropped =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 4:
                            current.AnimePlanned =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;
                        }
                        i++;
                    }
                    //left stats done now right
                    i = 0;
                    foreach (
                        var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r").Descendants("li"))
                    {
                        switch (i)
                        {
                        case 0:
                            current.AnimeTotal =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;

                        case 1:
                            current.AnimeRewatched =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;

                        case 2:
                            current.AnimeEpisodes =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;
                        }
                        i++;
                    }
                    //we are done with anime

                    #endregion

                    i                 = 0;
                    animeStats        = doc.FirstOfDescendantsWithClass("div", "stats manga");
                    generalStats      = animeStats.Descendants("div").First().Descendants("div");
                    current.MangaDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim());
                    current.MangaMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim());

                    #region MangaStats

                    foreach (
                        var htmlNode in
                        animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li"))
                    {
                        switch (i)
                        {
                        case 0:
                            current.MangaReading =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 1:
                            current.MangaCompleted =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 2:
                            current.MangaOnHold =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 3:
                            current.MangaDropped =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;

                        case 4:
                            current.MangaPlanned =
                                int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", ""));
                            break;
                        }
                        i++;
                    }
                    //left stats done now right
                    i = 0;
                    foreach (
                        var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r").Descendants("li"))
                    {
                        switch (i)
                        {
                        case 0:
                            current.MangaTotal =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;

                        case 1:
                            current.MangaReread =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;

                        case 2:
                            current.MangaChapters =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;

                        case 3:
                            current.MangaVolumes =
                                int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", ""));
                            break;
                        }
                        i++;
                    }
                    //we are done with manga

                    #endregion
                }
                catch (Exception)
                {
                    //hatml
                }
            }

            #endregion

            #region LeftSideBar
            if (!updateFavsOnly)
            {
                try
                {
                    var sideInfo =
                        doc.FirstOfDescendantsWithClass("ul", "user-status border-top pb8 mb4").Descendants("li").ToList();
                    try
                    {
                        foreach (var htmlNode in sideInfo)
                        {
                            var left = WebUtility.HtmlDecode(htmlNode.FirstChild.InnerText);
                            if (left == "Supporter")
                            {
                                continue;
                            }
                            current.Details.Add(new Tuple <string, string>(left, WebUtility.HtmlDecode(htmlNode.LastChild.InnerText)));
                        }
                        //current.LastOnline = sideInfo[0].LastChild.InnerText;
                        //current.Gender = sideInfo[1].LastChild.InnerText;
                        //current.Birthday = sideInfo[2].LastChild.InnerText;
                        //current.Location = sideInfo[3].LastChild.InnerText;
                        //current.Joined = sideInfo[4].LastChild.InnerText;
                    }
                    catch (Exception)
                    {
                        //current.LastOnline = sideInfo[0].LastChild.InnerText;
                        //current.Joined = sideInfo[1].LastChild.InnerText;
                    }
                    current.User.ImgUrl =
                        doc.FirstOfDescendantsWithClass("div", "user-image mb8").Descendants("img").First().Attributes["src"
                        ]
                        .Value;
                }
                catch (Exception)
                {
                    //???
                }
            }

            #endregion

            #region Friends
            if (!updateFavsOnly)
            {
                try
                {
                    var friends = doc.FirstOfDescendantsWithClass("div", "user-friends pt4 pb12").Descendants("a");
                    foreach (var friend in friends)
                    {
                        var curr        = new MalUser();
                        var styleString = friend.Attributes["style"].Value.Substring(22);
                        curr.ImgUrl = styleString.Replace("/r/76x120", "");
                        curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?'));

                        curr.Name = friend.InnerText;
                        current.Friends.Add(curr);
                    }
                }
                catch (Exception)
                {
                    //
                }
            }

            #endregion

            #region Comments
            if (!updateFavsOnly)
            {
                try
                {
                    var commentBox = doc.FirstOfDescendantsWithClass("div", "user-comments mt24 pt24");
                    foreach (var comment in commentBox.WhereOfDescendantsWithClass("div", "comment clearfix"))
                    {
                        var curr = new MalComment();
                        curr.User.ImgUrl = comment.Descendants("img").First().Attributes["src"].Value;
                        var textBlock = comment.Descendants("div").First();
                        var header    = textBlock.Descendants("div").First();
                        curr.User.Name = header.ChildNodes[1].InnerText;
                        curr.Date      = header.ChildNodes[3].InnerText;
                        curr.Content   = WebUtility.HtmlDecode(textBlock.Descendants("div").Skip(1).First().InnerText.Trim());
                        var postActionNodes = comment.WhereOfDescendantsWithClass("a", "ml8");
                        var convNode        = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Conversation");
                        if (convNode != null)
                        {
                            curr.ComToCom = WebUtility.HtmlDecode(convNode.Attributes["href"].Value.Split('?').Last());
                        }
                        var deleteNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Delete");
                        if (deleteNode != null)
                        {
                            curr.CanDelete = true;
                            curr.Id        =
                                deleteNode.Attributes["onclick"].Value.Split(new char[] { '(', ')' },
                                                                             StringSplitOptions.RemoveEmptyEntries).Last();
                        }
                        foreach (var img in comment.Descendants("img").Skip(1))
                        {
                            if (img.Attributes.Contains("src"))
                            {
                                curr.Images.Add(img.Attributes["src"].Value);
                            }
                        }
                        current.Comments.Add(curr);
                    }
                }
                catch (Exception e)
                {
                    //no comments
                }
            }

            #endregion

            try
            {
                current.ProfileMemId = doc.DocumentNode.Descendants("input")
                                       .First(node => node.Attributes.Contains("name") && node.Attributes["name"].Value == "profileMemId")
                                       .Attributes["value"].Value;
            }
            catch (Exception)
            {
                //restricted
            }

            try
            {
                current.HtmlContent = doc.FirstOfDescendantsWithClass("div", "word-break").OuterHtml;
            }
            catch (Exception)
            {
                //
            }


            if (_userName == Credentials.UserName) //umm why do we need someone's favs?
            {
                FavouritesManager.ForceNewSet(FavouriteType.Anime, current.FavouriteAnime.Select(i => i.ToString()).ToList());
                FavouritesManager.ForceNewSet(FavouriteType.Manga, current.FavouriteManga.Select(i => i.ToString()).ToList());
                FavouritesManager.ForceNewSet(FavouriteType.Character, current.FavouriteCharacters.Select(i => i.Id).ToList());
                FavouritesManager.ForceNewSet(FavouriteType.Person, current.FavouritePeople.Select(i => i.Id).ToList());
            }


            if (!updateFavsOnly)
            {
                DataCache.SaveProfileData(_userName, current);
            }

            return(current);
        }
コード例 #19
0
 public void SetUp()
 {
     mockEndUserSettingDAO    = new Mock <EndUserSettingDAO>();
     endUserFavouritesManager = new FavouritesManager(mockEndUserSettingDAO.Object);
 }
コード例 #20
0
 public FavouriteViewModel()
 {
     _cache = FavouritesManager.Instance;
 }