mirror of
https://github.com/status-im/status-python-sdk.git
synced 2026-08-30 13:41:10 +00:00
100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Self, Optional
|
|
import datetime
|
|
|
|
@dataclass
|
|
class ContactRequest:
|
|
public_key: str
|
|
incoming: bool = False
|
|
accepted: bool = False
|
|
|
|
def __post_init__(self):
|
|
if not (self.incoming or self.accepted):
|
|
raise ValueError("A ContactRequest must be `incoming` or `accepted`")
|
|
|
|
@dataclass
|
|
class PaymentRequest:
|
|
to_address: str
|
|
token_symbol: str
|
|
token_address: str
|
|
chain_id: int
|
|
amount: str
|
|
|
|
@classmethod
|
|
def from_raw(cls, raw: dict) -> Self:
|
|
chain_id, token_address = raw["tokenKey"].split("-")
|
|
params = {
|
|
"to_address": raw["receiver"],
|
|
"token_symbol": raw["symbol"],
|
|
"token_address": token_address,
|
|
"chain_id": int(chain_id),
|
|
"amount": raw["amount"]
|
|
}
|
|
return cls(**params)
|
|
|
|
@dataclass
|
|
class Message:
|
|
id: str
|
|
chat_id: str
|
|
content: str
|
|
content_type: str
|
|
from_public_key: str
|
|
timestamp: datetime.datetime
|
|
chat_type: str
|
|
reply_id: Optional[str] = None
|
|
payment_requests: list[PaymentRequest] = field(default_factory=list)
|
|
|
|
@classmethod
|
|
def from_raw(cls, raw: dict) -> Self:
|
|
content_type: int = raw["contentType"]
|
|
msg_type: int = raw["messageType"]
|
|
params = {
|
|
"id": raw["id"],
|
|
"chat_id": raw["chatId"],
|
|
"from_public_key": raw["from"],
|
|
"timestamp": datetime.datetime.fromtimestamp(raw["whisperTimestamp"] / 1_000)
|
|
}
|
|
|
|
if len(raw["responseTo"]) > 0:
|
|
params["reply_id"] = raw["responseTo"]
|
|
|
|
if msg_type == 5:
|
|
params["chat_type"] = "community"
|
|
|
|
elif msg_type == 1:
|
|
params["chat_type"] = "private"
|
|
|
|
elif msg_type in [2, 3]:
|
|
params["chat_type"] = "group"
|
|
|
|
# Text & Emojis
|
|
if content_type in [1, 4]:
|
|
params["content"] = raw["text"]
|
|
params["content_type"] = "text" if content_type == 1 else "image"
|
|
# Sticker
|
|
elif content_type == 2:
|
|
params["content"] = raw["sticker"]["url"]
|
|
params["content_type"] = "sticker"
|
|
# Image
|
|
elif content_type == 7:
|
|
img_path = raw["image"]
|
|
text = raw["text"]
|
|
caption = f"{text}\n\n" if len(text) > 0 else ""
|
|
params["content"] = f"{caption}{img_path}"
|
|
params["content_type"] = "image"
|
|
|
|
payments = raw.get("paymentRequests", [])
|
|
if payments:
|
|
params["payment_requests"] = [
|
|
PaymentRequest.from_raw(payment)
|
|
for payment in payments
|
|
]
|
|
return cls(**params)
|
|
|
|
|
|
@dataclass
|
|
class CommunityRequest:
|
|
id: str
|
|
state: str
|
|
public_key: str
|