Отправка встроенного канала с разрешением с использованием Discord.py вызывает исключения

#python #exception #permissions #discord.py #embed

Вопрос:

Прежде всего, мне жаль, если я делаю что-то не так. Это мой первый вопрос. В настоящее время я пытаюсь создать бота Discord с помощью Python.

Редактировать: Хотя ответ одного человека мне очень помог, мой вопрос остается, потому что у меня все еще есть исключение «ожидание коро», и еще одно было брошено после того, как я исправил старую ошибку. Я обновил код и исключения. Спасибо за вашу помощь!

Когда я пытаюсь отправить вложение, когда бот присоединяется к серверу, я получаю два исключения. Поскольку у меня нет 50 серверов, я заменил on_member_join(self) простым вызовом функции, когда что-то записывается в канале:

  1. Файл «…PythonPython39libsite-packagesdiscordclient.py» ждите коро(*арги, **кварги)
  2. Ошибка типа: on_message() отсутствует 1 необходимый позиционный аргумент: «ctx»
    Хотя я смотрел видео и искал в stackoverflow, я все еще не совсем понимаю ctx. Вероятно, именно по этой причине я совершаю эту ошибку. Если бы вы могли помочь мне исправить код или даже объяснить, что такое ctx (это похоже на «это» в java?), это было бы здорово!

Вот код двух функций, пытающихся отправить встраиваемое:

 import discord
from discord.utils import get
from discord.ext import commands

Bot_prefix = "<" #Later used before every command

class MyClient(discord.Client):

    async def Joining_Server(ctx, self):
        #Get channel by name:
        channel = get(ctx.guild.text_channels, name="Channel Name")

        #Get channel by ID:
        channels_Ids = get(ctx.guild.text_channels, id=discord.channel_id)

        embed = discord.Embed(title="Thanks for adding me!", description="Try")
        
        fields = [("Prefix", "My prefix is <. Just write it in front of every command!", True), 
                  ("Changing prefix", "Wanna change my prefix? Just write "<change_prefix" and the prefix you want, such as: "<change_prefix !"", True),
                  ("Commands", "For a list of the most important commands type "<help"", False),
                  ("Help", "For more help, type "<help_All" or visit:", True)]

        for channels in self.channel_Ids:
            if(commands.has_permissions(write=True)):
                channel_verified = channels.id 
        
        await ctx.channel_verified.send(embed)

    async def on_message(message, self, ctx):
        if message.author == client.user:
            return
        if message.content == "test":
            await MyClient.Joining_Server(ctx, self)
 

Спасибо, что помогли мне! Еще раз: извините, если я делаю что-то не так, это мой первый вопрос. Пожалуйста, спросите, не нужно ли вам что-нибудь. Обратная связь также была бы очень полезна.

Комментарии:

1. Почему вы создаете свой собственный экземпляр клиента, а затем используете commands.Bot его внутри? Почему вы не вводите self внутри Joining_Server команды? Разве это не должна быть простая функция вместо команды? Большая часть кода на самом деле не имеет для меня смысла

2. Извините, это мой первый настоящий проект, и, честно говоря, я иногда сам не знаю, что делаю. Спасибо за вашу помощь!

Ответ №1:

Я думаю, что вы просто хотите сравнить содержимое сообщения со "test" строкой

 if message.author == client.user:
    return
if message.content == "test":
    await MyClient.Joining_Server()
 

Комментарии:

1. Большое вам спасибо за вашу помощь!

2. Я рад помочь, пожалуйста, не забудьте принять ответ, если это помогло (отметьте галочкой в левой верхней части ответа).

3. (Надеюсь) Сделано!

4. Есть ли причина, по которой вы отвергли ответ @ExitCode1?

5. Да, я думал, может быть, люди подумают, что на этот вопрос полностью дан ответ, но это не похоже на это (я видел [закрыто] в некоторых названиях). Еще раз спасибо вам за вашу помощь!