Disnake.py Использование команды только в определенном канале с помощью sqlite3 и проверки
Сделал команду для Дискорд бота, исключающая другие команды и ограничивающая их, для использования только в определенных каналах. Использовал библиотеку sqlite3, сначала написал команду для создания БД, занесения и проверки данных в ней.
@commands.command(aliases = ['cfotc'])
@commands.has_permissions(administrator=True)
async def CommandForOnlyThatChannel(guild, ctx, command, channel:disnake.TextChannel):
global Bot
db = sqlite3.connect('CommandForOnlyThatChannel.db')
cursor = db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS cfotc (guild_id INT, command TEXT, channel INT)')
cursor.execute(f"SELECT command FROM cfotc WHERE channel = '{channel.id}'")
chan = cursor.fetchone()
cursor.execute(f"SELECT command FROM cfotc WHERE command = '{command}'")
comm = cursor.fetchone()
if not comm or not chan:
db = sqlite3.connect('CommandForOnlyThatChannel.db')
cursor = db.cursor()
cursor.execute("""INSERT INTO cfotc (guild_id, command, channel) VALUES(?, ?, ?)""", (ctx.guild.id, command, channel.id))
db.commit()
await ctx.send('**Успешно!\nИспользование команды ограничено этим каналом!**')
if comm and chan:
await ctx.send('**Команда уже разрешена для этого канала!**')
db.commit()
После, на одной из команд я сделал проверку на канал, в котором она исключена, в случае если команда занесена в БД и на проверки это подтвердилось, она будет исключена для всех каналов, кроме того, который был указан ранее (будет работать только в этом канале). Иначе если же проверка покажет, что команда не занесена в БД, в этом случае она будет работать на всех каналах.
@commands.command(aliases=['Say'])
@commands.has_permissions(manage_messages=True)
@commands.cooldown(1, 2, commands.BucketType.user)
async def say(self, ctx, *, text:str):
db = sqlite3.connect('CommandForOnlyThatChannel.db')
cursor = db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS cfotc (guild_id INT, command TEXT, channel TEXT)')
cursor = db.cursor()
cursor.execute(f"SELECT command FROM cfotc WHERE channel = '{ctx.channel.id}'")
chan = cursor.fetchone()
chan = str(chan)
db.commit()
proverka = str(ctx.channel.id)
if proverka in chan:
pass
else:
await ctx.channel.purge(limit = 1)
await ctx.send(text)
При использовании команды say без внесения в БД, команда работает на всех каналах, внеся в БД команда должна быть ограничена только тем каналом, который был указан, но она продолжает функционировать на других каналах. Уже не знаю как решить проблему, возможно проверку команды надо писать иначе!?
Ответы (1 шт):
У меня получилась вот такая проверка для команды say, теперь команда для занесение в БД и ограничения других команд в определенных каналах, работает
@commands.command(aliases=['Say'], pass_context = True)
@commands.has_permissions(manage_messages=True)
@commands.cooldown(1, 2, commands.BucketType.user)
async def say(self, ctx, *, text:str):
db = sqlite3.connect('CommandForOnlyThatChannel.db')
cursor = db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS cfotc (guild_id INT, command TEXT, channel TEXT)')
cursor = db.cursor()
cursor.execute(f"SELECT command FROM cfotc WHERE channel = '{ctx.channel.id}'")
chan = cursor.fetchone()
cursor.execute(f"SELECT command FROM cfotc WHERE command = '{ctx.command}'")
comm = cursor.fetchone()
chan = str(chan)
db.commit()
proverkachan = str(ctx.channel.id)
proverkacomm = str(ctx.command)
if (proverkachan and proverkacomm in chan and comm) or (chan and comm == None):
await ctx.channel.purge(limit = 1)
await ctx.send(text)
else:
pass
