#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)