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

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

Можно ли написать как то по-другому?
  • Вопрос задан
  • 476 просмотров
Решения вопроса 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, но так же по его упоминанию или просто по названию
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы