-
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f086caf
commit 9f78c3f
Showing
1 changed file
with
16 additions
and
95 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,97 +1,18 @@ | ||
import time | ||
import string | ||
import random | ||
import asyncio | ||
import datetime | ||
import aiofiles.os | ||
import traceback | ||
from config import BROADCAST_AS_COPY | ||
from helpers.access_db import db | ||
from pyrogram.types import Message | ||
from pyrogram.errors import FloodWait, InputUserDeactivated, UserIsBlocked, PeerIdInvalid | ||
from pyrogram import Client ,filters | ||
import os | ||
from helper.database import getid | ||
ADMIN = int(os.environ.get("ADMIN", 1696230986)) | ||
|
||
broadcast_ids = {} | ||
|
||
async def send_msg(user_id, message): | ||
try: | ||
if BROADCAST_AS_COPY is False: | ||
await message.forward(chat_id=user_id) | ||
elif BROADCAST_AS_COPY is True: | ||
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_handler(m: Message): | ||
all_users = await db.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 Started! You will be notified with log file when all the users are notified 😊\n\n@szimagebot 🤖" | ||
) | ||
start_time = time.time() | ||
total_users = await db.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 db.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.\n\n@szimagebot 🤖", | ||
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.\n\n@szimagebot 🤖", | ||
quote=True | ||
) | ||
await aiofiles.os.remove('broadcast.txt') | ||
@Client.on_message(filters.private & filters.user(ADMIN) & filters.command(["broadcast"])) | ||
async def broadcast(bot, message): | ||
if (message.reply_to_message): | ||
ms = await message.reply_text("Geting All ids from database ...........") | ||
ids = getid() | ||
tot = len(ids) | ||
await ms.edit(f"Starting Broadcast .... \n Sending Message To {tot} Users") | ||
for id in ids: | ||
try: | ||
await message.reply_to_message.copy(id) | ||
except: | ||
pass |