Я попытался закодировать систему голосования с помощью discord.py. Я хотел, чтобы бот отправил сообщение, которое пользователь отправил до того, как я уже узнал, что могу сделать это, закодировав async def voting(ctx, *text):
и поставив символ * перед текстовым аргументом, но когда я пытаюсь закодировать бота так, чтобы он отправлял текстовым аргументом ошибку:
discord.ext.commands.errors.CommandInvokeError: команда вызвала исключение: TypeError: send() принимает от 1 до 2 позиционных аргументов, но было передано 6
появляется в консоли. Я уже пробовал такие вещи, как положить его в f-строку, но это не сработает.
Вот полный код этой команды
@client.command()
async def voting(ctx, *text):
await ctx.channel.purge(limit = 1)
message = await ctx.send(*text)
cross = client.get_emoji(790243377953636372)
check = client.get_emoji(790243459050110977)
voting_cross = 0
voting_check = 0
await client.add_reaction(message, emoji = cross)
await client.add_reaction( emoji = check )
@client.event
async def on_reaction_add(reaction, user):
reaction_channel = reaction.message.channel
voting_channel = client.get_channel(voting_channel_id)
if reaction_channel == voting_channel :
if str(reaction.emoji) == "✅":
voting_check = voting_check + 1
print(f'{user} has votet with ')
if str(reaction.emoji) == "❌":
voting_cross = voting_cross + 1
print(f'{user} has votet with ')
@client.command()
async def results(ctx):
if voting_check > voting_cross :
await ctx.send(f'More people votet for :greencheckmark: ({voting_check} votes)')
else :
await ctx.send(f'More people votet for :redcross: ({voting_cross} votes)')
Этот код действительно плохой.
>>> lst = [1, 2, 3]
>>> print(lst)
[1, 2, 3]
>>> print(*lst)
1 2 3 # It's not the same, you need to join it using str.join(list)
>>> ' '.join(lst)
'1 2 3'
Также, если вы хотите передать его уже как строку, используйте это:
@client.command()
async def voting(ctx, *, text):
client.add_reaction
это уже не важно, если вы используете discord.py 1.0+
это Message.add_reaction
await message.add_reaction(whatever)
client.wait_for(event)
, вот пример@client.command()
async def voting(ctx, *text):
# add the reactions to the message here or whatever
# Here's how to wait for a reaction
def check_reaction(reaction, user):
return user == ctx.author
reaction, user = await client.wait_for('message', check=check_reaction)
# Here's how to wait for a message
def check_message(message):
return message.author == ctx.author
message = await client.wait_for('message', check=check_message)
Хорошо, большое спасибо за этот хорошо объясненный ответ :) Я новичок в кодировании Python и не очень много об этом знаю...
не беспокойтесь, не забудьте принять ответ, если он помог
Вы уверены, что
*text
не представляет более двух аргументов?