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); }
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; }
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); } } }