TypeError: 'NoneType' 对象不可下标错误

时间:2021-05-05 13:49:25

标签: python

这是我为 Discord 服务器的调平系统编写的代码,现在出现此错误。但是 Bot 正在启动,但是在执行命令时遇到了一些问题。代码创建 DB 并将每个人的起始 EXP 设置为 100,但关卡系统本身出了点问题。

level = ["Gamer", "Pro gamer", "Epic gamer", "Legendary gamer", "Godly gamer"]
levelnum = [10,20,30,40,50]

cluster = MongoClient("")

levelling = cluster[""][""]

class levelsys(commands.Cog):
    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_ready(self):
        print("Levelsystem is ready")

    @commands.Cog.listener()
    async def on_message(self,message):
        if message.channel.id in talk_channels:
            stats = levelling.find_one({"id" : message.author.id})
        if not message.author.bot:
            newuser = {"id" : message.author.id, "xp" : 100}
            levelling.insert_one(newuser)
        else:
            xp = stats["xp"] + 5
            levelling.update_one ({"id":message.author.id}, {"$set":{"xp":xp}})
            lvl = 0
            while True:
                if xp < ((50*(lvl**2))+(50*(lvl-1))):
                    break
                lvl += 1
            xp -= ((50*((lvl-1)**2))+(50*(lvl-1)))
            if xp == 0:
                await message.channel.send(f"well done {message.author.mention}! You leveld up to **level: {lvl}**")
                for i in range(len(level)):
                    if lvl == levelnum[i]:
                        await message.author.add_roles(discord.utils.get(message.author.guild.roles, name=level[i]))
                        embed = discord.Embed(description=f"{message.author.mention} you have gotten role **{level[i]}**!!!")
                        embed.set_thumbnail(url=message.author.avatar_url)
                        await message.channel.send(embed=embed)

@commands.command()
async def rank(self, ctx):
    if ctx.channel.id == bot_channel:
        stats = levelling.find_one({"id" : ctx.author.id})
        if stats is None:
            embed = discord.Embed(description="You haven't sent any message, no rank!!!")
            await ctx.channel.send(emebed=embed)
        else:
                xp = stats["xp"]
                lvl = 0
                rank = 0
                while True:
                        if xp < ((50*(lvl**2))+(50*(lvl-1))):
                            break
                        lvl += 1
                xp -= ((50*((lvl-1)**2))+(50*(lvl-1)))
                boxes = int((xp/(200*((1/2)* lvl)))*20)
                rankings = levelling.find().sort("xp",-1)
                for x in rankings:
                     rank += 1
                     if stats ["id"] == x["id"]:
                         break
                embed = discord.Embed(title="{}'s level stats".format(ctx.author))
                embed.add_field(name="Name", value=ctx.author.mention, inline=True)
                embed.add_field(name="XP", value=f"{xp}/{int(200*((1/2)*lvl))}", inline=True)
                embed.add_field(name="Rank", value=f"{rank}/{ctx.guild.member_count}", inline=True)
                embed.add_field(name="Progress Bar [lvl", value=boxes * ":blue_square:" + (20-boxes) * "white_large_square:", inline=False)
                embed.set_thumbnail(url=ctx.author.avatar_url)
                await ctx.channel.send(embed=embed)

@commands.command()
async def leaderboard(self, ctx):
    if (ctx.channel.id == bot_channel):
        rankings = levelling.find().sort("xp",-1)
        i = 1
        embed = discord.Embed(title="Rankings:")
        for x in rankings:
            try:
                temp = ctx.guild.get_member(x["id"])
                tempxp = x["xp"]
                embed.add_field(name=f"{i}: {temp.name}", value=f"Total XP: {tempxp}", inline=False)
                i += 1
            except:
                pass
            if i == 11:
                break
        await ctx.channel.send(embed=embed)

def setup(client):
    client.add_cog(levelsys(client))
    

我遇到了这个错误

04.05 18:38:00 [Bot] Ignoring exception in on_message
04.05 18:38:00 [Bot] Traceback (most recent call last):
04.05 18:38:00 [Bot] File "/.local/lib/python3.9/site-packages/discord/client.py", line 343, in _run_event
04.05 18:38:00 [Bot] await coro(*args, **kwargs)
04.05 18:38:00 [Bot] File "/cogs/levelsys.py", line 32, in on_message
04.05 18:38:00 [Bot] xp = stats["xp"] + 5
04.05 18:38:00 [Bot] TypeError: 'NoneType' object is not subscriptable

希望有人能帮帮我

1 个答案:

答案 0 :(得分:0)

问题可能出在您代码的这一部分:

async def on_message(self,message):
    if message.channel.id in talk_channels:
        stats = levelling.find_one({"id" : message.author.id})
    if not message.author.bot:
        newuser = {"id" : message.author.id, "xp" : 100}
        levelling.insert_one(newuser)
    else:
        xp = stats["xp"] + 5
    .
    .
    .

当第一个 if 条件为真时,您将设置 stats 变量,否则您将没有这样的变量。

第二个 if 语句是独立的,您尝试在它的 else 分支上使用 stats 变量。