Beispiel #1
0
    async def test_chain_list_gens(self):
        async def gen():
            for k in range(2, 9, 2):
                yield k

        it = ait.chain(slist, gen())
        for k in ["A", "B", "C", 2, 4, 6, 8]:
            self.assertEqual(await ait.next(it), k)
        with self.assertRaises(StopAsyncIteration):
            await ait.next(it)
Beispiel #2
0
    async def purge(self,
                    ctx,
                    end: MessageConverter,
                    begin: MessageConverter = None):
        """Delete a range of messages defined by two sentinel messages (inclusive)"""

        total = 0  # deleted total
        ref_time = ctx.message.created_at
        messages = ctx.history(after=end, before=begin, oldest_first=False)

        if not begin:
            messages.__anext__()  # skip invoking message

        # message matching is defined mathematically as,
        #   Selection = [Begin..End] ⊆ Messages
        #
        # for bulk-deletion specifically,
        #   BulkDelete = {m ∈ Selection | Age(m) ≤ 14}  [(2 ≤ |Selection| ≤ 100)]
        bulk_msgs = takewhile(lambda m: (ref_time - m.created_at).days < 15,
                              messages)

        async for bulk in chunked(bulk_msgs, 100):
            if len(bulk) == 1:
                messages = chain(bulk, messages)
                break  # queue remaining for manual deletion.

            await ctx.channel.delete_messages(bulk)  # 100 snowflakes/request
            total += len(bulk)

        # if can't bulk delete anymore, do manual.
        async for m in messages:
            await m.delete()
            total += 1

        await end.delete()
        await ctx.send(f"Purged {total+1} messages in {ctx.channel.mention}")
Beispiel #3
0
 async def test_chain_lists(self):
     it = ait.chain(slist, srange)
     for k in ["A", "B", "C", 1, 2, 3]:
         self.assertEqual(await ait.next(it), k)
     with self.assertRaises(StopAsyncIteration):
         await ait.next(it)