(c, m)
| 27 | |
| 28 | @StreamBot.on_message(filters.command("broadcast") & filters.private & filters.user(list(Var.OWNER_ID))) |
| 29 | async def broadcast_(c, m): |
| 30 | user_id=m.from_user.id |
| 31 | out = await m.reply_text( |
| 32 | text=f"Broadcast initiated! You will be notified with log file when all the users are notified." |
| 33 | ) |
| 34 | all_users = await db.get_all_users() |
| 35 | broadcast_msg = m.reply_to_message |
| 36 | while True: |
| 37 | broadcast_id = ''.join([random.choice(string.ascii_letters) for i in range(3)]) |
| 38 | if not Broadcast_IDs.get(broadcast_id): |
| 39 | break |
| 40 | start_time = time.time() |
| 41 | total_users = await db.total_users_count() |
| 42 | done = 0 |
| 43 | failed = 0 |
| 44 | success = 0 |
| 45 | Broadcast_IDs[broadcast_id] = dict( |
| 46 | total=total_users, |
| 47 | current=done, |
| 48 | failed=failed, |
| 49 | success=success |
| 50 | ) |
| 51 | async with aiofiles.open('broadcast.txt', 'w') as broadcast_log_file: |
| 52 | async for user in all_users: |
| 53 | sts, msg = await send_msg( |
| 54 | user_id=int(user['id']), |
| 55 | message=broadcast_msg |
| 56 | ) |
| 57 | if msg is not None: |
| 58 | await broadcast_log_file.write(msg) |
| 59 | if sts == 200: |
| 60 | success += 1 |
| 61 | else: |
| 62 | failed += 1 |
| 63 | if sts == 400: |
| 64 | await db.delete_user(user['id']) |
| 65 | done += 1 |
| 66 | if Broadcast_IDs.get(broadcast_id) is None: |
| 67 | break |
| 68 | else: |
| 69 | Broadcast_IDs[broadcast_id].update( |
| 70 | dict( |
| 71 | current=done, |
| 72 | failed=failed, |
| 73 | success=success |
| 74 | ) |
| 75 | ) |
| 76 | if Broadcast_IDs.get(broadcast_id): |
| 77 | Broadcast_IDs.pop(broadcast_id) |
| 78 | completed_in = datetime.timedelta(seconds=int(time.time() - start_time)) |
| 79 | await asyncio.sleep(3) |
| 80 | await out.delete() |
| 81 | if failed == 0: |
| 82 | await m.reply_text( |
| 83 | text=f"broadcast completed in `{completed_in}`\n\nTotal users {total_users}.\nTotal done {done}, {success} success and {failed} failed.", |
| 84 | quote=True |
| 85 | ) |
| 86 | else: |
nothing calls this directly
no test coverage detected