@LxneSamurai

Discord.Py equip/unequip, как правильно написать?

Почти написал всю lvl-system вместе с валютой и магазином, но застрял на таких командах, как equip/unequip (надеть/снять роль из инвентаря). В чём суть проблемы: изначально пытался делать через SelectMenu (дабы всё красивенько было, так сказать), но после понял, что фишка "автодобавления" работает лишь с embed fields (когда появляется новая строчка в Базе Данных, то в Эмбеде "добавляется" новый Field с данными), поэтому решил делать функцию через команду, но так выходит, что для её корректной работы необходимо будет указывать уникальный ID той или иной роли (проще говоря, ID роли - её порядковый номер в инвентаре пользователя), так как через "пинг" неудобно + отключена возможность такая для обычных юзеров.

Пытался сделать порядковый ID через counter, но постоянно выдавало единицу на всех ролях.
Вот сам код вместе с БД магазина и инвентаря:
spoiler
cursor.execute("""CREATE TABLE IF NOT EXISTS shop(
            
            role_id INT,  #Айди роли
            id INT, #Айди сервера
            cost BIGINT #Стоимость
            )""")

    cursor.execute("""CREATE TABLE IF NOT EXISTS inv(
        
            id INT,  #Айди пользователя
            roles INT, #Купленные роли из магазина
            idx INT #Порядковый ID
                
        )""")

#Команда магазина
@bot.command()
        async def shop(ctx):
                role1=discord.utils.get(ctx.guild.roles, id=966041637618847794)
                role2=discord.utils.get(ctx.guild.roles, id=966046291740217384)
                emb=discord.Embed(title="Магазин ролей",colour=discord.Color.from_rgb(255, 255, 255))
                counter=0
                if ctx.channel.id==955186277270048808:
                        for row in cursor.execute("SELECT role_id, cost FROM shop WHERE id = {}".format(ctx.guild.id)):
                                if ctx.guild.get_role(row[0]) != None:
                                        counter+=1
                                        emb.add_field(
                                                name=f"{counter}. Стоимость - {row[1]} <:servvalute:967795640425930822>",
                                                value=f"Роль {ctx.guild.get_role(row[0]).mention}",
                                                inline=False
                                        )
                                else:
                                        pass

                        await ctx.send(embed=emb, components=[
                        Select( #Под магазином имеется SelectMenu, через который и производится покупка той или иной роли.
                                placeholder="Выберите роль.",
                                options=[
                                SelectOption(label=f"{role1}", value="rle1"),
                                SelectOption(label=f"{role2}", value="rle2")
                                ],
                                min_values=1,
                                max_values=1
                        )
                        ])
                        interaction=await bot.wait_for("select_option")
                        idx:int=None
                        if interaction.values[0] == "rle1": #Покупка роли1
                                rle=cursor.execute("SELECT roles FROM inv WHERE id = {} and roles = {}".format(ctx.author.id, role1.id)).fetchone()
                                if cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role1.id)
                                        ).fetchone()[0] > cursor.execute("SELECT cash FROM users WHERE id = {}".format(interaction.author.id)
                                        ).fetchone()[0]:
                                        await interaction.send(embed=discord.Embed(title="<:nonn:965626108387164221> | Недостаточно средств для покупки."))
                                elif rle is not None:
                                        await interaction.send(embed=discord.Embed(title="<:nonn:965626108387164221> | У вас уже имеется такая роль."))
                                else:
                                        idx=cursor.execute("SELECT idx FROM inv WHERE id = {}".format(interaction.author.id))
                                        if idx == '1': #Если индекс 1 уже существует, то:
                                                cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(
                                                        cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role1.id)).
                                                fetchone()[0], ctx.author.id))
                                                cursor.execute(f"INSERT INTO inv VALUES ({interaction.author.id}, {role1.id}, '2')").fetchall()
                                                await interaction.send(embed=discord.Embed(title="<a:Yes1:965581422121353216> | Вы приобрели роль!", 
                                                color=discord.Color.from_rgb(65, 232, 162)))
                                                connection.commit()
                                        else: #Если данные не найдены вовсе:
                                                cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(
                                                        cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role1.id)).
                                                fetchone()[0], ctx.author.id))
                                                cursor.execute(f"INSERT INTO inv VALUES ({interaction.author.id}, {role1.id}, '1')").fetchall()
                                                await interaction.send(embed=discord.Embed(title="<a:Yes1:965581422121353216> | Вы приобрели роль!", 
                                                color=discord.Color.from_rgb(65, 232, 162)))
                                                connection.commit()

                        elif interaction.values[0] == "rle2": #Покупка роли2
                                rle=cursor.execute("SELECT roles FROM inv WHERE id = {} and roles = {}".format(ctx.author.id, role2.id)).fetchone()
                                if cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role2.id)
                                        ).fetchone()[0] > cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)
                                        ).fetchone()[0]:
                                        await interaction.send(embed=discord.Embed(title="<:nonn:965626108387164221> | Недостаточно средств для покупки."))
                                elif rle is not None:
                                        await interaction.send(embed=discord.Embed(title="<:nonn:965626108387164221> | У вас уже имеется такая роль."))
                                else:
                                        idx=cursor.execute("SELECT idx FROM inv WHERE id = {}".format(interaction.author.id))
                                        if idx == '1': #Если индекс 1 уже существует, то:
                                                cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(
                                                        cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role2.id)).
                                                fetchone()[0], ctx.author.id))
                                                cursor.execute(f"INSERT INTO inv VALUES ({interaction.author.id}, {role2.id}, '2')").fetchall()
                                                await interaction.send(embed=discord.Embed(title="<a:Yes1:965581422121353216> | Вы приобрели роль!", 
                                                color=discord.Color.from_rgb(65, 232, 162)))
                                                connection.commit()
                                        else: #Если данные не найдены вовсе:
                                                cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(
                                                        cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role2.id)).
                                                fetchone()[0], ctx.author.id))
                                                cursor.execute(f"INSERT INTO inv VALUES ({interaction.author.id}, {role2.id}, '1')").fetchall()
                                                await interaction.send(embed=discord.Embed(title="<a:Yes1:965581422121353216> | Вы приобрели роль!", 
                                                color=discord.Color.from_rgb(65, 232, 162)))
                                                connection.commit()
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
@LxneSamurai Автор вопроса
Не поместилось всё.
Команда инвентаря:
#Инвентарь
@bot.command(aliases=['inv'])
        async def inventory(ctx):
                role1=discord.utils.get(ctx.guild.roles, id=966041637618847794)
                role2=discord.utils.get(ctx.guild.roles, id=966046291740217384)
                br=discord.utils.get(ctx.guild.roles, id=969228629676535878)
                emb=discord.Embed(timestamp=ctx.message.created_at, colour=discord.Color.from_rgb(255, 255, 255))
                counter=0
                if ctx.channel.id==955186277270048808: 
                        for row in cursor.execute("SELECT roles FROM inv WHERE id = {}".format(ctx.author.id)):
                                if ctx.guild.get_role(row[0]) != None:
                                                emb.set_author(name=f"{ctx.author.name}  ✧  Инвентарь",
                                                icon_url=ctx.author.avatar_url)
                                                counter+=1
                                                emb.add_field(name=f"{counter}. Роль",
                                                value=f"{ctx.guild.get_role(row[0]).mention}",
                                                inline=False)
                                else:
                                        pass
                                

                        await ctx.reply(embed=emb, mention_author=False) 

