• Как сделать кулдаун на команду discord.py?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    В коде не разбирался, быстро глянул, но по-моему вы очень его перегрузили. Если вы хотите делать проверку руками, то не знаю зачем ждать через sleep и тд.

    Вызывается ваша команда work, происходит выдача человеку денег. Записывается таймстамп выдачи в в ваш json файл. Тут уже от нужды зависит, можете записывать только время последней выдачи, можно время последней выдачи + время, когда в следующий раз нужно будет выдать и тд. Допустим, для примера будет только одно поле - время последнего выполнения команды в виде таймстампа. Далее вы просто берете время последнего выполнения и складываете его с вашей задержкой для команды (в секундах, естественно), и если получившееся число меньше текущего таймстампа - выполняете команду.

    def work():
        with open('users.json', 'r', encoding='utf-8') as f:
            users = json.load(f)
    
        if ctx.author.id not in users:
            users[ctx.author.id] = {'last_work_time': 0}
    
        current_timestamp = int(time.time())
        work_cooldown = 60*60 # допустим задержка 1 час
    
        last_work_time = users[ctx.author.id]['last_work_time']
    
        if last_work_time + work_cooldown <= current_timestamp or last_work_time == 0:
            send_message('Ваша оплата: xxx')
            users[ctx.author.id]['last_work_time'] = current_timestamp
    
            with open('users.json', 'w', encoding='utf-8') as f:
                json.dump(users, f)
    Ответ написан
    Комментировать
  • Как сделать leaderboard с бд json discord.py?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    d = {"676744847844897979": 0, "5465756846894984": 10}
    print(sorted(d.items(), key=lambda item: item[1], reverse=True)[:10])
    Ответ написан
    Комментировать
  • Как вывести определённое время discord.py?

    SoreMix
    @SoreMix
    yellow
    Есть специальный декоратор, который вешает кулдаун на команду

    @commands.cooldown(1, 30, commands.BucketType.user)

    1 - кол-во использований команды
    30 - время в секундах, через сколько можно использовать команду еще раз
    commands.BucketType.user - ограничение для пользователя

    Советую прочитать описание декоратора, чтобы понимать:
    https://github.com/Rapptz/discord.py/blob/async/di...

    Когда кулдаун тригерится, он вызывает on_command_error

    Дальше уже в этой функции делаете что вам нужно. Пример для КД 14 дней:
    @commands.cooldown(1, 14*24*60*60, commands.BucketType.user)
    @bot.command()
    async def work(ctx):
        await ctx.send('hello')
    
    @bot.event
    async def on_command_error(ctx, error):
        if isinstance(error, commands.CommandOnCooldown):
            retry_after = str(datetime.timedelta(seconds=error.retry_after)).split('.')[0]
            await ctx.send(f'**Вы устали! Приходите через {retry_after}**')


    Форматирование вроде 20:30:14 PM или 00d 00h 00m 00s уже сами сделаете с помощью strftime
    Ответ написан
    1 комментарий