python - Discord.on_message() 缺少 1 个必需的位置参数:'ctx'
问题描述
我正在开发用户级系统,现在我在启动我的 Discord 升级代码时遇到了一个大问题,我不知道也不知道如何修复它。
这是我的代码:
import discord
import asyncio
import json
from discord.ext import commands
сlass Levels:
def __init__(self, client):
self.bot = client
self.bot.loop.create_task(self.save_users())
with open(r'C:\Users\conex_000\PycharmProjects\Shirochka\users.json', 'r') as f:
self.users = json.load(f)
async def save_users(self):
await self.bot.wait_until_ready()
while not self.bot.is_closed():
with open(r'C:\Users\conex_000\PycharmProjects\Shirochka\users.json', 'w') as f:
json.dump(self.users, f, indent=4)
await asyncio.sleep(5)
def lvl_up(self, author_id):
cur_xp = self.users[author_id]['exp']
cur_lvl = self.users[author_id]['level']
if cur_xp >= round((4 * (cur_lvl ** 3)) / 5):
self.users[author_id]['level'] += 1
return True
else:
return False
async def on_message(self, message):
if message.author == self.bot.user:
return
author_id = str(message.author.id)
if not author_id in self.users:
self.users[author_id] = {}
self.users[author_id]['level'] = 1
self.users[author_id]['exp'] = 0
self.users[author_id]['exp'] += 1
if self.lvl_up(author_id):
await message.channel.send(f"{message.author.mention} is now level {self.users[author_id]['level']}")
@client.command()
async def level(self, ctx, member: discord.Member = None):
member = ctx.author if not member else member
member_id = str(member.id)
if not member.id in self.users:
await ctx.send("Can't identify a member")
else:
embed = discord.Embed(color=member.color, timestamp=ctx.message.created_at)
embed.set_author(name=f'Level - {member}', icon_url=client.user.avatar_url)
embed.add_field(name='Level', value=self.users[member_id]['level'])
embed.add_field(name='Level', value=self.users[member_id]['exp'])
await ctx.send(embed=embed)
此代码正在启动,但是当我在 Discord 聊天程序上键入任何消息时返回以下错误:
类型错误:on_message() 缺少 1 个必需的位置参数:'ctx'
解决方案
为 Levels Cog 添加了子类化 commands.Cog,用装饰器标记了命令和事件,现在一切正常。
class Levels(commands.Cog):
def __init__(self, client):
self.bot = client
self.bot.loop.create_task(self.save_users())
with open(r'C:\Users\conex_000\PycharmProjects\Shirochka\users.json', 'r') as f:
self.users = json.load(f)
async def save_users(self):
await self.bot.wait_until_ready()
while not self.bot.is_closed():
with open(r'C:\Users\conex_000\PycharmProjects\Shirochka\users.json', 'w') as f:
json.dump(self.users, f, indent=4)
await asyncio.sleep(5)
def lvl_up(self, author_id):
cur_xp = self.users[author_id]['exp']
cur_lvl = self.users[author_id]['level']
if cur_xp >= round((10 * (cur_lvl ** 3)) / 5):
self.users[author_id]['level'] += 1
return True
else:
return False
@commands.Cog.listener()
async def on_message(self, message):
if message.author == self.bot.user:
return
author_id = str(message.author.id)
if not author_id in self.users:
self.users[author_id] = {}
self.users[author_id]['level'] = 1
self.users[author_id]['exp'] = 0
self.users[author_id]['exp'] += 1
if self.lvl_up(author_id):
await message.channel.send(f"{message.author.mention} is now level {self.users[author_id]['level']}")
@commands.command()
async def level(self, ctx, member: discord.Member = None):
member = ctx.author if not member else member
member_id = str(member.id)
if not member_id in self.users:
await ctx.send("Can't identify a member")
else:
embed = discord.Embed(color=member.color, timestamp=ctx.message.created_at)
embed.set_author(name=f'Level - {member}', icon_url=self.bot.user.avatar_url)
embed.add_field(name='Level', value=self.users[member_id]['level'])
embed.add_field(name='XP', value=self.users[member_id]['exp'])
await ctx.send(embed=embed)
def setup(bot):
bot.add_cog(Levels(bot))
推荐阅读
- android - 无法在 Android Studio 3.4.2 中使用 Picasso 加载图像
- mysql - 使用mysql上的三个表获取按类别分组的摘要
- html - 在引导列中放置一个 div 会将内容推送到新行
- php - 在后端检查 Google ReCaptcha 是否成功
- c# - 按下按钮并成功重定向到另一个页面后,如何禁用导航栏链接?
- python - 仅打印一行
- android - 什么是 json 数组的限制以及如何克服它
- r - 我尝试使用 R 读取.csv(逗号分隔),但某些列将“/”作为字符(未分隔)
- javascript - “脚本已损坏”但可在 codepen 中使用
- html - 如何在实时网站上强制背景图像刷新?