diff --git a/flask_discord/models/base.py b/flask_discord/models/base.py index 58b0e7a..b9f785b 100644 --- a/flask_discord/models/base.py +++ b/flask_discord/models/base.py @@ -1,8 +1,22 @@ from flask import current_app -from abc import ABC +from abc import ABCMeta, abstractmethod -class DiscordModelsBase(ABC): +class DiscordModelsMeta(ABCMeta): + + ROUTE = str() + + def __init__(cls, name, *args, **kwargs): + if not cls.ROUTE and name != "DiscordModelsBase": + raise NotImplementedError(f"ROUTE must be specified in a Discord model: {name}.") + super().__init__(name, *args, **kwargs) + + +class DiscordModelsBase(metaclass=DiscordModelsMeta): + + @abstractmethod + def __init__(self, payload): + self._payload = payload @staticmethod def _request(*args, **kwargs): @@ -12,6 +26,11 @@ class DiscordModelsBase(ABC): """ return current_app.discord.request(*args, **kwargs) + @classmethod + def fetch_from_api(cls): + """A class method which returns instance of this model by implicitly making an API call to Discord.""" + return cls(cls._request(cls.ROUTE)) + def to_json(self): """A utility method which returns raw payload object as it was received from discord. diff --git a/flask_discord/models/connections.py b/flask_discord/models/connections.py index f6b4b40..a8b9788 100644 --- a/flask_discord/models/connections.py +++ b/flask_discord/models/connections.py @@ -3,7 +3,7 @@ from .base import DiscordModelsBase from .user import User -class Integration(DiscordModelsBase): +class Integration(object): """"Class representing discord server integrations. Attributes @@ -49,7 +49,7 @@ class Integration(DiscordModelsBase): self.synced_at = self._payload.get("synced_at") -class UserConnection(object): +class UserConnection(DiscordModelsBase): """Class representing connections in discord account of the user. Attributes @@ -78,8 +78,10 @@ class UserConnection(object): """ + ROUTE = "/users/@me/connections" + def __init__(self, payload): - self._payload = payload + super().__init__(payload) self.id = self._payload["id"] self.name = self._payload.get("name") self.type = self._payload.get("type") diff --git a/flask_discord/models/guild.py b/flask_discord/models/guild.py index f8dc6f3..aa9c613 100644 --- a/flask_discord/models/guild.py +++ b/flask_discord/models/guild.py @@ -21,8 +21,10 @@ class Guild(DiscordModelsBase): """ + ROUTE = "/users/@me/guilds" + def __init__(self, payload): - self._payload = payload + super().__init__(payload) self.id = int(self._payload["id"]) self.name = self._payload["name"] self.icon_hash = self._payload.get("icon") diff --git a/flask_discord/models/user.py b/flask_discord/models/user.py index c09d8ba..89295b3 100644 --- a/flask_discord/models/user.py +++ b/flask_discord/models/user.py @@ -36,8 +36,10 @@ class User(DiscordModelsBase): """ + ROUTE = "/users/@me" + def __init__(self, payload): - self._payload = payload + super().__init__(payload) self.id = int(self._payload["id"]) self.username = self._payload["username"] self.discriminator = self._payload["discriminator"] @@ -99,3 +101,4 @@ class User(DiscordModelsBase): class Bot(User): """Class representing the client user itself.""" + # TODO: What is this?