我正在使用 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
我这样做了,它对我有用
@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()