Как сделать правильные проверки discord.py
Я сделал бота, который создаёт логи почти всех действий на сервере, но есть проблема, когда пользователь включает/выключает микрофон, то бот пишет, что он отключился и подключился к серверу, хотя у меня нет даже проверок на это, как избавиться от этого, пытался через if len(before.channel.members) == len(after.channel.members):, но так не работает.
if before.channel is not None:
if before.channel.id == 720295133282566176:
embed=discord.Embed(
title='',
description=f'? Пользователь {member.mention} покинул AFK канал.',
color=0xf04848
)
embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url)
embed.set_footer(text=f'ID: {member.id} • Сегодня, в {now.hour}:{now.minute}')
await bot.get_channel(1000781163696230440).send(embed=embed)
else:
embed=discord.Embed(
title='',
description=f'? Пользователь {member.mention} покинул голосовой канал `{before.channel}`',
color=0xf04848
)
embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url)
embed.set_footer(text=f'ID: {member.id} • Сегодня, в {now.hour}:{now.minute}')
await bot.get_channel(1000781163696230440).send(embed=embed)
if not before.afk and after.afk == True:
embed=discord.Embed(
title='',
description=f'? Пользователь {member.mention} был перемещён в AFK канал.',
color=0xfaa41b
)
embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url)
embed.set_footer(text=f'ID: {member.id} • Сегодня, в {now.hour}:{now.minute}')
await bot.get_channel(1000781163696230440).send(embed=embed)
if member.voice and after.afk == False:
embed=discord.Embed(
title='',
description=f'? Пользователь {member.mention} присоединился к голосовому каналу `{member.voice.channel}`.',
color=0x44b37f
)
embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url)
embed.set_footer(text=f'ID: {member.id} • Сегодня, в {now.hour}:{now.minute}')
await bot.get_channel(1000781163696230440).send(embed=embed)
Ответы (1 шт):
Это происходит из-за того, что функция on_voice_state_update вызывается каждый раз, когда пользователь обновляет свой discord.VoiceState, из-за чего она вызывается в том числе когда пользователь выключает микрофон и т.д. Решается это 1м условием if before.channel != after.channel:
@bot.event
async def on_voice_state_update(member: discord.Member, before: discord.VoiceState, after: discord.VoiceState) -> None:
if before.channel != after.channel:
if before.channel is None and isinstance(after.channel, discord.VoiceChannel):
print(f'member "{member.name}" connected')
elif isinstance(before.channel, discord.VoiceChannel) and isinstance(after.channel, discord.VoiceChannel):
print(f'member "{member.name}" moved')
elif isinstance(before.channel, discord.VoiceChannel) and after.channel is None:
print(f'member "{member.name}" disconnected')
Кстати для этого нужно включить определённый intent при создании объекта бота:
intents = discord.Intents.default()
intents.voice_states = True
intents.message_content = True
bot = commands.Bot(command_prefix="!!", intents=intents)