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)
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}")
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)