Spaces:
Sleeping
Sleeping
# (c) @AbirHasan2005 | X-Noid | |
import traceback, datetime, asyncio, string, random, time, os, aiofiles, aiofiles.os | |
from database.access import clinton | |
from pyrogram import filters | |
from pyrogram import Client as Clinton | |
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton | |
from pyrogram.errors import FloodWait, InputUserDeactivated, UserIsBlocked, PeerIdInvalid | |
from config import Config | |
broadcast_ids = {} | |
async def send_msg(user_id, message): | |
try: | |
await message.copy(chat_id=user_id) | |
return 200, None | |
except FloodWait as e: | |
await asyncio.sleep(e.x) | |
return send_msg(user_id, message) | |
except InputUserDeactivated: | |
return 400, f"{user_id} : deactivated\n" | |
except UserIsBlocked: | |
return 400, f"{user_id} : blocked the bot\n" | |
except PeerIdInvalid: | |
return 400, f"{user_id} : user id invalid\n" | |
except Exception as e: | |
return 500, f"{user_id} : {traceback.format_exc()}\n" | |
async def broadcast_(c, m): | |
if m.from_user.id != Config.OWNER_ID: | |
return | |
all_users = await clinton.get_all_users() | |
broadcast_msg = m.reply_to_message | |
while True: | |
broadcast_id = ''.join([random.choice(string.ascii_letters) for i in range(3)]) | |
if not broadcast_ids.get(broadcast_id): | |
break | |
out = await m.reply_text( | |
text = f"Broadcast initiated! You will be notified with log file when all the users are notified." | |
) | |
start_time = time.time() | |
total_users = await clinton.total_users_count() | |
done = 0 | |
failed = 0 | |
success = 0 | |
broadcast_ids[broadcast_id] = dict( | |
total = total_users, | |
current = done, | |
failed = failed, | |
success = success | |
) | |
async with aiofiles.open('broadcast.txt', 'w') as broadcast_log_file: | |
async for user in all_users: | |
sts, msg = await send_msg( | |
user_id = int(user['id']), | |
message = broadcast_msg | |
) | |
if msg is not None: | |
await broadcast_log_file.write(msg) | |
if sts == 200: | |
success += 1 | |
else: | |
failed += 1 | |
if sts == 400: | |
await clinton.delete_user(user['id']) | |
done += 1 | |
if broadcast_ids.get(broadcast_id) is None: | |
break | |
else: | |
broadcast_ids[broadcast_id].update( | |
dict( | |
current = done, | |
failed = failed, | |
success = success | |
) | |
) | |
if broadcast_ids.get(broadcast_id): | |
broadcast_ids.pop(broadcast_id) | |
completed_in = datetime.timedelta(seconds=int(time.time()-start_time)) | |
await asyncio.sleep(3) | |
await out.delete() | |
if failed == 0: | |
await m.reply_text( | |
text=f"broadcast completed in `{completed_in}`\n\nTotal users {total_users}.\nTotal done {done}, {success} success and {failed} failed.", | |
quote=True | |
) | |
else: | |
await m.reply_document( | |
document='broadcast.txt', | |
caption=f"broadcast completed in `{completed_in}`\n\nTotal users {total_users}.\nTotal done {done}, {success} success and {failed} failed.", | |
quote=True | |
) | |
await aiofiles.os.remove('broadcast.txt') | |