@LxneSamurai

Как купить роль по «айди»?

Взялся за магазин ролей для дискорд бота, пишу через БД SQLite. Никак в голову не приходит,
как реализовать идею с покупкой роли через её айди (порядковый номер), а не через пинг самой роли.
Вот сам код + команда на добавление ролей в магазин.
connection = sqlite3.connect('server.db')
cursor=connection.cursor()

@bot.event
async def on_ready():
    print('Ready!`')
    cursor.execute("""CREATE TABLE IF NOT EXISTS shop(
            
            role_id INT,  #айди роли
            id INT, #айди сервера
            cost BIGINT #цена роли
            )""")

#Добавление роли
@bot.command(aliases=['ar'])
@commands.has_role(955395334358577162)#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ#РОЛЬ
async def addrole(ctx, role : discord.Role = None, cost: int= None):
        logs=bot.get_channel(955754477300904026) #LOGSLOGSLOGSLOGSLOGSLOGSLOGSLOGS
        if role is None:
                await ctx.send(embed=discord.Embed(
                        timestamp=ctx.message.created_at,
                        colour=discord.Color.dark_red()
                        ).add_field(name=f'<a:noentr:965583104360198205> | Некорректный ввод команды.', 
                        value=f'Укажите роль.'
                        ).set_footer(text="{}".format(ctx.author.name),
                        icon_url=ctx.author.avatar_url),
                        delete_after=5
                        ) 
        else:
                if cost is None:
                        await ctx.send(embed=discord.Embed(
                        timestamp=ctx.message.created_at,
                        colour=discord.Color.dark_red()
                        ).add_field(name=f'<a:noentr:965583104360198205> | Некорректный ввод команды.', 
                        value=f'Укажите стоимость роли.'
                        ).set_footer(text="{}".format(ctx.author.name),
                        icon_url=ctx.author.avatar_url),
                        delete_after=5
                        )
                elif cost <1:
                        await ctx.send(embed=discord.Embed(
                        timestamp=ctx.message.created_at,
                        colour=discord.Color.dark_red()
                        ).add_field(name=f'<a:noentr:965583104360198205> | Некорректный ввод команды.', 
                        value=f'Сумма не может быть меньше **1** <:servvalute:967795640425930822>.'
                        ).set_footer(text="{}".format(ctx.author.name),
                        icon_url=ctx.author.avatar_url),
                        delete_after=5
                        )
                else:
                        cursor.execute("INSERT INTO shop VALUES ({}, {}, {})".format(role.id, ctx.guild.id, cost))
                        connection.commit()

                        await ctx.send(embed=discord.Embed(
                        timestamp=ctx.message.created_at,
                        colour=discord.Color.from_rgb(27, 227, 124)
                        ).add_field(name=f'<a:Yes1:965581422121353216> | Роль успешно добавлена в магазин.', 
                        value=f'Стоимость {role.name} = {cost} <:servvalute:967795640425930822>.'
                        ).set_footer(text="{}".format(ctx.author.name),
                        icon_url=ctx.author.avatar_url),
                        delete_after=5)

                        await logs.send(embed=discord.Embed(
                        timestamp=ctx.message.created_at,
                        colour=discord.Color.from_rgb(27, 227, 124)
                        ).add_field(name=f'<a:Yes1:965581422121353216> | Роль успешно добавлена в магазин.', 
                        value=f'Стоимость {role.name} = {cost} <:servvalute:967795640425930822>.'
                        ).set_footer(text="{}".format(ctx.author.name),
                        icon_url=ctx.author.avatar_url))

#Вызов магазина
@bot.command()
async def shop(ctx):
        emb=discord.Embed(title="Магазин ролей", timestamp=ctx.message.created_at, colour=discord.Color.from_rgb(255, 255, 255))
        emb.set_footer(text="{}".format(ctx.author.name), icon_url=ctx.author.avatar_url)
        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)

#Покупка роли
@bot.command()
async def buy(ctx, role: discord.Role = None):
        if ctx.channel.id == 955186277270048808: 
                if role is None:
                        await ctx.reply(embed=discord.Embed(
                                timestamp=ctx.message.created_at,
                                colour=discord.Color.dark_red()
                                ).add_field(name=f'<a:noentr:965583104360198205> | Некорректный ввод команды.', 
                                value=f'Укажите роль, которую хотите приобрести.'
                                ).set_footer(text="{}".format(ctx.author.name),
                                icon_url=ctx.author.avatar_url),
                                mention_author=False)
                else:
                        if role in ctx.author.roles:
                                await ctx.reply(embed=discord.Embed(
                                timestamp=ctx.message.created_at,
                                colour=discord.Color.dark_red()
                                ).add_field(name=f'<a:noentr:965583104360198205> | У вас уже имеется такая роль.', 
                                value=f'Попробуйте выбрать другую.'
                                ).set_footer(text="{}".format(ctx.author.name),
                                icon_url=ctx.author.avatar_url),
                                mention_author=False)
                        elif cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role.id)).fetchone()[0] > cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]:
                                await ctx.reply(embed=discord.Embed(
                                timestamp=ctx.message.created_at,
                                colour=discord.Color.dark_red()
                                ).add_field(name=f'<a:noentr:965583104360198205> | Недостаточно средств.', 
                                value=f'Накопите немного деньжат и возвращайтесь!'
                                ).set_footer(text="{}".format(ctx.author.name),
                                icon_url=ctx.author.avatar_url),
                                mention_author=False)

                        else:
                                await ctx.author.add_roles(role)
                                cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role.id)).fetchone()[0], ctx.author.id))
                                connection.commit()
                                await ctx.reply(embed=discord.Embed(
                                        timestamp=ctx.message.created_at,
                                        colour=discord.Color.from_rgb(27, 227, 124)
                                        ).add_field(name=f'<a:Yes1:965581422121353216> | Роль успешно приобретена.', 
                                        value=f'Она уже находится в вашем профиле.'
                                        ).set_footer(text="{}".format(ctx.author.name),
                                        icon_url=ctx.author.avatar_url),
                                        mention_author=False)
                                await asyncio.sleep(5)
                                await ctx.message.delete()
  • Вопрос задан
  • 326 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
У тебя противоречия в запросах к БД. Для начала ответь на такие вопросы:
1. Сколько серверов будет обслуживать бот - один или несколько?
2. Сколько ролей можно покупать на сервере?
3. Баланс пользователя будет свой на каждом сервере или общий?
Исходя из этого и нужно проектировать БД.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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