Кто-нибудь знает, как await publish () работает для бота Discord? В официальном руководстве я не нашел конкретного объявления

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

Я хочу, чтобы мой бот discord делал объявление для определенного канала на основе идентификатора канала. Но в разных руководствах я нахожу только await publish () и никаких комментариев, как это работает и для чего discord.py канал объявлений. Проблема также в том, что мне нужно вставить одну команду, отправляющую текст на канал, откуда поступает команда, и на другой канал одновременно.

Вместо последней строки должна быть команда, которая отправляет конкретное сообщение, желательно Embed на другой канал, идентификатор которого я укажу.

 @client.command( pass_context = True )
async def new_deposit( ctx, opID: str = None, stID: str = None, fname: str = None, lname: str = None, deposit: str = None):
    insert1 = (opID, stID, fname, lname, deposit)
    cur.execute("""INSERT INTO depositors( operationID, staticID, fname, lname, deposit) 
        VALUES( ?, ?, ?, ?, ?);""", insert1)
    conn.commit()
    emb = discord.Embed( title = 'Операция выполнена!')
    emb.add_field( name = 'ID операции', value = '{}'.format( opID ))
    emb.add_field( name = 'Статический ID', value = '{}'.format( stID ))
    emb.add_field( name = 'Сумма', value = '{}'.format( deposit ))
    emb.add_field( name = 'Имя', value = '{}'.format( fname ))
    emb.add_field( name = 'Фамилия', value = '{}'.format( lname ))
    await ctx.send( embed = emb)
    await ctx.publish( title = 'Операция выполнена!')
  

Отредактировано:
Хорошо, понял, каналы объявлений могут создавать только серверы с включенной функцией сообщества.
Тогда другой вопрос, как я могу сделать это без канала объявлений?

Отредактировано: я добавляю его так:

 @client.command( pass_context = True )
async def new_deposit( ctx, opID: str = None, stID: str = None, fname: str = None, lname: str = None, deposit: str = None):
    insert1 = (opID, stID, fname, lname, deposit)
    cur.execute("""INSERT INTO depositors( operationID, staticID, fname, lname, deposit) 
        VALUES( ?, ?, ?, ?, ?);""", insert1)
    conn.commit()
    emb = discord.Embed( title = 'Операция выполнена!')
    emb.add_field( name = 'ID операции', value = '{}'.format( opID ))
    emb.add_field( name = 'Статический ID', value = '{}'.format( stID ))
    emb.add_field( name = 'Сумма', value = '{}'.format( deposit ))
    emb.add_field( name = 'Имя', value = '{}'.format( fname ))
    emb.add_field( name = 'Фамилия', value = '{}'.format( lname ))
    guild = client.get_guild('*************************')
    channel = guild.get_channel('***********************')
    await ctx.send( embed = emb)
    await channel.send( title = 'Операция выполнена!')
  

И что я понимаю:
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'NoneType' object has no attribute 'get_channel'

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

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

2. Проверьте документы и эту статью Discord об этом.

Ответ №1:

Вам нужно получить объект channel и отправить, используя await channel.send('xyz') , что вам, возможно, нужен объект guild, чтобы получить канал. Приведенный ниже код должен работать.

 @client.command( pass_context = True )
async def new_deposit( ctx, opID: str = None, stID: str = None, fname: str = None, lname: str = None, deposit: str = None):
    insert1 = (opID, stID, fname, lname, deposit)
    cur.execute("""INSERT INTO depositors( operationID, staticID, fname, lname, deposit) 
        VALUES( ?, ?, ?, ?, ?);""", insert1)
    conn.commit()
    emb = discord.Embed( title = 'Операция выполнена!')
    emb.add_field( name = 'ID операции', value = '{}'.format( opID ))
    emb.add_field( name = 'Статический ID', value = '{}'.format( stID ))
    emb.add_field( name = 'Сумма', value = '{}'.format( deposit ))
    emb.add_field( name = 'Имя', value = '{}'.format( fname ))
    emb.add_field( name = 'Фамилия', value = '{}'.format( lname ))
    guild = client.get_guild('YOUR SERVER ID')
    channel = guild.get_channel('YOUR CHANNEL ID')
    await channel.send(embed = emb)