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

时间:2018-09-25 20:00:26

标签: python python-3.x discord discord.py discord.py-rewrite

嗨,我在运行asyncio循环时遇到问题,要求输入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)

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

loop = asyncio.get_event_loop()
loop.create_task(q.purge_modlog())

这应该使事件(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

如果有人可以帮助我,那就太好了。要添加此模块。

2 个答案:

答案 0 :(得分:0)

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事件,它为具有我们要维护的频道的每台服务器启动后台任务(这可能会循环浏览频道列表或类似内容)。

TextChannel.purge协程会处理所有实际的清除操作。我们只给它传递了一个datetime对象,它从该日期之前删除了100条消息(这是可配置的)。然后睡觉一天,然后重复。

答案 1 :(得分:0)

我在这里更正了一些错误。尝试通读有关purging消息的discord.py文档。

 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)