Мой Discord.py Проблемы с системой прокачки — Целая сага

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

Редактировать: Теперь я понимаю, что я должен записать хотя бы что-нибудь для общего, кроме «Lmao No». Я приношу извинения за неудобства и головные боли, которые я вызвал … возможно. Переполнение стека — безжалостное место.

Итак, я набирал бота, который использовал систему прокачки, и когда я запустил код:

Main.py

 from discord.ext import commands
import discord
import levelsys

cogs = [levelsys]

client = commands.Bot(command_prefix="k!", intents=discord.Intents.all())

for i in range(len(cogs)):
  cogs[i].setup(client)
 

levelsys.py

 import discord
from discord.ext import commands
from pymongo import MongoClient
import dns

general = 1

level = ["Sperm Whale", "Artillery General", "Commander", "Supreme General",]
levelnum = [1,5,10,15]


cluster = MongoClient("Just assume this is correct")


levelling = cluster["discord"]["Levelling"]

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

  @commands.Cog.listener()
  async def on_ready(self):
    print("Kingdom-kun is ready to come!")

  @commands.Cog.listener()
  async def on_message(self, message):
    if message.channel.id in general:
      stats = levelling.find_one({"id" : message.author.id})
      if not message.author.bot:
        if stats is None:
          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"}})
          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 were promoted 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 == general:
    stats = levelling.find_one({"id": ctx.author.id})
    if stats is None:
      embed = discord.Embed(description = "You haven't sent any messages, no rank!!!")
      await ctx.channelsned(embed=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 = [(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.name))
      embed.add_field(name="Name", value = ctx.author.mention, inline=True)

      embed.add_field(name="XP", value = f"{(xp/(200*((1/2)* lvl)))*20}", 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 == general):
    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))
 

Я продолжаю сталкиваться с ошибкой, которая выглядит следующим образом:

     if message.channel.id in general:
TypeError: argument of type 'int' is not iterable
Ignoring exception in on_message
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "/home/runner/Kingdom-kun/levelsys.py", line 27, in on_message
    if message.channel.id in general:
TypeError: argument of type 'int' is not iterable
 

Игнорируя тот факт, что я использовал учебник YouTube, чтобы сделать это, и я ни за что на свете не могу понять, что пошло не так, где, черт возьми, ‘int’ ?!?

В любом случае, хорошего дня.

Комментарии:

1. Что такое переменная «general»? Судя по всему, general — это int .

2. как упоминал @Brade, похоже, что «общее» — это число, а не массив (например [123, 345] ). Если вы пытаетесь сравнить одно число с message.channel.id , замените if message.channel.id in general: на if message.channel.id == general: .

Ответ №1:

Проблема здесь в вашей general переменной. В вашей rank функции вы можете видеть, что вы приравниваете идентификатор канала к general , подразумевая, что general является int .

 if ctx.channel.id == general:
 

Но в вашей on_message функции вы проверяете, есть ли идентификатор вообще.

 if message.channel.id in general:
 

Таким образом, вы устанавливаете general значение в целое число, а затем проверяете, входит ли другое целое число general , чего вы не можете сделать.

Решение для исправления вашей ошибки состоит в том, чтобы general вместо переменной сделать массив целых чисел, а затем изменить строку, которая проверяет, равен ли идентификатор канала general .

Также, пожалуйста, обратите внимание, что обфускация значения general до «Lmao No» никому не помогает, а вместо этого делает попытки разобраться в проблеме еще сложнее. Насколько я могу судить, это какой-то идентификатор канала, вместо полного изменения типа переменной просто измените его на другое целое число. Даже 1 этого достаточно.