首页 > 解决方案 > 如何将命令名称的发送者添加到 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

我也可以使用一些帮助使这个更整洁。

标签: pythondiscord.py

解决方案


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
    ...
}

推荐阅读