缺少1个必需的位置参数:“number”

2024-04-29 00:38:53 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我在运行一个异步循环时遇到了一个问题,它要求一个missing 1 required positional argument: 'number'.

以下是我的工作:

async def purge_modlog(ctx, number):
    tomorrow = datetime.now()+timedelta(days=1)
    midnight = datetime(year=tomorrow.year, month=tomorrow.month, 
    day=tomorrow.day, hour=20, minute=35, second=0)
    number = int(number)
    server = before.server
    db = fileIO(self.direct, "load")
    if not server.id in db:
        return
    channel = db[server.id]["Channel"]
    if number > 99 or number < 1:
        await ctx.send("I can only delete messages within a range of 1 - 99", delete_after=10)
    else:
        author = ctx.message.author
        authorID = author.id
        mgs = []
        number = int(number)
        channel = modlog
        async for x in bot.logs_from((channel), limit = int(number+1)):
            mgs.append(x)
            await asyncio.sleep((midnight - datetime.now()).seconds)
            print("Deleting modlog messages 14 day or older")
            await asyncio.sleep(5) 
            await delete_messages(mgs)
            await ctx.send('Success!', delete_after=4)
            await asyncio.sleep(86400) # Wait 24 hours




def check_folder():
    if not os.path.exists('data/modlogset'):
        print('Creating data/modlogset folder...')
        os.makedirs('data/modlogset')


def check_file():
    f = 'data/modlogset/settings.json'
    if not fileIO(f, 'check'):
        print('Creating default settings.json...')
        fileIO(f, 'save', {})


def setup(bot):
    check_folder()
    check_file()
    q = ModLog(bot)
    loop = asyncio.get_event_loop()
    loop.create_task(q.purge_modlog())
    bot.add_cog(q)

在defdef setup(bot):下循环事件,可以看到

^{pr2}$

这应该循环事件(q.purge_modlog())我不确定我在这里做错了什么。我已经试过了(q.purge_modlog(ctx, number))

line 686, in setup
loop.create_task(q.purge_modlog(ctx, number))
NameError: name 'ctx' is not defined

如果有人能帮我那就太好了。添加这是一个模块。在


Tags: asyncionumberdataifserverdefcheckbot
2条回答
class ModLog:
    def __init__(self, bot):
        self.bot = bot
    async def on_ready(self):
        await self.bot.wait_until_ready()
        for guild in self.bot.guilds:
            channel = await self.get_channel(guild)
            if channel:
                self.bot.loop.create_task(self.modlog_purge(channel))
    async def get_channel(guild):
        # Whatever your logic for getting the Channel for a given guild is
    async def modlog_purge(self, channel):
        while True:
            now = datetime.utcnow()
            two_weeks_ago = now - timedelta(days=14)
            await channel.purge(before=two_weeks_ago)
            await asyncio.sleep(86400)

def setup(bot):
    q = ModLog(bot)
    bot.add_cog(q)

下面是我将如何构造它(我现在没有使用discord.py的计算机,因此可能有一些错误)。我们有一个on_ready事件,该事件为每个拥有我们想要维护的通道的服务器启动后台任务(这可能会在一个通道列表中循环,或者类似的东西)。在

实际的清除全部由^{}协同程序处理。我们只需向它传递一个datetime对象,它将从该日期之前删除100条消息(这是可配置的)。然后它会睡一天,然后重复。在

我在这里改正了一些错误。试着通读不和.py关于purging消息的文档。在

 class ModLog:
    def __init__(self, bot):
        self.bot = bot


async def on_ready(self):
    await self.bot.wait_until_ready()
    for server in self.bot.servers:
        channel = self.bot.get_channel("channel ID here")
        if channel:
            self.bot.loop.create_task(self.modlog_purge(channel))

async def modlog_purge(self, channel):
    while True:
        now = datetime.utcnow()
        two_weeks_ago = now - timedelta(days=14)
        await self.bot.purge_from(channel, before=two_weeks_ago)
        await asyncio.sleep(86400)

def setup(bot):
    q = ModLog(bot)
    bot.add_cog(q)

相关问题 更多 >