from datetime import datetime from typing import List, Optional from umongo import Document, EmbeddedDocument, fields from jarvis_core import __version__ from jarvis_core.db import JARVIS_INST from jarvis_core.db.fields import BinaryField from jarvis_core.db.utils import get_id, get_now @JARVIS_INST.register class Image(Document): discord_id: int = fields.IntegerField(unique=True) image_data: List[bytes] = BinaryField() image_ext: str = fields.StringField() created_at: datetime = fields.AwareDateTimeField(default=get_now) @JARVIS_INST.register class PermissionOverwriteBackup(EmbeddedDocument): id: int = fields.IntegerField() type: int = fields.IntegerField() allow: int = fields.IntegerField() deny: int = fields.IntegerField() @JARVIS_INST.register class WebhookBackup(EmbeddedDocument): id: int = fields.IntegerField() channel_id: int = fields.IntegerField() type: int = fields.IntegerField() avatar: Image = fields.ReferenceField(Image) name: str = fields.StringField() @JARVIS_INST.register class ChannelBackup(EmbeddedDocument): id: int = fields.IntegerField() name: str = fields.StringField() type: int = fields.IntegerField() position: int = fields.IntegerField() topic: Optional[str] = fields.StringField(default=None) nsfw: bool = fields.BooleanField(default=False) rate_limit_per_user: int = fields.IntegerField(default=None) bitrate: Optional[int] = fields.IntegerField(default=None) user_limit: Optional[int] = fields.IntegerField(default=None) permission_overwrites: List[PermissionOverwriteBackup] = fields.ListField( fields.EmbeddedField(PermissionOverwriteBackup), factory=list ) parent_id: Optional[int] = fields.IntegerField(default=None) rtc_region: Optional[str] = fields.StringField(default=None) video_quality_mode: Optional[int] = fields.IntegerField(default=None) default_auto_archive_duration: Optional[int] = fields.IntegerField(default=None) webhooks: List[WebhookBackup] = fields.ListField( fields.EmbeddedField(WebhookBackup), factory=list ) @JARVIS_INST.register class RoleBackup(EmbeddedDocument): id: int = fields.IntegerField() name: str = fields.StringField() permissions: int = fields.IntegerField() color: str = fields.StringField() hoist: bool = fields.BooleanField() mentionable: bool = fields.BooleanField() @JARVIS_INST.register class EmojiBackup(EmbeddedDocument): id: int = fields.IntegerField() name: str = fields.StringField() image: Image = fields.ReferenceField(Image) @JARVIS_INST.register class StickerBackup(EmbeddedDocument): id: int = fields.IntegerField() name: str = fields.StringField() format_type: int = fields.IntegerField() tags: str = fields.StringField() type: int = fields.IntegerField() image: Image = fields.ReferenceField(Image) @JARVIS_INST.register class GuildBackup(EmbeddedDocument): name: str = fields.StringField(required=True) description: str = fields.StringField(default=None) default_message_notifications: Optional[int] = fields.IntegerField(default=None) explicit_content_filter: Optional[int] = fields.IntegerField(default=None) afk_channel: Optional[int] = fields.IntegerField(default=None) afk_timeout: Optional[int] = fields.IntegerField(default=None) icon: Optional[Image] = fields.ReferenceField(Image, default=None) owner: int = fields.IntegerField(required=True) splash: Optional[Image] = fields.ReferenceField(Image, default=None) discovery_splash: Optional[Image] = fields.ReferenceField(Image, default=None) banner: Optional[Image] = fields.ReferenceField(Image, default=None) system_channel: Optional[int] = fields.IntegerField(default=None) system_channel_flags: Optional[int] = fields.IntegerField(default=None) rules_channel: Optional[int] = fields.IntegerField(default=None) public_updates_channel: Optional[int] = fields.IntegerField(default=None) preferred_locale: Optional[str] = fields.StringField(default=None) features: List[str] = fields.ListField(fields.StringField, factory=list) channels: List[ChannelBackup] = fields.ListField( fields.EmbeddedField(ChannelBackup), factory=list ) roles: List[RoleBackup] = fields.ListField(fields.EmbeddedField(RoleBackup), factory=list) emojis: List[EmojiBackup] = fields.ListField(fields.EmbeddedField(EmojiBackup), factory=list) stickers: List[StickerBackup] = fields.ListField( fields.EmbeddedField(StickerBackup), factory=list ) @JARVIS_INST.register class Backup(Document): created_at: datetime = fields.AwareDateTimeField(default=get_now) guild_id: int = fields.IntegerField() bkid: str = fields.StringField(default=get_id) guild: GuildBackup = fields.EmbeddedField(GuildBackup, required=True) version: str = fields.StringField(default=__version__)