03. [40p] Adding features

Up until now, everything was pretty tutorial-ish. From here on out, it's time for you to get your hands dirty and add some new features to the bot! This means looking stuff on the Internet. For yourselves. Scary stuff… I know!
Hint: a good starting point would be the API Reference page.

[20p] Task A - Playing music

Let's begin by adding the most important feature of a music bot: a play command that takes a song name (e.g.: danger_zone.mp3) as argument. Invoking this command while present in a voice channel should cause the bot to connect to that channel and play the song. The song should be loaded from a local file (hint: use any music file that you have on hand, or a YouTube downloader).

In order to do that, please note how the commands are defined:

@bot.command(brief='Generate random number between 1 and <arg>')
async def roll(ctx, max_val: int):
    # implementation goes here ...

To create new discord bot commands, simply define your function with the name of the command and decorate them with @bot.command as above. Oh, and whats with that : int declaration? I thought Python doesn't require us to give types to our variables… that's right! But we're now able to, if we want ;)

But, as expected, the hardest part will be implementing it. There are several questions: how can you load an .mp3 file from disk? how can you send it streaming over the Discord server? etc.

You will need to read some more API references to find the appropiate calls:

  • Start from VoiceClient. You can read that it provides a play() function, though note that you cannot instantiate this directly… so we'll move on through the links!
  • Next is the VoiceChannel.connect() routine that gives us a voice channel, but how to we get a voice channel object?
  • Here's the idea: find the voice channel the user issuing the play command is connected to!
  • So we start from our ctx variable, which we can find that is of type ApplicationContext (ofc!); we follow up with the author, which has a voice property (of type VoiceState), which finally brings us to our desired channel!
  • Once we got ahold of our VoiceChannel, we connect to it and we finally get a VoiceClient, phew! Now we can simply use play()
  • What's that? play() requires an AudioSource-type argument? We just need something that reads mp3 files… oh, we see a ffmpeg naming in there, which is a very popular open source library which can read almost every audio/video format in existence (check the right side menu!), so problem solved!
  • Now get to writing the code! :P

Hint: check this out for an example: https://brucecodes.gitbook.io/pycord/guide/voice-commands

[10p] Task B - Enumerating the songs

This one is easier: build a list command that lists all available songs in the discord chat.

Use the basic Python OS functions for easily reading directory contents and filtering by mp3 extension.

[10p] Task C - Misc commands

Let's assume someone enters your channel and plays this. We'll need a quick solution…

So: create a scram command that tells the bot to disconnect from the current voice channel immediately (which will stop the play!).

Finally, make an event handler for on_voice_state_update that checks if the bot was left alone in the channel after a user left. If the bot is indeed alone, it should also disconnect.

That's it!

ii/labs/04/tasks/03.txt · Last modified: 2024/11/20 16:03 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0