Spaces:
Paused
Paused
| # (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') | |