from datetime import datetime from typing import Optional from beanie import Document, Indexed, Link from pydantic import BaseModel, Field from jarvis_core import __version__ from jarvis_core.db.utils import NanoField, NowField class Image(Document): discord_id: int = Indexed(int, unique=True) image_data: list[bytes] image_ext: str created_at: datetime = NowField() class PermissionOverwriteBackup(BaseModel): id: int type: int allow: int deny: int class WebhookBackup(BaseModel): id: int channel_id: int type: int avatar: Link[Image] name: str class ChannelBackup(BaseModel): id: int name: str type: int position: int topic: Optional[str] = None nsfw: bool = False rate_limit_per_user: Optional[int] = None bitrate: Optional[int] = None user_limit: Optional[int] = None permission_overwrites: list[PermissionOverwriteBackup] = Field(default_factory=list) parent_id: Optional[int] = None rtc_region: Optional[str] = None video_quality_mode: Optional[int] = None default_auto_archive_duration: Optional[int] = None webhooks: list[WebhookBackup] = Field(default_factory=list) class RoleBackup(BaseModel): id: int name: str permissions: int color: str hoist: bool mentionable: bool class EmojiBackup(BaseModel): id: int name: str image: Link[Image] class StickerBackup(BaseModel): id: int name: str format_type: int tags: str type: int image: Link[Image] class GuildBackup(BaseModel): name: str description: Optional[str] = None default_message_notifications: Optional[int] = None explicit_content_filter: Optional[int] = None afk_channel: Optional[int] = None afk_timeout: Optional[int] = None icon: Optional[Link[Image]] = None owner: int splash: Optional[Link[Image]] = None discovery_splash: Optional[Link[Image]] = None banner: Optional[Link[Image]] = None system_channel: Optional[int] = None system_channel_flags: Optional[int] = None rules_channel: Optional[int] = None public_updates_channel: Optional[int] = None preferred_locale: Optional[str] = None features: list[str] = Field(default_factory=list) channels: list[ChannelBackup] = Field(default_factory=list) roles: list[RoleBackup] = Field(default_factory=list) emojis: list[EmojiBackup] = Field(default_factory=list) stickers: list[StickerBackup] = Field(default_factory=list) class Backup(Document): created_at: datetime = NowField() guild_id: int bkid: str = NanoField() guild: GuildBackup version: str = Field(default=__version__)