Пример #1
0
        void UpdateSummoner(Summoner summoner, ConcurrentRPC concurrentRPC, DbConnection connection)
        {
            int accountId = summoner.AccountId;

            lock (ActiveAccountIds)
            {
                //Avoid concurrent updates of the same account, it's asking for trouble and is redundant anyways
                //We might obtain outdated results in one query but that's a minor issue in comparison to corrupted database results
                if (ActiveAccountIds.Contains(accountId))
                {
                    return;
                }

                ActiveAccountIds.Add(accountId);
            }

            //Use a transaction because we're going to insert a fair amount of data
            using (var transaction = connection.BeginTransaction())
            {
                UpdateSummonerFields(summoner, connection, true);
                UpdateRunes(summoner, concurrentRPC.PublicSummonerData, connection);

                UpdateSummonerRatings(summoner, concurrentRPC.LifeTimeStatistics, connection);
                //A season value of zero indicates the current season only
                UpdateSummonerRankedStatistics(summoner, 0, concurrentRPC.AggregatedStatistics, connection);
                UpdateSummonerGames(summoner, concurrentRPC.RecentGameData, connection);

                transaction.Commit();
            }

            lock (ActiveAccountIds)
                ActiveAccountIds.Remove(accountId);
        }
Пример #2
0
        void UpdateSummoner(Summoner summoner, ConcurrentRPC concurrentRPC, DbConnection connection)
        {
            int accountId = summoner.AccountId;

            lock (ActiveAccountIds)
            {
                //Avoid concurrent updates of the same account, it's asking for trouble and is redundant anyways
                //We might obtain outdated results in one query but that's a minor issue in comparison to corrupted database results
                if (ActiveAccountIds.Contains(accountId))
                    return;

                ActiveAccountIds.Add(accountId);
            }

            //Use a transaction because we're going to insert a fair amount of data
            using (var transaction = connection.BeginTransaction())
            {
                UpdateSummonerFields(summoner, connection, true);
                UpdateRunes(summoner, concurrentRPC.PublicSummonerData, connection);

                UpdateSummonerRatings(summoner, concurrentRPC.LifeTimeStatistics, connection);
                //A season value of zero indicates the current season only
                UpdateSummonerRankedStatistics(summoner, 0, concurrentRPC.AggregatedStatistics, connection);
                UpdateSummonerGames(summoner, concurrentRPC.RecentGameData, connection);

                transaction.Commit();
            }

            lock (ActiveAccountIds)
                ActiveAccountIds.Remove(accountId);
        }
        public OperationResult UpdateSummonerByAccountId(int accountId)
        {
            if (!Connected)
            {
                return(OperationResult.NotConnected);
            }

            WriteLine("Updating account {0}", accountId);
            ConcurrentRPC   concurrentRPC = new ConcurrentRPC(RPC, accountId);
            OperationResult result        = concurrentRPC.Run();

            if (result == OperationResult.Success)
            {
                if (concurrentRPC.PublicSummonerData == null)
                {
                    //This means that the summoner was not found, even though the other structures are actually non-null
                    return(OperationResult.NotFound);
                }
                Summoner newSummoner = new Summoner(concurrentRPC.PublicSummonerData, Region);
                Summoner summoner    = StatisticsService.GetSummoner(Region, accountId);
                if (summoner == null)
                {
                    //The summoner wasn't in the database yet, add them
                    using (var connection = Provider.GetConnection())
                        InsertNewSummoner(newSummoner, connection);
                    summoner = newSummoner;
                }
                else
                {
                    //Copy data that might have been changed
                    summoner.SummonerName = newSummoner.SummonerName;
                    summoner.InternalName = newSummoner.InternalName;

                    summoner.SummonerLevel = newSummoner.SummonerLevel;
                    summoner.ProfileIcon   = newSummoner.ProfileIcon;
                }
                //Perform a full update
                using (var connection = Provider.GetConnection())
                    UpdateSummoner(summoner, concurrentRPC, connection);
                return(OperationResult.Success);
            }
            return(result);
        }
        public OperationResult UpdateSummonerByAccountId(int accountId)
        {
            if (!Connected)
                return OperationResult.NotConnected;

            WriteLine("Updating account {0}", accountId);
            ConcurrentRPC concurrentRPC = new ConcurrentRPC(RPC, accountId);
            OperationResult result = concurrentRPC.Run();
            if (result == OperationResult.Success)
            {
                if (concurrentRPC.PublicSummonerData == null)
                {
                    //This means that the summoner was not found, even though the other structures are actually non-null
                    return OperationResult.NotFound;
                }
                Summoner newSummoner = new Summoner(concurrentRPC.PublicSummonerData, Region);
                Summoner summoner = StatisticsService.GetSummoner(Region, accountId);
                if (summoner == null)
                {
                    //The summoner wasn't in the database yet, add them
                    using (var connection = Provider.GetConnection())
                        InsertNewSummoner(newSummoner, connection);
                    summoner = newSummoner;
                }
                else
                {
                    //Copy data that might have been changed
                    summoner.SummonerName = newSummoner.SummonerName;
                    summoner.InternalName = newSummoner.InternalName;

                    summoner.SummonerLevel = newSummoner.SummonerLevel;
                    summoner.ProfileIcon = newSummoner.ProfileIcon;
                }
                //Perform a full update
                using (var connection = Provider.GetConnection())
                    UpdateSummoner(summoner, concurrentRPC.PublicSummonerData, concurrentRPC.AggregatedStatistics, concurrentRPC.LifeTimeStatistics, concurrentRPC.RecentGameData, connection);
                return OperationResult.Success;
            }
            return result;
        }
        public OperationResult UpdateSummonerByAccountId(int accountId, bool isAutoUpdate = false)
        {
            if (!Connected)
                return OperationResult.NotConnected;

            ConcurrentRPC concurrentRPC = new ConcurrentRPC(RPC, accountId);
            OperationResult result = concurrentRPC.Run();

            if (result == OperationResult.Success)
            {
                if (concurrentRPC.PublicSummonerData == null)
                {
                    //This means that the summoner was not found, even though the other structures are actually non-null
                    return OperationResult.NotFound;
                }

                Summoner newSummoner = new Summoner(concurrentRPC.PublicSummonerData, Region);
                Summoner summoner = StatisticsService.GetSummoner(Region, accountId);

                if (summoner == null)
                {
                    //The summoner wasn't in the database yet, add them
                    using (var connection = Provider.GetConnection())
                        InsertNewSummoner(newSummoner, connection);
                    summoner = newSummoner;

                    summoner.LastUpdateTrial = 0;
                }
                else
                {
                    //Copy data that might have been changed
                    summoner.SummonerName = newSummoner.SummonerName;
                    summoner.InternalName = newSummoner.InternalName;

                    summoner.SummonerLevel = newSummoner.SummonerLevel;
                    summoner.ProfileIcon = newSummoner.ProfileIcon;
                }

                // too bad i have to query summoner by name because i dont have revision date
                PublicSummoner publicSummoner;

                try
                {
                    publicSummoner = RPC.GetSummonerByName(summoner.SummonerName);
                }
                catch(RPCTimeoutException)
                {
                    return OperationResult.Timeout;
                }

                if (publicSummoner == null)
                    return OperationResult.NotFound;

                newSummoner.RevisionDate = (int)publicSummoner.revisionDate.ToUnixTime();

                if ((summoner == newSummoner) || (summoner.RevisionDate < newSummoner.RevisionDate))
                {
                    summoner.RevisionDate = newSummoner.RevisionDate;

                    if (isAutoUpdate)
                        summoner.LastUpdateTrial = 0;
                }
                else if ( (isAutoUpdate) || (summoner.LastUpdateTrial == 0) )
                    summoner.LastUpdateTrial++;

                //Perform a full update, eh
                using (var connection = Provider.GetConnection())
                    UpdateSummoner(summoner, concurrentRPC, connection);

                WriteLine("Updated account {0}, trial {1}", accountId, summoner.LastUpdateTrial);

                return OperationResult.Success;
            }

            return result;
        }
