MinZeroMax
@MinZeroMax

Дайте советы по коду?

В пайтоне я не силён но хочу разобраться(до этого программы писал на си и c#) у меня есть событие on_message и оно не очень так читабельно написано. Пытался сделать через функции но что то не получилось. Может покажите как мне улучшить свой код или дайте совет где найти инфу которая поможет в этом не простом деле.

import database
import db_levels
import time
from disnake import Embed, Colour
from disnake.ext import commands

class XpController(commands.Cog):
    def __init__(self,bot: commands.Bot, guilds, xp_delay):
        self.bot = bot
        self.guilds = guilds
        self.xp_delay = xp_delay
        self.last_xp_update = {}
        
    @commands.Cog.listener()
    async def on_message(self, message):
        
        if message.author == self.bot.user:
            return
        
        user_id = message.author.id
        user_name = message.author.name
        xp_amount = 0
        current_time = time.time()
        if message.channel.id == 1233498806881095824:

            if message.attachments:
                xp_amount = 150
            else:
                xp_amount = 100

            if user_id in self.last_xp_update:
                time_since_last_update = current_time - self.last_xp_update[user_id]
                if time_since_last_update < self.xp_delay:
                    return

            self.last_xp_update[user_id] = current_time
            database.increase_xp(user_id, user_name, xp_amount)
        
            guild_id = message.guild.id
            guild = self.bot.get_guild(guild_id)
            member = guild.get_member(user_id)
        
            if db_levels.get_id_add_role(database.get_lvl(user_id, user_name)):
                id_add_role = db_levels.get_id_add_role(database.get_lvl(user_id, user_name))
                if db_levels.get_id_delete_role(database.get_lvl(user_id, user_name)):
                    id_delete_role = db_levels.get_id_delete_role(database.get_lvl(user_id, user_name))
  
            if member:
                if id_add_role:
                    add_role = guild.get_role(id_add_role)
                    if add_role:
                        await member.add_roles(add_role)
                if id_delete_role:
                    del_role = guild.get_role(id_delete_role)
                    if del_role:
                        await member.remove_roles(del_role)
  • Вопрос задан
  • 97 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Выходите из подпрограммы как можно раньше, это позволит не выполнять лишние действия и уменьшит вложенность.
@commands.Cog.listener()
async def on_message(self, message):
    
    if message.author == self.bot.user:
        return
    
    if message.channel.id != 1233498806881095824:
        return

    user_id = message.author.id
    current_time = time.time()

    if not msg_delay(user_id, self, current_time):
        await message.channel.send("Ожидайте перед следующим обновлением опыта.")
        return

    user_name = message.author.name
    xp_amount = 100
    if message.attachments:
        xp_amount = 150

    self.last_xp_update[user_id] = current_time
    database.increase_xp(user_id, user_name, xp_amount)

    guild_id = message.guild.id
    guild = self.bot.get_guild(guild_id)
    member = guild.get_member(user_id)
    if member == None:
        return

    id_add_role, id_delete_role = await get_role_ids(user_id, user_name, db_levels, database)
    await manage_roles(member, guild, id_add_role, id_delete_role)
Ответ написан
Комментировать
MinZeroMax
@MinZeroMax Автор вопроса
Не знаю хорошо ли это или плохо но я сделал вот так:

import database
import db_levels
import time
from disnake import Embed, Colour
from disnake.ext import commands

def msg_delay(user_id, self, current_time):
    if user_id in self.last_xp_update:
        time_since_last_update = current_time - self.last_xp_update[user_id]
        if time_since_last_update < self.xp_delay:
            return False
    return True

async def get_role_ids(user_id, user_name, db_levels, database):
    lvl = database.get_lvl(user_id, user_name)
    id_add_role = db_levels.get_id_add_role(lvl) if db_levels.get_id_add_role(lvl) else None
    id_delete_role = db_levels.get_id_delete_role(lvl) if db_levels.get_id_delete_role(lvl) else None
    return id_add_role, id_delete_role

async def manage_roles(member, guild, id_add_role, id_delete_role):
    if id_add_role:
        add_role = guild.get_role(id_add_role)
        if add_role:
            await member.add_roles(add_role)
    if id_delete_role:
        del_role = guild.get_role(id_delete_role)
        if del_role:
            await member.remove_roles(del_role)

                
class XpController(commands.Cog):
    def __init__(self, bot: commands.Bot, guilds, xp_delay):
        self.bot = bot
        self.guilds = guilds
        self.xp_delay = xp_delay
        self.last_xp_update = {}
        
    @commands.Cog.listener()
    async def on_message(self, message):
        
        if message.author == self.bot.user:
            return
        
        user_id = message.author.id
        user_name = message.author.name
        xp_amount = 0
        current_time = time.time()

        if message.channel.id == 1233498806881095824:
            if message.attachments:
                xp_amount = 150
            else:
                xp_amount = 100

            if not msg_delay(user_id, self, current_time):
                await message.channel.send("Ожидайте перед следующим обновлением опыта.")
                return

            self.last_xp_update[user_id] = current_time
            database.increase_xp(user_id, user_name, xp_amount)
        
            guild_id = message.guild.id
            guild = self.bot.get_guild(guild_id)
            member = guild.get_member(user_id)
        
            id_add_role, id_delete_role = await get_role_ids(user_id, user_name, db_levels, database)
  
            if member:
                await manage_roles(member, guild, id_add_role, id_delete_role)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Timurkaaa
Ну вообще советую закидывать ивенты в основной файл, а не в ког(так будет читабельнее изза меньшего количества отступов)

Также стоит добавить комментарии
Ответ написан
Ваш ответ на вопрос

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

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