From 0aa46e6def0af17973e00887b2aae116c84afb39 Mon Sep 17 00:00:00 2001 From: Khazhismel Date: Wed, 23 Dec 2015 17:38:59 -0500 Subject: [PATCH] Add game data class, replace game_id. --- discord/__init__.py | 1 + discord/client.py | 25 +++++++++-------- discord/game.py | 65 +++++++++++++++++++++++++++++++++++++++++++++ discord/member.py | 11 ++++---- discord/server.py | 5 ++-- discord/state.py | 4 ++- 6 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 discord/game.py diff --git a/discord/__init__.py b/discord/__init__.py index e54ff94fb..618d568a0 100644 --- a/discord/__init__.py +++ b/discord/__init__.py @@ -19,6 +19,7 @@ __version__ = '0.10.0-alpha' from .client import Client from .user import User +from .game import Game from .channel import Channel, PrivateChannel from .server import Server from .member import Member diff --git a/discord/client.py b/discord/client.py index 3690536ec..dc069df98 100644 --- a/discord/client.py +++ b/discord/client.py @@ -27,6 +27,7 @@ DEALINGS IN THE SOFTWARE. from . import __version__ as library_version from . import endpoints from .user import User +from .game import Game from .channel import Channel, PrivateChannel from .server import Server from .message import Message @@ -1391,15 +1392,13 @@ class Client: self._update_cache(self.email, password) @asyncio.coroutine - def change_status(self, game_id=None, idle=False): + def change_status(self, game=None, idle=False): """|coro| Changes the client's status. - The game_id parameter is a numeric ID (not a string) that represents - a game being played currently. The list of game_id to actual games changes - constantly and would thus be out of date pretty quickly. An old version of - the game_id database can be seen `here `_ to help you get started. + The game parameter is a Game object (not a string) that represents + a game being played currently. The idle parameter is a boolean parameter that indicates whether the client should go idle or not. @@ -1408,27 +1407,27 @@ class Client: Parameters ---------- - game_id : Optional[int] - The game ID being played. None if no game is being played. + game : Optional[:class:`Game`] + The game being played. None if no game is being played. idle : bool Indicates if the client should go idle. Raises ------ InvalidArgument - If the ``game_id`` parameter is convertible integer or None. + If the ``game`` parameter is not :class:`Game` or None. """ + if game is not None and not isinstance(game, Game): + raise InvalidArgument('game must be of Game or None') + idle_since = None if idle == False else int(time.time() * 1000) - try: - game_id = None if game_id is None else int(game_id) - except: - raise InvalidArgument('game_id must be convertible to an integer or None') + game = game and {'name': game.name} payload = { 'op': 3, 'd': { - 'game_id': game_id, + 'game': game, 'idle_since': idle_since } } diff --git a/discord/game.py b/discord/game.py new file mode 100644 index 000000000..266ece579 --- /dev/null +++ b/discord/game.py @@ -0,0 +1,65 @@ +# -*- 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. +""" + +class Game: + """Represents a Discord game. + + Supported Operations: + + +-----------+------------------------------------+ + | Operation | Description | + +===========+====================================+ + | x == y | Checks if two games are equal. | + +-----------+------------------------------------+ + | x != y | Checks if two games are not equal. | + +-----------+------------------------------------+ + | hash(x) | Return the games's hash. | + +-----------+------------------------------------+ + | str(x) | Returns the games's name. | + +-----------+------------------------------------+ + + Attributes + ----------- + name : str + The game's name. + """ + + __slots__ = ['name'] + + def __init__(self, **kwargs): + self.name = kwargs.get('name') + + def __str__(self): + return self.name + + def __eq__(self, other): + return isinstance(other, Game) and other.name == self.name + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return hash(self.name) diff --git a/discord/member.py b/discord/member.py index 684aab2d0..b8b047d33 100644 --- a/discord/member.py +++ b/discord/member.py @@ -25,6 +25,7 @@ DEALINGS IN THE SOFTWARE. """ from .user import User +from .game import Game from .utils import parse_time from .enums import Status @@ -58,14 +59,14 @@ class Member(User): status : :class:`Status` The member's status. There is a chance that the status will be a ``str`` if it is a value that is not recognised by the enumerator. - game_id : int - The game ID that the user is currently playing. Could be None if no game is being played. + game : :class:`Game` + The game that the user is currently playing. Could be None if no game is being played. server : :class:`Server` The server that the member belongs to. """ __slots__ = [ 'deaf', 'mute', 'self_mute', 'self_deaf', 'is_afk', - 'voice_channel', 'roles', 'joined_at', 'status', 'game_id', + 'voice_channel', 'roles', 'joined_at', 'status', 'game', 'server' ] def __init__(self, deaf, joined_at, user, roles, mute, **kwargs): @@ -75,7 +76,8 @@ class Member(User): self.joined_at = parse_time(joined_at) self.roles = roles self.status = Status.offline - self.game_id = kwargs.get('game_id', None) + game = kwargs.get('game') + self.game = game and Game(**game) self.server = kwargs.get('server', None) self.update_voice_state(mute=mute, deaf=deaf) @@ -101,4 +103,3 @@ class Member(User): # we switched channels if self.voice_channel is not None: self.voice_channel.voice_members.append(self) - diff --git a/discord/server.py b/discord/server.py index 566510e54..cb3d9237e 100644 --- a/discord/server.py +++ b/discord/server.py @@ -27,6 +27,7 @@ DEALINGS IN THE SOFTWARE. from . import utils from .role import Role from .member import Member +from .game import Game from .channel import Channel from .enums import ServerRegion, Status from .mixins import Hashable @@ -143,7 +144,8 @@ class Server(Hashable): member.status = Status(member.status) except: pass - member.game_id = presence['game_id'] + game = presence.get('game') + member.game = game and Game(**game) if 'channels' in guild: channels = guild['channels'] @@ -171,4 +173,3 @@ class Server(Hashable): if self.icon is None: return '' return 'https://cdn.discordapp.com/icons/{0.id}/{0.icon}.jpg'.format(self) - diff --git a/discord/state.py b/discord/state.py index c4c3cee62..996099595 100644 --- a/discord/state.py +++ b/discord/state.py @@ -26,6 +26,7 @@ DEALINGS IN THE SOFTWARE. from .server import Server from .user import User +from .game import Game from .message import Message from .channel import Channel, PrivateChannel from .member import Member @@ -121,7 +122,8 @@ class ConnectionState: except: pass - member.game_id = data.get('game_id') + game = data.get('game') + member.game = game and Game(**game) member.name = user.get('username', member.name) member.avatar = user.get('avatar', member.avatar)