#Equip (написан очень глупо, но до того, как его редактировать, хотя бы разобраться с порядковым ID)
@bot.command(aliases=['eq'])
        async def equip(ctx, unit=None):
                role1=discord.utils.get(ctx.guild.roles, id=966041637618847794)
                role2=discord.utils.get(ctx.guild.roles, id=966046291740217384)
                for row in cursor.execute("SELECT roles, idx FROM inv WHERE id = {}".format(ctx.author.id)).fetchall():
                        if unit == "1":
                                        role=cursor.execute("SELECT roles FROM inv WHERE idx = {}".format(1))
                                        if role not in ctx.author.roles:
                                                        await ctx.author.add_roles(role)
                                                        await ctx.reply(embed=discord.Embed(timestamp=ctx.message.created_at,
                                                                        description="<a:Yes1:965581422121353216> Роль успешно надета.",
                                                                        colour=discord.Color.from_rgb(255, 255, 255)
                                                                        ).set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url),
                                                                        mention_author=False, delete_after=5)
                                                        await asyncio.sleep(5)
                                                        await ctx.message.delete()   
                                        else:
                                                        await ctx.reply(embed=discord.Embed(timestamp=ctx.message.created_at,
                                                                        description="<:nonn:965626108387164221> Роль уже надета."
                                                                        ).set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url),
                                                                        mention_author=False, delete_after=5)
                                                        await asyncio.sleep(5)
                                                        await ctx.message.delete() 

                        elif unit == "2":
                                role=ctx.guild.get_role(row[0])
                                if role not in ctx.author.roles:
                                                await ctx.author.add_roles(role)
                                                await ctx.reply(embed=discord.Embed(timestamp=ctx.message.created_at,
                                                                description="<a:Yes1:965581422121353216> Роль успешно надета.",
                                                                colour=discord.Color.from_rgb(255, 255, 255)
                                                                ).set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url),
                                                                mention_author=False, delete_after=5)
                                                await asyncio.sleep(5)
                                                await ctx.message.delete()   
                                else:
                                                await ctx.reply(embed=discord.Embed(timestamp=ctx.message.created_at,
                                                                description="<:nonn:965626108387164221> Роль уже надета."
                                                                ).set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url),
                                                                mention_author=False, delete_after=5)
                                                await asyncio.sleep(5)
                                                await ctx.message.delete()
Ответ написан
Ваш ответ на вопрос

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

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