aboutsummaryrefslogtreecommitdiff
path: root/discord/state.py
diff options
context:
space:
mode:
Diffstat (limited to 'discord/state.py')
-rw-r--r--discord/state.py33
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