Функция channel_conv ищет в первом слове канал, если не находит - отправляет None, которое создает при попытке отправки исключение, приводящее к отправке в текущий канал
ctx, *, text - звездочка означает, что в text будут записываться все идущее после ctx
split - разбивает строку в список
isdigit - проверят, является ли строка числом
replace - заменяет фрагмент в строке на другой данный (В данном случае канал заменяется на пустое место, чтобы в случае отправки в другой канал его не отправляло вместе с текстом)
async def say(ctx, *, text):
def channel_conv(text):
value = text.split(" ")
string = value[0]
if string.isdigit():
return (
client.get_channel(int(string)),
text.replace(string, "")
)
elif string.startswith("<#"):
return (
client.get_channel(int(string[2:20])),
text.replace(string, "")
)
else:
return (
None,
text
)
try:
channel = channel_conv(text)
await channel[0].send(channel[1])
except:
await ctx.send(text)
Так же можно использовать конвертер из оригинальной библиотеки:
from discord.ext.commands import TextChannelConverter
Код:
async def say(ctx, *, text):
v = text.split(" ")
try:
channel = await TextChannelConverter().convert(ctx = ctx, argument = v[0])
await channel.send(text.replace(v[0], ""))
except:
await ctx.send(text)