Python как узнать, что человек вошел в голосовой канал в Дискорде?

Подскажите, как узнать, что человек вошел в голосовой канал Дискорде? и как узнать, кто этот человек? Спасибо.

Я нашел вот такой код, чтобы скинуть имена всех, кто в голосовых чатах и перекинуть их в один. Может быть, можно как-то доработать этот код?

@bot.command()
@commands.has_permissions(administrator=True)
async def mtm(ctx):
    c = 1
    for channel in ctx.guild.voice_channels:
        for member in channel.members:
            await member.move_to(ctx.author.voice.channel)
            await ctx.author.create_dm()
            await ctx.author.dm_channel.send(
                f'{c}) {member.name}'
            )
            c += 1

Главная проблема в том, чтобы проверять наличие людей постоянно, а не при вызове команды.


Ответы (1 шт):

Автор решения: xZartsust

Вот вам полностю рабочий код, пользуйтесь)

import logging

import config
import discord
from discord.ext import commands
from discord.utils import get


class PrivateChannel(commands.Cog):
    def __init__(self, bot: commands.Bot) -> None:
        super().__init__()
        self.bot = bot
        self.all_channel = []

    @commands.Cog.listener()
    async def on_voice_state_update(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState):
        
        category = int(config.category_id) # здесь айди категори в которой находиться канал с которого создается новый канал

        if after.channel is not None and member.voice.channel.id == int(config.voice_id) and member.voice.channel is not None: # тут int(config.voice_id) надо указать айди канала с которого будет создаваться новый канал и в него переноситься пользователь
            
            try:
                category_main: discord.CategoryChannel = get(member.guild.categories, id = category)
                channel: discord.VoiceChannel = await member.guild.create_voice_channel(name = f'Приватный ({member.display_name})', category = category_main)
                
                await channel.set_permissions(member, connect = True, mute_members = True, move_members = True, manage_channels = True, manage_roles = True)
                await member.move_to(channel)

                self.all_channel.append(channel.id)

            except Exception as e:
                logging.exception(e)
        
        elif after.channel is None and before.channel.id in self.all_channel and len(before.channel.members) == 0:

            try:
                
                del_channel: discord.VoiceChannel = get(member.guild.voice_channels, id = before.channel.id)
                await del_channel.delete()
            
            except Exception as e:
                logging.exception(e)
            
def setup(bot: commands.Bot):
    bot.add_cog(PrivateChannel(bot))
→ Ссылка