diff --git a/discord/__init__.py b/discord/__init__.py index 7bf7cd483..1fd3d83c6 100644 --- a/discord/__init__.py +++ b/discord/__init__.py @@ -33,7 +33,7 @@ from .colour import Color, Colour from .invite import Invite from .object import Object from .reaction import Reaction -from . import utils, opus, compat +from . import utils, opus, compat, abc from .voice_client import VoiceClient from .enums import ChannelType, ServerRegion, Status, MessageType, VerificationLevel from collections import namedtuple diff --git a/discord/abc.py b/discord/abc.py new file mode 100644 index 000000000..2bda266e9 --- /dev/null +++ b/discord/abc.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +""" +The MIT License (MIT) + +Copyright (c) 2015-2016 Rapptz + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +import abc + +class Snowflake(metaclass=abc.ABCMeta): + __slots__ = () + + @property + @abc.abstractmethod + def created_at(self): + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, C): + if cls is Snowflake: + mro = C.__mro__ + for attr in ('created_at', 'id'): + for base in mro: + if attr in base.__dict__: + break + else: + return NotImplemented + return True + return NotImplemented + +class User(metaclass=abc.ABCMeta): + __slots__ = () + + @property + @abc.abstractmethod + def display_name(self): + raise NotImplementedError + + @property + @abc.abstractmethod + def mention(self): + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, C): + if cls is User: + if Snowflake.__subclasshook__(C) is NotImplemented: + return NotImplemented + + mro = C.__mro__ + for attr in ('display_name', 'mention', 'name', 'avatar', 'discriminator', 'bot'): + for base in mro: + if attr in base.__dict__: + break + else: + return NotImplemented + return True + return NotImplemented