Задать вопрос
@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)
  • Вопрос задан
  • 291 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Удаляйте сразу все роли, зачем по одной

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


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

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

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

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