如何在Python disnake上编写discord自动语音机器人?

问题描述 投票:0回答:1

我正在使用 disnake 在 python 上制作一个不和谐的机器人,但是因为我对此很陌生,所以我不明白如何做我想做的事情。这个想法是建立一个名为“创建语音聊天”的语音频道,当用户加入该频道时,机器人会自动创建新的语音频道并将该用户移至该频道。创建的通道中无人后,它就会销毁。

我在 autocode.com 上找到了我需要的东西,但我不知道如何使用 disnake 在 python 上重写它。有什么想法吗?

来自autocode(js)的代码

const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN});
const event = context.params.event;
const { guild_id, channel_id, user_id } = event

// The 'central' voice channel users must join first
const voiceChannelId = process.env.VOICE_CHANNEL_ID

// The voice channel name to create for the user
const voiceChannelName = `vc_${user_id}`

// Create a new voice channel when the user joins the specifc voice channel
const joinedChannel = channel_id === voiceChannelId
if (joinedChannel) {
  const channel = await lib.discord.guilds['@0.1.0'].channels.create({
    guild_id,
    name: voiceChannelName,
    type: 2, // vc
  })
  await lib.discord.guilds['@0.1.0'].members.update({
    guild_id, user_id,
    channel_id: channel.id,
  });
  return
}

// Delete the user's voice channel when the user disconnects
const leftChannel = !channel_id
if (leftChannel) {
  const channels = await lib.discord.guilds['@0.1.0'].channels.list({ guild_id });
  const channel = channels.find(c => c.name === voiceChannelName)
  if (channel)
    await lib.discord.channels['@0.2.0'].destroy({ channel_id: channel.id });
  return
}

我自己做了什么(没有工作)

def _get_channel(self) -> disnake.abc.GuildChannel:
    return self.channel


def __init__(self):
    self.auto_channel = 1030505142820282408
    self.auto_channel = self.guild.get_channel(self.auto_channel)


@bot.event
async def on_voice_state_update(self, member = disnake.Member, before = disnake.VoiceState, after = disnake.VoiceState) -> None:
    if after.channel is not None and after.channel == auto_channel:
        ch = await self.auto_channel.category.create_voice_channel(name=member.display_name, overwrites={**self.auto_channel.category.overwrites, member: disnake.PermissionOverwrite(connect=True, move_members=True, manage_channels=True, manage_roles=True)})
        try:
            await member.move_to(ch, reason='autochannel')
        except disnake.HTTPException:
            pass
    if before.channel is not None and before.channel.id != auto_channel and before.channel.category.id == auto_channel and len(before.channel.members) == 0:
        try:
            await before.channel.delete()
        except disnake.NotFound:
            pass
javascript python discord disnake
1个回答
0
投票

我这样做了,它对我有用

@bot.event
async def on_voice_state_update(self, member: disnake.Member, before: disnake.VoiceState, after: disnake.VoiceState):
        name_Channel = f"{member.name}'s Channel"
        if after.channel.id == channel.id:
            Channel = await after.channel.clone(name=name_Channel)
            await member.move_to(Channel)
        if before.channel:
            if before.channel.name == name_Channel:
                if len(before.channel.members) == 0:
                await before.channel.delete()
© www.soinside.com 2019 - 2024. All rights reserved.