diff options
Diffstat (limited to 'discord/state.py')
| -rw-r--r-- | discord/state.py | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/discord/state.py b/discord/state.py index cf2af379..adac7f5f 100644 --- a/discord/state.py +++ b/discord/state.py @@ -33,7 +33,7 @@ from .member import Member from .role import Role from . import utils, compat from .enums import Status, ChannelType, try_enum - +from .calls import GroupCall from collections import deque, namedtuple import copy, enum, math @@ -63,6 +63,7 @@ class ConnectionState: self.user = None self.sequence = None self.session_id = None + self._calls = {} self._servers = {} self._voice_clients = {} self._private_channels = {} @@ -563,16 +564,21 @@ class ConnectionState: def parse_voice_state_update(self, data): server = self._get_server(data.get('guild_id')) - user_id = data.get('user_id') if server is not None: - if user_id == self.user.id: + channel = server.get_channel(data.get('channel_id')) + if data.get('user_id') == self.user.id: voice = self._get_voice_client(server.id) if voice is not None: - voice.channel = server.get_channel(data.get('channel_id')) + voice.channel = channel before, after = server._update_voice_state(data) if after is not None: self.dispatch('voice_state_update', before, after) + else: + # in here we're either at private or group calls + call = self._calls.get(data.get('channel_id'), None) + if call is not None: + call._update_voice_state(data) def parse_typing_start(self, data): channel = self.get_channel(data.get('channel_id')) @@ -592,6 +598,25 @@ class ConnectionState: timestamp = datetime.datetime.utcfromtimestamp(data.get('timestamp')) self.dispatch('typing', channel, member, timestamp) + def parse_call_create(self, data): + message = self._get_message(data.get('message_id')) + if message is not None: + call = GroupCall(message=message, **data) + self._calls[data['channel_id']] = call + self.dispatch('call', call) + + def parse_call_update(self, data): + call = self._calls.get(data.get('channel_id'), None) + if call is not None: + before = copy.copy(call) + call._update(**data) + self.dispatch('call_update', before, call) + + def parse_call_delete(self, data): + call = self._calls.pop(data.get('channel_id'), None) + if call is not None: + self.dispatch('call_remove', call) + def get_channel(self, id): if id is None: return None |