qol + discord crash bug fix

This commit is contained in:
N0\A
2025-10-24 12:35:48 +02:00
parent 06d32c55b3
commit 5254524ee0
3 changed files with 94 additions and 45 deletions

View File

@@ -5,7 +5,9 @@ files = [
"core/headers.py", "core/headers.py",
"core/updater.py", "core/updater.py",
"core/web_search.py", "core/web_search.py",
"main.py" "main.py",
"README.md",
"requirements.txt"
] ]
codeblock = "```" codeblock = "```"

View File

@@ -1,4 +1,5 @@
import time import time
import threading
from discordrp import Presence from discordrp import Presence
class DiscordPresence: class DiscordPresence:
@@ -7,17 +8,48 @@ class DiscordPresence:
self.presence = None self.presence = None
self.running = False self.running = False
self.start_time = None self.start_time = None
self._thread = None
self._stop_thread = threading.Event()
def start(self): def start(self):
"""Start the Discord Rich Presence"""
if self.running: if self.running:
print("Presence is already running") print("Presence is already running")
return return
self.start_time = int(time.time()) self.running = True
self.presence = Presence(self.client_id) self._stop_thread.clear()
self.presence.__enter__() self._thread = threading.Thread(target=self._run_loop, daemon=True)
self._thread.start()
print("Discord presence manager started")
def _run_loop(self):
while not self._stop_thread.is_set():
try:
with Presence(self.client_id) as presence:
self.presence = presence
print("Successfully connected to Discord RPC.")
self.start_time = int(time.time())
self._set_initial_presence()
while not self._stop_thread.is_set():
time.sleep(15)
except Exception as e:
self.presence = None
print(f"Failed to connect to Discord RPC: {e}. Retrying in 30 seconds...")
for _ in range(30):
if self._stop_thread.is_set():
break
time.sleep(1)
self.presence = None
def _set_initial_presence(self):
if not self.presence:
return
try:
self.presence.set( self.presence.set(
{ {
"assets": { "assets": {
@@ -32,36 +64,33 @@ class DiscordPresence:
] ]
} }
) )
except Exception as e:
self.running = True print(f"Failed to set initial Discord presence: {e}")
print("Discord presence started")
def end(self): def end(self):
"""Stop the Discord Rich Presence"""
if not self.running: if not self.running:
print("Presence is not running") print("Presence is not running")
return return
try: print("Stopping Discord presence...")
if self.presence: self._stop_thread.set()
self.presence.__exit__(None, None, None) if self._thread and self._thread.is_alive():
self.presence = None self._thread.join(timeout=5)
except Exception as e:
print(f"Error closing presence: {e}")
finally:
self.running = False self.running = False
self.presence = None
print("Discord presence stopped") print("Discord presence stopped")
def update(self, data): def update(self, data):
"""Update the presence with new data"""
if not self.running or not self.presence: if not self.running or not self.presence:
print("Presence is not running. Call start() first.")
return return
try:
self.presence.set(data) self.presence.set(data)
except Exception as e:
print(f"Failed to update Discord presence: {e}")
def __del__(self): def __del__(self):
"""Cleanup when object is destroyed"""
if self.running: if self.running:
self.end() self.end()

24
main.py
View File

@@ -362,6 +362,7 @@ class MainWindow(QtWidgets.QMainWindow):
if not no_quit: if not no_quit:
right_menu.addAction("Quit", QtWidgets.QApplication.quit) right_menu.addAction("Quit", QtWidgets.QApplication.quit)
self.tray.setContextMenu(right_menu) self.tray.setContextMenu(right_menu)
self.tray.activated.connect(self.handle_tray_activated)
self.tray.show() self.tray.show()
# LEFT MENU # LEFT MENU
@@ -410,15 +411,26 @@ class MainWindow(QtWidgets.QMainWindow):
elif event.button() == QtCore.Qt.RightButton: #type: ignore elif event.button() == QtCore.Qt.RightButton: #type: ignore
self.tray.contextMenu().popup(event.globalPosition().toPoint()) self.tray.contextMenu().popup(event.globalPosition().toPoint())
def handle_tray_activated(self, reason):
if reason == QtWidgets.QSystemTrayIcon.ActivationReason.Trigger:
self.left_menu.popup(QtGui.QCursor.pos())
def toggle_visible(self): def toggle_visible(self):
self.setVisible(not self.isVisible()) self.setVisible(not self.isVisible())
def start_app_launcher(self): def start_app_launcher(self):
self.app_launcher_dialog = AppLauncherDialog(self) self.app_launcher_dialog = AppLauncherDialog(self)
self.app_launcher_dialog.move(QtGui.QCursor.pos())
self.app_launcher_dialog.show() self.app_launcher_dialog.show()
def start_file_search(self): def start_file_search(self):
pattern, ok = QtWidgets.QInputDialog.getText(self, "File Search", "Enter search pattern:") dialog = QtWidgets.QInputDialog(self)
dialog.setWindowTitle("File Search")
dialog.setLabelText("Enter search pattern:")
dialog.move(QtGui.QCursor.pos())
ok = dialog.exec()
pattern = dialog.textValue()
if ok and pattern: if ok and pattern:
try: try:
@@ -453,7 +465,14 @@ class MainWindow(QtWidgets.QMainWindow):
QtWidgets.QMessageBox.information(self, "No Results", "Sorry, I couldn't find anything in the root folder either.") QtWidgets.QMessageBox.information(self, "No Results", "Sorry, I couldn't find anything in the root folder either.")
def start_web_search(self): def start_web_search(self):
query, ok = QtWidgets.QInputDialog.getText(self, "Web Search", "Enter search query:") dialog = QtWidgets.QInputDialog(self)
dialog.setWindowTitle("Web Search")
dialog.setLabelText("Enter search query:")
dialog.move(QtGui.QCursor.pos())
ok = dialog.exec()
query = dialog.textValue()
if ok and query: if ok and query:
try: try:
QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) #type: ignore QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) #type: ignore
@@ -527,7 +546,6 @@ def main():
pet.show() pet.show()
# Gracefully handle shutdown
app.aboutToQuit.connect(presence.end) app.aboutToQuit.connect(presence.end)
sys.exit(app.exec()) sys.exit(app.exec())