36 lines
778 B
Python
36 lines
778 B
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
|
||
|
|
class IMessageError(Exception):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class IMessageAuthError(IMessageError):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class IMessageConnectionError(IMessageError):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class IMessageSendError(IMessageError):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class IMessageMediaError(IMessageError):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
def classify_http_error(status_code: int, body: str = "") -> IMessageError:
|
||
|
|
if status_code == 401 or status_code == 403:
|
||
|
|
return IMessageAuthError(f"HTTP {status_code}: {body}")
|
||
|
|
if status_code >= 500:
|
||
|
|
return IMessageConnectionError(f"HTTP {status_code}: {body}")
|
||
|
|
return IMessageError(f"HTTP {status_code}: {body}")
|
||
|
|
|
||
|
|
|
||
|
|
def get_retry_after_ms(error: Exception) -> int | None:
|
||
|
|
if isinstance(error, IMessageConnectionError):
|
||
|
|
return 5000
|
||
|
|
return None
|