1
1
from sc2ranks import Sc2Ranks
2
2
from django .core .cache import cache
3
- import logging
4
3
4
+ CACHE_TIME = 60 * 60 * 4
5
5
6
6
try :
7
7
from django .conf import settings
10
10
print "Please configure 'SC2RANKS_API_KEY' in your settings.py"
11
11
12
12
13
- class Sc2RanksMixin (object ):
14
- """Add methods for fetching SC2Ranks-Data to a Django model"""
13
+ class Sc2RanksManager (object ):
14
+ """
15
+ Descriptor for handling access to Sc2Ranks-API.
16
+ """
15
17
16
- client = Sc2Ranks (SC2RANKS_API_KEY )
17
- # How to best enforce that a model that uses this mixin has these fields set?
18
- # TODO: evaluate abstract properties
19
- player_fieldname = None
20
- bnet_id_fieldname = None
21
- bnet_realm_fieldname = None
18
+ def __init__ (self , name , realm , bid ):
19
+ self .bnet = {}
20
+ self .bnet ['name' ] = name
21
+ self .bnet ['realm' ] = realm
22
+ self .bnet ['bid' ] = bid
22
23
23
- @property
24
- def bnet_name (self ):
25
- try :
26
- assert bool (self .player_fieldname )
27
- player_field = getattr (self , 'player_fieldname' )
28
- return getattr (self , player_field )
29
- except AssertionError :
30
- raise AssertionError ('No field mapping for player_fieldname specified' )
31
- except AttributeError :
32
- raise AttributeError ('The fieldname specified for player_fieldname does not exist on this model' )
24
+ def __get__ (self , instance , owner ):
25
+ # get instance values and pass data to api wrapper
26
+ return Sc2RanksAPIWrapper (instance , ** self .bnet )
33
27
34
- @property
35
- def bnet_id (self ):
36
- try :
37
- assert bool (self .bnet_id_fieldname )
38
- bnet_id_field = getattr (self , 'bnet_id_fieldname' )
39
- return getattr (self , bnet_id_field )
40
- except AssertionError :
41
- raise AssertionError ('No field mapping for bnet_id_fieldname specified' )
42
- except AttributeError :
43
- raise AttributeError ('The fieldname specified for bnet_id_fieldname does not exist on this model' )
28
+
29
+ class Sc2RanksAPIWrapper (object ):
30
+
31
+ def __init__ (self , instance , name , realm , bid ):
32
+ self .bnet_name = instance .__dict__ [name ]
33
+ self .bnet_realm = instance .__dict__ [realm ]
34
+ self .bnet_id = instance .__dict__ [bid ]
35
+ self .client = Sc2Ranks (SC2RANKS_API_KEY )
44
36
45
37
@property
46
- def bnet_realm (self ):
47
- try :
48
- assert bool (self .bnet_realm_fieldname )
49
- bnet_realm_field = getattr (self , 'bnet_realm_fieldname' )
50
- return getattr (self , bnet_realm_field )
51
- raise AssertionError ('No field mapping for bnet_realm_fieldname specified' )
52
- except AttributeError :
53
- raise AttributeError ('The fieldname specified for bnet_realm does not exist on this model' )
54
-
55
- def assert_bnet_id (self ):
56
- """Updates the players battle.net id if it isn't set yet."""
57
-
58
- if not self .bnet_id :
59
- try :
60
- bnet_id = self .get_sc2ranks_bnet_id ()
61
- setattr (self , self .bnet_id_fieldname , bnet_id )
62
- self .save ()
63
- except Exception , e :
64
- logging .debug ('bnet_id could not be updated.\n %s' % e )
38
+ def profile_page (self ):
39
+ return "http://www.sc2ranks.com/%s/%s/%s/" % (self .bnet_realm ,
40
+ self .bnet_id ,
41
+ self .bnet_name )
42
+
43
+ def get_team_stats (self , bracket = 1 , * partner ):
44
+ """
45
+ Fetch team stats from sc2ranks.
46
+
47
+ if no further parameter is given single player stats are returned
48
+ further options:
49
+ bracket = 1,2 etc.
50
+ partner = HandJudas, MrChance etc ...
51
+ """
52
+ data = None
53
+ cache_key = '%s%s' % (self .bnet_name , bracket )
54
+ cached_teams = cache .get (cache_key )
55
+
56
+ if cached_teams is not None :
57
+ data = cached_teams
58
+ else :
59
+ data = self .client .fetch_character_teams (region = self .bnet_realm ,
60
+ name = self .bnet_name ,
61
+ bracket = bracket ,
62
+ bnet_id = self .bnet_id )
63
+ cache .set (cache_key , data , CACHE_TIME )
65
64
65
+ teams = []
66
+ for team in data .teams :
67
+ # get the actual team from the list of all player's team in bracket
68
+ if hasattr (team , 'members' ):
69
+ if all ([member .name in partner for member in team .members ]):
70
+ teams .append (team )
71
+ else :
72
+ # as there are no members we can assume it's a single player team
73
+ teams = data .teams
74
+
75
+ return list (set (teams ))
66
76
67
- ########################
68
- # Sc2Ranks-Api methods #
69
- ########################
70
77
def search_character (self ):
71
78
"""Search a character by name."""
72
79
73
- data = self .client .search_for_character (self .bnet_realm , self .bnet_name )
74
- return data
80
+ return self .client .search_for_character (self .bnet_realm , self .bnet_name )
75
81
76
82
@property
77
83
def bnet_url (self ):
@@ -80,18 +86,12 @@ def bnet_url(self):
80
86
self .bnet_id ,
81
87
self .bnet_name )
82
88
83
- @property
84
- def sc2ranks_profile_page (self ):
85
- return "http://www.sc2ranks.com/%s/%s/%s/" % (self .bnet_realm ,
86
- self .bnet_id ,
87
- self .bnet_name )
88
89
89
90
@property
90
- def get_sc2ranks_base_character (self , cache_seconds = 1800 ):
91
+ def base_character (self , cache_seconds = CACHE_TIME ):
91
92
character = None
92
93
cache_key = self .bnet_name
93
94
character = cache .get (cache_key )
94
- self .assert_bnet_id ()
95
95
96
96
if character is not None :
97
97
return character
@@ -104,48 +104,13 @@ def get_sc2ranks_base_character(self, cache_seconds=1800):
104
104
cache .set (cache_key , character , cache_seconds )
105
105
return character
106
106
107
- def get_sc2ranks_stats (self , bracket = 1 , * partner ):
108
- """
109
- Get team stats from sc2ranks.com
110
-
111
- if no further parameter is given single player stats are returned
112
- further options:
113
- bracket = 1,2 etc.
114
- partner = HandJudas, MrChance etc ...
115
- """
116
- teams = None
117
- cache_key = '%s%s' % (self .bnet_name , bracket )
118
- cached_teams = cache .get (cache_key )
119
-
120
- if cached_teams is not None :
121
- teams = cached_teams
122
- else :
123
- teams = self .client .fetch_character_teams (region = self .bnet_realm ,
124
- name = self .bnet_name ,
125
- bracket = bracket ,
126
- bnet_id = self .bnet_id )
127
- cache .set (cache_key , teams , 1800 )
128
-
129
- teams_partner = []
130
- if partner :
131
- for team in teams .teams :
132
- for member in team .members :
133
- if member .name in partner :
134
- teams_partner .append (team )
135
- teams = list (set (teams_partner ))
136
- return teams
137
-
138
- def get_sc2ranks_bnet_id (self ):
139
- """Get the battle.net id for a player name."""
140
-
141
- return self .search_character ().characters [0 ]['bnet_id' ]
142
107
143
- def get_sc2ranks_portrait (self , size = 75 ):
108
+ def get_portrait (self , size = 75 ):
144
109
"""Returns the data needed to render the starcraft profile image."""
145
110
146
- if self .get_sc2ranks_base_character :
111
+ if self .base_character :
147
112
try :
148
- portrait = self .get_sc2ranks_base_character .portrait
113
+ portrait = self .base_character .portrait
149
114
x = - (portrait .column * size )
150
115
y = - (portrait .row * size )
151
116
image = 'portraits-%d-%d.jpg' % (portrait .icon_id , size )
0 commit comments