aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2017-01-08 04:31:33 -0500
committerRapptz <[email protected]>2017-01-08 04:31:33 -0500
commitaae8b783e9f0005e1cc5a51f7acad9d3d6282f30 (patch)
treeb4b8dd52601ce6968fb61b47699fe72200ae1fb6
parentFix bug that caused Guild instances to be in VoiceChannel.voice_members (diff)
downloaddiscord.py-aae8b783e9f0005e1cc5a51f7acad9d3d6282f30.tar.xz
discord.py-aae8b783e9f0005e1cc5a51f7acad9d3d6282f30.zip
VoiceChannel.voice_members is now computed when needed.
-rw-r--r--discord/channel.py18
-rw-r--r--discord/guild.py17
-rw-r--r--discord/member.py5
3 files changed, 17 insertions, 23 deletions
diff --git a/discord/channel.py b/discord/channel.py
index 998b70d1..238e235b 100644
--- a/discord/channel.py
+++ b/discord/channel.py
@@ -174,20 +174,17 @@ class VoiceChannel(discord.abc.GuildChannel, Hashable):
top channel is position 0.
bitrate: int
The channel's preferred audio bitrate in bits per second.
- voice_members
- A list of :class:`Members` that are currently inside this voice channel.
user_limit: int
The channel's limit for number of members that can be in a voice channel.
"""
- __slots__ = ( 'voice_members', 'name', 'id', 'guild', 'bitrate',
- 'user_limit', '_state', 'position', '_overwrites' )
+ __slots__ = ('name', 'id', 'guild', 'bitrate', 'user_limit',
+ '_state', 'position', '_overwrites' )
def __init__(self, *, state, guild, data):
self._state = state
self.id = int(data['id'])
self._update(guild, data)
- self.voice_members = []
def __repr__(self):
return '<VoiceChannel id={0.id} name={0.name!r} position={0.position}>'.format(self)
@@ -200,6 +197,17 @@ class VoiceChannel(discord.abc.GuildChannel, Hashable):
self.user_limit = data.get('user_limit')
self._fill_overwrites(data)
+ @property
+ def voice_members(self):
+ """Returns a list of :class:`Member` that are currently inside this voice channel."""
+ ret = []
+ for user_id, state in self.guild._voice_states.items():
+ if state.channel.id == self.id:
+ member = self.guild.get_member(user_id)
+ if member is not None:
+ ret.append(member)
+ return ret
+
@asyncio.coroutine
def edit(self, **options):
"""|coro|
diff --git a/discord/guild.py b/discord/guild.py
index 7033bff6..dba9c6b9 100644
--- a/discord/guild.py
+++ b/discord/guild.py
@@ -164,23 +164,6 @@ class Guild(Hashable):
self._voice_states[user_id] = after
member = self.get_member(user_id)
- if member is not None:
- old = before.channel
- # update the references pointed to by the voice channels
- if old is None and channel is not None:
- # we joined a channel
- channel.voice_members.append(member)
- elif old is not None:
- try:
- # we either left a channel or switched channels
- old.voice_members.remove(member)
- except ValueError:
- pass
- finally:
- # we switched channels
- if channel is not None:
- channel.voice_members.append(member)
-
return member, before, after
def _add_role(self, role):
diff --git a/discord/member.py b/discord/member.py
index 467bdbbe..5201bc41 100644
--- a/discord/member.py
+++ b/discord/member.py
@@ -50,7 +50,7 @@ class VoiceState:
Indicates if the user is currently deafened by their own accord.
is_afk: bool
Indicates if the user is currently in the AFK channel in the guild.
- channel: Optional[Union[:class:`Channel`, :class:`PrivateChannel`]]
+ channel: :class:`VoiceChannel`
The voice channel that the user is currently connected to. None if the user
is not currently in a voice channel.
"""
@@ -70,6 +70,9 @@ class VoiceState:
self.deaf = data.get('deaf', False)
self.channel = channel
+ def __repr__(self):
+ return '<VoiceState self_mute={0.self_mute} self_deaf={0.self_deaf} channel={0.channel!r}>'.format(self)
+
def flatten_user(cls):
for attr, value in User.__dict__.items():
# ignore private/special methods