diff --git a/rare/components/tabs/store/__init__.py b/rare/components/tabs/store/__init__.py index c6693b68b..e9b776b40 100644 --- a/rare/components/tabs/store/__init__.py +++ b/rare/components/tabs/store/__init__.py @@ -20,6 +20,7 @@ def __init__(self, core: LegendaryCore, parent=None): self.core.egs.session.headers['Authorization'], self.core.language_code, self.core.country_code, + self.core.egs._store_user_agent, [], # [i.asset_infos["Windows"].namespace for i in self.rcore.game_list if bool(i.asset_infos)] ) diff --git a/rare/components/tabs/store/store_api.py b/rare/components/tabs/store/store_api.py index a14d18215..8a162a9a0 100644 --- a/rare/components/tabs/store/store_api.py +++ b/rare/components/tabs/store/store_api.py @@ -1,6 +1,7 @@ from collections.abc import Callable from logging import getLogger +from legendary.api.egs import EPCAPI from PySide6.QtCore import QObject, Signal from PySide6.QtWidgets import QApplication @@ -19,9 +20,6 @@ ResponseModel, ) -graphql_url = 'https://store.epicgames.com/graphql' -# graphql_url = "https://launcher.store.epicgames.com/graphql" - def DEBUG() -> bool: return '--debug' in QApplication.arguments() @@ -30,7 +28,7 @@ def DEBUG() -> bool: class StoreAPI(QObject): update_wishlist = Signal() - def __init__(self, token, language: str, country: str, installed): + def __init__(self, token, language: str, country: str, user_agent: str, installed): super(StoreAPI, self).__init__() self.logger = getLogger(type(self).__name__) self.token = token @@ -38,9 +36,11 @@ def __init__(self, token, language: str, country: str, installed): self.country_code: str = country self.locale = f'{self.language_code}-{self.country_code}' self.manager = QRequests(parent=self) - self.authed_manager = QRequests(token=token, parent=self) + self.authed_manager = QRequests(token=token, user_agent=user_agent, parent=self) self.cached_manager = QRequests(cache=str(cache_dir().joinpath('store')), parent=self) + self.grapql_url = f'https://{EPCAPI._store_gql_host}/graphql' + self.installed = installed self.browse_active = False @@ -65,13 +65,13 @@ def __handle_free_games(self, data, callback: Callable): except (Exception, AttributeError, KeyError) as e: if DEBUG(): raise - elements = False + elements = () self.logger.error('Free games request failed with: %s', e) callback(elements) def get_wishlist(self, callback: Callable): self.authed_manager.post( - graphql_url, + self.grapql_url, lambda data: self.__handle_wishlist(data, callback), { 'query': wishlist_query, @@ -93,7 +93,7 @@ def __handle_wishlist(self, data, callback: Callable[[tuple], None]): except (Exception, AttributeError, KeyError) as e: if DEBUG(): raise - elements = False + elements = () self.logger.error('Wishlist request failed with: %s', e) callback(elements) @@ -115,7 +115,7 @@ def search_game(self, name, callback: Callable): }, } - self.manager.post(graphql_url, lambda data: self.__handle_search(data, callback), payload) + self.authed_manager.post(self.grapql_url, lambda data: self.__handle_search(data, callback), payload) def __handle_search(self, data, callback: Callable[[tuple], None]): try: @@ -127,7 +127,7 @@ def __handle_search(self, data, callback: Callable[[tuple], None]): except (Exception, AttributeError, KeyError) as e: if DEBUG(): raise - elements = False + elements = () self.logger.error('Search request failed with: %s', e) callback(elements) @@ -137,8 +137,8 @@ def browse_games(self, browse_model: SearchStoreQuery, callback): return self.browse_active = True payload = {'query': search_query, 'variables': browse_model.to_dict()} - self.manager.post( - graphql_url, + self.authed_manager.post( + self.grapql_url, lambda data: self.__handle_browse_games(data, callback), payload, ) @@ -157,7 +157,7 @@ def __handle_browse_games(self, data, callback): except (Exception, AttributeError, KeyError) as e: if DEBUG(): raise - elements = False + elements = () self.logger.error('Browse request failed with: %s', e) callback(elements) else: @@ -206,7 +206,7 @@ def add_to_wishlist(self, namespace, offer_id, callback: Callable): }, } self.authed_manager.post( - graphql_url, + self.grapql_url, lambda data: self._handle_add_to_wishlist(data, callback), payload, ) @@ -236,7 +236,7 @@ def remove_from_wishlist(self, namespace, offer_id, callback: Callable): }, } self.authed_manager.post( - graphql_url, + self.grapql_url, lambda data: self._handle_remove_from_wishlist(data, callback), payload, ) diff --git a/rare/utils/qrequests.py b/rare/utils/qrequests.py index 4028093b6..a24624855 100644 --- a/rare/utils/qrequests.py +++ b/rare/utils/qrequests.py @@ -13,8 +13,8 @@ QNetworkRequest, ) -user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' -# user_agent = f'UELauncher/{version} Windows/10.0.19041.1.256.64bit' +_user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' +# _user_agent = f'UELauncher/{version} Windows/10.0.19041.1.256.64bit' RequestHandler = TypeVar('RequestHandler', bound=Callable[[dict | bytes], None]) @@ -33,7 +33,9 @@ def __eq__(self, other): class QRequests(QObject): data_ready = Signal(object) - def __init__(self, cache: str | None = None, token: str | None = None, parent=None): + def __init__( + self, cache: str | None = None, token: str | None = None, user_agent: str = _user_agent, parent: QObject | None = None + ): super(QRequests, self).__init__(parent=parent) self.logger = getLogger(f'{type(self).__name__}_{type(parent).__name__}') self._manager = QNetworkAccessManager(self) @@ -47,6 +49,7 @@ def __init__(self, cache: str | None = None, token: str | None = None, parent=No if token is not None: self.logger.debug('Manager is authorized') self._token = token + self._user_agent = user_agent self._active_requests: dict[QNetworkReply, RequestQueueItem] = {} @@ -65,11 +68,12 @@ def _prepare_request(self, item: RequestQueueItem) -> QNetworkRequest: QNetworkRequest.KnownHeaders.ContentTypeHeader, 'application/json; charset=UTF-8', ) - request.setHeader(QNetworkRequest.KnownHeaders.UserAgentHeader, user_agent) + request.setHeader(QNetworkRequest.KnownHeaders.UserAgentHeader, self._user_agent) request.setAttribute( QNetworkRequest.Attribute.RedirectPolicyAttribute, QNetworkRequest.RedirectPolicy.NoLessSafeRedirectPolicy, ) + # request.setAttribute(QNetworkRequest.Attribute.Http2AllowedAttribute, False) if self._cache is not None: request.setAttribute( QNetworkRequest.Attribute.CacheLoadControlAttribute,