如何将命令名称的发送者添加到Discord.py

时间:2020-10-01 03:50:35

标签: python discord.py

我正在尝试使用Discord.py创建自己的Discord机器人,并跟踪单个玩家的积分,我使用了一个列表,一个带有玩家名称,另一个带有玩家的积分,并且两者都是相同的数字在那个名单上。我想做的是将发送命令的人员的姓名添加到玩家列表中。 代码:


    @bot.command()
    async def pointadd(ctx, amount, points=points, players=players):
        yes = 1
        for x in players:
            if players[x] == {ctx.message.author}:
                yes = ('Yes')
                level = x
        if yes == ('Yes'):
            points[level] = (points[level] + amount)
            await ctx.send(points[level])
        else:
            players.append(ctx.message.author)
            points.append('0')

错误:

Ignoring exception in command pointadd:
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "/home/pi/pipy_bot/bot.py", line 58, in pointadd
    if players[x] == {ctx.message.author}:
TypeError: list indices must be integers or slices, not str

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/discord/ext/commands/bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "/usr/local/lib/python3.5/dist-packages/discord/ext/commands/core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/usr/local/lib/python3.5/dist-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: list indices must be integers or slices, not str

我也可以使用一些帮助使之变得更整洁。

1 个答案:

答案 0 :(得分:0)

x是一个players列表元素,我想是一个discord.Member对象。列表索引必须是整数,不能有其他任何内容,因此会出现此错误。您必须写:

@bot.command()
async def pointadd(ctx, amount, points=points, players=players):
    found = False
    for x in players:
    if x == ctx.message.author:
        found = True
        level = players.index(x)
    if found:
        points[level] = (int(points[level]) + amount)
        await ctx.send(points[level])
    else:
        players.append(ctx.message.author)
        points.append('0')

({points[level]必须是整数才能进行计算,所以我写了int(points[level])

可以使用字典来代替使用列表:

#Your points definition
points = {}
#Your pointadd command
@bot.command()
async def pointadd(ctx, amount: int, points=points):
    try:
        points[ctx.author.id] += amount
    except:
        points[ctx.author.id] = 0
    await ctx.send(points[ctx.author.id])

最后,您的points词典将如下所示:

{
    'user_id_1': xp_amount_1
    'user_id_2': xp_amount_2
    ...
}