import json import logging from PyQt5 import QtGui from PyQt5.QtCore import pyqtSignal, QUrl, QJsonParseError, QJsonDocument from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel from rare.utils.extra_widgets import ImageLabel from rare.utils.utils import get_lang logger = logging.getLogger("GameWidgets") class GameWidget(QWidget): show_info = pyqtSignal(dict) def __init__(self, path, json_info=None, width=300): super(GameWidget, self).__init__() self.manager = QNetworkAccessManager() self.width = width if json_info: self.init_ui(json_info, path) self.path = path def init_ui(self, json_info, path): self.path = path self.layout = QVBoxLayout() self.image = ImageLabel() self.layout.addWidget(self.image) self.title_label = QLabel(json_info["title"]) self.title_label.setWordWrap(True) self.layout.addWidget(self.title_label) for c in r'<>?":|\/*': json_info["title"] = json_info["title"].replace(c, "") self.json_info = json_info self.slug = json_info["productSlug"] self.title = json_info["title"] for img in json_info["keyImages"]: if img["type"] in ["DieselStoreFrontWide", "OfferImageWide", "VaultClosed"]: if img["type"] == "VaultClosed" and self.title != "Mystery Game": continue self.image.update_image(img["url"], json_info["title"], (self.width, int(self.width * 9 / 16))) break else: logger.info(", ".join([img["type"] for img in json_info["keyImages"]])) # print(json_info["keyImages"]) self.setLayout(self.layout) def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: self.show_info.emit(self.json_info) @classmethod def from_request(cls, name, path): c = cls(path) c.manager = QNetworkAccessManager() c.request = c.manager.get(QNetworkRequest()) locale = get_lang() payload = json.dumps({ "query": query, "variables": {"category": "games/edition/base|bundles/games|editors|software/edition/base", "count": 1, "country": "DE", "keywords": name, "locale": locale, "sortDir": "DESC", "allowCountries": locale.upper(), "start": 0, "tag": "", "withMapping": False, "withPrice": True} }).encode() request = QNetworkRequest(QUrl("https://www.epicgames.com/graphql")) request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") c.search_request = c.manager.post(request, payload) c.search_request.finished.connect(lambda: c.handle_response(path)) return c def handle_response(self, path): if self.search_request: if self.search_request.error() == QNetworkReply.NoError: error = QJsonParseError() json_data = QJsonDocument.fromJson(self.search_request.readAll().data(), error) if QJsonParseError.NoError == error.error: data = json.loads(json_data.toJson().data().decode())["data"]["Catalog"]["searchStore"][ "elements"][0] self.init_ui(data, path) else: logging.error(error.errorString()) return else: return else: return query = "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, " \ "$keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, " \ "$sortBy: String, $sortDir: String, $start: Int, $tag: String, $releaseDate: String, $withPrice: Boolean = " \ "false, $withPromotions: Boolean = false, $priceRange: String, $freeGame: Boolean, $onSale: Boolean, " \ "$effectiveDate: String) {\n Catalog {\n searchStore(\n allowCountries: $allowCountries\n " \ "category: $category\n count: $count\n country: $country\n keywords: $keywords\n locale: " \ "$locale\n namespace: $namespace\n itemNs: $itemNs\n sortBy: $sortBy\n sortDir: " \ "$sortDir\n releaseDate: $releaseDate\n start: $start\n tag: $tag\n priceRange: " \ "$priceRange\n freeGame: $freeGame\n onSale: $onSale\n effectiveDate: $effectiveDate\n ) {" \ "\n elements {\n title\n id\n namespace\n description\n " \ "effectiveDate\n keyImages {\n type\n url\n }\n currentPrice\n " \ "seller {\n id\n name\n }\n productSlug\n urlSlug\n url\n " \ " tags {\n id\n }\n items {\n id\n namespace\n }\n " \ "customAttributes {\n key\n value\n }\n categories {\n path\n " \ "}\n catalogNs @include(if: $withMapping) {\n mappings(pageType: \"productHome\") {\n " \ " pageSlug\n pageType\n }\n }\n offerMappings @include(if: $withMapping) " \ "{\n pageSlug\n pageType\n }\n price(country: $country) @include(if: " \ "$withPrice) {\n totalPrice {\n discountPrice\n originalPrice\n " \ "voucherDiscount\n discount\n currencyCode\n currencyInfo {\n " \ "decimals\n }\n fmtPrice(locale: $locale) {\n originalPrice\n " \ "discountPrice\n intermediatePrice\n }\n }\n lineOffers {\n " \ " appliedRules {\n id\n endDate\n discountSetting {\n " \ "discountType\n }\n }\n }\n }\n promotions(category: " \ "$category) @include(if: $withPromotions) {\n promotionalOffers {\n promotionalOffers {\n " \ " startDate\n endDate\n discountSetting {\n " \ "discountType\n discountPercentage\n }\n }\n }\n " \ "upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n " \ "endDate\n discountSetting {\n discountType\n discountPercentage\n " \ " }\n }\n }\n }\n }\n paging {\n count\n " \ "total\n }\n }\n }\n}\n "