Я хочу использовать возврат в командной функции, что мне делать в качестве переменной? - PullRequest
1 голос
/ 09 июля 2020

Я хочу, чтобы мой бот не отвечал сам, поэтому я попытался настроить оператор if, очевидно, он не тот ... Чем я заменяю message.author в этой ситуации?

@client.command()
async def amy(ctx):
    if message.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)

Я знаю, как это делать с событиями, я просто не уверен, что использовать под командами ...

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)

Ответы [ 4 ]

1 голос
/ 09 июля 2020

Пока я видел только ответы, в которых говорилось, что вам нужно делать. Но не почему вам нужно делать то, что вам сказали. Этот ответ даст вам стратегию и решение, поэтому вам не придется снова задавать эти вопросы. (Не то чтобы это неправильно, но вы можете легко выяснить это самостоятельно, сэкономив много времени).

Шаг 1: Найдите событие (или, в данном случае, как создать команду) в документации

Так как мы хотим понять, как мы можем составлять команды. Сначала мы исследуем, как мы можем составлять команды. Например, эта ссылка помогает вам создавать команды. Чтобы перейти по этой ссылке, введите «Как создавать команды в Discord py» и перейдите по первой ссылке из официальной документации: https://discordpy.readthedocs.io/.

Шаг 2: Посмотрите, какие параметры (объекты) вы получаете от события

Когда мы читаем документацию, вы увидите в первой части, что она использует объект context . И что вы можете использовать его через ввод из функции (переменная ctx). Теперь мы хотим исследовать, что мы можем сделать с объектом ctx / context .

Шаг 3. Понять, для чего можно использовать объекты

Как было сказано ранее, мы хотим понять, как мы можем использовать объекты. В этом случае мы фокусируемся на объекте "ctx". Страница, описывающая объект контекста, сообщает обо всем, что содержит объект ctx. Как видите, первым появляющимся параметром является объект сообщения . Что было частью того, что вы хотели. Таким образом, доступ был бы просто: ctx.message.author. Но как другие люди говорят использовать: ctx.author? Если вы прочтете контекстную страницу дальше, мы также увидим член Автор . Также указано, что это сокращение от Message.Author. Это означает, что мы также можем использовать: ctx.author, чтобы получить точно такой же результат.

Шаг 4. Интегрируйте объекты в ваш код

Теперь мы знаем, как что объект контекста есть, и что мы можем с ним делать. Но как нам это интегрировать?

Ну, сначала полезно напомнить нам о том, чего мы хотели достичь. Мы хотим, чтобы бот не отвечал сам себе. Таким образом, вы просто игнорируете сообщения, которые могут исходить от вашего бота. Нам нужно сравнить, является ли автор входящего сообщения ботом, если оно исходит от бота, нам нужно его игнорировать.

Как указано ранее в шаге 3. Мы можем использовать ctx.message.author или ctx.author, чтобы получить автора. Если это равно боту (client.user), тогда мы должны вернуться раньше.

Это приводит к выражению if, которое проверяет оба значения:

@client.command()
async def amy(ctx):
    if ctx.author == client.user:
        return
    else:
        # the rest of your code.

или

@client.command()
async def amy(ctx):
    if ctx.message.author == client.user:
        return
    else:
        # the rest of your code.

_________________________________________________________________

Рекомендую прочитать документацию. Поскольку это очень помогает. Часто ввод, который вы получаете от событий / команд, - это все, что вам нужно для выполнения работы. Также это удобно, если вы точно знаете, что вам нужно. Например, вы могли бы выполнить поиск по всем объектам, полученным от функции, и найти в них указанную c переменную и описание, в этом случае вам нужен «Автор». Это может ускорить поиск.

В любом случае полезно знать, для чего можно использовать общие объекты. Поскольку это очень помогает при написании кода для вашего бота.

1 голос
/ 09 июля 2020

Йо! Я обнаружил, что вы неправильно написали ctx и сообщение! Команда не имеет переменной сообщения!

@client.command()
async def amy(ctx):
    if message.author == client.user: # <-- RIGHT HERE
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif) 

, поэтому вам просто нужно изменить код на:

@client.command()
async def amy(ctx):
    if ctx.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)

надеюсь, что это поможет!

0 голосов
/ 09 июля 2020

Если я правильно понимаю, вы не хотите, чтобы ваша программа отвечала на команды сама по себе. В этом случае используйте ctx.author вместо message.author

Попробуйте использовать этот код:

@client.command()
async def amy(ctx):
    if ctx.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)
0 голосов
/ 09 июля 2020
@client.event
async def on_message(message):
    if message.author == client.user:
        return

вы уже делаете это правильно. оператор if должен быть поверх функции. похоже, есть еще какие-то проблемы.

...