Making a bot say “Hello, World!” is one thing. Having it roll a die for you is a little more complicated. Luckily, I know you can handle it! Let’s get to it.
Table of Contents
Laying Out the Foundation
As promised, in this article, we’ll be creating a Discord bot that rolls a die and sends the results of that roll to a Discord channel. To do that, we’ll need to lay out a bit of a foundation. Fortunately, we already know what that looks like:
import discord webhook = discord.Webhook.from_url("<your webhook url>", adapter=discord.RequestsWebhookAdapter())
That said, if this is your first time seeing an article from this series, I’ll quickly explain.
In the first line, we’re importing a set of tools from the Discord library. Among those tools is a function for generating webhook objects which we can use to send messages to Discord. We make this object using the code in line two.
From here, we can begin sending all sorts of messages. For example, we can send our usual “Hello, World!” message:
So, how would we go about getting this bot to roll a die? We’ll talk about that in the next section.
How to Generate a Number in Python
In order for us to roll a die, we’re going to need some way to generate a number. Luckily, Python has an entire library dedicated to generating random numbers called `random`. Just like with the Discord tools, we can import these random number generator tools as follows:
Now, one thing I think is worth getting in the habit of is reading the documentation for any new library you decided to include in a project. For example, you can find the `random` documentation here.
Right at the top, you’ll read that most of the utilities provided in this library are based on the `random()` function which generates a random number between zero and one:
>>> random.random() 0.12264457983876476
Unfortunately, I’m not aware of any real-world die that can generate continuous numbers like this. It’s more likely that we want to produce integers (e.g., 1 to 6). Surely, if we were clever with our math, we could convert the result of `random()` into a range of integers. However, I’d prefer to work smarter, not harder. Why don’t we take a look at the documentation once again to see if we can find anything useful.
As it turns out, in the heading titled “Functions for integers“, there’s a function called `randint` that we might be able to use:
Return a random integer N such that
a <= N <= b. Alias for
If we trust this description, we should be able to generate a random number between 1 and 6 as follows:
>>> random.randint(1, 6) 5 >>> random.randint(1, 6) 3 >>> random.randint(1, 6) 4 >>> random.randint(1, 6) 3
Alright, we have a way to roll a die! Now what?
How to Store Data in Python
At this point, we could go back to our bot and sort of call it a day. After all, we can generate a number, so surely we can send the result to our webhook:
import discord import random webhook = discord.Webhook.from_url("<your webhook url>", adapter=discord.RequestsWebhookAdapter()) webhook.send("Rolling a six-sided die!") webhook.send(random.randint(1, 6))
And, this is totally fine. That said, it’s sometimes useful to save results of a function for later. For example, we already do that with our webhook. It’s perfectly possible to write code that looks like this:
import discord import random discord.Webhook.from_url("<your webhook url>", adapter=discord.RequestsWebhookAdapter()).send("Rolling a six-sided die!") discord.Webhook.from_url("<your webhook url>", adapter=discord.RequestsWebhookAdapter()).send(random.randit(1, 6))
But, this is very messy and inefficient. If we compute a value, we should probably save it somewhere—even if we use it once. After all, how is anyone supposed to know the purpose of our random integer. Sure, they might be able to tell from the context of our first message, but it’s not clear otherwise. As a result, let’s try saving our random number in a variable:
import discord import random webhook = discord.Webhook.from_url("<your webhook url>", adapter=discord.RequestsWebhookAdapter()) webhook.send("Rolling a six-sided die!") dice_roll = random.randint(1, 6) webhook.send(dice_roll)
And there we go! We have a bot that can roll a die and share the result with a discord channel.
Taking on a Challenge
As it turns out, taking a Hello World bot and turning it into a die rolling bot is a matter of adding a couple more lines of code. While you wait on the release of the next article, why not try extending the code above in a couple of ways.
First, check out this article on string formatting. It’ll give you some tools for writing cleaner strings. For example, rather than sending two messages, you could send one that reads: “Rolling a six-sided die: 4”. Or maybe, you want your bots name to change based on your roll. The previous article shares a way you might do that.
Second, check out this article on operators. It’ll show you how to perform simple math operations like addition and subtraction. You might try taking that knowledge and modifying your bot to play craps (i.e., roll two dice and sum the results). Alternatively, you could make up your own use for random numbers and operators.
Once you’re done playing around with strings and numbers, make sure you have fun with your new bots with your friends. And while you’re at it, show them how to make one!
Now that we’ve had a chance to learn about variables in Python, we can start taking on more advanced Python topics. For example, in the next article, we’ll extend what we’ve learned about in terms of generating random numbers to have our programs start making decisions. If you want a primer on that, check out this article.
In the meantime, you might enjoy these related Python articles:
- Can You Actually Return Multiple Values From a Function in Python?
- How to Capitalize a String in Python: Upper(), Capitalize(), And More
- The Self-Taught Guide to Type Systems in Python
Likewise, here are some resources from the folks at Amazon (#ad):
- Effective Python: 90 Specific Ways to Write Better Python
- Python Tricks: A Buffet of Awesome Python Features
- Python Programming: An Introduction to Computer Science
Otherwise, see you again soon! Take care.
Recent Code Posts
Python software should always be versioned, but it's not always clear how. Luckily, I've shared some of my experience with versioning here.
SnakeMD has finally matured to a proper library. To mark that maturity, we're releasing a transition guide to the latest version: 2.0.0.