Задать вопрос
@bjfssd757

Как сократить код?

Можно ли сократить количество условий в один/несколько циклов? В таком виде код получается довольно громоздким и каким-то неудобным для чтения.
И вообще стоит ли делать такую проверку в функции on_message или будет лучше написать отдельную функцию для этого?

@client.event
async def on_message(message: discord.Message, *args):
    await client.process_commands(message)

    if message.author.bot == True:
        pass
    else:
        if len(args) >= 10:
            cursor.execute(f"UPDATE users SET xp = xp + 100 WHERE id = {message.author.id}")
            connection.commit()

            exp = cursor.execute(f"SELECT xp FROM users WHERE id = {message.author.id}").fetchone()
            lvl = cursor.execute(f"SELECT lvl FROM users WHERE id = {message.author.id}").fetchone()

            if lvl < 10:
                if exp % 10000 == 0:
                    cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
                    connection.commit()
                else:
                    pass
            elif lvl < 20 and lvl >= 10:
                if exp % 20000 == 0:
                    cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
                    connection.commit()
                else:
                    pass
            elif lvl < 100 and lvl >= 20:
                if exp % 40000 == 0:
                    cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
                    connection.commit()
                else:
                    pass
            elif lvl < 300 and lvl >= 100:
                if exp % 80000 == 0:
                    cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
                    connection.commit()
                else:
                    pass
            elif lvl < 700 and lvl >= 300:
                if exp % 160000 == 0:
                    cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
                    connection.commit()
                else:
                    pass
            elif lvl < 1000 and lvl >= 700:
                if exp % 320000 == 0:
                    cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
                    connection.commit()
                else:
                    pass
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
Wispik
@Wispik
Можно, как вариант, все условия вынести в отдельный список и по нему проходиться в цикле (в таком случае новые условия будет проще добавлять):
conditions = [
    {
        'min_lvl': 0,
        'max_lvl': 10,
        'exp': 10000
    },
    {
        'min_lvl': 10,
        'max_lvl': 20,
        'exp': 20000
    },
]

for _cond in conditions:
    if lvl < _cond['max_lvl'] and lvl >= _cond['min_lvl'] and exp % _cond['exp'] == 0:
        cursor.execute(f"UPDATE users SET lvl = lvl + 1 WHERE id = {message.author.id}")
        connection.commit()
        break
Ответ написан
@Zailox
Можно все это написать в одну строку, но это будет ещё более неудобным для чтения.

Пример:

Вместо

if a == 5:
    do_smth()
else:
    if a > 10:
        func()
    else:
       func2()


Можно

do_smth() if a == 5 else func() if a > 10 else func2()


Не очень понятно, про какие вы говорили циклы, для чего они?

Насчёт "нужно ли выводить в функцию" - если вы используете этот код только здесь - нет, если в нескольких местах - да, желательно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Такое количество запросов к БД с коммитами это кошмар.

on_message это событие которые вызывается на каждое отправленное сообщение и в нём не рекомендуется использовать никаких запросов к БД.

В событии максимум стоит накапливать информацию скажем в словаре, а по кулдауну (например раз в минуту) читать весь словарь и пачкой обновлять записи в базе одним коммитом.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы