Взялся за магазин ролей для дискорд бота, пишу через БД 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()