Discord.py - объект 'NoneType' не имеет атрибута 'voice_state' - PullRequest
0 голосов
/ 03 мая 2020

Думал, что это будет довольно просто, но явно нет, guild, который я передаю в join_guild, является Django Модельным Объектом. В _join_guild я пытаюсь получить первый VoiceChannel для гильдии и просто подключить к ней бота. Тем не менее, получаю следующую ошибку целую вечность. Любая помощь, где я иду не так или что здесь происходит, поможет.

Ошибка:

Traceback (most recent call last):
  File ".../env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File ".../env/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File ".../env/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File ".../soundboard/sound/views.py", line 41, in play_guild_sound
    join_guild(guild)
  File ".../soundboard/sound/discord.py", line 38, in join_guild
    loop.run_until_complete(_join_guild(guild))
  File "/usr/lib/python3.8/asyncio/base_events.py", line 608, in run_until_complete
    return future.result()
  File ".../soundboard/sound/discord.py", line 32, in _join_guild
    await first_channel.connect()
  File ".../env/lib/python3.8/site-packages/discord/abc.py", line 1066, in connect
    await voice.connect(reconnect=reconnect)
  File ".../env/lib/python3.8/site-packages/discord/voice_client.py", line 219, in connect
    await self.start_handshake()
  File ".../env/lib/python3.8/site-packages/discord/voice_client.py", line 152, in start_handshake
    await ws.voice_state(guild_id, channel_id)
AttributeError: 'NoneType' object has no attribute 'voice_state'

Код:

import asyncio
from discord import Client, VoiceChannel

client = Client()

def voice_channels(channels):
    r = [channel for channel in channels if isinstance(channel, VoiceChannel)]
    r.sort(key=lambda c: (c.position, c.id))
    return r


async def _join_guild(guild):
    await client.login(token=settings.BOT_TOKEN)
    disc_guild = await client.fetch_guild(guild.guild_id)
    channels = await disc_guild.fetch_channels()
    print(f'Guild: {disc_guild}, Channels: {voice_channels(channels)}')
    first_channel = voice_channels(channels)[0]
    await first_channel.connect()
    await client.logout()


def join_guild(guild):
    loop = asyncio.new_event_loop()
    loop.run_until_complete(_join_guild(guild))
    loop.close()
...