Как проверить указанные аргументы discord py?
Я перерыл весь интернет, но не нашел нужного мне ответа. Простую проверку аргументов я знаю как делать. Но, как сделать проверку аргументов, когда их очень много и они разного типа, или указан ли id или mention пользователя? вот код
@commands.command()
async def accept(self, ctx, user: discord.Member = None, o = None, date = None, time = None):
if any(role.id in adm for role in ctx.author.roles):
ewModule.log(f"{ctx.author.nick or ctx.author.name} использовал команду: accept", 1)
if user != discord.Member: await ctx.send(f"Пользователь не найден")
else: ewModule.log(f"{ctx.author.nick or ctx.author.name} не хватило прав использовать: accept", 3)
К примеру когда 1 аргумент user не указан, надо что бы в чат писало "пользователь не найден", но заместо этого, получаю ошибку в консоль о том что пользователь не найден.
Ответы (1 шт):
Самым простым для вас и для пользователей решением, будет переход на slash-команды.
discord-py - устаревшая библиотека без поддержки таких команд и других новых фишек дискорда, поэтому нужно установить другую библиотеку, аналогичную discord-py:
pip install py-cord==2.0.0b5
В целом, вся структура классов, их свойств и методов в py-cord осталась такой же как в discord-py, поэтому ничего менять и переписывать не нужно. Поэтому к py-cord подойдет документация от discord-py, но я все же рекомендую пользоваться документацией именно от py-cord
Итак, чтобы сделать функцию не префикс-командой, а слеш-командой, заменяем декоратор @bot.command() на @bot.slash_command()
В декораторе можно сразу же указать название и описание команды:
@bot.slash_command(name='test', description='Тестовая команда для проверки аргументов')
А в качестве типа аргументов указываем параметр Option()
from discord.commands import Option
Option() принимает на вход
тип параметра
описание параметра
required: обязателен параметр или нет
default: стандартное значение параметра, если он не был указан
Последнее имеет смысл указывать только если параметр не обязателен (required=False)
В итоге команда выглядит так:
@bot.slash_command(name='test', description='Тестовая команда для проверки аргументов')
async def test(
ctx,
user: Option(discord.Member, 'Пользователь', required=True),
o: Option(str, 'Описание параметра', required=True),
date: Option(str, 'Дата', required=False, default=None),
time: Option(str, 'Время', required=False, default=None)
):
Результат:
Параметры теперь можно указывать в разном порядке и если не указать обязательные, то дискорд не пропустит команду:
Полный код:
import discord
from discord.ext import commands
from discord.commands import Option
bot = commands.Bot(command_prefix='!', intents=discord.Intents.all())
@bot.slash_command(name='test', description='Тестовая команда для проверки аргументов')
async def test(ctx, user: Option(discord.Member, 'Пользователь', required=True), o: Option(str, 'Описание параметра', required=True), date: Option(str, 'Дата', required=False, default=None), time: Option(str, 'Время', required=False, default=None)):
pass
bot.run('TOKEN')

