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
我也可以使用一些帮助使这个更整洁。
解决方案
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
...
}
推荐阅读
- angular - Typescript json引用变量但需要检查变量是否存在
- javascript - 使用正则表达式检查每个出现的特殊字符后跟空格
- python - 如何使用 zeep 发送 xml 请求?
- mysql - 时间间隔内的 SQL 计数
- mysql - 如何在过去 7 天内获得每小时的条目数?
- angularjs - 单击元素不适用于量角器中的每个场景
- datetime - ZonedDateTime 解析为 ZonedDateTime 的另一种格式
- docker - docker中的jenkins无法在主机中执行
- outlook - 使用 office js 获取约会对象的 iCalUId
- segmentation-fault - 为什么我在 Qt creator/designer 中的这行代码上出现 Seg Fault?