1
0
Fork 0
mirror of synced 2024-06-29 19:51:02 +12:00
Rare/rare/utils/qt_requests.py

110 lines
4 KiB
Python
Raw Normal View History

2021-08-23 08:22:17 +12:00
import json
from dataclasses import dataclass
from logging import getLogger
from typing import Callable
from typing import Union
2021-08-23 08:22:17 +12:00
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, QJsonParseError, QJsonDocument
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
logger = getLogger("QtRequests")
class QtRequestManager(QObject):
data_ready = pyqtSignal(object)
request = None
request_active = None
def __init__(self, type: str = "json", authorization_token: str = None):
super(QtRequestManager, self).__init__()
self.manager = QNetworkAccessManager()
self.type = type
self.authorization_token = authorization_token
self.request_queue = []
def post(self, url: str, payload: dict, handle_func):
if not self.request_active:
request = QNetworkRequest(QUrl(url))
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
self.request_active = RequestQueueItem(handle_func=handle_func)
payload = json.dumps(payload).encode("utf-8")
2021-12-24 22:09:50 +13:00
request.setHeader(
QNetworkRequest.UserAgentHeader,
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
)
2021-08-23 08:22:17 +12:00
if self.authorization_token is not None:
2021-12-24 22:09:50 +13:00
request.setRawHeader(
b"Authorization", self.authorization_token.encode()
)
2021-08-23 08:22:17 +12:00
self.request = self.manager.post(request, payload)
self.request.finished.connect(self.prepare_data)
else:
self.request_queue.append(
2021-12-24 22:09:50 +13:00
RequestQueueItem(
method="post", url=url, payload=payload, handle_func=handle_func
)
)
2021-08-23 08:22:17 +12:00
def get(self, url: str, handle_func: Callable[[Union[dict, bytes]], None]):
2021-08-23 08:22:17 +12:00
if not self.request_active:
request = QNetworkRequest(QUrl(url))
2021-12-24 22:09:50 +13:00
request.setHeader(
QNetworkRequest.UserAgentHeader,
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
)
2021-08-23 08:22:17 +12:00
self.request_active = RequestQueueItem(handle_func=handle_func)
self.request = self.manager.get(request)
self.request.finished.connect(self.prepare_data)
else:
2021-12-24 22:09:50 +13:00
self.request_queue.append(
RequestQueueItem(method="get", url=url, handle_func=handle_func)
)
2021-08-23 08:22:17 +12:00
def prepare_data(self):
# self.request_active = False
data = {} if self.type == "json" else b""
if self.request:
try:
if self.request.error() == QNetworkReply.NoError:
if self.type == "json":
error = QJsonParseError()
2021-12-24 22:09:50 +13:00
json_data = QJsonDocument.fromJson(
self.request.readAll().data(), error
)
2021-08-23 08:22:17 +12:00
if QJsonParseError.NoError == error.error:
data = json.loads(json_data.toJson().data().decode())
else:
logger.error(error.errorString())
else:
data = self.request.readAll().data()
except RuntimeError as e:
logger.error(str(e))
self.request_active.handle_func(data)
self.request.deleteLater()
self.request_active = None
if self.request_queue:
if self.request_queue[0].method == "post":
2021-12-24 22:09:50 +13:00
self.post(
self.request_queue[0].url,
self.request_queue[0].payload,
self.request_queue[0].handle_func,
)
2021-08-23 08:22:17 +12:00
else:
self.get(self.request_queue[0].url, self.request_queue[0].handle_func)
self.request_queue.pop(0)
@dataclass
class RequestQueueItem:
method: str = None
url: str = None
handle_func: Callable[[Union[dict, bytes]], None] = None
2021-08-23 08:22:17 +12:00
payload: dict = None