#python #recursion #async-await #discord.py #bots
Вопрос:
У моего бота Discord есть start
команда, в которой я проверяю, находится ли пользователь уже в моей базе данных, и если нет (запуск start
команды в первый раз) Я хочу добавить этого пользователя в свою базу данных.
Вот идея, которую я попробовал:
client = commands.Bot(command_prefix = '/') # define commands @client.command() async def start(ctx): await start_command(ctx) async def start_command(ctx): user_id : int = ctx.message.author.id result : int = does_user_exist(user_id) # returns 0 if no entry in database if (result == 0): print('Create user') create_user(user_id) await start_command(ctx) else: welcome_message = 'Welcome!' await ctx.send(welcome_message)
Моя идея здесь состояла в том, чтобы проверить, зарегистрирован ли пользователь уже (=запись в моей базе данных). Если да, то сообщение будет отправлено. Чтобы избежать /start
повторного запуска, я попытался использовать рекурсию.
Моя проблема в том случае, если пользователь еще не существует. Пользователь создается с create_user(user_id)
помощью , но рекурсия работает не так, как я ожидал. В этом случае мне нужно запустить /start
второй раз, прежде чем мое сообщение будет отправлено ботом.
(вот почему я знаю, что пользователь был создан, иначе /start
при повторном запуске мое сообщение не отобразилось бы
Как бы я достиг своей цели, используя рекурсию?
Ответ №1:
Не используйте рекурсию для реализации цикла, точка.
async def start_command(ctx): user_id : int = ctx.message.author.id while True: result : int = does_user_exist(user_id) if result != 0: break print('Create user') create_user(user_id) welcome_message = 'Welcome!' await ctx.send(welcome_message)
В зависимости от того, насколько это надежно create_user
, вам вообще не понадобится петля.
async def start_command(ctx): user_id : int = ctx.message.author.id result : int = does_user_exist(user_id) if result == 0: print('Create user') create_user(user_id) welcome_message = 'Welcome!' await ctx.send(welcome_message)