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

170 lines
7 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
2021-08-23 08:22:17 +12:00
from rare.components.tabs.shop import ShopApiCore
from rare.components.tabs.shop.constants import search_query
2021-08-19 08:17:14 +12:00
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-23 08:22:17 +12:00
from rare.utils.utils import 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-08-23 08:22:17 +12:00
wishlist: list = []
2021-06-04 09:23:55 +12:00
2021-08-23 08:22:17 +12:00
def __init__(self, path, core: LegendaryCore, shop_api: ShopApiCore):
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-08-23 08:22:17 +12:00
self.shop_api = shop_api
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-23 08:22:17 +12:00
# 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):
2021-08-23 08:22:17 +12:00
# load free games
self.shop_api.get_free_games(self.add_free_games)
# load wishlist
self.shop_api.get_wishlist(self.add_wishlist_items)
def update_wishlist(self):
self.shop_api.get_wishlist(self.add_wishlist_items)
def add_wishlist_items(self, wishlist):
QWidget().setLayout(self.wishlist_gb.layout())
self.wishlist_gb.setLayout(FlowLayout())
2021-08-19 08:17:14 +12:00
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
2021-08-23 08:22:17 +12:00
self.wishlist_gb.setVisible(discounts > 0)
2021-06-04 09:23:55 +12:00
2021-08-08 09:42:40 +12:00
def add_free_games(self, free_games):
2021-06-04 09:23:55 +12:00
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())