nope
This commit is contained in:
parent
ba6b2b6d68
commit
396abcf558
@ -1,3 +0,0 @@
|
|||||||
"""plugins"""
|
|
||||||
|
|
||||||
__version__ = "0.4.0"
|
|
@ -1,76 +0,0 @@
|
|||||||
# Copyright (C) 2021 By VeezMusicProject
|
|
||||||
|
|
||||||
# ===========
|
|
||||||
# running bot
|
|
||||||
# ===========
|
|
||||||
import logging
|
|
||||||
import time
|
|
||||||
import sys
|
|
||||||
import asyncio
|
|
||||||
import glob
|
|
||||||
import importlib
|
|
||||||
from pathlib import Path
|
|
||||||
from pyrogram import Client, idle
|
|
||||||
from config import Veez
|
|
||||||
from bot.videoplayer import app
|
|
||||||
from bot.videoplayer import call_py
|
|
||||||
from helpers.loggings import LOG
|
|
||||||
|
|
||||||
|
|
||||||
bot = Client(
|
|
||||||
":memory:",
|
|
||||||
Veez.API_ID,
|
|
||||||
Veez.API_HASH,
|
|
||||||
bot_token=Veez.BOT_TOKEN,
|
|
||||||
plugins=dict(root="bot"),
|
|
||||||
)
|
|
||||||
|
|
||||||
StartTime = time.time()
|
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
|
||||||
|
|
||||||
_path = f"bot/*.py"
|
|
||||||
files = glob.glob(_path)
|
|
||||||
|
|
||||||
def load_plugins(plugin_name):
|
|
||||||
path = Path(f"bot/{plugin_name}.py")
|
|
||||||
name = "bot.{}".format(plugin_name)
|
|
||||||
spec = importlib.util.spec_from_file_location(name, path)
|
|
||||||
load = importlib.util.module_from_spec(spec)
|
|
||||||
spec.loader.exec_module(load)
|
|
||||||
sys.modules[f"bot." + plugin_name] = load
|
|
||||||
print("Imported => " + plugin_name)
|
|
||||||
|
|
||||||
async def start():
|
|
||||||
print('\n')
|
|
||||||
print('------------------ Initalizing VEEZ --------------------')
|
|
||||||
if bot:
|
|
||||||
await bot.start()
|
|
||||||
await app.start()
|
|
||||||
await call_py.start()
|
|
||||||
print('------------------------ DONE --------------------------')
|
|
||||||
print('------------------ Importing Modules -------------------')
|
|
||||||
for name in files:
|
|
||||||
with open(name) as a:
|
|
||||||
path_ = Path(a.name)
|
|
||||||
plugin_name = path_.stem
|
|
||||||
load_plugins(plugin_name.replace(".py", ""))
|
|
||||||
print('------------------- INITIATED VEEZ ---------------------')
|
|
||||||
print(' Logged in as User =>> {}'.format((await app.get_me()).first_name))
|
|
||||||
if bot:
|
|
||||||
print(' Logged in to Bots =>> {}'.format((await bot.get_me()).first_name))
|
|
||||||
print('--------------------------------------------------------')
|
|
||||||
await idle()
|
|
||||||
if __name__ == '__main__':
|
|
||||||
is_bot = bool(Veez.BOT_TOKEN)
|
|
||||||
loop.run_until_complete(start())
|
|
||||||
|
|
||||||
|
|
||||||
# bot.start()
|
|
||||||
# print("[STATUS]:✅ »» BOT CLIENT STARTED ««")
|
|
||||||
# app.start()
|
|
||||||
# print("[STATUS]:✅ »» USERBOT CLIENT STARTED ««")
|
|
||||||
# call_py.start()
|
|
||||||
# print("[STATUS]:✅ »» PYTGCALLS CLIENT STARTED ««")
|
|
||||||
# idle()
|
|
||||||
# print("[STATUS]:❌ »» BOT STOPPED ««")
|
|
137
bot/callback.py
137
bot/callback.py
@ -1,137 +0,0 @@
|
|||||||
# Copyright (C) 2021 By VeezMusicProject
|
|
||||||
|
|
||||||
from pyrogram import Client, filters
|
|
||||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
|
|
||||||
|
|
||||||
from config import Veez
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_callback_query(filters.regex("cbguide"))
|
|
||||||
async def cbguide(_, query: CallbackQuery):
|
|
||||||
await query.edit_message_text(
|
|
||||||
f"""❓ HOW TO USE THIS BOT:
|
|
||||||
|
|
||||||
1.) first, add me to your group.
|
|
||||||
2.) then promote me as admin and give all permissions except anonymous admin.
|
|
||||||
3.) add @{Veez.ASSISTANT_NAME } to your group.
|
|
||||||
4.) turn on the voice chat first before start to stream video.
|
|
||||||
5.) type /vplay (reply to video) to start streaming.
|
|
||||||
6.) type /vstop to end the video streaming.
|
|
||||||
|
|
||||||
📝 **note: stream & stop command can only be executed by group admin only!**
|
|
||||||
|
|
||||||
⚡ __Maintained by Veez Project Team__""",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🏡 Go Back", callback_data="cbstart")
|
|
||||||
]]
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_callback_query(filters.regex("cbstart"))
|
|
||||||
async def cbstart(_, query: CallbackQuery):
|
|
||||||
await query.edit_message_text(
|
|
||||||
f"✨ **Hello there, I am a telegram group video streaming bot.**\n\n💭 **I was created to stream videos in group "
|
|
||||||
f"video chats easily.**\n\n❔ **To find out how to use me, please press the help button below** 👇🏻",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"➕ Add me to your Group ➕", url=f"https://t.me/{Veez.BOT_USERNAME}?startgroup=true")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"❔ HOW TO USE THIS BOT", callback_data="cbguide")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🌐 Terms & Condition", callback_data="cbinfo")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"💬 Group", url=f"https://t.me/{Veez.GROUP_NAME}"),
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"📣 Channel", url=f"https://t.me/{Veez.CHANNEL_NAME}")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🧙🏻♂️ Owner", url=f"https://t.me/{Veez.OWNER_NAME}")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"📚 All Command List", callback_data="cblist")
|
|
||||||
]]
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_callback_query(filters.regex("cbinfo"))
|
|
||||||
async def cbinfo(_, query: CallbackQuery):
|
|
||||||
await query.edit_message_text(
|
|
||||||
f"""🌐 **bot information !**
|
|
||||||
|
|
||||||
🤖 __This bot was created to stream video in telegram group video chats using several methods from WebRTC.__
|
|
||||||
|
|
||||||
💡 __Powered by PyTgcalls the Async client API for the Telegram Group Calls, and Pyrogram the telegram MTProto API
|
|
||||||
Client Library and Framework in Pure Python for Users and Bots.__
|
|
||||||
|
|
||||||
👨🏻💻 __Thanks to the developers who participated in the development of this bot, the list of devs can be seen below:__
|
|
||||||
|
|
||||||
👩🏻✈️ » [Levina Shavila](https://github.com/levina-lab)
|
|
||||||
🤵🏻 » [Sammy-XD](https://github.com/Sammy-XD)
|
|
||||||
🤵🏻 » [Zxce3](https://github.com/Zxce3)
|
|
||||||
🤵🏻 » [Tofik Denianto](https://github.com/tofikdn)
|
|
||||||
🤵🏻 » [Shohih Abdul](https://github.com/DoellBarr)
|
|
||||||
|
|
||||||
__This bot licensed under GNU-GPL 3.0 License__""",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🏡 Go Back", callback_data="cbstart")
|
|
||||||
]]
|
|
||||||
),
|
|
||||||
disable_web_page_preview=True
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_callback_query(filters.regex("cblist"))
|
|
||||||
async def cblist(_, query: CallbackQuery):
|
|
||||||
await query.edit_message_text(
|
|
||||||
f"""📚 All Command List:
|
|
||||||
|
|
||||||
» /vplay (reply to video or yt/live url) - to stream video
|
|
||||||
» /vstop - stop the video streaming
|
|
||||||
» /song (song name) - download song from YT
|
|
||||||
» /vsong (video name) - download video from YT
|
|
||||||
» /lyric (song name) - lyric scrapper
|
|
||||||
» /vjoin - invite assistant join to your group
|
|
||||||
» /vleave - order assistant leave from your group
|
|
||||||
|
|
||||||
🎊 FUN CMD:
|
|
||||||
|
|
||||||
» /asupan - check it by yourself
|
|
||||||
» /chika - check it by yourself
|
|
||||||
» /wibu - check it by yourself
|
|
||||||
» /truth - check it by yourself
|
|
||||||
» /dare - check it by yourself
|
|
||||||
|
|
||||||
🔰 EXTRA CMD:
|
|
||||||
|
|
||||||
» /tts (reply to text) - text to speech
|
|
||||||
» /alive - check bot alive status
|
|
||||||
» /ping - check bot ping status
|
|
||||||
» /uptime - check bot uptime status
|
|
||||||
» /sysinfo - check bot system information
|
|
||||||
|
|
||||||
💡 SUDO ONLY:
|
|
||||||
|
|
||||||
» /rmd - remove all downloaded files
|
|
||||||
» /rmw - remove all downloaded raw files
|
|
||||||
» /leaveall - order assistant leave from all group
|
|
||||||
|
|
||||||
⚡ __Maintained by Veez Project Team__""",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🏡 Go Back", callback_data="cbstart")
|
|
||||||
]]
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_callback_query(filters.regex("cls"))
|
|
||||||
async def close(_, query: CallbackQuery):
|
|
||||||
await query.message.delete()
|
|
@ -1,69 +0,0 @@
|
|||||||
# Copyright (C) 2021 Veez Project
|
|
||||||
|
|
||||||
from pyrogram import Client, errors
|
|
||||||
from pyrogram.types import (
|
|
||||||
InlineQuery,
|
|
||||||
InlineQueryResultArticle,
|
|
||||||
InputTextMessageContent,
|
|
||||||
)
|
|
||||||
from youtubesearchpython import VideosSearch
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_inline_query()
|
|
||||||
async def inline(client: Client, query: InlineQuery):
|
|
||||||
answers = []
|
|
||||||
search_query = query.query.lower().strip().rstrip()
|
|
||||||
|
|
||||||
if search_query == "menu":
|
|
||||||
await client.answer_inline_query(
|
|
||||||
query.id,
|
|
||||||
results=menus,
|
|
||||||
switch_pm_text="Menu",
|
|
||||||
switch_pm_parameter="help",
|
|
||||||
cache_time=0,
|
|
||||||
)
|
|
||||||
if search_query == "":
|
|
||||||
await client.answer_inline_query(
|
|
||||||
query.id,
|
|
||||||
results=answers,
|
|
||||||
switch_pm_text="search a youtube video",
|
|
||||||
switch_pm_parameter="help",
|
|
||||||
cache_time=0,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
search = VideosSearch(search_query, limit=50)
|
|
||||||
|
|
||||||
for result in search.result()["result"]:
|
|
||||||
answers.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
title=result["title"],
|
|
||||||
description="{}, {}.".format(
|
|
||||||
result["duration"], result["viewCount"]["short"]
|
|
||||||
),
|
|
||||||
input_message_content=InputTextMessageContent(
|
|
||||||
"/vplay https://www.youtube.com/watch?v={}".format(result["id"])
|
|
||||||
),
|
|
||||||
thumb_url=result["thumbnails"][0]["url"],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
|
||||||
await query.answer(results=answers, cache_time=0)
|
|
||||||
except errors.QueryIdInvalid:
|
|
||||||
await query.answer(
|
|
||||||
results=answers,
|
|
||||||
cache_time=0,
|
|
||||||
switch_pm_text="Error: search timed out",
|
|
||||||
switch_pm_parameter="",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# ==================
|
|
||||||
# Tested
|
|
||||||
|
|
||||||
menus = [
|
|
||||||
InlineQueryResultArticle(title="Start", description="Start a bot",
|
|
||||||
input_message_content=InputTextMessageContent("/start")),
|
|
||||||
InlineQueryResultArticle(title="Info Bot", description="Info about this bot",
|
|
||||||
input_message_content=InputTextMessageContent("/info")),
|
|
||||||
]
|
|
@ -1,47 +0,0 @@
|
|||||||
# Copyright (C) 2021 By VeezMusicProject
|
|
||||||
|
|
||||||
import os
|
|
||||||
from pyrogram import Client, filters
|
|
||||||
from pyrogram.types import Message
|
|
||||||
from helpers.filters import command
|
|
||||||
from helpers.decorators import sudo_users_only, errors
|
|
||||||
|
|
||||||
downloads = os.path.realpath("bot/downloads")
|
|
||||||
raw = os.path.realpath(".")
|
|
||||||
|
|
||||||
@Client.on_message(command(["rmd", "cleardl"]) & ~filters.edited)
|
|
||||||
@errors
|
|
||||||
@sudo_users_only
|
|
||||||
async def clear_downloads(_, message: Message):
|
|
||||||
ls_dir = os.listdir(downloads)
|
|
||||||
if ls_dir:
|
|
||||||
for file in os.listdir(downloads):
|
|
||||||
os.remove(os.path.join(downloads, file))
|
|
||||||
await message.reply_text("✅ **deleted all downloaded files**")
|
|
||||||
else:
|
|
||||||
await message.reply_text("❌ **no files downloaded**")
|
|
||||||
|
|
||||||
@Client.on_message(command(["clean", "wipe", "rmw"]) & ~filters.edited)
|
|
||||||
@errors
|
|
||||||
@sudo_users_only
|
|
||||||
async def clear_raw(_, message: Message):
|
|
||||||
ls_dir = os.listdir(raw)
|
|
||||||
if ls_dir:
|
|
||||||
for file in os.listdir(raw):
|
|
||||||
if file.endswith('.raw'):
|
|
||||||
os.remove(os.path.join(raw, file))
|
|
||||||
await message.reply_text("✅ **deleted all raw files**")
|
|
||||||
else:
|
|
||||||
await message.reply_text("❌ **no raw files**")
|
|
||||||
|
|
||||||
@Client.on_message(command(["dahlah"]) & ~filters.edited)
|
|
||||||
# edit if u want
|
|
||||||
async def haduhh(_, message: Message):
|
|
||||||
pth = os.path.realpath(".")
|
|
||||||
ls_dir = os.listdir(pth)
|
|
||||||
if ls_dir:
|
|
||||||
for dta in os.listdir(pth):
|
|
||||||
os.system("rm -rf *.raw *.jpg")
|
|
||||||
await message.reply_text("Oke")
|
|
||||||
else:
|
|
||||||
await message.reply_text("tadi udah")
|
|
263
bot/song.py
263
bot/song.py
@ -1,263 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
import asyncio
|
|
||||||
import math
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
from random import randint
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
import aiofiles
|
|
||||||
import aiohttp
|
|
||||||
import wget
|
|
||||||
import yt_dlp
|
|
||||||
from pyrogram import Client, filters
|
|
||||||
from pyrogram.errors import FloodWait, MessageNotModified
|
|
||||||
from pyrogram.types import Message
|
|
||||||
from youtube_search import YoutubeSearch
|
|
||||||
from yt_dlp import YoutubeDL
|
|
||||||
|
|
||||||
from config import BOT_USERNAME as bn
|
|
||||||
from helpers.decorators import humanbytes
|
|
||||||
from helpers.filters import command
|
|
||||||
|
|
||||||
|
|
||||||
ydl_opts = {
|
|
||||||
'format':'best',
|
|
||||||
'keepvideo':True,
|
|
||||||
'prefer_ffmpeg':False,
|
|
||||||
'geo_bypass':True,
|
|
||||||
'outtmpl':'%(title)s.%(ext)s',
|
|
||||||
'quite':True
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["song", f"song@{bn}"]) & ~filters.edited)
|
|
||||||
def song(_, message):
|
|
||||||
query = " ".join(message.command[1:])
|
|
||||||
m = message.reply("🔎 finding song...")
|
|
||||||
ydl_ops = {"format": "bestaudio[ext=m4a]"}
|
|
||||||
try:
|
|
||||||
results = YoutubeSearch(query, max_results=1).to_dict()
|
|
||||||
link = f"https://youtube.com{results[0]['url_suffix']}"
|
|
||||||
title = results[0]["title"][:40]
|
|
||||||
thumbnail = results[0]["thumbnails"][0]
|
|
||||||
thumb_name = f"thumb{title}.jpg"
|
|
||||||
thumb = requests.get(thumbnail, allow_redirects=True)
|
|
||||||
open(thumb_name, "wb").write(thumb.content)
|
|
||||||
duration = results[0]["duration"]
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
m.edit("❌ song not found.\n\nplease give a valid song name.")
|
|
||||||
print(str(e))
|
|
||||||
return
|
|
||||||
m.edit("📥 downloading...")
|
|
||||||
try:
|
|
||||||
with yt_dlp.YoutubeDL(ydl_ops) as ydl:
|
|
||||||
info_dict = ydl.extract_info(link, download=False)
|
|
||||||
audio_file = ydl.prepare_filename(info_dict)
|
|
||||||
ydl.process_info(info_dict)
|
|
||||||
rep = f"**🎧 Uploader @{bn}**"
|
|
||||||
secmul, dur, dur_arr = 1, 0, duration.split(":")
|
|
||||||
for i in range(len(dur_arr) - 1, -1, -1):
|
|
||||||
dur += int(float(dur_arr[i])) * secmul
|
|
||||||
secmul *= 60
|
|
||||||
message.reply_audio(
|
|
||||||
audio_file,
|
|
||||||
caption=rep,
|
|
||||||
thumb=thumb_name,
|
|
||||||
parse_mode="md",
|
|
||||||
title=title,
|
|
||||||
duration=dur,
|
|
||||||
)
|
|
||||||
m.delete()
|
|
||||||
except Exception as e:
|
|
||||||
m.edit("❌ error, wait for bot owner to fix")
|
|
||||||
print(e)
|
|
||||||
|
|
||||||
try:
|
|
||||||
os.remove(audio_file)
|
|
||||||
os.remove(thumb_name)
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
|
|
||||||
|
|
||||||
def get_text(message: Message) -> [None, str]:
|
|
||||||
text_to_return = message.text
|
|
||||||
if message.text is None:
|
|
||||||
return None
|
|
||||||
if " " not in text_to_return:
|
|
||||||
return None
|
|
||||||
|
|
||||||
try:
|
|
||||||
return message.text.split(None, 1)[1]
|
|
||||||
except IndexError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
async def progress(current, total, message, start, type_of_ps, file_name=None):
|
|
||||||
now = time.time()
|
|
||||||
diff = now - start
|
|
||||||
if round(diff % 10.00) == 0 or current == total:
|
|
||||||
percentage = current * 100 / total
|
|
||||||
speed = current / diff
|
|
||||||
elapsed_time = round(diff) * 1000
|
|
||||||
if elapsed_time == 0:
|
|
||||||
return
|
|
||||||
time_to_completion = round((total - current) / speed) * 1000
|
|
||||||
estimated_total_time = elapsed_time + time_to_completion
|
|
||||||
progress_str = "{0}{1} {2}%\n".format(
|
|
||||||
"".join("🔴" for _ in range(math.floor(percentage / 10))),
|
|
||||||
"".join("🔘" for _ in range(10 - math.floor(percentage / 10))),
|
|
||||||
round(percentage, 2),
|
|
||||||
)
|
|
||||||
|
|
||||||
tmp = progress_str + "{0} of {1}\nETA: {2}".format(
|
|
||||||
humanbytes(current), humanbytes(total), time_formatter(estimated_total_time)
|
|
||||||
)
|
|
||||||
if file_name:
|
|
||||||
try:
|
|
||||||
await message.edit(
|
|
||||||
"{}\n**File Name:** `{}`\n{}".format(type_of_ps, file_name, tmp)
|
|
||||||
)
|
|
||||||
except FloodWait as e:
|
|
||||||
await asyncio.sleep(e.x)
|
|
||||||
except MessageNotModified:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
await message.edit("{}\n{}".format(type_of_ps, tmp))
|
|
||||||
except FloodWait as e:
|
|
||||||
await asyncio.sleep(e.x)
|
|
||||||
except MessageNotModified:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def get_user(message: Message, text: str) -> [int, str, None]:
|
|
||||||
asplit = None if text is None else text.split(" ", 1)
|
|
||||||
user_s = None
|
|
||||||
reason_ = None
|
|
||||||
if message.reply_to_message:
|
|
||||||
user_s = message.reply_to_message.from_user.id
|
|
||||||
reason_ = text or None
|
|
||||||
elif asplit is None:
|
|
||||||
return None, None
|
|
||||||
elif len(asplit[0]) > 0:
|
|
||||||
user_s = int(asplit[0]) if asplit[0].isdigit() else asplit[0]
|
|
||||||
if len(asplit) == 2:
|
|
||||||
reason_ = asplit[1]
|
|
||||||
return user_s, reason_
|
|
||||||
|
|
||||||
|
|
||||||
def get_readable_time(seconds: int) -> str:
|
|
||||||
count = 0
|
|
||||||
ping_time = ""
|
|
||||||
time_list = []
|
|
||||||
time_suffix_list = ["s", "m", "h", "days"]
|
|
||||||
|
|
||||||
while count < 4:
|
|
||||||
count += 1
|
|
||||||
remainder, result = divmod(seconds, 60) if count < 3 else divmod(seconds, 24)
|
|
||||||
if seconds == 0 and remainder == 0:
|
|
||||||
break
|
|
||||||
time_list.append(int(result))
|
|
||||||
seconds = int(remainder)
|
|
||||||
|
|
||||||
for x in range(len(time_list)):
|
|
||||||
time_list[x] = str(time_list[x]) + time_suffix_list[x]
|
|
||||||
if len(time_list) == 4:
|
|
||||||
ping_time += time_list.pop() + ", "
|
|
||||||
|
|
||||||
time_list.reverse()
|
|
||||||
ping_time += ":".join(time_list)
|
|
||||||
|
|
||||||
return ping_time
|
|
||||||
|
|
||||||
|
|
||||||
def time_formatter(milliseconds: int) -> str:
|
|
||||||
seconds, milliseconds = divmod(int(milliseconds), 1000)
|
|
||||||
minutes, seconds = divmod(seconds, 60)
|
|
||||||
hours, minutes = divmod(minutes, 60)
|
|
||||||
days, hours = divmod(hours, 24)
|
|
||||||
tmp = (
|
|
||||||
((str(days) + " day(s), ") if days else "")
|
|
||||||
+ ((str(hours) + " hour(s), ") if hours else "")
|
|
||||||
+ ((str(minutes) + " minute(s), ") if minutes else "")
|
|
||||||
+ ((str(seconds) + " second(s), ") if seconds else "")
|
|
||||||
+ ((str(milliseconds) + " millisecond(s), ") if milliseconds else "")
|
|
||||||
)
|
|
||||||
return tmp[:-2]
|
|
||||||
|
|
||||||
|
|
||||||
def get_file_extension_from_url(url):
|
|
||||||
url_path = urlparse(url).path
|
|
||||||
basename = os.path.basename(url_path)
|
|
||||||
return basename.split(".")[-1]
|
|
||||||
|
|
||||||
|
|
||||||
async def download_song(url):
|
|
||||||
song_name = f"{randint(6969, 6999)}.mp3"
|
|
||||||
async with aiohttp.ClientSession() as session:
|
|
||||||
async with session.get(url) as resp:
|
|
||||||
if resp.status == 200:
|
|
||||||
f = await aiofiles.open(song_name, mode="wb")
|
|
||||||
await f.write(await resp.read())
|
|
||||||
await f.close()
|
|
||||||
return song_name
|
|
||||||
|
|
||||||
|
|
||||||
is_downloading = False
|
|
||||||
|
|
||||||
|
|
||||||
def time_to_seconds(times):
|
|
||||||
stringt = str(times)
|
|
||||||
return sum(int(x) * 60 ** i for i, x in enumerate(reversed(stringt.split(":"))))
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(
|
|
||||||
command(["vsong", f"vsong@{bn}", "video", f"video@{bn}"]) & ~filters.edited
|
|
||||||
)
|
|
||||||
async def vsong(client, message):
|
|
||||||
ydl_opts = {
|
|
||||||
"format": "best",
|
|
||||||
"keepvideo": True,
|
|
||||||
"prefer_ffmpeg": False,
|
|
||||||
"geo_bypass": True,
|
|
||||||
"outtmpl": "%(title)s.%(ext)s",
|
|
||||||
"quite": True,
|
|
||||||
}
|
|
||||||
query = " ".join(message.command[1:])
|
|
||||||
try:
|
|
||||||
results = YoutubeSearch(query, max_results=1).to_dict()
|
|
||||||
link = f"https://youtube.com{results[0]['url_suffix']}"
|
|
||||||
title = results[0]["title"][:40]
|
|
||||||
thumbnail = results[0]["thumbnails"][0]
|
|
||||||
thumb_name = f"{title}.jpg"
|
|
||||||
thumb = requests.get(thumbnail, allow_redirects=True)
|
|
||||||
open(thumb_name, "wb").write(thumb.content)
|
|
||||||
results[0]["duration"]
|
|
||||||
results[0]["url_suffix"]
|
|
||||||
results[0]["views"]
|
|
||||||
message.from_user.mention
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
try:
|
|
||||||
msg = await message.reply("📥 **downloading video...**")
|
|
||||||
with YoutubeDL(ydl_opts) as ytdl:
|
|
||||||
ytdl_data = ytdl.extract_info(link, download=True)
|
|
||||||
file_name = ytdl.prepare_filename(ytdl_data)
|
|
||||||
except Exception as e:
|
|
||||||
return await msg.edit(f"🚫 **error:** {e}")
|
|
||||||
preview = wget.download(thumbnail)
|
|
||||||
await msg.edit("📤 **uploading video...**")
|
|
||||||
await message.reply_video(
|
|
||||||
file_name,
|
|
||||||
duration=int(ytdl_data["duration"]),
|
|
||||||
thumb=preview,
|
|
||||||
caption=ytdl_data["title"],
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
os.remove(file_name)
|
|
||||||
await msg.delete()
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
125
bot/start.py
125
bot/start.py
@ -1,125 +0,0 @@
|
|||||||
# Copyright (C) 2021 By VeezMusicProject
|
|
||||||
|
|
||||||
from datetime import datetime
|
|
||||||
from time import time
|
|
||||||
|
|
||||||
from pyrogram import Client, filters
|
|
||||||
from pyrogram.types import Message, InlineKeyboardButton, InlineKeyboardMarkup
|
|
||||||
|
|
||||||
from config import Veez
|
|
||||||
from helpers.decorators import sudo_users_only
|
|
||||||
from helpers.filters import command
|
|
||||||
|
|
||||||
START_TIME = datetime.utcnow()
|
|
||||||
START_TIME_ISO = START_TIME.replace(microsecond=0).isoformat()
|
|
||||||
TIME_DURATION_UNITS = (
|
|
||||||
('week', 60 * 60 * 24 * 7),
|
|
||||||
('day', 60 * 60 * 24),
|
|
||||||
('hour', 60 * 60),
|
|
||||||
('min', 60),
|
|
||||||
('sec', 1)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def _human_time_duration(seconds):
|
|
||||||
if seconds == 0:
|
|
||||||
return 'inf'
|
|
||||||
parts = []
|
|
||||||
for unit, div in TIME_DURATION_UNITS:
|
|
||||||
amount, seconds = divmod(int(seconds), div)
|
|
||||||
if amount > 0:
|
|
||||||
parts.append('{} {}{}'
|
|
||||||
.format(amount, unit, "" if amount == 1 else "s"))
|
|
||||||
return ', '.join(parts)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["start", f"start@{Veez.BOT_USERNAME}"]))
|
|
||||||
async def start(_, m: Message):
|
|
||||||
if m.chat.type == "private":
|
|
||||||
await m.reply_text(
|
|
||||||
f"✨ **Hello there, I am a telegram group video streaming bot.**\n\n💭 **I was created to stream videos in group "
|
|
||||||
f"video chats easily.**\n\n❔ **To find out how to use me, please press the help button below** 👇🏻",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"➕ Add me to your Group ➕", url=f"https://t.me/{Veez.BOT_USERNAME}?startgroup=true")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"❔ HOW TO USE THIS BOT", callback_data="cbguide")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🌐 Terms & Condition", callback_data="cbinfo")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"💬 Group", url="https://t.me/VeezSupportGroup"),
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"📣 Channel", url="https://t.me/levinachannel")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"👩🏻💻 Developer", url="https://t.me/dlwrml")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"📚 All Command List", callback_data="cblist")
|
|
||||||
]]
|
|
||||||
))
|
|
||||||
else:
|
|
||||||
await m.reply_text("**✨ bot is online now ✨**",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"❔ HOW TO USE THIS BOT", callback_data="cbguide")
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"🌐 Search Youtube", switch_inline_query='')
|
|
||||||
], [
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"📚 Command List", callback_data="cblist")
|
|
||||||
]]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["alive", f"alive@{Veez.BOT_USERNAME}"]) & filters.group & ~filters.edited)
|
|
||||||
async def alive(_, m: Message):
|
|
||||||
current_time = datetime.utcnow()
|
|
||||||
uptime_sec = (current_time - START_TIME).total_seconds()
|
|
||||||
uptime = await _human_time_duration(int(uptime_sec))
|
|
||||||
await m.reply_text(
|
|
||||||
f"""✅ **bot is running**\n<b>💠 **uptime:**</b> `{uptime}`""",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"✨ Group", url=f"https://t.me/VeezSupportGroup"
|
|
||||||
),
|
|
||||||
InlineKeyboardButton(
|
|
||||||
"📣 Channel", url=f"https://t.me/levinachannel"
|
|
||||||
)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["ping", f"ping@{Veez.BOT_USERNAME}"]) & ~filters.edited)
|
|
||||||
async def ping_pong(_, m: Message):
|
|
||||||
sturt = time()
|
|
||||||
m_reply = await m.reply_text("pinging...")
|
|
||||||
delta_ping = time() - sturt
|
|
||||||
await m_reply.edit_text(
|
|
||||||
"🏓 `PONG!!`\n"
|
|
||||||
f"⚡️ `{delta_ping * 1000:.3f} ms`"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["uptime", f"uptime@{Veez.BOT_USERNAME}"]) & ~filters.edited)
|
|
||||||
@sudo_users_only
|
|
||||||
async def get_uptime(_, m: Message):
|
|
||||||
current_time = datetime.utcnow()
|
|
||||||
uptime_sec = (current_time - START_TIME).total_seconds()
|
|
||||||
uptime = await _human_time_duration(int(uptime_sec))
|
|
||||||
await m.reply_text(
|
|
||||||
"🤖 bot status 🤖\n\n"
|
|
||||||
f"• **uptime:** `{uptime}`\n"
|
|
||||||
f"• **start time:** `{START_TIME_ISO}`"
|
|
||||||
)
|
|
@ -1,53 +0,0 @@
|
|||||||
# Copyright (C) 2021 Veez Project
|
|
||||||
|
|
||||||
import platform
|
|
||||||
import re
|
|
||||||
import socket
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
import psutil
|
|
||||||
from pyrogram import Client, filters
|
|
||||||
from config import Veez
|
|
||||||
from helpers.decorators import sudo_users_only, humanbytes
|
|
||||||
from helpers.filters import command
|
|
||||||
|
|
||||||
|
|
||||||
# FETCH SYSINFO
|
|
||||||
|
|
||||||
@Client.on_message(command(["sysinfo", f"sysinfo@{Veez.BOT_USERNAME}"]) & ~filters.edited)
|
|
||||||
@sudo_users_only
|
|
||||||
async def give_sysinfo(client, message):
|
|
||||||
splatform = platform.system()
|
|
||||||
platform_release = platform.release()
|
|
||||||
platform_version = platform.version()
|
|
||||||
architecture = platform.machine()
|
|
||||||
hostname = socket.gethostname()
|
|
||||||
ip_address = socket.gethostbyname(socket.gethostname())
|
|
||||||
mac_address = ":".join(re.findall("..", "%012x" % uuid.getnode()))
|
|
||||||
processor = platform.processor()
|
|
||||||
ram = humanbytes(round(psutil.virtual_memory().total))
|
|
||||||
cpu_freq = psutil.cpu_freq().current
|
|
||||||
if cpu_freq >= 1000:
|
|
||||||
cpu_freq = f"{round(cpu_freq / 1000, 2)}GHz"
|
|
||||||
else:
|
|
||||||
cpu_freq = f"{round(cpu_freq, 2)}MHz"
|
|
||||||
du = psutil.disk_usage(client.workdir)
|
|
||||||
psutil.disk_io_counters()
|
|
||||||
disk = f"{humanbytes(du.used)} / {humanbytes(du.total)} " f"({du.percent}%)"
|
|
||||||
cpu_len = len(psutil.Process().cpu_affinity())
|
|
||||||
somsg = f"""**🖥 SYSTEM INFO**
|
|
||||||
|
|
||||||
**PlatForm :** `{splatform}`
|
|
||||||
**PlatForm - Release :** `{platform_release}`
|
|
||||||
**PlatFork - Version :** `{platform_version}`
|
|
||||||
**Architecture :** `{architecture}`
|
|
||||||
**Hostname :** `{hostname}`
|
|
||||||
**IP :** `{ip_address}`
|
|
||||||
**Mac :** `{mac_address}`
|
|
||||||
**Processor :** `{processor}`
|
|
||||||
**Ram : ** `{ram}`
|
|
||||||
**CPU :** `{cpu_len}`
|
|
||||||
**CPU FREQ :** `{cpu_freq}`
|
|
||||||
**DISK :** `{disk}`
|
|
||||||
"""
|
|
||||||
await message.reply(somsg)
|
|
@ -1,88 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
from helpers.filters import command
|
|
||||||
from pyrogram import Client, filters
|
|
||||||
from config import BOT_USERNAME, SUDO_USERS
|
|
||||||
from pyrogram.errors import UserAlreadyParticipant
|
|
||||||
from helpers.decorators import authorized_users_only, errors
|
|
||||||
|
|
||||||
@Client.on_message(
|
|
||||||
command(["userbotjoin", f"userbotjoin@{BOT_USERNAME}"]) & ~filters.private & ~filters.bot
|
|
||||||
)
|
|
||||||
@authorized_users_only
|
|
||||||
@errors
|
|
||||||
async def addchannel(client, message):
|
|
||||||
chid = message.chat.id
|
|
||||||
try:
|
|
||||||
invitelink = await client.export_chat_invite_link(chid)
|
|
||||||
except:
|
|
||||||
await message.reply_text(
|
|
||||||
"<b>• **i'm not have permission:**\n\n» ❌ __Add Users__</b>",
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
|
||||||
user = await USER.get_me()
|
|
||||||
except:
|
|
||||||
user.first_name = "music assistant"
|
|
||||||
|
|
||||||
try:
|
|
||||||
await USER.join_chat(invitelink)
|
|
||||||
await USER.send_message(
|
|
||||||
message.chat.id, "🤖: i'm joined here for playing music on voice chat"
|
|
||||||
)
|
|
||||||
except UserAlreadyParticipant:
|
|
||||||
await message.reply_text(
|
|
||||||
f"<b>✅ userbot already joined chat</b>",
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
await message.reply_text(
|
|
||||||
f"<b>🛑 Flood Wait Error 🛑 \n\n User {user.first_name} couldn't join your group due to heavy join requests for userbot."
|
|
||||||
"\n\nor manually add assistant to your Group and try again</b>",
|
|
||||||
)
|
|
||||||
return
|
|
||||||
await message.reply_text(
|
|
||||||
f"<b>✅ userbot successfully joined chat</b>",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(
|
|
||||||
command(["userbotleave", f"userbotleave@{BOT_USERNAME}"]) & filters.group & ~filters.edited
|
|
||||||
)
|
|
||||||
@authorized_users_only
|
|
||||||
async def rem(client, message):
|
|
||||||
try:
|
|
||||||
await USER.send_message(message.chat.id, "✅ userbot successfully left chat")
|
|
||||||
await USER.leave_chat(message.chat.id)
|
|
||||||
except:
|
|
||||||
await message.reply_text(
|
|
||||||
"<b>user couldn't leave your group, may be floodwaits.\n\nor manually kick me from your group</b>"
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["leaveall", f"leaveall@{BOT_USERNAME}"]))
|
|
||||||
async def bye(client, message):
|
|
||||||
if message.from_user.id not in SUDO_USERS:
|
|
||||||
return
|
|
||||||
|
|
||||||
left = 0
|
|
||||||
failed = 0
|
|
||||||
lol = await message.reply("🔄 **userbot** leaving all chats !")
|
|
||||||
async for dialog in USER.iter_dialogs():
|
|
||||||
try:
|
|
||||||
await USER.leave_chat(dialog.chat.id)
|
|
||||||
left += 1
|
|
||||||
await lol.edit(
|
|
||||||
f"Userbot leaving all group...\n\nLeft: {left} chats.\nFailed: {failed} chats."
|
|
||||||
)
|
|
||||||
except:
|
|
||||||
failed += 1
|
|
||||||
await lol.edit(
|
|
||||||
f"Userbot leaving...\n\nLeft: {left} chats.\nFailed: {failed} chats."
|
|
||||||
)
|
|
||||||
await asyncio.sleep(0.7)
|
|
||||||
await client.send_message(
|
|
||||||
message.chat.id, f"Left {left} chats.\nFailed {failed} chats."
|
|
||||||
)
|
|
@ -1,36 +0,0 @@
|
|||||||
import logging
|
|
||||||
from pyrogram import Client
|
|
||||||
from config import BOT_USERNAME
|
|
||||||
from pyrogram.types import Message
|
|
||||||
from helpers.filters import command
|
|
||||||
from youtube_search import YoutubeSearch
|
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(
|
|
||||||
level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
||||||
)
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
logging.getLogger("pyrogram").setLevel(logging.WARNING)
|
|
||||||
|
|
||||||
|
|
||||||
@Client.on_message(command(["search", f"search@{BOT_USERNAME}"]))
|
|
||||||
async def ytsearch(_, message: Message):
|
|
||||||
try:
|
|
||||||
if len(message.command) < 2:
|
|
||||||
await message.reply_text("/search **needs an argument !**")
|
|
||||||
return
|
|
||||||
query = message.text.split(None, 1)[1]
|
|
||||||
m = await message.reply_text("🔎 **Searching...**")
|
|
||||||
results = YoutubeSearch(query, max_results=5).to_dict()
|
|
||||||
i = 0
|
|
||||||
text = ""
|
|
||||||
while i < 5:
|
|
||||||
text += f"🏷 **Name:** __{results[i]['title']}__\n"
|
|
||||||
text += f"⏱ **Duration:** `{results[i]['duration']}`\n"
|
|
||||||
text += f"👀 **Views:** `{results[i]['views']}`\n"
|
|
||||||
text += f"📣 **Channel:** {results[i]['channel']}\n"
|
|
||||||
text += f"🔗: https://www.youtube.com{results[i]['url_suffix']}\n\n"
|
|
||||||
i += 1
|
|
||||||
await m.edit(text, disable_web_page_preview=True)
|
|
||||||
except Exception as e:
|
|
||||||
await m.edit(str(e))
|
|
Loading…
Reference in New Issue
Block a user