@xzartsust
Учусь

Как отправить сообщение в чат по ID чата — discord.py rewrite?

Вот у меня есть код по которому в должно отправляться сообщения в канал который указан в сообщении:

@bot.command()
async def news(ctx,channel_id, text):
    emb= discord.Embed(title='Новость!!!',description=f'{text}', timestamp=ctx.message.created_at)
    channel= bot.get_channel(channel_id)
    await channel.send(embed=emb)

Писал по одной из ваших вопросов, но выдает ошибку:

Ignoring exception in command news:
2020-08-05T12:54:20.983670+00:00 app[worker.1]: Traceback (most recent call last):
2020-08-05T12:54:20.983698+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/discord/ext/commands/core.py", line 83, in wrapped
2020-08-05T12:54:20.983698+00:00 app[worker.1]:     ret = await coro(*args, **kwargs)
2020-08-05T12:54:20.983701+00:00 app[worker.1]:   File "Bot.py", line 248, in news
2020-08-05T12:54:20.983702+00:00 app[worker.1]:     await channel.send(embed=emb)
2020-08-05T12:54:20.983729+00:00 app[worker.1]: AttributeError: 'NoneType' object has no attribute 'send'
2020-08-05T12:54:20.983732+00:00 app[worker.1]: 
2020-08-05T12:54:20.983733+00:00 app[worker.1]: The above exception was the direct cause of the following exception:
2020-08-05T12:54:20.983733+00:00 app[worker.1]: 
2020-08-05T12:54:20.983736+00:00 app[worker.1]: Traceback (most recent call last):
2020-08-05T12:54:20.983770+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 892, in invoke
2020-08-05T12:54:20.983770+00:00 app[worker.1]:     await ctx.command.invoke(ctx)
2020-08-05T12:54:20.983771+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/discord/ext/commands/core.py", line 797, in invoke
2020-08-05T12:54:20.983771+00:00 app[worker.1]:     await injected(*ctx.args, **ctx.kwargs)
2020-08-05T12:54:20.983774+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/discord/ext/commands/core.py", line 92, in wrapped
2020-08-05T12:54:20.983775+00:00 app[worker.1]:     raise CommandInvokeError(exc) from exc
2020-08-05T12:54:20.983813+00:00 app[worker.1]: discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'NoneType' object has no attribute 'send'

А если написать:

@bot.command()
async def news(ctx,channel_id, text):
    emb= discord.Embed(title='Новость!!!',description=f'{text}', timestamp=ctx.message.created_at)
    channel= bot.get_channel(channel_id)
    await ctx.channel.send(embed=emb)

То будет отправлено в тот же канал, в котором была написана команда.

Можно ли написать как то по-другому?
  • Вопрос задан
  • 504 просмотра
Решения вопроса 1
bot.get_channel в качестве аргумента принимает ID в типе int. По умолчанию все аргументы передаваемые в команду парсером, передаются туда как str, если не указан иной тип. В вашем случае эта функция никогда не вернёт канал.

Самый адекватный метод решения в контексте discord.py: Использовать конвертеры.
@bot.command()
async def news(ctx, channel: discord.TextChannel, *, text):  # используем kwargs для отсутствия необходимости написания ковычек: https://discordpy.readthedocs.io/en/stable/ext/commands/commands.html#keyword-only-arguments
    emb= discord.Embed(title='Новость!!!',description=f'{text}', timestamp=ctx.message.created_at)
    await channel.send(embed=emb)

Это позволит получать канал в команде не только по ID, но так же по его упоминанию или просто по названию
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы