McJohnalds
McJohnalds

Reputation: 85

Adding more parameters to a Discord Bot?

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

Answers (2)

Voz bonita
Voz bonita

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.

enter image description here

This one shows every result for 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

Abdulaziz
Abdulaziz

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}')

enter image description here

Upvotes: 1

Related Questions