бот на библиотеке discord.py
от бота требуется переместить участника голосового канала в другой голосовой канал с именем "aab", но при попытке сделать это выпадает ошибка
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'id',
код бота:
import discord
from discord.ext import commands
client = commands.Bot(command_prefix = '~')
@client.event
async def on_ready():
await client.change_presence(status=discord.Status.online, activity=discord.Game('перемещение'))
print('Logged')
#for member in client.get_all_members():
# print(member.name, member.id, member.activities)
@client.command(pass_context=True)
async def act(ctx, member: discord.Member, channel='id=aab'):
await member.edit(voice_channel=channel, reason='none')
Ответы (2 шт):
Автор решения: Евгений
→ Ссылка
У вас есть только строковое название канала. Чтобы переместить участника, нужно получить объект этого канала. Идеологически код должен выглядеть так, однако, вероятно, будет требовать отладки.
@client.command(pass_context=True)
async def act(ctx, member: discord.Member, channel_name='aab'):
channel = discord.utils.get(ctx.message.guild.voice_channels, name=channel_name)
await member.edit(voice_channel=channel, reason='none')
Автор решения: Fixator10
→ Ссылка
- Аргумент
pass_contextв rewrite-версии discord.py не существует. Контекст всегда передаётся в функцию команды первым аргументом. member.edit(voice_channel=Optional[discord.VoiceChannel])принимает объект типаdiscord.VoiceChannel, а не строку.- Используйте конвертеры для получения подходящих объектов в аргументах команд.
@client.command()
async def act(ctx, member: discord.Member, channel: discord.VoiceChannel):
print(channel.name, type(channel))
# ~act user#0000 "Voice channel" →
# Voice channel <class 'discord.channel.VoiceChannel'>
await member.edit(voice_channel=channel)