如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件

Posted

技术标签:

【中文标题】如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件【英文标题】:How to Make a Discord Bot Join a Voice Channel and Play an Audio File When a Member Joins the Channel Using Discord.py Cogs 【发布时间】:2021-03-02 10:18:46 【问题描述】:

我目前的项目

我目前正在尝试在 Python 3 中为 Discord 机器人制作一个 cog,当有人加入特定的 Discord 语音频道时,它在运行时播放特定的音频文件。

我的问题

我已经有了我的项目的代码(信用:Tabulate),但我不知道如何

    将其转换为 cog,然后 使其适用于特定语音频道,而不是 Discord 中的每个频道 服务器。

这是我的代码:

import discord
from discord.ext import commands
from time import sleep

rpgmusicpath = r"C:\Users\lones\OneDrive\Desktop\Bot\music\rpgmusic.mp3"

class VoiceChannelIntro(commands.Cog):
    def __init__(self, client):
        self.bot = client

    @commands.Cog.listener()
    async def on_ready(self):
        print('Channel Intro cog successfully loaded.')

    @commands.Cog.event
    async def on_voice_state_update(member: discord.Member, before, after):
    #replace this with the path to your audio file
        path = r"path\to\music.mp3"

        vc_before = before.channel
        vc_after = after.channel
    
        if vc_before == vc_after:
            return
    
        elif vc_before is None:
            channel = member.voice.channel
            vc = await channel.connect()
            vc.play(discord.FFmpegPCMAudio(path))
            with audioread.audio_open(path) as f:
                #Start Playing
                sleep(f.duration)
            await vc.disconnect()

        elif vc_after is None:
            return
    
        else:
            channel = member.voice.channel
            vc = await channel.connect()
            vc.play(discord.FFmpegPCMAudio(path))
            with audioread.audio_open(path) as f:
                #Start Playing
                sleep(f.duration)
            await vc.disconnect()
        

def setup(bot):
    bot.add_cog(VoiceChannelIntro(bot))

【问题讨论】:

【参考方案1】:

以下是你的一些错误:

    使用asyncio.sleep() 而不是time.sleep() 您忘记将self 作为第一个参数传递

以下是修改后的代码:

import discord
from discord.ext import commands
from asyncio import sleep

rpgmusicpath = r"C:\Users\lones\OneDrive\Desktop\Bot\music\rpgmusic.mp3"

class Music(commands.Cog):
    def __init__(self, client):
        self.bot = client

    @commands.Cog.listener()
    async def on_ready(self):
        print('Music cog successfully loaded.')

    @commands.Cog.event
    async def on_voice_state_update(self, member, before, after):
    #replace this with the path to your audio file
        path = r"C:\Users\lones\OneDrive\Desktop\Bot\test-chamber-4-intro.mp3"

        vc_before = before.channel
        vc_after = after.channel
    
        if not vc_before and vc_after.id == YOUR VOICE CHANNEL ID:
            vc = await vc_after.connect()
            vc.play(discord.FFmpegPCMAudio(path))
            with audioread.audio_open(path) as f:
                #Start Playing
                sleep(f.duration)
            await vc.disconnect()

def setup(bot):
    bot.add_cog(Music(bot))

【讨论】:

嘿,所以我去测试它,但我得到一个错误。当我运行代码时,它显示:“AttributeError: type object 'Cog' has no attribute 'event'”。知道可能是什么原因造成的吗?我查看了 Discord.py 中的文档,但它甚至没有提到任何关于 Cog.event 的内容。

以上是关于如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章

使用不带 cogs 的 discord.py 是不是可以实现 OOP?

Discord py cogs 不加载命令

如何将 discord.py 帮助命令放入嵌入中?

(discord.py) 如何使我的 setprefix 命令正常工作?

自定义前缀 Discord.py

如何在 discord.py 中获取 dm [重复]