@@ -6,69 +6,26 @@ class SyncPlayerFromRiotJob < ApplicationJob
66 def perform ( player_id )
77 player = Player . find ( player_id )
88
9- unless player . riot_puuid . present? || player . summoner_name . present?
10- player . update ( sync_status : 'error' , last_sync_at : Time . current )
11- Rails . logger . error "Player #{ player_id } missing Riot info"
12- return
13- end
9+ return mark_error ( player , "Player #{ player_id } missing Riot info" ) unless player . riot_puuid . present? || player . summoner_name . present?
1410
1511 riot_api_key = ENV [ 'RIOT_API_KEY' ]
16- unless riot_api_key . present?
17- player . update ( sync_status : 'error' , last_sync_at : Time . current )
18- Rails . logger . error 'Riot API key not configured'
19- return
20- end
12+ return mark_error ( player , 'Riot API key not configured' ) unless riot_api_key . present?
13+
14+ region = player . region . presence &.downcase || 'br1'
2115
2216 begin
23- region = player . region . presence &.downcase || 'br1'
24-
25- summoner_data = if player . riot_puuid . present?
26- fetch_summoner_by_puuid ( player . riot_puuid , region , riot_api_key )
27- else
28- fetch_summoner_by_name ( player . summoner_name , region , riot_api_key )
29- end
30-
31- # Use PUUID for league endpoint (workaround for Riot API bug where summoner_data['id'] is nil)
32- # See: https://github.com/RiotGames/developer-relations/issues/1092
33- ranked_data = fetch_ranked_stats_by_puuid ( player . riot_puuid , region , riot_api_key )
34-
35- update_data = {
36- riot_puuid : summoner_data [ 'puuid' ] ,
37- riot_summoner_id : summoner_data [ 'id' ] ,
38- summoner_level : summoner_data [ 'summonerLevel' ] ,
39- profile_icon_id : summoner_data [ 'profileIconId' ] ,
40- sync_status : 'success' ,
41- last_sync_at : Time . current
42- }
43-
44- solo_queue = ranked_data . find { |q | q [ 'queueType' ] == 'RANKED_SOLO_5x5' }
45- if solo_queue
46- update_data . merge! ( {
47- solo_queue_tier : solo_queue [ 'tier' ] ,
48- solo_queue_rank : solo_queue [ 'rank' ] ,
49- solo_queue_lp : solo_queue [ 'leaguePoints' ] ,
50- solo_queue_wins : solo_queue [ 'wins' ] ,
51- solo_queue_losses : solo_queue [ 'losses' ]
52- } )
53- end
54-
55- flex_queue = ranked_data . find { |q | q [ 'queueType' ] == 'RANKED_FLEX_SR' }
56- if flex_queue
57- update_data . merge! ( {
58- flex_queue_tier : flex_queue [ 'tier' ] ,
59- flex_queue_rank : flex_queue [ 'rank' ] ,
60- flex_queue_lp : flex_queue [ 'leaguePoints' ]
61- } )
62- end
17+ summoner_data = fetch_summoner ( player , region , riot_api_key )
18+ ranked_data = fetch_ranked_stats_by_puuid ( summoner_data [ 'puuid' ] , region , riot_api_key )
6319
64- player . update! ( update_data )
20+ update_data = build_update_data ( summoner_data )
21+ update_data . merge! ( extract_queue_updates ( ranked_data ) )
6522
23+ player . update! ( update_data )
6624 Rails . logger . info "Successfully synced player #{ player_id } from Riot API"
6725 rescue StandardError => e
6826 Rails . logger . error "Failed to sync player #{ player_id } : #{ e . message } "
6927 Rails . logger . error e . backtrace . join ( "\n " )
70-
71- player . update ( sync_status : 'error' , last_sync_at : Time . current )
28+ mark_error ( player )
7229 end
7330 end
7431
@@ -154,3 +111,49 @@ def fetch_ranked_stats_by_puuid(puuid, region, api_key)
154111 JSON . parse ( response . body )
155112 end
156113end
114+ def fetch_summoner ( player , region , api_key )
115+ return fetch_summoner_by_puuid ( player . riot_puuid , region , api_key ) if player . riot_puuid . present?
116+ fetch_summoner_by_name ( player . summoner_name , region , api_key )
117+ end
118+
119+ def build_update_data ( summoner_data )
120+ {
121+ riot_puuid : summoner_data [ 'puuid' ] ,
122+ riot_summoner_id : summoner_data [ 'id' ] ,
123+ summoner_level : summoner_data [ 'summonerLevel' ] ,
124+ profile_icon_id : summoner_data [ 'profileIconId' ] ,
125+ sync_status : 'success' ,
126+ last_sync_at : Time . current
127+ }
128+ end
129+
130+ def extract_queue_updates ( ranked_data )
131+ updates = { }
132+
133+ solo = ranked_data . find { |q | q [ 'queueType' ] == 'RANKED_SOLO_5x5' }
134+ if solo
135+ updates . merge! ( {
136+ solo_queue_tier : solo [ 'tier' ] ,
137+ solo_queue_rank : solo [ 'rank' ] ,
138+ solo_queue_lp : solo [ 'leaguePoints' ] ,
139+ solo_queue_wins : solo [ 'wins' ] ,
140+ solo_queue_losses : solo [ 'losses' ]
141+ } )
142+ end
143+
144+ flex = ranked_data . find { |q | q [ 'queueType' ] == 'RANKED_FLEX_SR' }
145+ if flex
146+ updates . merge! ( {
147+ flex_queue_tier : flex [ 'tier' ] ,
148+ flex_queue_rank : flex [ 'rank' ] ,
149+ flex_queue_lp : flex [ 'leaguePoints' ]
150+ } )
151+ end
152+
153+ updates
154+ end
155+
156+ def mark_error ( player , message = nil )
157+ Rails . logger . error ( message ) if message
158+ player . update ( sync_status : 'error' , last_sync_at : Time . current )
159+ end
0 commit comments