from yuxi.channels.exceptions import ChannelException class BlueBubblesError(ChannelException): def __init__(self, message: str, retryable: bool = False, retry_after_ms: int = 0): super().__init__(message, retryable=retryable, retry_after_ms=retry_after_ms) class BlueBubblesHTTPError(BlueBubblesError): def __init__(self, status_code: int, message: str = "", headers: dict | None = None): self.status_code = status_code self.headers = headers or {} retryable = status_code >= 500 or status_code == 429 detail = f"HTTP {status_code}: {message}" if message else f"HTTP {status_code}" super().__init__(detail, retryable=retryable) class BlueBubblesConnectionError(BlueBubblesError): def __init__(self, message: str = ""): super().__init__(message or "BlueBubbles connection failed", retryable=True, retry_after_ms=5000) class BlueBubblesAuthenticationError(BlueBubblesError): def __init__(self, message: str = ""): super().__init__(message or "BlueBubbles authentication failed", retryable=False) class TapbackError(BlueBubblesError): def __init__(self, message: str = ""): super().__init__(message or "Tapback operation failed", retryable=False)