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
46 changes: 27 additions & 19 deletions src/CheckUpdateGui.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,11 @@ def initUi(self):
row1.addWidget(QLabel(self.release.tag_name))
row1.addItem(QSpacerItem(
20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
self.dateTimeLabel.setText(QDateTime.fromString(
self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString("yyyy-MM-dd hh:mm:ss"))
self.dateTimeLabel.hide()
if self.release.assets_created_at != "":
self.dateTimeLabel.setText(QDateTime.fromString(
self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString("yyyy-MM-dd hh:mm:ss"))
self.dateTimeLabel.show()
row1.addWidget(self.dateTimeLabel)
row1.addItem(QSpacerItem(
20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
Expand All @@ -99,24 +102,29 @@ def initUi(self):
self.titleWidget.setLayout(row1)
self.titleWidget.setContentsMargins(0, 0, 0, 0)
formLayout = QFormLayout()
urlLabel = QLabel()
urlLabel.setText("<a href='" + self.release.html_url +
"'>" + QObject.tr(self, "open external links") + "</a>")
urlLabel.setOpenExternalLinks(True)
dataLayout = QVBoxLayout()
formLayout.setLabelAlignment(Qt.AlignmentFlag.AlignLeft)
formLayout.addRow(QObject.tr(self, "html_url"), urlLabel)
dataLayout = QVBoxLayout()
if self.release.html_url != "":
urlLabel = QLabel()
urlLabel.setText("<a href='" + self.release.html_url +
"'>" + QObject.tr(self, "open external links") + "</a>")
urlLabel.setOpenExternalLinks(True)
formLayout.addRow(QObject.tr(self, "html_url"), urlLabel)
formLayout.addRow(QObject.tr(self, "name"),
QLabel(self.release.assets_name))
formLayout.addRow(QObject.tr(self, "content_type"),
QLabel(self.release.assets_content_type))
formLayout.addRow(QObject.tr(self, "size"), QLabel(
str(f"{self.release.assets_size / 1000000:.2f} MB")))
formLayout.addRow(QObject.tr(self, "download_count"),
QLabel(str(self.release.assets_download_count)))
formLayout.addRow(QObject.tr(self, "created_at"),
QLabel(QDateTime.fromString(self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString(
"yyyy-MM-dd hh:mm:ss")))
if self.release.assets_content_type != "":
formLayout.addRow(QObject.tr(self, "content_type"),
QLabel(self.release.assets_content_type))
if self.release.assets_size > 0:
formLayout.addRow(QObject.tr(self, "size"), QLabel(
str(f"{self.release.assets_size / 1000000:.2f} MB")))
if self.release.assets_download_count != "":
formLayout.addRow(QObject.tr(self, "download_count"),
QLabel(str(self.release.assets_download_count)))
if self.release.assets_created_at != "":
formLayout.addRow(QObject.tr(self, "created_at"),
QLabel(QDateTime.fromString(self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString(
"yyyy-MM-dd hh:mm:ss")))
downloadUrlLabel = QLabel()
downloadUrlLabel.setText("<a href='" + self.release.assets_browser_download_url +
"'>" + QObject.tr(self, "open download links") + "</a>")
Expand Down Expand Up @@ -237,7 +245,7 @@ def __init__(self, github: GitHub, parent=None):
self.setWindowTitle(QObject.tr(self, "CheckUpdate"))
# 去掉问号
self.setWindowFlags(self.windowFlags() & ~
Qt.WindowContextHelpButtonHint)
Qt.WindowContextHelpButtonHint)
self.r_path = parent.r_path
self.github: GitHub = github
self.github.setParent(self)
Expand Down Expand Up @@ -309,7 +317,7 @@ def initConnect(self):

def changeSource(self, source: str):
self.pingThread = PingThread(
source, self.github.sourceManager.sources[source])
source, self.github.sourceManager.sources[source]['url'])
self.sourceSpeedLabel.setText("---ms")
self.pingThread.pingSignal.connect(
lambda x, y: self.sourceSpeedLabel.setText(f"{int(y)}ms"))
Expand Down
69 changes: 31 additions & 38 deletions src/githubApi.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,16 @@ def run(self) -> None:
class SourceManager(QObject):
quickSource = pyqtSignal(str, float)

def __init__(self, sources: dict, current: any = None, parent=None):
def __init__(self, sources: dict, current: str = None, parent=None):
super().__init__(parent)
if not isinstance(sources, dict):
raise TypeError
if not sources:
raise ValueError
self.sources = sources
# 第一个的key
self.currentSource = list(sources.keys())[0] if current is None else current
self.currentSource = list(sources.keys())[
0] if current is None else current
self.speedData = {}
self.threads = []

Expand All @@ -70,7 +71,7 @@ def sources(self, sources: dict):
if not sources:
raise ValueError
for key in sources:
sources[key] = sources[key].strip('/')
sources[key]['url'] = sources[key]['url'].strip('/')
self.__sources = sources
self.currentSource = list(sources.keys())[0]

Expand All @@ -81,6 +82,17 @@ def currentSource(self):
"""
return self.__currentSource

@property
def token(self) -> str:
return self.__sources[self.currentSource]['t']

@property
def tokenUrl(self) -> str:
if self.currentSource == "gitee":
return f'?access_token={self.token}'
else:
return ""

@currentSource.setter
def currentSource(self, currentSource: str):
"""
Expand All @@ -98,7 +110,7 @@ def currentSource(self, currentSource: str):

@property
def currentSourceUrl(self):
return self.sources[self.currentSource]
return self.sources[self.currentSource]['url']

def checkSourceSpeed(self):
"""
Expand All @@ -107,7 +119,7 @@ def checkSourceSpeed(self):
self.threads.clear()
self.speedData = {}
for source in self.sources:
thread = PingThread(source, self.sources[source])
thread = PingThread(source, self.sources[source]['url'])
thread.pingSignal.connect(self.__pingSignal)
self.threads.append(thread)
thread.start()
Expand All @@ -129,13 +141,13 @@ def __init__(self, dataJson: dict, versionReStr: str) -> None:
self.tag_name = dataJson['tag_name'] if re.search(
versionReStr, dataJson['tag_name']) else dataJson['name']
self.body = dataJson['body']
self.html_url = dataJson['html_url']
self.html_url = dataJson['html_url'] if 'html_url' in dataJson else ""
m_assert = dataJson['assets'][0]
self.assets_name = m_assert['name']
self.assets_content_type = m_assert['content_type']
self.assets_size = m_assert['size']
self.assets_download_count = m_assert['download_count']
self.assets_created_at = m_assert['created_at']
self.assets_content_type = m_assert['content_type'] if 'content_type' in m_assert else ""
self.assets_size = m_assert['size'] if 'size' in m_assert else 0
self.assets_download_count = m_assert['download_count'] if 'download_count' in m_assert else ""
self.assets_created_at = m_assert['created_at'] if 'created_at' in m_assert else ""
self.assets_browser_download_url = m_assert['browser_download_url']


Expand All @@ -148,20 +160,16 @@ class GitHub(QObject):
downloadReleaseAsyncFinishSignal = pyqtSignal(str)
errorSignal = pyqtSignal(str)

def __init__(self, sourceManager: SourceManager, owner: str, repo: str, version: str, versionReStr: str,
def __init__(self, sourceManager: SourceManager, version: str, versionReStr: str,
parent=None):
"""
:param sourceManager: 一个SourceManager实例,提供了多个github api的url
:param owner: github的owner
:param repo: github的仓库名
:param version: 当前的版本号
:param versionReStr: 一个正则表达式串,用于从github的release中,提取版本号
:param parent: 一个QObject实例,父对象
"""
super().__init__(parent)
self.__sourceManager = sourceManager
self.__owner = owner
self.__repo = repo
self.__version = version
self.__versionReStr = versionReStr
self.__replyDict = {}
Expand All @@ -177,22 +185,6 @@ def sourceManager(self, sourceManager: SourceManager) -> None:
self.__sourceManager = sourceManager
self.__sourceManager.setParent(self)

@property
def owner(self) -> str:
return self.__owner

@owner.setter
def owner(self, owner: str) -> None:
self.__owner = owner

@property
def repo(self) -> str:
return self.__repo

@repo.setter
def repo(self, repo: str) -> None:
self.__repo = repo

@property
def version(self) -> str:
return self.__version
Expand All @@ -214,14 +206,14 @@ def latestReleaseUrl(self) -> str:
"""
获取最新的release的url
"""
return f'{self.sourceManager.currentSourceUrl}/{self.__owner}/{self.__repo}/releases/latest'
return f'{self.sourceManager.currentSourceUrl}/releases/latest{self.sourceManager.tokenUrl}'

@property
def releasesUrl(self) -> str:
"""
获取所有release的url
"""
return f'{self.sourceManager.currentSourceUrl}/{self.__owner}/{self.__repo}/releases'
return f'{self.sourceManager.currentSourceUrl}/releases{self.sourceManager.tokenUrl}'

def isNeedUpdate(self, isAsync: bool = True) -> bool | str | None:
"""
Expand Down Expand Up @@ -354,7 +346,8 @@ def downloadRelease(self, release: ReleaseInfo) -> str:
:return: 一个当前请求的唯一标识
"""
self.downloadReleaseAsyncStartSignal.emit(release)
nam, request = self.__createRequest(release.assets_browser_download_url)
nam, request = self.__createRequest(
release.assets_browser_download_url)
reply = nam.get(request)
reply.setObjectName(str(uuid.uuid1()))
self.__replyDict[reply.objectName()] = reply
Expand Down Expand Up @@ -474,14 +467,14 @@ def removeDownloadFile(self):
"""删除下载的文件"""
GitHub.removeAllTempFile(f".*{self.__repo}.*")


if __name__ == '__main__':
app = QCoreApplication([])
data = {
"Github": "https://api.github.com/repos/",
"gitee": "https://api.gitee.com/repos/",
"Github": "https://api.github.com/repos/eee555/Metasweeper",
"gitee": "https://api.gitee.com/repos/ee55/Metasweeper",
}
github = GitHub(SourceManager(data), "eee555",
"Solvable-Minesweeper", "3.1.9", "(\d+\.\d+\.\d+)")
github = GitHub(SourceManager(data, "gitee"), "3.1.9", "(\d+\.\d+\.\d+)")
github.releasesAsyncSignal.connect(lambda x: print(x))
github.releases()
# manager = SourceManager(data)
Expand Down
78 changes: 64 additions & 14 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,44 @@
import time
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication
from PyQt5.QtNetwork import QLocalSocket,QLocalServer
import sys, os
from PyQt5.QtWidgets import QApplication, QMessageBox
from PyQt5.QtNetwork import QLocalSocket, QLocalServer
import sys
import os
import mainWindowGUI as mainWindowGUI
import mineSweeperGUI as mineSweeperGUI
import ctypes
from ctypes import wintypes
os.environ["QT_FONT_DPI"] = "96"

def on_new_connection(localServer:QLocalServer):

def on_new_connection(localServer: QLocalServer):
"""当新连接进来时,接受连接并将文件路径传递给主窗口"""
socket = localServer.nextPendingConnection()
if socket:
socket.readyRead.connect(lambda: on_ready_read(socket))


def on_ready_read(socket: QLocalSocket):
"""从socket读取文件路径并传递给主窗口"""
if socket and socket.state() == QLocalSocket.ConnectedState:
# 读取文件路径并调用打开文件
socket.waitForReadyRead(500)
file_path = socket.readAll().data().decode()
for win in QApplication.topLevelWidgets():
if isinstance(win, mainWindowGUI.MainWindow):
win.dropFileSignal.emit(file_path)
socket.disconnectFromServer() # 断开连接


def on_new_connection(localServer: QLocalServer):
"""当新连接进来时,接受连接并将文件路径传递给主窗口"""
socket = localServer.nextPendingConnection()
if socket:
socket.readyRead.connect(lambda: on_ready_read(socket))

def on_ready_read(socket:QLocalSocket):

def on_ready_read(socket: QLocalSocket):
"""从socket读取文件路径并传递给主窗口"""
if socket and socket.state() == QLocalSocket.ConnectedState:
# 读取文件路径并调用打开文件
Expand All @@ -29,21 +51,43 @@ def on_ready_read(socket:QLocalSocket):
socket.disconnectFromServer() # 断开连接


def on_new_connection(localServer: QLocalServer):
"""当新连接进来时,接受连接并将文件路径传递给主窗口"""
socket = localServer.nextPendingConnection()
if socket:
socket.readyRead.connect(lambda: on_ready_read(socket))


def on_ready_read(socket: QLocalSocket):
"""从socket读取文件路径并传递给主窗口"""
if socket and socket.state() == QLocalSocket.ConnectedState:
# 读取文件路径并调用打开文件
socket.waitForReadyRead(500)
file_path = socket.readAll().data().decode()
for win in QApplication.topLevelWidgets():
if isinstance(win, mainWindowGUI.MainWindow):
win.dropFileSignal.emit(file_path)
socket.disconnectFromServer() # 断开连接


def find_window(class_name, window_name):
"""
查找指定窗口的句柄。



Args:
class_name (str): 要查找的窗口的类名。
window_name (str): 要查找的窗口的标题。



Returns:
int: 查找到的窗口的句柄。如果未找到窗口,则抛出异常。



Raises:
ctypes.WinError: 如果未找到指定窗口,则抛出此异常。



"""
user32 = ctypes.WinDLL('user32', use_last_error=True)
user32.FindWindowW.argtypes = [wintypes.LPCWSTR, wintypes.LPCWSTR]
Expand All @@ -58,7 +102,7 @@ def find_window(class_name, window_name):
if __name__ == "__main__":
# QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
try:
app = QtWidgets.QApplication (sys.argv)
app = QtWidgets.QApplication(sys.argv)
serverName = "MineSweeperServer"
socket = QLocalSocket()
socket.connectToServer(serverName)
Expand All @@ -72,7 +116,8 @@ def find_window(class_name, window_name):
else:
localServer = QLocalServer()
localServer.listen(serverName)
localServer.newConnection.connect(lambda: on_new_connection(localServer=localServer))
localServer.newConnection.connect(
lambda: on_new_connection(localServer=localServer))
mainWindow = mainWindowGUI.MainWindow()
ui = mineSweeperGUI.MineSweeperGUI(mainWindow, sys.argv)
ui.mainWindow.show()
Expand All @@ -82,8 +127,14 @@ def find_window(class_name, window_name):
hwnd = find_window(None, _translate("MainWindow", "元扫雷"))

SetWindowDisplayAffinity = ctypes.windll.user32.SetWindowDisplayAffinity
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(hwnd, 0x00000011) else 1/0
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(hwnd, 0x00000000) else 1/0
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(
hwnd, 0x00000011) else 1/0
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(
hwnd, 0x00000000) else 1/0
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(
hwnd, 0x00000011) else 1/0
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(
hwnd, 0x00000000) else 1/0

sys.exit(app.exec_())
...
Expand Down Expand Up @@ -157,4 +208,3 @@ def find_window(class_name, window_name):
# MouseState::ChordingNotFlag => Ok(6),
# MouseState::DownUpAfterChording => Ok(7),
# MouseState::Undefined => Ok(8),

Loading