mirror of
https://github.com/avipatilpro/FileStreamBot.git
synced 2026-01-16 06:42:54 -03:00
161 lines
5.9 KiB
Python
161 lines
5.9 KiB
Python
import os
|
||
import time
|
||
import string
|
||
import random
|
||
import asyncio
|
||
import aiofiles
|
||
import datetime
|
||
|
||
from FileStream.utils.broadcast_helper import send_msg
|
||
from FileStream.utils.database import Database
|
||
from FileStream.bot import FileStream
|
||
from FileStream.server.exceptions import FIleNotFound
|
||
from FileStream.config import Telegram, Server
|
||
from pyrogram import filters, Client
|
||
from pyrogram.types import Message
|
||
from pyrogram.enums.parse_mode import ParseMode
|
||
|
||
db = Database(Telegram.DATABASE_URL, Telegram.SESSION_NAME)
|
||
broadcast_ids = {}
|
||
|
||
|
||
@FileStream.on_message(filters.command("status") & filters.private & filters.user(Telegram.OWNER_ID))
|
||
async def sts(c: Client, m: Message):
|
||
await m.reply_text(text=f"""**Total Users in DB:** `{await db.total_users_count()}`
|
||
**Banned Users in DB:** `{await db.total_banned_users_count()}`
|
||
**Total Links Generated: ** `{await db.total_files()}`"""
|
||
, parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
|
||
|
||
@FileStream.on_message(filters.command("ban") & filters.private & filters.user(Telegram.OWNER_ID))
|
||
async def sts(b, m: Message):
|
||
id = m.text.split("/ban ")[-1]
|
||
if not await db.is_user_banned(int(id)):
|
||
try:
|
||
await db.ban_user(int(id))
|
||
await db.delete_user(int(id))
|
||
await m.reply_text(text=f"`{id}`** is Banned** ", parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
if not str(id).startswith('-100'):
|
||
await b.send_message(
|
||
chat_id=id,
|
||
text="**Your Banned to Use The Bot**",
|
||
parse_mode=ParseMode.MARKDOWN,
|
||
disable_web_page_preview=True
|
||
)
|
||
except Exception as e:
|
||
await m.reply_text(text=f"**something went wrong: {e}** ", parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
else:
|
||
await m.reply_text(text=f"`{id}`** is Already Banned** ", parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
|
||
|
||
@FileStream.on_message(filters.command("unban") & filters.private & filters.user(Telegram.OWNER_ID))
|
||
async def sts(b, m: Message):
|
||
id = m.text.split("/unban ")[-1]
|
||
if await db.is_user_banned(int(id)):
|
||
try:
|
||
await db.unban_user(int(id))
|
||
await m.reply_text(text=f"`{id}`** is Unbanned** ", parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
if not str(id).startswith('-100'):
|
||
await b.send_message(
|
||
chat_id=id,
|
||
text="**Your Unbanned now Use can use The Bot**",
|
||
parse_mode=ParseMode.MARKDOWN,
|
||
disable_web_page_preview=True
|
||
)
|
||
except Exception as e:
|
||
await m.reply_text(text=f"** something went wrong: {e}**", parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
else:
|
||
await m.reply_text(text=f"`{id}`** is not Banned** ", parse_mode=ParseMode.MARKDOWN, quote=True)
|
||
|
||
|
||
@FileStream.on_message(filters.command("broadcast") & filters.private & filters.user(Telegram.OWNER_ID) & filters.reply)
|
||
async def broadcast_(c, m):
|
||
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 initiated! You will be notified with log file when all the users are notified."
|
||
)
|
||
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
|
||
)
|
||
)
|
||
try:
|
||
await out.edit_text(f"Broadcast Status\n\ncurrent: {done}\nfailed:{failed}\nsuccess: {success}")
|
||
except:
|
||
pass
|
||
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
|
||
)
|
||
os.remove('broadcast.txt')
|
||
|
||
|
||
@FileStream.on_message(filters.command("del") & filters.private & filters.user(Telegram.OWNER_ID))
|
||
async def sts(c: Client, m: Message):
|
||
file_id = m.text.split(" ")[-1]
|
||
try:
|
||
file_info = await db.get_file(file_id)
|
||
except FIleNotFound:
|
||
await m.reply_text(
|
||
text=f"**ꜰɪʟᴇ ᴀʟʀᴇᴀᴅʏ ᴅᴇʟᴇᴛᴇᴅ**",
|
||
quote=True
|
||
)
|
||
return
|
||
await db.delete_one_file(file_info['_id'])
|
||
await db.count_links(file_info['user_id'], "-")
|
||
await m.reply_text(
|
||
text=f"**Fɪʟᴇ Dᴇʟᴇᴛᴇᴅ Sᴜᴄᴄᴇssғᴜʟʟʏ !** ",
|
||
quote=True
|
||
)
|
||
|
||
|
||
|