Reputation: 85
I have written a basic Discord Bot for my D&D group. It allows us to roll the dice using commands and sends results instead of using an honor system where we say what we roll. However, it has two major drawbacks:
1: You can only roll one die at a time, and
2: You cannot add any modifiers.
I have seen many Discord Bots, especially ones that search Youtube for music, that can have multiple parameters when running a command, such as "!play songname". How would I make it so my bot can have multiple parameters, such as !roll (dice type, amount, modifiers) instead of just !roll_d20?
Code is as follows:
import discord
from discord.ext import commands # used to create bot commands
import random # adding this fixed a problem, don't delete
from random import randint # generates random numbers for dice rolls
import sys # used to safely shut down the bot
bot = commands.Bot(command_prefix='!') # creates an instance of a bot
@bot.event # says when the bot should be ready as a message in the IDE
async def on_ready():
print("Ready to roll!")
@bot.command() # allows users to test the response of the bot from Discord
async def test(ctx):
await ctx.send('Ready to roll!'.format(ctx.author))
@bot.command() # rolls a d4 and shows the result
async def roll_d4(ctx):
x = random.randint(1,4)
await ctx.send((str(ctx.author) + ', you rolled a d4 and got a ' + str(x) + '!').format(ctx.author))
@bot.command() # rolls a d6 and shows the result
async def roll_d6(ctx):
x = random.randint(1,6)
await ctx.send((str(ctx.author) + ', you rolled a d6 got a ' + str(x) + '!').format(ctx.author))
@bot.command() # rolls a d8 and shows the result
async def roll_d8(ctx):
x = random.randint(1,8)
await ctx.send((str(ctx.author) + ', you rolled a d8 got a ' + str(x) + '!').format(ctx.author))
@bot.command() # rolls a d10 and shows the result
async def roll_d10(ctx):
x = random.randint(1,10)
await ctx.send((str(ctx.author) + ', you rolled a d10 got a ' + str(x) + '!').format(ctx.author))
@bot.command() # rolls a d12 and shows the result
async def roll_d12(ctx):
x = random.randint(1,12)
await ctx.send((str(ctx.author) + ', you rolled a d12 got a ' + str(x) + '!').format(ctx.author))
@bot.command() # rolls a d20 and shows the result
async def roll_d20(ctx):
x = random.randint(1,20)
if x == 1:
await ctx.send((str(ctx.author) + ', you rolled a d20 and got a Nat 1!').format(ctx.author))
elif x == 20:
await ctx.send((str(ctx.author) + ', you rolled a d20 and got a Nat 20!').format(ctx.author))
else:
await ctx.send((str(ctx.author) + ', you rolled a d20 and got a ' + str(x) + '!').format(ctx.author))
@bot.command() # rolls a d100 and shows the result
async def roll_d100(ctx):
x = random.randint(1,100)
await ctx.send((str(ctx.author) + ', you rolled a d100 got a ' + str(x) + '!').format(ctx.author))
@bot.command() # shuts down the bot
async def stop(ctx):
await ctx.send(("Logging out. See you next session!").format(ctx.author))
sys.exit()
bot.run('token')
Upvotes: 0
Views: 773
Reputation: 380
You can do string manipulation to take the user message just as /roll 'number of dices'd'how many dice faces' + 'modifiers', I did a single command on my Discord Bot to roll any amount of any kind of dices and add modifiers.
What I did was take the user message, split by spaces, put therms with 'd' in it in a dices list, put any other therm in a bonus list, and finally pick a random number betwen 1 and the amount of dice faces per each type of dice.
Here goes the github link that contains the dice cog for my own Discord Bot
https://github.com/Voz-bonita/Discord-Bot/blob/master/Dices%20extension.py
Upvotes: 0
Reputation: 3426
You can easily combine all of the commands into one as follows, i don't know D&D so i didn't get what you meant by modifiers.
@bot.command()
async def dice(ctx, dice_type: int, amount: int):
results = []
for role in range(amount):
x = random.randint(1, dice_type)
results.append(x)
await ctx.send(f'You have rolled {dice_type} for {amount} times and got {results}')
Upvotes: 1