From 411b477a02042ebec9f1a1fe944b114611c40b1b Mon Sep 17 00:00:00 2001 From: Rapptz Date: Fri, 16 Oct 2015 07:13:24 -0400 Subject: [PATCH] Separate colour tuple into its own class. Also enumerate all the constant colours that Discord currently supports. --- discord/__init__.py | 3 +- discord/client.py | 3 +- discord/role.py | 213 ++++++++++++++++++++++++++++++++++++++++++++ discord/server.py | 51 ----------- docs/api.rst | 3 + 5 files changed, 220 insertions(+), 53 deletions(-) create mode 100644 discord/role.py diff --git a/discord/__init__.py b/discord/__init__.py index c22041ff3..bb5c2d0ad 100644 --- a/discord/__init__.py +++ b/discord/__init__.py @@ -21,10 +21,11 @@ __build__ = 0x007000 from .client import Client from .user import User from .channel import Channel, PrivateChannel -from .server import Server, Member, Permissions, Role +from .server import Server, Member from .message import Message from .errors import * from .permissions import Permissions +from .role import Role, Colour, Color from .invite import Invite from . import utils diff --git a/discord/client.py b/discord/client.py index 2a04bb288..1df0c812c 100644 --- a/discord/client.py +++ b/discord/client.py @@ -28,7 +28,8 @@ from . import endpoints from .errors import InvalidEventName, InvalidDestination, GatewayNotFound from .user import User from .channel import Channel, PrivateChannel -from .server import Server, Member, Permissions, Role +from .server import Server, Member +from .role import Role, Permissions from .message import Message from . import utils from .invite import Invite diff --git a/discord/role.py b/discord/role.py new file mode 100644 index 000000000..79a87d342 --- /dev/null +++ b/discord/role.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- + +""" +The MIT License (MIT) + +Copyright (c) 2015 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. +""" + +from .permissions import Permissions + +def create_colour_constants(cls): + cls.DEFAULT = cls(0) + cls.CYAN = cls(0x1abc9c) + cls.GREEN = cls(0x2ecc71) + cls.BLUE = cls(0x3498db) + cls.PURPLE = cls(0x9b59b6) + cls.YELLOW = cls(0xf1c40f) + cls.ORANGE = cls(0xe67e22) + cls.RED = cls(0xe74c3c) + cls.GREY = cls(0x95a5a6) + cls.DARK_GREY = cls(0x7f8c8d) + cls.NAVY_BLUE = cls(0x34495e) + cls.DARK_CYAN = cls(0x11806a) + cls.DARK_GREEN = cls(0x1f8b4c) + cls.DARK_BLUE = cls(0x206694) + cls.DARK_PURPLE = cls(0x71368a) + cls.STRONG_ORANGE = cls(0xc27c0e) + cls.DARK_ORANGE = cls(0xa84300) + cls.DARK_RED = cls(0x992d22) + cls.DARK_GREY_BLUE = cls(0x979c9f) + cls.LIGHT_GREY = cls(0xbcc0c0) + cls.DARK_NAVY_BLUE = cls(0x2c3e50) + return cls + +@create_colour_constants +class Colour(object): + """Represents a Discord role colour. This class is similar + to an (red, green, blue) tuple. + + There is an alias for this called Color. + + Supported operations: + + +-----------+--------------------------------------+ + | Operation | Description | + +===========+======================================+ + | x == y | Checks if two colours are equal. | + +-----------+--------------------------------------+ + | x != y | Checks if two colours are not equal. | + +-----------+--------------------------------------+ + + Class attributes: + + .. attribute:: DEFAULT + + A constant representing the equivalent of ``Colour(0)``. + .. attribute:: CYAN + + A constant representing the equivalent of ``Colour(0x1abc9c)``. + .. attribute:: GREEN + + A constant representing the equivalent of ``Colour(0x2ecc71)``. + .. attribute:: BLUE + + A constant representing the equivalent of ``Colour(0x3498db)``. + .. attribute:: PURPLE + + A constant representing the equivalent of ``Colour(0x9b59b6)``. + .. attribute:: YELLOW + + A constant representing the equivalent of ``Colour(0xf1c40f)``. + .. attribute:: ORANGE + + A constant representing the equivalent of ``Colour(0xe67e22)``. + .. attribute:: RED + + A constant representing the equivalent of ``Colour(0xe74c3c)``. + .. attribute:: GREY + + A constant representing the equivalent of ``Colour(0x95a5a6)``. + .. attribute:: DARK_GREY + + A constant representing the equivalent of ``Colour(0x7f8c8d)``. + .. attribute:: NAVY_BLUE + + A constant representing the equivalent of ``Colour(0x34495e)``. + .. attribute:: DARK_CYAN + + A constant representing the equivalent of ``Colour(0x11806a)``. + .. attribute:: DARK_GREEN + + A constant representing the equivalent of ``Colour(0x1f8b4c)``. + .. attribute:: DARK_BLUE + + A constant representing the equivalent of ``Colour(0x206694)``. + .. attribute:: DARK_PURPLE + + A constant representing the equivalent of ``Colour(0x71368a)``. + .. attribute:: STRONG_ORANGE + + A constant representing the equivalent of ``Colour(0xc27c0e)``. + .. attribute:: DARK_ORANGE + + A constant representing the equivalent of ``Colour(0xa84300)``. + .. attribute:: DARK_RED + + A constant representing the equivalent of ``Colour(0x992d22)``. + .. attribute:: DARK_GREY_BLUE + + A constant representing the equivalent of ``Colour(0x979c9f)``. + .. attribute:: LIGHT_GREY + + A constant representing the equivalent of ``Colour(0xbcc0c0)``. + .. attribute:: DARK_NAVY_BLUE + + A constant representing the equivalent of ``Colour(0x2c3e50)``. + + Instance attributes: + + .. attribute:: value + + The raw integer colour value. + """ + + def __init__(self, value): + self.value = value + + def _get_byte(self, byte): + return (self.value >> (8 * byte)) & 0xff + + def __eq__(self, other): + return self.value == getattr(other, 'value', None) + + def __ne__(self, other): + return isinstance(other, Colour) and self.value != other.value + + @property + def red(self): + """Returns the red component of the colour.""" + return self._get_byte(2) + + @property + def green(self): + """Returns the green component of the colour.""" + return self._get_byte(1) + + @property + def blue(self): + """Returns the blue component of the colour.""" + return self._get_byte(0) + + def to_tuple(self): + """Returns an (r, g, b) tuple representing the colour.""" + return (self.red, self.green, self.blue) + + +Color = Colour + +class Role(object): + """Represents a Discord role in a :class:`Server`. + + Instance attributes: + + .. attribute:: id + + The ID for the role. + .. attribute:: name + + The name of the role. + .. attribute:: permissions + + A :class:`Permissions` that represents the role's permissions. + .. attribute:: color + colour + + A :class:`Colour` representing the role colour. + .. attribute:: hoist + + A boolean representing if the role will be displayed separately from other members. + .. attribute:: position + + The position of the role. + """ + + def __init__(self, **kwargs): + self.update(**kwargs) + + def update(self, **kwargs): + self.id = kwargs.get('id') + self.name = kwargs.get('name') + self.permissions = Permissions(kwargs.get('permissions', 0)) + self.position = kwargs.get('position', -1) + self.colour = Colour(kwargs.get('color', 0)) + self.hoist = kwargs.get('hoist', False) + self.color = self.colour diff --git a/discord/server.py b/discord/server.py index 8ddc9f0f9..0e596d44e 100644 --- a/discord/server.py +++ b/discord/server.py @@ -25,59 +25,8 @@ DEALINGS IN THE SOFTWARE. """ from .user import User -from .permissions import Permissions from .utils import parse_time -class Role(object): - """Represents a Discord role in a :class:`Server`. - - Instance attributes: - - .. attribute:: id - - The ID for the role. - .. attribute:: name - - The name of the role. - .. attribute:: permissions - - A :class:`Permissions` that represents the role's permissions. - .. attribute:: color - colour - - A tuple of (r, g, b) associated with the role colour. - .. attribute:: hoist - - A boolean representing if the role will be displayed separately from other members. - .. attribute:: position - - The position of the role. - """ - - def __init__(self, **kwargs): - self.update(**kwargs) - - def update(self, **kwargs): - self.id = kwargs.get('id') - self.name = kwargs.get('name') - self.permissions = Permissions(kwargs.get('permissions', 0)) - self.position = kwargs.get('position', -1) - self.colour = kwargs.get('color', 0) - self.hoist = kwargs.get('hoist', False) - self._colour_to_tuple() - - def _colour_to_tuple(self): - # first we turn this into a hex string - # the reason why we're using a hex string rather than just use bitwise - # ops is because we don't want to care too much about endianness. - hex_str = format(self.colour, '06x') - red = int(hex_str[0] + hex_str[1], base=16) - green = int(hex_str[2] + hex_str[3], base=16) - blue = int(hex_str[4] + hex_str[5], base=16) - self.colour = (red, green, blue) - self.color = self.colour - - class Member(User): """Represents a Discord member to a :class:`Server`. diff --git a/docs/api.rst b/docs/api.rst index 62e41e4d2..b8d91275a 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -210,6 +210,9 @@ Some classes are just there to be data containers, this lists them. It should be .. autoclass:: Member :members: +.. autoclass:: Colour + :members: + .. autoclass:: Role :members: