Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions rare/components/tabs/store/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
)

Expand Down
30 changes: 15 additions & 15 deletions rare/components/tabs/store/store_api.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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()
Expand All @@ -30,17 +28,19 @@ 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
self.language_code: str = language
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
Expand All @@ -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,
Expand All @@ -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)

Expand All @@ -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:
Expand All @@ -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)

Expand All @@ -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,
)
Expand All @@ -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:
Expand Down Expand Up @@ -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,
)
Expand Down Expand Up @@ -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,
)
Expand Down
12 changes: 8 additions & 4 deletions rare/utils/qrequests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])


Expand All @@ -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)
Expand All @@ -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] = {}

Expand All @@ -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,
Expand Down
Loading