Задать вопрос
@buxoy

Почему проверка на конкретный канал не работает?

Я тут снова хочу спросить вас почему не работает совершенно проверка которую написал.
На команды работает, а вот на client event не хочет. В чем проблема?

Код до:
@client.event
async def on_message(message):
	channel = client.get_channel(889788953216032780)
	buxoy = message.content
	content = int(float(f'{buxoy}'))
	if message.author.bot:
		return
	else:
		con = sql.connect('lyam.db')
		lastnumber = 0
		if not message.content.isnumeric() and message.author.bot:
			return await channel.send('❌ Неверно! Не используйте буквы :(')
		with con:
			cur = con.cursor()
			# cur.execute("CREATE TABLE IF NOT EXISTS `lyam` (`howmuch` INT)")
			# cur.execute(f"INSERT INTO `lyam` VALUES ('0')")
			cur.execute("SELECT * FROM `lyam`")
			rows = cur.fetchall()
			receivenumber = content
			for row in rows:
				lastnumber = row[0] + 1
			if receivenumber != lastnumber:
				return await channel.send(f'❌ Неверно! Следующая цифра: {lastnumber}')
			cur.execute(f"UPDATE `lyam` SET `howmuch`={lastnumber}")
			lastnumber1 = lastnumber + 1
			await channel.send(f'✅ Новая цифра: {lastnumber1} | Пиши следующую :)')
			con.commit()
			cur.close()


Я решил создать проверку чтобы сам клиент работал только в 1 заданном канале!
def predicate(ctx: commands.Context):
    channel = discord.utils.get(ctx.guild.text_channels, id=889788953216032780)
    if ctx.channel != channel:
        return False
    else:
        return True

has_channel = commands.check(predicate)


После чего код изменился на:
def predicate(ctx: commands.Context):
    channel = discord.utils.get(ctx.guild.text_channels, id=889788953216032780)
    if ctx.channel != channel:
        return False
    else:
        return True

has_channel = commands.check(predicate)
@client.event
@has_channel
async def on_message(message):
	channel = client.get_channel(889788953216032780)
	buxoy = message.content
	content = int(float(f'{buxoy}'))
	if message.author.bot:
		return
	else:
		con = sql.connect('lyam.db')
		lastnumber = 0
		if not message.content.isnumeric() and message.author.bot:
			return await channel.send('❌ Неверно! Не используйте буквы :(')
		with con:
			cur = con.cursor()
			# cur.execute("CREATE TABLE IF NOT EXISTS `lyam` (`howmuch` INT)")
			# cur.execute(f"INSERT INTO `lyam` VALUES ('0')")
			cur.execute("SELECT * FROM `lyam`")
			rows = cur.fetchall()
			receivenumber = content
			for row in rows:
				lastnumber = row[0] + 1
			if receivenumber != lastnumber:
				return await channel.send(f'❌ Неверно! Следующая цифра: {lastnumber}')
			cur.execute(f"UPDATE `lyam` SET `howmuch`={lastnumber}")
			lastnumber1 = lastnumber + 1
			await channel.send(f'✅ Новая цифра: {lastnumber1} | Пиши следующую :)')
			con.commit()
			cur.close()


Посоветуйте как сделать так чтобы сам клиент работал только в определенном заданном канале
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Читаем документацию к методу commands.check, и видим, что оно предназначено только для команд и других наследуемых от них объектов.

Декоратор, добавляющий проверку для Command (команды) или его подклассов. Эти проверки могут быть получены через Command.checks.

Эти проверки должны быть предикатами, которые принимают единственный аргумент - Context. Если проверка возвращает значение похожее на False, то при выполнении команды поднимается исключение CheckFailure и отправляется в событие on_command_error().


Плюс ко всему, декоратор должен вызываться.
@has_channel()
def is_me():
    def predicate(ctx):
        return ctx.message.author.id == 85309593344815104
    return commands.check(predicate)

@bot.command()
@is_me()
async def only_me(ctx):
    await ctx.send('Only you!')


Если Вам нужно ограничить сам event listener - просто добавьте проверку в сам слушатель события
@client.event
async def on_message(message):
    if message.channel.id != 889788953216032780:
        return
    ...


Если же вы хотите ограничить выполнение команд бота - добавьте проверку на уровне бота.
@bot.check
def check_commands(ctx):
    return message.channel.id == 889788953216032780
Ответ написан
Ваш ответ на вопрос

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

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