1
0
Fork 0
mirror of synced 2024-06-26 18:20:50 +12:00
Rare/rare/components/tabs/shop/shop_widget.py

183 lines
7.9 KiB
Python
Raw Normal View History

2021-06-04 09:23:55 +12:00
import datetime
import logging
2021-08-08 09:42:40 +12:00
from PyQt5.QtCore import Qt, pyqtSignal, QStringListModel
from PyQt5.QtNetwork import QNetworkAccessManager
2021-06-15 08:30:57 +12:00
from PyQt5.QtWidgets import QWidget, QCompleter, QGroupBox, QHBoxLayout, QScrollArea
2021-06-04 09:23:55 +12:00
2021-08-19 08:17:14 +12:00
from custom_legendary.core import LegendaryCore
from rare.components.tabs.shop.constants import search_query, wishlist_query
from rare.components.tabs.shop.game_widgets import GameWidget, GameWidgetDiscount
2021-06-04 09:23:55 +12:00
from rare.ui.components.tabs.store.store import Ui_ShopWidget
from rare.utils.extra_widgets import WaitingSpinner, FlowLayout, ButtonLineEdit
2021-08-08 09:42:40 +12:00
from rare.utils.utils import QtRequestManager, get_lang
2021-06-04 09:23:55 +12:00
logger = logging.getLogger("Shop")
2021-06-04 09:23:55 +12:00
2021-06-11 05:58:35 +12:00
# noinspection PyAttributeOutsideInit,PyBroadException
class ShopWidget(QScrollArea, Ui_ShopWidget):
2021-08-08 09:42:40 +12:00
show_info = pyqtSignal(str)
show_game = pyqtSignal(dict)
2021-06-04 09:23:55 +12:00
free_game_widgets = []
active_search_request = False
next_search = ""
2021-06-04 09:23:55 +12:00
2021-08-19 08:17:14 +12:00
def __init__(self, path, core: LegendaryCore):
2021-06-04 09:23:55 +12:00
super(ShopWidget, self).__init__()
self.setWidgetResizable(True)
2021-06-04 09:23:55 +12:00
self.setupUi(self)
2021-06-15 08:30:57 +12:00
self.path = path
2021-08-19 08:17:14 +12:00
self.core = core
2021-06-04 09:23:55 +12:00
self.manager = QNetworkAccessManager()
2021-06-11 05:58:35 +12:00
self.free_games_widget = QWidget()
self.free_games_widget.setLayout(FlowLayout())
self.free_games_now = QGroupBox(self.tr("Free Games"))
self.free_games_now.setLayout(QHBoxLayout())
self.free_games_widget.layout().addWidget(self.free_games_now)
self.coming_free_games = QGroupBox(self.tr("Free Games next week"))
self.coming_free_games.setLayout(QHBoxLayout())
self.free_games_widget.layout().addWidget(self.coming_free_games)
2021-06-04 09:23:55 +12:00
self.free_games_stack.addWidget(WaitingSpinner())
2021-06-11 05:58:35 +12:00
self.free_games_stack.addWidget(self.free_games_widget)
2021-06-04 09:23:55 +12:00
self.completer = QCompleter()
self.completer.setCaseSensitivity(Qt.CaseInsensitive)
2021-06-04 09:23:55 +12:00
self.data = []
self.search_bar = ButtonLineEdit("fa.search", placeholder_text=self.tr("Search Games"))
self.scrollAreaWidgetContents.layout().insertWidget(0, self.search_bar)
2021-08-08 09:42:40 +12:00
# self.search_bar.textChanged.connect(self.search_games)
self.search_bar.setCompleter(self.completer)
2021-08-08 09:42:40 +12:00
self.search_bar.returnPressed.connect(self.show_search_results)
self.search_bar.buttonClicked.connect(self.show_search_results)
2021-08-08 09:42:40 +12:00
self.search_request_manager = QtRequestManager("json")
self.search_request_manager.data_ready.connect(self.set_completer)
self.search_bar.textChanged.connect(self.load_completer)
2021-08-19 08:17:14 +12:00
self.wishlist_gb.setLayout(FlowLayout())
self.wishlist_gb.setVisible(False)
self.locale = get_lang()
2021-08-08 09:42:40 +12:00
def load_completer(self, text):
if text != "":
2021-08-19 08:17:14 +12:00
2021-08-08 09:42:40 +12:00
payload = {
"query": search_query,
"variables": {"category": "games/edition/base|bundles/games|editors|software/edition/base",
"count": 20,
2021-08-19 08:17:14 +12:00
"country": self.locale.upper(), "keywords": text, "locale": self.locale,
"sortDir": "DESC",
"allowCountries": self.locale.upper(),
2021-08-08 09:42:40 +12:00
"start": 0, "tag": "", "withMapping": False, "withPrice": True}
}
self.search_request_manager.post("https://www.epicgames.com/graphql", payload)
2021-06-04 09:23:55 +12:00
def load(self):
url = "https://store-site-backend-static.ak.epicgames.com/freeGamesPromotions"
2021-08-08 09:42:40 +12:00
self.free_game_request_manager = QtRequestManager("json")
self.free_game_request_manager.get(url)
2021-08-19 08:17:14 +12:00
self.free_game_request_manager.data_ready.connect(
self.add_free_games)
self.wishlist_manager = QtRequestManager("json")
self.wishlist_manager.data_ready.connect(self.add_wishlist)
wish_list_url = "https://www.epicgames.com/graphql"
self.wishlist_manager.post(wish_list_url,
payload={
"query": wishlist_query,
"variables": {
"country": self.locale.upper(),
"locale": self.locale
}
},
headers={"Authorization": self.core.egs.session.headers["Authorization"]})
def add_wishlist(self, wishlist):
wishlist = wishlist["data"]["Wishlist"]["wishlistItems"]["elements"]
discounts = 0
for game in wishlist:
if game["offer"]["price"]["totalPrice"]["discount"] > 0:
w = GameWidgetDiscount(self.path, game["offer"])
w.show_info.connect(self.show_game.emit)
self.wishlist_gb.layout().addWidget(w)
discounts += 1
if discounts != 0:
self.wishlist_gb.setVisible(True)
2021-06-04 09:23:55 +12:00
2021-08-08 09:42:40 +12:00
def add_free_games(self, free_games):
2021-08-19 08:17:14 +12:00
self.free_game_request_manager.deleteLater()
2021-06-04 09:23:55 +12:00
free_games = free_games["data"]["Catalog"]["searchStore"]["elements"]
date = datetime.datetime.now()
free_games_now = []
coming_free_games = []
for game in free_games:
if game["title"] == "Mystery Game":
coming_free_games.append(game)
continue
try:
# parse datetime
2021-06-11 05:58:35 +12:00
try:
end_date = datetime.datetime.strptime(
game["promotions"]["upcomingPromotionalOffers"][0]["promotionalOffers"][0]["endDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception:
try:
end_date = datetime.datetime.strptime(
game["promotions"]["promotionalOffers"][0]["promotionalOffers"][0]["endDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception:
continue
try:
start_date = datetime.datetime.strptime(
game["promotions"]["upcomingPromotionalOffers"][0]["promotionalOffers"][0]["startDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception:
try:
start_date = datetime.datetime.strptime(
game["promotions"]["promotionalOffers"][0]["promotionalOffers"][0]["startDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception as e:
print(e)
continue
2021-06-04 09:23:55 +12:00
except TypeError:
print("type error")
continue
if start_date < date < end_date:
free_games_now.append(game)
elif start_date > date:
coming_free_games.append(game)
for free_game in free_games_now:
w = GameWidget(self.path, free_game)
2021-06-11 05:58:35 +12:00
w.show_info.connect(self.show_game.emit)
self.free_games_now.layout().addWidget(w)
2021-06-04 09:23:55 +12:00
self.free_game_widgets.append(w)
2021-06-11 05:58:35 +12:00
self.free_games_now.layout().addStretch(1)
2021-06-04 09:23:55 +12:00
for free_game in coming_free_games:
w = GameWidget(self.path, free_game)
2021-06-04 09:23:55 +12:00
if free_game["title"] != "Mystery Game":
2021-06-11 05:58:35 +12:00
w.show_info.connect(self.show_game.emit)
self.coming_free_games.layout().addWidget(w)
2021-06-04 09:23:55 +12:00
self.free_game_widgets.append(w)
2021-06-11 05:58:35 +12:00
self.coming_free_games.layout().addStretch(1)
# self.coming_free_games.setFixedWidth(int(40 + len(coming_free_games) * 300))
self.free_games_stack.setCurrentIndex(1)
2021-08-08 09:42:40 +12:00
def set_completer(self, search_data):
search_data = search_data["data"]["Catalog"]["searchStore"]["elements"]
titles = [i.get("title") for i in search_data]
model = QStringListModel()
model.setStringList(titles)
self.completer.setModel(model)
def show_search_results(self):
self.show_info.emit(self.search_bar.text())