@Yossi_i

Как оптимизировать бота discord на python?

Помогите оптимизировать бота. Когда 2 и более пользователей нажимают на эмодзи, им выдается роль, тут все отлично работает. Но когда они с этой ролью ходят по каналам бот ломается и снимает и выдает роли с огромной задержкой. Помогите оптимизировать.
@client.event
async def on_voice_state_update(member, before, after):
    role1 = discord.utils.get(member.guild.roles, id = 804852310966140978)
    role2 = discord.utils.get(member.guild.roles, id = 804852422082035712)
    role3 = discord.utils.get(member.guild.roles, id = 804852451991617627)
    role4 = discord.utils.get(member.guild.roles, id = 804852479543738408)
    role5 = discord.utils.get(member.guild.roles, id = 804852514456338432)
    role6 = discord.utils.get(member.guild.roles, id = 804852542260510720)
    role7 = discord.utils.get(member.guild.roles, id = 804852574150197269)
    role8 = discord.utils.get(member.guild.roles, id = 804852599911481364)
    role9 = discord.utils.get(member.guild.roles, id = 804852622959444000)
    role10 = discord.utils.get(member.guild.roles, id = 804852653367885844)

    etaj1 = discord.utils.get(member.guild.roles, id = 808149325137707028)
    etaj2 = discord.utils.get(member.guild.roles, id = 808149380082696202)
    etaj3 = discord.utils.get(member.guild.roles, id = 808149405529800735)
    etaj4 = discord.utils.get(member.guild.roles, id = 808149438823530496)
    etaj5 = discord.utils.get(member.guild.roles, id = 808149470864343041)
    etaj6 = discord.utils.get(member.guild.roles, id = 808149495073341481)
    etaj7 = discord.utils.get(member.guild.roles, id = 808149517470924830)
    etaj8 = discord.utils.get(member.guild.roles, id = 808149539310534656)
    etaj9 = discord.utils.get(member.guild.roles, id = 808149561335742484)
    etaj10 = discord.utils.get(member.guild.roles, id = 808149584479780865)

    if before.channel:
        if before.channel.id == 804901448931475506 or before.channel.id == 808359523508944896:
            await member.add_roles(etaj1)
        if before.channel.id == 804901621095858236 or before.channel.id == 804832699151810561:
            await member.add_roles(etaj2)
        if before.channel.id == 804901679718858752:
            await member.add_roles(etaj3)
        if before.channel.id == 804901679718858752:
            await member.add_roles(etaj3)
        if before.channel.id == 804901764355981322:
            await member.add_roles(etaj4)
        if before.channel.id == 804901803757404172:
            await member.add_roles(etaj5)
        if before.channel.id == 804901852712927293:
            await member.add_roles(etaj6)
        if before.channel.id == 804901904559636531:
            await member.add_roles(etaj7)
        if before.channel.id == 804901958522765322 or before.channel.id == 804735066222755871 or before.channel.id == 804736218864418816:
            await member.add_roles(etaj8)
        if before.channel.id == 804902015384682556 or before.channel.id == 804736018804244530 or before.channel.id == 804826989243924552:
            await member.add_roles(etaj9)
        if before.channel.id == 804902071421763594:
            await member.add_roles(etaj10)

    if after.channel:
        await member.remove_roles(etaj1)
        await member.remove_roles(etaj2)
        await member.remove_roles(etaj3)
        await member.remove_roles(etaj4)
        await member.remove_roles(etaj5)
        await member.remove_roles(etaj6)
        await member.remove_roles(etaj7)
        await member.remove_roles(etaj8)
        await member.remove_roles(etaj9)
        await member.remove_roles(etaj10)
    
    if after.channel:
        if after.channel.id == 804901448931475506:
            await member.remove_roles(role1)
        if after.channel.id == 804901621095858236:
            await member.remove_roles(role2)
        if after.channel.id == 804901679718858752:
            await member.remove_roles(role3)
        if after.channel.id == 804901764355981322:
            await member.remove_roles(role4)
        if after.channel.id == 804901803757404172:
            await member.remove_roles(role5)
        if after.channel.id == 804901852712927293:
            await member.remove_roles(role6)
        if after.channel.id == 804901904559636531:
            await member.remove_roles(role7)
        if after.channel.id == 804901958522765322:
            await member.remove_roles(role8)
        if after.channel.id == 804902015384682556:
            await member.remove_roles(role9)
        if after.channel.id == 804902071421763594:
            await member.remove_roles(role10)
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Удаляйте сразу все роли, зачем по одной

if after.channel:
        await member.remove_roles(etaj1, etaj2, etaj3, ...)


Ну и я бы не делал сразу 20 запросов на получение всех ролей, если выполнится условие before.channel, то в нем не используется ни одна из 10 переменных, на создание которых ушло время.

Ну и неплохо было бы в конструкции if использовать elif, чтоб не проверять по сто раз условия, которые точно не выполнятся.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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