@Mem1388

Как считать время (кулдаун) для команды?

Хочу сделать откат для команды, который будет хранится в общей базе данных, и при перезапуске бота продолжал считать время. Вот что написал я, но цикл для отсчёта не работает, в базу записывается время и более не обновляется.
conn = sqlite3.connect('testingBot.db')
cur = conn.cursor()

@Bot.event
async def on_ready():
    cur.execute(f"""CREATE TABLE IF NOT EXISTS users (
        id BIGINT,
        rep INT,
        rep_last_user BIGINT,
        rep_time BIGINT
    )""")
    for guild in Bot.guilds:
        for member in guild.members:
            if cur.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
                cur.execute(f"INSERT INTO users VALUES (?, ?, ?, ?)", (member.id, 0, 0, 0))
            else:
                pass
    conn.commit()
    print(f"Bot logged as -> {Bot.user}")

# Цикл для отсчёта времени, который написан некорректно.
for guild in Bot.guilds:
    for member in guild.members:
        while cur.execute(f"SELECT rep_time FROM users WHERE id = {member.id}").fetchone()[0] > 0:
            cur.execute(f"UPDATE users SET rep_time = rep_time - 5 WHERE id = {member.id}")
            conn.commit()

@Bot.command()
async def rep(ctx, member: Optional[discord.Member]):
    if cur.execute(f"SELECT rep_time FROM users WHERE id = {ctx.message.author.id}").fetchone()[0] == 0:
        if member is None:
            return
        elif member.id == ctx.message.author.id:
            emb = discord.Embed(
                description = f'{ctx.message.author.mention} Вы не можете повысить репутацию сами себе.',
                color = 0xff0000
            )
            await ctx.send(embed = emb)
        else:
            cur.execute(f"UPDATE users SET rep = rep + 1 WHERE id = {member.id}")
            conn.commit()
            emb = discord.Embed(
                description = f'{ctx.message.author.mention} Вы повысили репутацию пользователя {member.mention} \nТеперь у него **+{cur.execute(f"SELECT rep FROM users WHERE id = {member.id}").fetchone()[0]}☆** репутации. \n\nПовысить снова можно через **2 часа.**',
                color = 0x00E584
            )
            await ctx.send(embed = emb)
            cur.execute(f"UPDATE users SET rep_time = 10800 WHERE id = {ctx.message.author.id}")
            conn.commit()
    elif cur.execute(f"SELECT rep_time FROM users WHERE id = {member.id}").fetchone()[0] > 0:
        rep_cooldown = strftime('%Hh %Mm %Ss', gmtime(cur.execute(f"SELECT rep_time FROM users WHERE id = {ctx.message.author.id}").fetchone()[0]))
        emb = discord.Embed(
            description = f'{ctx.message.author.mention} Вы уже использовали очки репутации. Снова повысить репутацию вы сможете через **{rep_cooldown}.**',
            color = 0xff0000
        )
        await ctx.send(embed = emb)
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Vindicar
Неправильная архитектура.
Тебе незачем отсчитывать время постоянно - просто запомни, когда команда была отправлена данным пользователем, и при следующем запуске этой команды проверь запомненное предыдущее время отправки и сверь его с текущим. Если разница больше кулдауна, можно выполнять команду снова.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы