Думал, что это будет довольно просто, но явно нет, 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()