/
client.py
150 lines (124 loc) · 5.14 KB
/
client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""
Xbox Live Client
Basic factory that stores :class:`XboxLiveLanguage`, User authorization data
and available `Providers`
"""
import logging
from typing import Any
from httpx import Response
from ms_cv import CorrelationVector
from xbox.webapi.api.language import DefaultXboxLiveLanguages, XboxLiveLanguage
from xbox.webapi.api.provider.account import AccountProvider
from xbox.webapi.api.provider.achievements import AchievementsProvider
from xbox.webapi.api.provider.catalog import CatalogProvider
from xbox.webapi.api.provider.cqs import CQSProvider
from xbox.webapi.api.provider.gameclips import GameclipProvider
from xbox.webapi.api.provider.lists import ListsProvider
from xbox.webapi.api.provider.mediahub import MediahubProvider
from xbox.webapi.api.provider.message import MessageProvider
from xbox.webapi.api.provider.people import PeopleProvider
from xbox.webapi.api.provider.presence import PresenceProvider
from xbox.webapi.api.provider.profile import ProfileProvider
from xbox.webapi.api.provider.screenshots import ScreenshotsProvider
from xbox.webapi.api.provider.smartglass import SmartglassProvider
from xbox.webapi.api.provider.titlehub import TitlehubProvider
from xbox.webapi.api.provider.usersearch import UserSearchProvider
from xbox.webapi.api.provider.userstats import UserStatsProvider
from xbox.webapi.authentication.manager import AuthenticationManager
log = logging.getLogger("xbox.api")
class Session:
def __init__(self, auth_mgr: AuthenticationManager):
self._auth_mgr = auth_mgr
self._cv = CorrelationVector()
async def request(
self,
method: str,
url: str,
include_auth: bool = True,
include_cv: bool = True,
**kwargs: Any,
) -> Response:
"""Proxy Request and add Auth/CV headers."""
headers = kwargs.pop("headers", {})
params = kwargs.pop("params", None)
data = kwargs.pop("data", None)
# Extra, user supplied values
extra_headers = kwargs.pop("extra_headers", None)
extra_params = kwargs.pop("extra_params", None)
extra_data = kwargs.pop("extra_data", None)
if include_auth:
# Ensure tokens valid
await self._auth_mgr.refresh_tokens()
# Set auth header
headers[
"Authorization"
] = self._auth_mgr.xsts_token.authorization_header_value
if include_cv:
headers["MS-CV"] = self._cv.increment()
# Extend with optionally supplied values
if extra_headers:
headers.update(extra_headers)
if extra_params:
# query parameters
params = params or {}
params.update(extra_params)
if extra_data:
# form encoded post data
data = data or {}
data.update(extra_data)
return await self._auth_mgr.session.request(
method, url, **kwargs, headers=headers, params=params, data=data
)
async def get(self, url: str, **kwargs: Any) -> Response:
return await self.request("GET", url, **kwargs)
async def options(self, url: str, **kwargs: Any) -> Response:
return await self.request("OPTIONS", url, **kwargs)
async def head(self, url: str, **kwargs: Any) -> Response:
return await self.request("HEAD", url, **kwargs)
async def post(self, url: str, **kwargs: Any) -> Response:
return await self.request("POST", url, **kwargs)
async def put(self, url: str, **kwargs: Any) -> Response:
return await self.request("PUT", url, **kwargs)
async def patch(self, url: str, **kwargs: Any) -> Response:
return await self.request("PATCH", url, **kwargs)
async def delete(self, url: str, **kwargs: Any) -> Response:
return await self.request("DELETE", url, **kwargs)
class XboxLiveClient:
def __init__(
self,
auth_mgr: AuthenticationManager,
language: XboxLiveLanguage = DefaultXboxLiveLanguages.United_States,
):
self._auth_mgr = auth_mgr
self.session = Session(auth_mgr)
self._language = language
self.cqs = CQSProvider(self)
self.lists = ListsProvider(self)
self.profile = ProfileProvider(self)
self.achievements = AchievementsProvider(self)
self.usersearch = UserSearchProvider(self)
self.gameclips = GameclipProvider(self)
self.people = PeopleProvider(self)
self.presence = PresenceProvider(self)
self.mediahub = MediahubProvider(self)
self.message = MessageProvider(self)
self.userstats = UserStatsProvider(self)
self.screenshots = ScreenshotsProvider(self)
self.titlehub = TitlehubProvider(self)
self.account = AccountProvider(self)
self.catalog = CatalogProvider(self)
self.smartglass = SmartglassProvider(self)
@property
def xuid(self) -> str:
"""
Gets the Xbox User ID
Returns: Xbox user Id
"""
return self._auth_mgr.xsts_token.xuid
@property
def language(self) -> XboxLiveLanguage:
"""
Gets the active Xbox Live Language
Returns: Active Xbox Live language
"""
return self._language