提问者:小点点

Discord.py D


所以我所有的D

我当前拥有的命令是

async def d(ctx, die:int):
    for x in range(1):
        await ctx.send("<:d20:748302353375166614> "+str(random.randint(1,die)))

第一个问题是,它使用了格式“|d 20”而不是“|d20”,因此第一个请求是删除“d”和int之间的空格,该空格表示骰子的边数(本例中为“die”变量,“20”)。

除此之外,我想添加一个功能,如果键入“|[骰子数]d[边数]”,它会将请求的骰子滚动请求的次数。如果没有指定骰子数(例如:“|d20”),它应该自动假设骰子数为1。机器人消息应该包括所有滚动的数字及其总和。

例如,“|2d20”可能会返回“

最重要的是,我还希望能够将奖金添加到掷骰子中(“|[骰子数]d[边数][奖金]”),并在机器人的消息中返回骰子掷骰子、奖金和最终值。

例如“|d20 4”可能返回“

(或者,如果痛苦地写下这个问题的答案的人觉得他们还没有从这个请求的庞大规模中感到足够的痛苦,那么像“|1d4 2d6”这样的东西是可能的)


共2个答案

匿名用户

使用命令扩展,您无法删除命令和 die 变量之间的空格。为了摆脱它,您必须使用on_message事件来解析命令的内容:

from random import sample

@client.event
async def on_message(message):
    content = message.content
    if content.startswith('|') and (content[1].isdigit() or content[1]=='d'):
        content = content.split('+')
        rolls = [int(content.pop(i)) for i in range(len(content)) if content[i].isdigit()]
        for elem in content:
            n, faces = elem.split('d') if elem.split('d')[0] != '' else (1, elem[1:])
            rolls += [randint(1, int(faces)) for _ in range(int(n))]
        rolls_str = ' + '.join([str(n) for n in rolls]) 
        await message.channel.send(f"{rolls_str} = {sum(rolls)}")
    else:
        pass

    await client.process_commands(message)

匿名用户

这样的格式怎么样!滚动3d20 6d8 1?如果可以接受,您可以这样做:

async def d(ctx, *args):
    dicestring = "".join(args)
    # Process dicestring here

这里,*args是一个可变长度参数说明符。解析命令的方式,!掷5d6 6d12会给你参数(“5d6”,“”,“6d12”)!掷5d6 6d12将给你参数(“5d6 5d12”)

“”.join(args) 将简单地将所有这些参数混合在一起,为您提供一个字符串,您可以根据需要解析。

如果唯一的前缀是|对你来说很重要,那么你要做的事情并不适合命令结构。我会考虑把它变成一个on_message事件,比如https://discordpy.readthedocs.io/en/latest/api.html#discord-api-events.