Пример #6
0
        void RunMassiveSummonerLookup()
        {
            while (PerformUpdates())
            {
                int summonerId = 0;

                if (_summonerToLookup.Count == 0) // lock is not important here :p
                {
                    TerminationEvent.WaitOne(1000);
                    continue;
                }

                lock (_summonerToLookup)
                    summonerId = _summonerToLookup.Dequeue();

                if (summonerId == 0)
                    continue;

                var name = RPC.FindSummonerNameBySummonerId(summonerId);

                if (String.IsNullOrEmpty(name))
                {
                    WriteLine("Can't find summoner by id {0} ", summonerId);
                    continue;
                }

                var summoner = StatisticsService.GetSummoner(Region, name);
                if (summoner != null)
                {
                    if (FindSummoner(name, ref summoner) != OperationResult.Success)
                    {
                        WriteLine("No such player named {0} ", name);
                        continue;
                    }
                }

                if (FindSummoner(name, ref summoner) != OperationResult.Success)
                    continue;

                var gameLookupRPC = new ConcurrentRPC(RPC, summoner.AccountId);

                if (gameLookupRPC.Run(ConcurrentRPC.Flag.RecentGames) != OperationResult.Success)
                    continue;

                using (var connection = Provider.GetConnection())
                {
                    WriteLine("Performing massive lookup for {0} ", name);
                    UpdateSummonerGames(summoner, gameLookupRPC.RecentGameData, connection, false);
                }
            }
        }