Отсутствует 1 обязательный позиционный аргумент: 'число' - PullRequest
0 голосов
/ 25 сентября 2018

Привет, у меня проблема с запуском асинхронного цикла, он запрашивает 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 голосов
/ 26 сентября 2018

Я исправил некоторые ошибки здесь.Попробуйте прочитать документацию на 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)
0 голосов
/ 25 сентября 2018
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 сообщений до этой даты (это настраивается).Затем он спит в течение дня и повторяется.

...