mirror of
https://github.com/RichieCahill/dotfiles.git
synced 2026-04-17 13:08:19 -04:00
75 lines
1.6 KiB
Python
75 lines
1.6 KiB
Python
"""Models for the Signal command and control bot."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime # noqa: TC003 - pydantic needs this at runtime
|
|
from enum import StrEnum
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class TrustLevel(StrEnum):
|
|
"""Device trust level."""
|
|
|
|
VERIFIED = "verified"
|
|
UNVERIFIED = "unverified"
|
|
BLOCKED = "blocked"
|
|
|
|
|
|
class Device(BaseModel):
|
|
"""A registered device tracked by safety number."""
|
|
|
|
phone_number: str
|
|
safety_number: str
|
|
trust_level: TrustLevel = TrustLevel.UNVERIFIED
|
|
first_seen: datetime
|
|
last_seen: datetime
|
|
|
|
|
|
class SignalMessage(BaseModel):
|
|
"""An incoming Signal message."""
|
|
|
|
source: str
|
|
timestamp: int
|
|
message: str = ""
|
|
attachments: list[str] = []
|
|
group_id: str | None = None
|
|
is_receipt: bool = False
|
|
|
|
|
|
class SignalEnvelope(BaseModel):
|
|
"""Raw envelope from signal-cli-rest-api."""
|
|
|
|
envelope: dict[str, Any]
|
|
account: str | None = None
|
|
|
|
|
|
class InventoryItem(BaseModel):
|
|
"""An item in the van inventory."""
|
|
|
|
name: str
|
|
quantity: int = 1
|
|
category: str = ""
|
|
notes: str = ""
|
|
|
|
|
|
class InventoryUpdate(BaseModel):
|
|
"""Result of processing an inventory update."""
|
|
|
|
items: list[InventoryItem] = []
|
|
raw_response: str = ""
|
|
source_type: str = "" # "receipt_photo" or "text_list"
|
|
|
|
|
|
class BotConfig(BaseModel):
|
|
"""Top-level bot configuration."""
|
|
|
|
signal_api_url: str
|
|
phone_number: str
|
|
inventory_file: str = "van_inventory.json"
|
|
cmd_prefix: str = "!"
|
|
reconnect_delay: int = 5
|
|
max_reconnect_delay: int = 300
|
|
max_retries: int = 10
|