예제 #1
0
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                logger.Info($"Parsing data for \"{url}\"");
                string data    = Downloader.DownloadURL(url);
                var    players = Parser.ParseList(data);

                foreach (var p in players)
                {
                    Player localPlayer = null;
                    if (Storage.Players.ContainsKey(url))
                    {
                        localPlayer = Storage.Players[url].FirstOrDefault(x => x.Name == p.Name);
                    }

                    if ((localPlayer == null || (localPlayer.Timestamp != p.Timestamp && int.Parse(p.Timestamp) - int.Parse(localPlayer.Timestamp) > postDelay)) &&
                        new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds() - int.Parse(p.Timestamp) <= outdatedThreshold)
                    {
                        logger.Info($"New player data found for \"{p.Name}\"");
                        p.URL = new Uri(new Uri(url), p.URL).ToString();
                        string htmlPlayer = Downloader.DownloadURL(p.URL);
                        Parser.ParsePlayer(p, htmlPlayer);

                        if (!string.IsNullOrEmpty(p.GuildURL))
                        {
                            p.GuildURL = new Uri(new Uri(url), p.GuildURL).ToString();
                            string htmlGuild = Downloader.DownloadURL(p.GuildURL);
                            Parser.ParseGuild(p, htmlGuild);
                        }

                        logger.Debug($"Sending player data via event invoke for \"{p.Name}\"");
                        NewPlayerData?.Invoke(this, new NewPlayerDataEventArgs(url, p));
                    }
                }

                Storage.Players[url] = players;
                Storage.Save();
                logger.Info($"Local storage updated for \"{url}\"");
            }
            catch (Exception ex)
            {
                logger.Error(ex.ToString());
            }
        }
예제 #2
0
        /// <summary>
        ///     Handles new http contents.
        /// </summary>
        /// <param name="content">Http content.</param>
        /// <param name="page">Which page content came from.</param>
        public void OnNewContent(string content, Page page)
        {
            switch (page)
            {
            case Page.INDEX:
                break;

            case Page.LOGIN:
                Status = ClientStatus.NotLogged;
                break;

            case Page.VILLAGE1:
                if (Status == ClientStatus.NotLogged)
                {
                    Status = ClientStatus.NotInitialized;
                    break;
                }
                string villageName = Parser.VillageName(content);
                Player.ActiveVillage.Name = villageName;

                int villageType = Parser.VillageType(content);
                Player.ActiveVillage.SetBuildings(
                    BuildingFactory.GetBuildings(villageType));

                BuildingData[] fields = Parser.Fields(content);
                foreach (var bd in fields)
                {
                    Building b = Player.ActiveVillage.Buildings[bd.Id];
                    b.Level = bd.Level;
                }
                break;

            case Page.VILLAGE2:
                BuildingData[] buildings = Parser.Buildings(content);
                foreach (var bd in buildings)
                {
                    Building b = Player.ActiveVillage.Buildings[bd.Id];
                    b.Level = bd.Level;
                    b.Type  = bd.Type;
                }
                break;

            case Page.VILLAGE3:
                break;

            case Page.V2V:
                break;

            case Page.BUILD:
                break;

            case Page.STATISTICS:
                PlayerData[] players = Parser.Players(content);
                if (NewPlayerData != null)
                {
                    NewPlayerData.Invoke(players);
                }
                break;

            case Page.PROFILE:
                VillageData[] villages = Parser.Villages(content);
                if (NewVillageData != null)
                {
                    NewVillageData.Invoke(villages);
                }
                break;

            case Page.MAP:
                break;

            case Page.MESSAGES:
                break;

            case Page.REPORTS:
                break;

            default:
                throw new ArgumentOutOfRangeException("page", page, null);
            }
        }