From e57e450e71b7f7048fff60168c5c350484b83046 Mon Sep 17 00:00:00 2001 From: Jonas Nicoletti Date: Sun, 1 Nov 2020 10:28:57 +0100 Subject: [PATCH 1/3] add basic PlayerStats model and request --- kickbase_api/kickbase.py | 12 ++++++++++++ kickbase_api/models/player_stats.py | 7 +++++++ 2 files changed, 19 insertions(+) create mode 100644 kickbase_api/models/player_stats.py diff --git a/kickbase_api/kickbase.py b/kickbase_api/kickbase.py index daddfbb..1648efe 100644 --- a/kickbase_api/kickbase.py +++ b/kickbase_api/kickbase.py @@ -211,6 +211,18 @@ def league_user_players(self, league: Union[str, LeagueData], user: Union[str, U else: raise KickbaseException() + + def league_user_players_stats(self, league: Union[str, LeagueData], player: Union[str, Player]) -> PlayerStats: + league_id = self._get_league_id(league) + player_id = self._get_player_id(player) + + r = self._do_get("/leagues/{}/players/{}/stats".format(league_id, player_id), True) + + if r.status_code == 200: + return PlayerStats(r.json()) + else: + raise KickbaseException() + def league_collect_gift(self, league: Union[str, LeagueData]) -> True: league_id = self._get_league_id(league) diff --git a/kickbase_api/models/player_stats.py b/kickbase_api/models/player_stats.py new file mode 100644 index 0000000..bc66db0 --- /dev/null +++ b/kickbase_api/models/player_stats.py @@ -0,0 +1,7 @@ +class PlayerStats(): + market_value_change: int = None + market_value_change_percent: float = None + + def __init__(self, d: dict = {}): + self.market_value_change = d['leaguePlayer']['marketValueChange'] + self.market_value_change_percent = d['leaguePlayer']['marketValueChangePercent'] From 5810abd07db21f8d2c9c3d8427b59a44a83e0e9b Mon Sep 17 00:00:00 2001 From: Jonas Nicoletti Date: Sun, 1 Nov 2020 10:48:24 +0100 Subject: [PATCH 2/3] add missing import --- kickbase_api/kickbase.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kickbase_api/kickbase.py b/kickbase_api/kickbase.py index 1648efe..2bf927c 100644 --- a/kickbase_api/kickbase.py +++ b/kickbase_api/kickbase.py @@ -20,6 +20,7 @@ from kickbase_api.models.market import Market from kickbase_api.models.market_player import MarketPlayer from kickbase_api.models.player import Player +from kickbase_api.models.player_stats import PlayerStats from kickbase_api.models.response.league_stats_response import LeagueStatsResponse from kickbase_api.models.user import User @@ -222,7 +223,7 @@ def league_user_players_stats(self, league: Union[str, LeagueData], player: Unio return PlayerStats(r.json()) else: raise KickbaseException() - + def league_collect_gift(self, league: Union[str, LeagueData]) -> True: league_id = self._get_league_id(league) From 37706a0fd48aa365930c67f4a2e9c5dd20378dcd Mon Sep 17 00:00:00 2001 From: kevinskyba Date: Sun, 1 Nov 2020 11:35:50 +0100 Subject: [PATCH 3/3] - fixed formatting - added BaseModel json parsing logic - added simple test --- kickbase_api/kickbase.py | 40 ++++++++++++++++------------- kickbase_api/models/player_stats.py | 14 +++++++--- tests/test_kickbase.py | 7 +++++ 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/kickbase_api/kickbase.py b/kickbase_api/kickbase.py index 2bf927c..36c703b 100644 --- a/kickbase_api/kickbase.py +++ b/kickbase_api/kickbase.py @@ -212,15 +212,14 @@ def league_user_players(self, league: Union[str, LeagueData], user: Union[str, U else: raise KickbaseException() - - def league_user_players_stats(self, league: Union[str, LeagueData], player: Union[str, Player]) -> PlayerStats: - league_id = self._get_league_id(league) + def league_user_player_stats(self, league: Union[str, LeagueData], player: Union[str, Player]) -> PlayerStats: + league_id = self._get_league_id(league) player_id = self._get_player_id(player) r = self._do_get("/leagues/{}/players/{}/stats".format(league_id, player_id), True) if r.status_code == 200: - return PlayerStats(r.json()) + return PlayerStats(r.json()["leaguePlayer"]) else: raise KickbaseException() @@ -415,31 +414,33 @@ def exchange_custom_token(self, chat_token: str): "Content-Type": "application/json", "Accept": "application/json" } - + data = { "returnSecureToken": True, "token": chat_token } r = requests.post(self._url_for_google_identity_toolkit( - "/v3/relyingparty/verifyCustomToken?key={}".format(self.google_identity_toolkit_api_key)), data=json.dumps(data), + "/v3/relyingparty/verifyCustomToken?key={}".format(self.google_identity_toolkit_api_key)), + data=json.dumps(data), headers=headers) - + if r.status_code == 200: j = r.json() self.firebase_token = j["idToken"] self.firebase_token_expire = datetime.now(timezone.utc) + timedelta(seconds=int(j["expiresIn"])) else: raise KickbaseException("There was an error exchanging custom token for firebase token") - + def _update_firebase_token(self): token = self.chat_token() self.exchange_custom_token(token) - def chat_messages(self, league: Union[str, LeagueData], page_size: int = 30, next_page_token: str = None) -> ([ChatItem], str): + def chat_messages(self, league: Union[str, LeagueData], page_size: int = 30, next_page_token: str = None) -> ( + [ChatItem], str): if self.google_identity_toolkit_api_key is None: return [] - + league_id = self._get_league_id(league) if not self._is_token_valid(): @@ -454,9 +455,12 @@ def chat_messages(self, league: Union[str, LeagueData], page_size: int = 30, nex "Authorization": "Bearer {}".format(self.firebase_token) } if next_page_token is None: - r = requests.get(self._url_for_firestore("/chat/{}/messages?pageSize={}".format(league_id, page_size)), headers=headers) + r = requests.get(self._url_for_firestore("/chat/{}/messages?pageSize={}".format(league_id, page_size)), + headers=headers) else: - r = requests.get(self._url_for_firestore("/chat/{}/messages?pageSize={}&pageToken={}".format(league_id, page_size, next_page_token)), headers=headers) + r = requests.get(self._url_for_firestore( + "/chat/{}/messages?pageSize={}&pageToken={}".format(league_id, page_size, next_page_token)), + headers=headers) if r.status_code == 200: j = r.json() @@ -471,7 +475,7 @@ def chat_messages(self, league: Union[str, LeagueData], page_size: int = 30, nex def post_chat_message(self, message: str, league: Union[str, LeagueData]): if self.google_identity_toolkit_api_key is None: return - + league_id = self._get_league_id(league) if not self._is_token_valid(): @@ -485,7 +489,7 @@ def post_chat_message(self, message: str, league: Union[str, LeagueData]): "Accept": "application/json", "Authorization": "Bearer {}".format(self.firebase_token) } - + data = { "fields": { "userId": { @@ -513,7 +517,7 @@ def post_chat_message(self, message: str, league: Union[str, LeagueData]): } } - r = requests.post(self._url_for_firestore("/chat/{}/messages".format(league_id)), + r = requests.post(self._url_for_firestore("/chat/{}/messages".format(league_id)), data=json.dumps(data), headers=headers) if r.status_code == 200: @@ -565,7 +569,7 @@ def _auth_cookie(self): return "kkstrauth={}".format(self.token) def _do_get(self, endpoint: str, authenticated: bool = False): - if authenticated and not self._is_token_valid(): + if authenticated and not self._is_token_valid(): self.login(self._username, self._password) headers = { @@ -591,7 +595,7 @@ def _do_post(self, endpoint: str, data: dict, authenticated: bool = False): return requests.post(self._url_for_endpoint(endpoint), data=json.dumps(data), headers=headers) def _do_put(self, endpoint: str, data: dict, authenticated: bool = False): - if authenticated and not self._is_token_valid(): + if authenticated and not self._is_token_valid(): self.login(self._username, self._password) headers = { @@ -604,7 +608,7 @@ def _do_put(self, endpoint: str, data: dict, authenticated: bool = False): return requests.put(self._url_for_endpoint(endpoint), data=json.dumps(data), headers=headers) def _do_delete(self, endpoint: str, authenticated: bool = False): - if authenticated and not self._is_token_valid(): + if authenticated and not self._is_token_valid(): self.login(self._username, self._password) headers = { diff --git a/kickbase_api/models/player_stats.py b/kickbase_api/models/player_stats.py index bc66db0..c73cfcb 100644 --- a/kickbase_api/models/player_stats.py +++ b/kickbase_api/models/player_stats.py @@ -1,7 +1,15 @@ -class PlayerStats(): +from kickbase_api.models.base_model import BaseModel + + +class PlayerStats(BaseModel): market_value_change: int = None market_value_change_percent: float = None def __init__(self, d: dict = {}): - self.market_value_change = d['leaguePlayer']['marketValueChange'] - self.market_value_change_percent = d['leaguePlayer']['marketValueChangePercent'] + self._json_transform = { + } + self._json_mapping = { + "marketValueChange": "market_value_change", + "marketValueChangePercent": "market_value_change_percent" + } + super().__init__(d) diff --git a/tests/test_kickbase.py b/tests/test_kickbase.py index d1ca0fd..b9561b1 100644 --- a/tests/test_kickbase.py +++ b/tests/test_kickbase.py @@ -88,6 +88,13 @@ def test_league_user_players(logged_in_kickbase): assert players is not None +@pytest.mark.online +def test_league_user_player_stats(logged_in_kickbase): + kickbase, user, leagues = logged_in_kickbase + stats = kickbase.league_user_player_stats(leagues[0], "44") + assert stats is not None + + @pytest.mark.online def test_league_user_players_match_day(logged_in_kickbase): kickbase, user, leagues = logged_in_kickbase