PagerMaid_Plugins_Pyro/clear_blocked/main.py

54 lines
2.0 KiB
Python
Raw Normal View History

import contextlib
from asyncio import sleep
from pyrogram.errors import FloodWait
from pyrogram.raw.functions.contacts import GetBlocked
2022-11-26 04:55:44 +00:00
from pyrogram.raw.types.contacts import BlockedSlice
from pagermaid.listener import listener
from pagermaid.enums import Client, Message
async def clear_blocked_func(client: Client, message: Message):
offset = 0
success, failed, skipped = 0, 0, 0
while True:
blocked = await client.invoke(GetBlocked(offset=offset, limit=100))
if not blocked.users:
break
for user in blocked.users:
if (user.bot or user.scam or user.fake) and not user.deleted:
skipped += 1
continue
try:
await client.unblock_user(user.id)
success += 1
except FloodWait as e:
with contextlib.suppress(Exception):
await message.edit(f"🧹 Clearing blocked users...\n\nWill run after {e.value} seconds.")
await sleep(e.value + 1)
2022-11-26 04:55:44 +00:00
with contextlib.suppress(Exception):
await message.edit("🧹 Clearing blocked users...")
await client.unblock_user(user.id)
success += 1
except Exception:
failed += 1
offset += 100
2022-11-26 04:55:44 +00:00
if (isinstance(blocked, BlockedSlice) and offset > blocked.count) or not isinstance(blocked, BlockedSlice):
break
return success, failed, skipped
@listener(command="clear_blocked", description="Clear blocked users.", need_admin=True)
async def clear_blocked(client: Client, message: Message):
""" Clear blocked users. """
message: Message = await message.edit("🧹 Clearing blocked users...")
try:
success, failed, skipped = await clear_blocked_func(client, message)
except Exception as e:
await message.edit(f"❌ Failed to clear blocked users: {e}")
return
await message.edit(f"🧹 Clear blocked users complete. \n"
f"Success: {success}, Failed: {failed}, Skipped: {skipped}")