Add support for querying information about group calls.

This commit is contained in:
Rapptz
2016-07-15 22:46:00 -04:00
parent 33eba31aac
commit 1c8ab25917
6 changed files with 207 additions and 31 deletions

View File

@ -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