PagerMaid_Plugins_Pyro/clear_blocked/main.py
2023-07-01 20:18:58 +08:00

60 lines
2.1 KiB
Python

import contextlib
from asyncio import sleep
from pyrogram.errors import FloodWait
from pyrogram.raw.functions.contacts import GetBlocked
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)
with contextlib.suppress(Exception):
await message.edit("🧹 Clearing blocked users...")
await client.unblock_user(user.id)
success += 1
except Exception:
failed += 1
offset += 100
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}"
)