hydraveil-gui/gui/v2/infrastructure/setup_observers.py
2026-07-09 18:26:26 -04:00

97 lines
4.2 KiB
Python
Executable file

from core.observers.ApplicationVersionObserver import ApplicationVersionObserver
from core.observers.ClientObserver import ClientObserver
from core.observers.ConnectionObserver import ConnectionObserver
from core.observers.InvoiceObserver import InvoiceObserver
from core.observers.ProfileObserver import ProfileObserver
from core.observers.TicketObserver import TicketObserver
from core.controllers.ApplicationController import ApplicationController
from PyQt6.QtCore import QObject, pyqtSignal
class StatusRelay(QObject):
status_requested = pyqtSignal(object, bool)
def __init__(self, update_status):
super().__init__()
self.update_status = update_status
self.status_requested.connect(self.apply_status)
def post(self, text, clear=False):
self.status_requested.emit(text, clear)
def apply_status(self, text, clear=False):
self.update_status(text, clear=clear)
application_version_observer = ApplicationVersionObserver()
client_observer = ClientObserver()
connection_observer = ConnectionObserver()
invoice_observer = InvoiceObserver()
profile_observer = ProfileObserver()
ticket_observer = TicketObserver()
def observer_message(topic, event):
subject = getattr(event, 'subject', None)
meta = getattr(event, 'meta', None)
if subject is not None:
return str(subject)
if meta:
return str(meta)
return str(topic)
def subscribe_observer_messages(observer, post_status):
for attr in dir(observer):
if not attr.startswith('on_'):
continue
callbacks = getattr(observer, attr, None)
if not isinstance(callbacks, list):
continue
topic = attr[3:]
observer.subscribe(
topic,
lambda event, topic=topic: post_status(observer_message(topic, event)))
def setup_observers(update_status):
relay = StatusRelay(update_status)
post_status = relay.post
profile_observer.subscribe(
'created', lambda event: post_status('Profile Created'))
profile_observer.subscribe(
'destroyed', lambda event: post_status('Profile destroyed'))
subscribe_observer_messages(client_observer, post_status)
application_version_observer.subscribe('downloading', lambda event: post_status(
f'Downloading {ApplicationController.get(event.subject.application_code).name}'))
application_version_observer.subscribe('download_progressing', lambda event: post_status(
f'Downloading {ApplicationController.get(event.subject.application_code).name} {event.meta.get('progress'):.2f}%'))
application_version_observer.subscribe('downloaded', lambda event: post_status(
f'Downloaded {ApplicationController.get(event.subject.application_code).name}'))
subscribe_observer_messages(connection_observer, post_status)
ticket_observer.subscribe('connecting', lambda event: post_status('Connecting to ticket server...'))
ticket_observer.subscribe('sync_done', lambda event: post_status('Ticket prices synced.'))
ticket_observer.subscribe('waiting', lambda event: post_status('Waiting for payment...'))
ticket_observer.subscribe('paid', lambda event: post_status('Payment received.'))
ticket_observer.subscribe('ticket_ready', lambda event: post_status('Ticket ready.'))
ticket_observer.subscribe('used', lambda event: post_status('Ticket used.'))
ticket_observer.subscribe('connection_error', lambda event: post_status('Ticket server connection error.'))
ticket_observer.subscribe('failed_output', lambda event: post_status(f'{event.subject if event.subject else ""}'))
ticket_observer.subscribe('failed_input', lambda event: post_status(f'{event.subject if event.subject else ""}'))
ticket_observer.subscribe('unknown_error', lambda event: post_status('Unknown ticket error.'))
ticket_observer.subscribe('error', lambda event: post_status(f'Ticket error: {event.subject if event.subject else ""}'))
return {
'status_relay': relay,
'application_version_observer': application_version_observer,
'client_observer': client_observer,
'connection_observer': connection_observer,
'invoice_observer': invoice_observer,
'profile_observer': profile_observer,
'ticket_observer': ticket_observer,
}