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, }