#python #discord #python-3.6 #discord.py-rewrite
#python #Discord #python-3.6 #discord.py
Вопрос:
Я пытаюсь добавить своего рода время восстановления для системы работоспособности моего бота. Так что, как только здоровье участника достигнет нуля, они не смогут выполнить команду до одного часа после того, как они достигнут 0. Я видел @commands.cooldown(1, 30, commands.BucketType.user)
при исследовании возможных решений, но я не думал, что это действительно сработает здесь, поскольку время восстановления не зависит от самой команды. Вот моя первая попытка добавить время перезарядки (пытался заставить его работать перед очисткой, так что извините за это)
def start_cooldown(ctx): # is called after the bot detects the user hits 0 hp or less
stopTime=str(datetime.now().time()) # gets current time
hours=stopTime[0:2]; minutes=stopTime[3:5] # separates hours from mins
if hours[0] == '0': # removes the first zero (honestly not sure if I need this)
hours[0]=''
if hours=='00': # converts 00 to 24 (midnight to 24 hours)
hours='24'
global on_cooldown
on_cooldown.update({ctx.author.id:f'{hours} {minutes}'}) # dictionary that contains members' ids and their cooldowns (if they have one)
print(f'on_cooldown={on_cooldown}')
def check_cooldown(ctx): # called at the start of the command
currentTime=str(datetime.now().time())
hours=currentTime[0:2]; minutes=currentTime[3:5]
print(hours,minutes)
if hours[0] == '0':
hours[0]=''
if hours=='00':
hours='24' # all the same as above
print(hours,minutes)
#cooldown ends at '24 50' 12:50am
#current time is '23 50' 11:50pm
while True: # tries to get the member's cooldown, if a KeyError is raised (the member has no active cooldown), then the function ends and returns nothing (the command continues to run)
try:
cooldownEnd=on_cooldown[ctx.author.id]
break
except KeyError:
return
print(f'[Line 71]nhours={hours}ncooldownEnd={cooldownEnd[0:2]}nminutes={minutes}ncooldownEnd[3:]={cooldownEnd[3:]}')
if int(hours) > int(cooldownEnd[0:2]) and int(minutes) >= int(cooldownEnd[3:]):
on_cooldown.pop(ctx.author.id) # checks if the current time is past the time the cooldown was started
if on_cooldown[ctx.author.id] in on_cooldown:
timeRemaining=int(cooldownEnd[3:]) - int(minutes)
return(f'Sorry! You're still resting, try again in {timeRemaining} minutes.')
Комментарии:
1. Ваш код для получения часов путем перехода от datetime ко времени, а затем разбора, который немного сумасшедший, потому что у datetime уже есть дружественные участники, которые дают вам часы, минуты и т.д. Напрямую: импортируйте datetime; now = datetime.datetime.now(); сейчас. час # равен 23
2. В чем ваш вопрос?
3. Идея использовать словарь, который отображает пользователей во времени, хороша, но синтаксис для обновления dict запутан. Я бы сделал просто: on_cooldown[ctx.author.id ] = сейчас . Затем проверьте хорошие функции сравнения, которые есть у объектов datetime, для длительностей вычислений и т.д.
4. @Steve Мне было интересно, есть ли у кого-нибудь идеи о том, как реализовать своего рода систему охлаждения, которая запускала бы таймер на один час, начиная с момента, когда hp участника = 0. И в течение этого часового периода это помешало бы им выполнить команду, хотя кто-то другой, возможно, предоставил исправление
5. @antont Спасибо, я на самом деле нашел другое исправление для этого при поиске чего-то другого и нашел команду, которая может получить время из количества времени до / после текущего времени