├── modules
├── __init__.py
├── handlers
│ └── __init__.py
├── Buttons
│ ├── InlineButtons.py
│ ├── __init__.py
│ ├── Strings.py
│ └── TextButton.py
└── download
│ ├── spotify.py
│ ├── instagram.py
│ ├── pinterest.py
│ ├── __init__.py
│ └── youtube.py
├── Database
├── Data
│ ├── Users.json
│ ├── Channels.json
│ └── AdminList.json
└── Database.py
├── Config
├── __init__.py
├── Config.py
└── client.py
├── requirements.txt
├── README.md
└── main.py
/modules/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/modules/handlers/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Database/Data/Users.json:
--------------------------------------------------------------------------------
1 | {
2 | "Users": [
3 | ]
4 | }
--------------------------------------------------------------------------------
/modules/Buttons/InlineButtons.py:
--------------------------------------------------------------------------------
1 | class InlineButton:
2 | ...
--------------------------------------------------------------------------------
/modules/download/spotify.py:
--------------------------------------------------------------------------------
1 | class SpotifyDownloader:
2 | ...
--------------------------------------------------------------------------------
/Database/Data/Channels.json:
--------------------------------------------------------------------------------
1 | {
2 | "ChannelsID": [
3 | ]
4 | }
--------------------------------------------------------------------------------
/modules/download/instagram.py:
--------------------------------------------------------------------------------
1 | class InstagramDownloader:
2 | ...
--------------------------------------------------------------------------------
/modules/download/pinterest.py:
--------------------------------------------------------------------------------
1 | class PinterestDownloader:
2 | ...
--------------------------------------------------------------------------------
/Config/__init__.py:
--------------------------------------------------------------------------------
1 | from .Config import Config
2 | from .client import client
--------------------------------------------------------------------------------
/Database/Data/AdminList.json:
--------------------------------------------------------------------------------
1 | {
2 | "Admins": [
3 |
4 | ]
5 | }
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | jdatetime==4.1.0
2 | pytube==12.1.3
3 | Telethon==1.27.0
4 |
5 |
--------------------------------------------------------------------------------
/modules/Buttons/__init__.py:
--------------------------------------------------------------------------------
1 | from .TextButton import TextButtons
2 | from .InlineButtons import InlineButton
--------------------------------------------------------------------------------
/Config/Config.py:
--------------------------------------------------------------------------------
1 |
2 | class Config:
3 | SESSION_NAME = "bot"
4 | API_ID = ...
5 | API_HASH = ""
6 | BOT_TOKEN = ""
7 | BOT_USERNAME = "" # without @ example : Testbot
8 |
--------------------------------------------------------------------------------
/modules/download/__init__.py:
--------------------------------------------------------------------------------
1 | from .youtube import YoutubeDownloader
2 | from .pinterest import PinterestDownloader
3 | from .instagram import InstagramDownloader
4 | from .spotify import SpotifyDownloader
--------------------------------------------------------------------------------
/Config/client.py:
--------------------------------------------------------------------------------
1 | from .Config import Config
2 | from telethon import TelegramClient
3 |
4 | try:
5 | client = TelegramClient(
6 | session= Config.SESSION_NAME,
7 | api_id= Config.API_ID,
8 | api_hash= Config.API_HASH,
9 | ).start(
10 | bot_token= Config.BOT_TOKEN,
11 | )
12 | except Exception as ex:
13 | print(ex)
--------------------------------------------------------------------------------
/modules/download/youtube.py:
--------------------------------------------------------------------------------
1 | from pytube import YouTube
2 |
3 | class YoutubeDownloader:
4 | def __init__(self,Link):
5 | self.url = Link
6 |
7 | async def youtube_download(self):
8 | try:
9 | return YouTube(self.url).streaming_data
10 | except Exception as ex:
11 | print(ex)
12 | return False
13 |
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Simple bot for : Download from youtube/instagram/spotify/... :sunglasses:
2 | **please give me star:star:**
3 |
4 |
5 | **Do these things first : :point_down:**
6 |
7 | ```
8 | pip install -r requirements.txt
9 | ```
10 |
11 | **Then : :point_down:**
12 |
13 | - Open the Config/Config.py file
14 | - Add your api id
15 | - Add your api hash
16 | - Add your bot token
17 | - Add your bot username without @
18 | - Open the Database/Data/Admins.json file
19 | - Set userId for admin
20 | - Run main.py
21 |
22 | ** 🔺 Note: Currently the bot is not complete... **
23 |
24 | # Version 2 : [Plus Saver](https://github.com/arbabpouri/PlusSaver)
25 |
--------------------------------------------------------------------------------
/modules/Buttons/Strings.py:
--------------------------------------------------------------------------------
1 | class ButtonStrings:
2 | BOT_STATUS = "👥 آمار ربات 👥"
3 | CHANNEL_SETTING_PANEL = "📍 بخش چنل 📍"
4 | ADMIN_SETTING_PANEL = "🪄 بخش ادمین 🪄"
5 | USER_SETTING_PANEL = "🪩 بخش کاربر 🪩"
6 | SENDER_PANEL = "📣 پیام رسانی 📣"
7 | ADD_ADMIN = "💥 افزودن ادمین 💥"
8 | REMOVE_ADMIN = "🫧 حذف ادمین 🫧"
9 | ADMINS_LIST = "❄️ لیست ادمین ها ❄️"
10 | ADD_CHANNEL = "🧮 افزودن چنل 🧮"
11 | REMOVE_CHANNEL = "🖇 حذف چنل 🖇"
12 | CHANELLS_LIST = "🗂 لیست چنل ها 🗂"
13 | FORWARD_TO_ALL = "📎 فوروارد همگانی"
14 | SEND_TO_ALL = "🖇 پیام همگانی"
15 | BACK_TO_ADMIN_PANEL = "🔙 برگشت 🔙"
16 | CLOSE_ADMIN_PANEL = "❌ بستن پنل مدیر ❌"
17 | CHANCEL_PROCEC = "❌ کنسل کردن ❌"
--------------------------------------------------------------------------------
/modules/Buttons/TextButton.py:
--------------------------------------------------------------------------------
1 | from telethon import Button
2 | from .Strings import ButtonStrings
3 |
4 | class TextButtons:
5 | # admin panel for setting bot
6 | ADMIN_PANEL = [
7 | [Button.text(ButtonStrings.BOT_STATUS, resize=True, single_use=True)],
8 | [Button.text(ButtonStrings.CHANNEL_SETTING_PANEL, resize=True, single_use=True), Button.text(ButtonStrings.ADMIN_SETTING_PANEL, resize=True, single_use=True)],
9 | [Button.text(ButtonStrings.SENDER_PANEL, resize=True, single_use=True)],
10 | [Button.text(ButtonStrings.CLOSE_ADMIN_PANEL, resize=True, single_use=True)]
11 | ]
12 |
13 | # admin setting panel for add/remove admin and show admins list
14 | ADMIN_SETTING = [
15 | [Button.text(ButtonStrings.ADD_ADMIN, resize=True, single_use=True), Button.text(ButtonStrings.REMOVE_ADMIN, resize=True, single_use=True)],
16 | [Button.text(ButtonStrings.ADMINS_LIST, resize=True, single_use=True)],
17 | [Button.text(ButtonStrings.BACK_TO_ADMIN_PANEL, resize=True, single_use=True)]
18 | ]
19 |
20 | # channel setting panel for add/remove channel and show channel list
21 | CHANNEL_SETTING = [
22 | [Button.text(ButtonStrings.ADD_CHANNEL, resize=True, single_use=True),Button.text(ButtonStrings.REMOVE_CHANNEL, resize=True, single_use=True)],
23 | [Button.text(ButtonStrings.CHANELLS_LIST, resize=True, single_use=True)],
24 | [Button.text(ButtonStrings.BACK_TO_ADMIN_PANEL, resize=True, single_use=True)]
25 | ]
26 |
27 | # sender panel for send/forward message to all
28 | SENDER_PANEL = [
29 | [Button.text(ButtonStrings.FORWARD_TO_ALL, resize=True, single_use=True), Button.text(ButtonStrings.SEND_TO_ALL, resize=True, single_use=True)],
30 | [Button.text(ButtonStrings.BACK_TO_ADMIN_PANEL, resize=True, single_use=True)]
31 | ]
32 |
33 | # cancel get or ...(procec)
34 | CHANEL_PROCEC = [
35 | [Button.text(ButtonStrings.CHANCEL_PROCEC, resize=True, single_use=True)]
36 | ]
--------------------------------------------------------------------------------
/Database/Database.py:
--------------------------------------------------------------------------------
1 | # in the name of god | ya ali(ra)
2 | from json import dumps, loads
3 | from os import path
4 |
5 | FileList = ['AdminList', 'Channels', 'Users'] # file list for create
6 | Data = {}
7 |
8 | for i in FileList: # create files
9 | if not path.exists(f'Database/Data/{i}.json'):
10 | open(f'Database/Data/{i}.json', 'a+').close()
11 |
12 | for i in FileList: # import data
13 | Data[i] = loads(open(f'Database/Data/{i}.json', 'r').read())
14 |
15 |
16 | class Database:
17 | # Channels Pack
18 | async def add_channel(ChannelID):
19 | if isinstance(ChannelID,int):
20 | Data['Channels']['ChannelsID'].append(ChannelID)
21 | open('Database/Data/Channels.json', 'w').write(dumps(Data["Channels"], indent=4))
22 | else:
23 | print('ChannelID not int')
24 |
25 | async def del_channel(ChannelID):
26 | if isinstance(ChannelID,int):
27 | Data['Channels']['ChannelsID'].remove(int(ChannelID))
28 | open('Database/Data/Channels.json', 'w').write(dumps(Data["Channels"], indent=4))
29 | else:
30 | print('ChannelID not int')
31 |
32 |
33 | async def channel_list():
34 | ChannelList = Data["Channels"]["ChannelsID"]
35 | return ChannelList
36 |
37 | # Admins Pack
38 | async def add_admin(UserID):
39 | if isinstance(UserID, int):
40 | Data["AdminList"]["Admins"].append(UserID)
41 | open('Database/Data/AdminList.json', 'w').write(dumps(Data["AdminList"], indent=4))
42 | else:
43 | print('UserID not int')
44 |
45 | async def del_admin(UserID):
46 | if isinstance(UserID, int):
47 | Data["AdminList"]["Admins"].remove(UserID)
48 | open('Database/Data/AdminList.json', 'w').write(dumps(Data["AdminList"], indent=4))
49 | else:
50 | print('UserID not int')
51 |
52 | async def admin_list():
53 | return Data["AdminList"]["Admins"]
54 |
55 |
56 | # User Pack
57 | async def add_user_to_database(UserID):
58 | if UserID not in Data["Users"]["Users"] and str(UserID).isnumeric():
59 | Data["Users"]["Users"].append(int(UserID))
60 | open('Database/Data/Users.json', 'w').write(dumps(Data['Users'], indent=4))
61 | else:
62 | return False
63 |
64 | async def user_list():
65 | return Data['Users']['Users']
66 |
67 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | # in the name of god
2 | #github : https://github.com/Arbabpouri
3 | # It may have bugs because it has not been fully tested
4 | from asyncio import sleep
5 | from json import loads
6 | from Database.Database import Database
7 | import jdatetime
8 | import logging
9 | from re import match
10 | from telethon.tl.types import PeerUser, PeerChannel
11 | from telethon.tl.functions.channels import GetParticipantRequest, GetFullChannelRequest
12 | from telethon.errors import ChannelPrivateError, ChatAdminRequiredError, UserNotParticipantError
13 | from telethon.sync import TelegramClient, Button, custom
14 | from telethon.events import NewMessage, CallbackQuery
15 | from modules.Buttons import TextButtons, InlineButton
16 | from modules.download import YoutubeDownloader, InstagramDownloader, PinterestDownloader, SpotifyDownloader
17 | from Config import client
18 | logging.basicConfig(filename="log.txt", filemode="a",format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
19 | logger = logging.getLogger(__name__)
20 |
21 | AdminResponsive, UserResponsive, SendMessageList, ForwardMessageList = [], [], [], []
22 | print('Imported data')
23 | # ------------------------------------------------------ Body Bot --------------------------------------------------------------
24 | # ---------------------------------------------------- Creator pack ------------------------------------------------------------
25 |
26 |
27 | async def admins_check(event):
28 | if event.is_private and event.sender_id in await Database.admin_list() and event.sender_id not in AdminResponsive and event.sender_id not in UserResponsive:
29 | return True
30 | else:
31 | return False
32 |
33 |
34 | async def users_check(event):
35 | if event.is_private and event.sender_id not in AdminResponsive and event.sender_id not in UserResponsive:
36 | return True
37 | else:
38 | return False
39 |
40 |
41 | async def get_link_check(event):
42 | if event.is_private and event.sender_id in UserResponsive and event.sender_id not in AdminResponsive:
43 | return True
44 | else:
45 | return False
46 |
47 |
48 | async def forced_to_join(UserID):
49 | Channels_ID = await Database.channel_list()
50 | if Channels_ID == []:
51 | return True
52 | elif str(UserID).isnumeric():
53 | try:
54 | NoJoin = []
55 | for i in Channels_ID:
56 | try:
57 | Channel = await client.get_entity(PeerChannel(i))
58 | await client(GetParticipantRequest(Channel, PeerUser(int(UserID))))
59 | except UserNotParticipantError:
60 | ChannelLink = await client(GetFullChannelRequest(Channel))
61 | NoJoin.append(ChannelLink.full_chat.exported_invite.link)
62 | except ChatAdminRequiredError:
63 | await Database.del_channel(int(i))
64 | Admins = await Database.admin_list()
65 | for ii in Admins:
66 | await client.send_message(PeerUser(ii), f'چنل با ایدی عددی __{i}__ از لیست چنل ها حذف شد زیرا ربات را از ادمینی دراورده بود')
67 | if Channels_ID == []:
68 | return True
69 |
70 | if NoJoin != []:
71 | Buttons, Num = [], 1
72 | for i in NoJoin:
73 | Buttons.append([Button.url(f'عضویت در کانال {str(Num)}', str(i))])
74 | Num += 1
75 | Buttons.append([Button.inline('جوین شدم', 'check')])
76 | await client.send_message(PeerUser(int(UserID)), 'برای تایید شدن عضو شید', buttons=Buttons)
77 | return False
78 | else:
79 | return True
80 | except Exception as ex:
81 | print(ex)
82 | else:
83 | print('UserID not numeric or type(Channels_ID) is not list')
84 |
85 |
86 | async def send_to_all(Admin_User_ID, MessageForSend, UserIDList):
87 | if SendMessageList == []:
88 | SendMessageList.append(MessageForSend)
89 | while True:
90 | await client.send_message(PeerUser(int(Admin_User_ID)), SendMessageList[0])
91 | await client.send_message(PeerUser(int(Admin_User_ID)), f"⏳ تقریبی برای ارسال پیام بالا 👆🏻 حدود {len(UserIDList) * 0.2 + 10} ثانیه طول میکشد.\n\n🙏🏻 لطفا صبور باشید.\n\n♨️ اگر قصد ارسال چندین پیام دیگر نیز دارید , مجدد ارسال کنید تا در لیست انتظار ذخیره شوند و به نوبت ارسال میشوند.\n\n🆔 @DownloadYarRobot", parse_mode='html')
92 | Number, Error = 0, 0
93 | await sleep(10)
94 | for i in UserIDList:
95 | try:
96 | await client.send_message(PeerUser(int(i)), SendMessageList[0])
97 | Number += 1
98 | await sleep(0.2)
99 | except Exception as ex:
100 | Error += 1
101 | await client.send_message(PeerUser(int(Admin_User_ID)), SendMessageList[0])
102 | SendMessageList.remove(SendMessageList[0])
103 | await client.send_message(PeerUser(int(Admin_User_ID)), f"⭕️ اعلام وضعیت ارسال همگانی 💢\n\n✅ وضعیت پیام های ارسال شده : پیام بالا 👆🏻 برای {Number} نفر از کاربران ارسال شد.\n\n❌ وضعیت پیام های ارسال نشده : پیام بالا 👆🏻 برای {Error} نفر از کاربران ارسال نشد.\n\n🪑 وضعیت پیام های در انتظار : تعداد {len(SendMessageList)} پیام در لیست انتظار برای ارسال باقی مانده اند.\n\n🆔 @DownloadYarRobot", parse_mode='html')
104 | Number, Error = 0, 0
105 | if SendMessageList == []:
106 | break
107 |
108 | else:
109 | await client.send_message(PeerUser(int(Admin_User_ID)), f"✅ پیام ارسالی شما به لیست انتظار افزوده شد.\n\n🪑 وضعیت پیام های در انتظار : تعداد {len(SendMessageList)} پیام در لیست انتظار برای ارسال باقی مانده اند.\n\n🆔 @DownloadYarRobot", parse_mode='html')
110 | SendMessageList.append(MessageForSend)
111 |
112 |
113 | async def forward_to_all(Admin_User_ID, MessageForSend, UserIDList):
114 | if ForwardMessageList == []:
115 | ForwardMessageList.append(MessageForSend)
116 | while True:
117 | Number, Error = 0, 0
118 | await client.send_message(PeerUser(int(Admin_User_ID)), ForwardMessageList[0])
119 | await client.send_message(PeerUser(int(Admin_User_ID)), f"⏳ تقریبی برای ارسال پیام بالا 👆🏻 حدود {len(UserIDList) * 5 + 10} ثانیه طول میکشد.\n\n🙏🏻 لطفا صبور باشید.\n\n♨️ اگر قصد ارسال چندین پیام دیگر نیز دارید , مجدد ارسال کنید تا در لیست انتظار ذخیره شوند و به نوبت ارسال میشوند.\n\n🆔 @DownloadYarRobot", parse_mode='html')
120 | await sleep(10)
121 | for i in UserIDList:
122 | try:
123 | await client.forward_messages(PeerUser(int(i)), ForwardMessageList[0])
124 | Number += 1
125 | await sleep(5)
126 | except Exception as ex:
127 | Error += 1
128 | await client.send_message(PeerUser(int(Admin_User_ID)), ForwardMessageList[0])
129 | ForwardMessageList.remove(ForwardMessageList[0])
130 | await client.send_message(PeerUser(int(Admin_User_ID)), f"⭕️ اعلام وضعیت فوروارد همگانی 💢\n\n✅ وضعیت پیام های ارسال شده : پیام بالا 👆🏻 برای {Number} نفر از کاربران ارسال شد.\n\n❌ وضعیت پیام های ارسال نشده : پیام بالا 👆🏻 برای {Error} نفر از کاربران ارسال نشد.\n\n🪑 وضعیت پیام های در انتظار : تعداد {len(ForwardMessageList)} پیام در لیست انتظار برای ارسال باقی مانده اند.\n\n🆔 @DownloadYarRobot", parse_mode='html')
131 | Number, Error = 0, 0
132 | if ForwardMessageList == []:
133 | break
134 |
135 | else:
136 | await client.send_message(PeerUser(int(Admin_User_ID)), f"✅ پیام ارسالی شما به لیست انتظار افزوده شد.\n\n🪑 وضعیت پیام های در انتظار : تعداد {len(ForwardMessageList)} پیام در لیست انتظار برای ارسال باقی مانده اند.\n\n🆔 @DownloadYarRobot", parse_mode='html')
137 | ForwardMessageList.append(MessageForSend)
138 |
139 |
140 | async def second_to_date(Time:float):
141 | ElapsedTime = {
142 | "D":0,
143 | "H":0,
144 | "M":0,
145 | "S":0
146 | }
147 | Date = Time / 60
148 | while True:
149 | if Date >= 1440:
150 | ElapsedTime["D"] += 1
151 | Date -= 1440
152 |
153 | elif Date < 1440 and Date >= 60:
154 | ElapsedTime["H"] += 1
155 | Date -= 60
156 |
157 | elif Date < 60 and Date > 1:
158 | ElapsedTime["M"] += 1
159 | Date -= 1
160 |
161 | elif Date < 1:
162 | ElapsedTime["S"] = round(Date * 60)
163 | return ElapsedTime
164 |
165 |
166 | @client.on(NewMessage(pattern='پنل', func= admins_check))
167 | async def ADMIN_SETTING(event):
168 | await client.send_message(event.sender_id, 'سلام ادمین عزیز به پنل مدیریت ربات خود خوش امدید 😀', buttons= TextButtons.ADMIN_PANEL)
169 |
170 |
171 | @client.on(NewMessage(pattern='👥 آمار ربات 👥', func= admins_check))
172 | async def members(event):
173 | await client.send_message(event.sender_id, f"""👋 سلام {event.chat.first_name} خسته نباشی
174 | 💢 امار ربات شما تا این لحظه برابر است با: ⬇️
175 |
176 | 👥 - تعداد ممبر : {str(len(await Database.user_list()))}
177 | 🫂 - تعداد ادمین ها : {str(len(await Database.admin_list()))}
178 | 🗣 - تعداد چنل های قفل شده : {str(len(await Database.channel_list()))}
179 | 📅 تاریخ امروز : {str(jdatetime.date.today()).replace('-', '/')}
180 | 🕰 ساعت : {str(jdatetime.datetime.now().strftime("%H:%M:%S"))}
181 | 🆔 @DownloadYarRobot
182 | """, buttons= TextButtons.ADMIN_PANEL, parse_mode= 'html')
183 |
184 | # ----------------------------------------------------- Channel pack ----------------------------------------------------------
185 |
186 | @client.on(NewMessage(pattern='📍 بخش چنل 📍', func= admins_check))
187 | async def channel_menu(event):
188 | await client.send_message(event.sender_id, "به بخش چنل خوش امدید!\nچه کاری میتونم براتون بکنم ؟", buttons= TextButtons.CHANNEL_SETTING)
189 |
190 |
191 | @client.on(NewMessage(pattern='🧮 افزودن چنل 🧮', func= admins_check))
192 | async def add_channel(event):
193 | await client.send_message(event.sender_id, f"🌹 خب ببین {event.chat.first_name} کامل گوش بده ببین چی میگم.😎\n✅ برای افزودن قفل چنل باید این کاراییو که میگم به درستی انجام بدی وگرنه نمیتونم کمکت کنم و شرمندت میشم.😢\n1️⃣ اولین کار اینه که منو (رباتو) توی چنلی که میخوای قفل شه ادمین کنی.\n2️⃣ دومین مرحله اینه که یه پیام (ترجیحا به صورت متن باشه) از همون چنل که منو ادمین کردی توش برام بفرستی تا بتونم مشخصاتشو در بیارم و قفل شم روش.\n3️⃣ قفل میشم روش و میتونی لذت ببری.\n🔴 #تذکر = یادت نره ربات رو از ادمینی در نیاری وگرنه از لیست چنلای قفل شده پاکش میکنم.🔴\n🆔 @DownloadYarRobot", buttons= TextButtons.CHANEL_PROCEC)
194 | AdminResponsive.append(event.sender_id)
195 | # give chat id for add to database
196 |
197 | @client.on(NewMessage(func=lambda e: e.is_private and e.sender_id in AdminResponsive))
198 | async def GiveChannelForAdd(event2):
199 | if event2.message.message == event.message.message or event.sender_id != event2.sender_id:
200 | return False
201 | elif event2.message.message == "❌ کنسل کردن ❌":
202 | client.remove_event_handler(GiveChannelForAdd)
203 | AdminResponsive.remove(event2.sender_id)
204 | await client.send_message(event2.sender_id, "عملیات کنسل شد\n\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_PANEL)
205 | elif event2.fwd_from:
206 | try:
207 | Channels = await Database.channel_list()
208 | if int(event2.fwd_from.from_id.channel_id) not in Channels:
209 | Link = await client(GetFullChannelRequest(PeerChannel(int(event2.fwd_from.from_id.channel_id))))
210 | if Link.full_chat.admins_count != None:
211 | client.remove_event_handler(GiveChannelForAdd)
212 | await Database.add_channel(int(event2.fwd_from.from_id.channel_id))
213 | AdminResponsive.remove(event2.sender_id)
214 | await client.send_message(event2.sender_id, f"کانال با ایدی عددی {event2.fwd_from.from_id.channel_id} و لینک {Link.full_chat.exported_invite.link} به لیست چنل های قفل شده اضافه شد :)\n\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_PANEL)
215 | else:
216 | await client.send_message(event2.sender_id, "رفیق مثل اینکه منو ادمین کانال نکردی\nلطفا اول منو ادمین کن بعد پیامو فوروارد کن", buttons= TextButtons.CHANEL_PROCEC)
217 | else:
218 | await client.send_message(event2.sender_id, "🤭 این کانال در لیست کانال های قفل شده هست 🤖", buttons= TextButtons.CHANEL_PROCEC)
219 | except AttributeError:
220 | await client.send_message(event2.sender_id, "❌ پیام رو از کانال برام بفرست نه از چیز دیگه , فقط و فقط از کانال مورد نظرت 😐", buttons= TextButtons.CHANEL_PROCEC)
221 | except ChannelPrivateError:
222 | await client.send_message(event2.sender_id, "❌ هنوز منو توی چنل ادمین نکردی سلطان\nگفتم بهت که اول تو کانال ادمینم کن بعد فوروارد کن ❌", buttons= TextButtons.CHANEL_PROCEC)
223 |
224 | except Exception as ex:
225 | await client.send_message(event2.sender_id, "❌ هنوز منو توی چنل ادمین نکردی سلطان\nگفتم بهت که اول تو کانال ادمینم کن بعد فوروارد کن ❌", buttons= TextButtons.CHANEL_PROCEC)
226 | else:
227 | await client.send_message(event2.sender_id, "❌ جناب برای اضافه کردن کانال به لیست لطفا ابتدا اموزش رو بخونید سپس دست به کار بشید ❌\n⭕️ شما پیام رو از کانال فوروراد نکردید ⭕️", buttons= TextButtons.CHANEL_PROCEC)
228 |
229 |
230 | @client.on(NewMessage(pattern='🖇 حذف چنل 🖇', func= admins_check))
231 | async def remove_channel(event):
232 | Pack = {
233 | "ChannelList": await Database.channel_list(),
234 | "Channels": "",
235 | "Num": 0
236 | }
237 | if Pack['ChannelList'] != []:
238 | for i in Pack['ChannelList']:
239 | Pack['Num'] += 1
240 | ChannelLink = await client(GetFullChannelRequest(PeerChannel(i)))
241 | if ChannelLink.full_chat.admins_count != None:
242 | Pack['Channels'] += f"{Pack['Num']} ) ID : {i} , Link : {ChannelLink.full_chat.exported_invite.link}\n\n"
243 | else:
244 | await Database.del_channel(i)
245 | Pack['ChannelList'].remove(i)
246 | await client.send_message(event.sender_id, f'چنلی به ایدی عددی {i} از قفل ربات ها برداشته شد زیرا ربات رو ازادمینی دراورده بود')
247 | if Pack['ChannelList'] == []:
248 | await client.send_message(event.sender_id, 'چنلی برای نمایش وجود ندارد')
249 | break
250 | if Pack["ChannelList"] != []:
251 | await client.send_message(event.sender_id, f"خب یکی ایدی عددی هرکدام از چنل هارا که میخواهید حذف شود وارد کنید\n{Pack['Channels']}", buttons= TextButtons.CHANEL_PROCEC)
252 | AdminResponsive.append(event.sender_id)
253 | Pack = 0
254 | # give channel id for delete from database
255 |
256 | @client.on(NewMessage(func=lambda e: e.is_private and e.sender_id in AdminResponsive))
257 | async def GiveChannelChatIDForDelete(event2):
258 | if event2.message.message == event.message.message or event2.sender_id != event.sender_id:
259 | return False
260 | elif event2.message.message == "❌ کنسل کردن ❌":
261 | AdminResponsive.remove(event2.sender_id)
262 | client.remove_event_handler(GiveChannelChatIDForDelete)
263 | await client.send_message(event2.sender_id, "عملیات کنسل شد\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_SETTING)
264 | elif event2.message.message.isnumeric():
265 | Channels = await Database.channel_list()
266 | if int(event2.message.message) in Channels:
267 | client.remove_event_handler(GiveChannelChatIDForDelete)
268 | await Database.del_channel(int(event2.message.message))
269 | AdminResponsive.remove(event2.sender_id)
270 | await client.send_message(event2.sender_id, f"کانال با ایدی عددی {event2.message.message} از لیست کانال های قفل شده حذف شد\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_PANEL)
271 | else:
272 | await client.send_message(event2.sender_id, "دوست عزیز این ایدی عددی اصلا در لیست وجود ندارد لطفا دقت کنید", buttons= TextButtons.CHANEL_PROCEC)
273 | else:
274 | await client.send_message(event2.sender_id, "لطفا ایدی عددی کانال رو ارسال کنید غیر این چیزی ارسال نکنید", buttons= TextButtons.CHANEL_PROCEC)
275 | else:
276 | await client.send_message(event.sender_id, "چنلی برای حذف کردن وجود ندارد جناب", buttons= TextButtons.CHANEL_PROCEC)
277 | else:
278 | await client.send_message(event.sender_id, "چنلی برای حذف کردن وجود ندارد جناب", buttons= TextButtons.CHANEL_PROCEC)
279 |
280 |
281 | @client.on(NewMessage(pattern='🗂 لیست چنل ها 🗂', func= admins_check))
282 | async def channels_list(event):
283 | Pack = {
284 | "ChannelList": await Database.channel_list(),
285 | "Channels": "",
286 | "Num": 0
287 | }
288 | if Pack['ChannelList'] != []:
289 | for i in Pack['ChannelList']:
290 | Pack['Num'] += 1
291 | ChannelLink = await client(GetFullChannelRequest(PeerChannel(i)))
292 | if ChannelLink.full_chat.admins_count != None:
293 | Pack['Channels'] += f"{Pack['Num']} ) ID : {i} , Link : {ChannelLink.full_chat.exported_invite.link}\n\n"
294 | else:
295 | await Database.del_channel(i)
296 | await client.send_message(event.sender_id, f'چنلی به ایدی عددی {i} از قفل ربات ها برداشته شد زیرا ربات رو ازادمینی دراورده بود')
297 | if Pack['ChannelList'] == []:
298 | await client.send_message(event.sender_id, 'چنلی برای نمایش وجود ندارد')
299 | break
300 |
301 | await client.send_message(event.sender_id, str(Pack['Channels']))
302 | Pack = 0
303 | else:
304 | await client.send_message(event.sender_id, "چنلی برای نمایش وجود ندارد")
305 |
306 | # ------------------------------------------------------- Admin pack ------------------------------------------------------------
307 |
308 |
309 | @client.on(NewMessage(pattern='🪄 بخش ادمین 🪄', func= admins_check))
310 | async def admin_menu(event):
311 | await client.send_message(event.sender_id, 'به بخش ادمین خوش امدید\n\nچه کاری براتون انجام بدم سرورم', buttons= TextButtons.ADMIN_SETTING)
312 |
313 |
314 | @client.on(NewMessage(pattern='💥 افزودن ادمین 💥', func= admins_check))
315 | async def add_admin(event):
316 | await client.send_message(event.sender_id, f"🌹 خب ببین {event.chat.first_name} عزیز , برای اضافه کردن ادمین 2 تا روش داره که الان جفتشو برات توضیح میدم. 🫡\n1️⃣ روش اول ) ایدی عددی کاربر رو بفرستی تا من به ادمینا اضافش کنم. ✅\n🔺 #توجه : باید حتما ایدی عددی رو به صورت عدد بدی نری یوزرنیم رو بفرستی که ناراحت میشم. 🤭\n2️⃣ روش دوم ) یه پیام ازش فوروارد کن برام که اضافش کنم به لیست ادمینا. ✅\n🔺 #توجه : باید کاربر فورواردش باز باشه تا بتونم ایدی عددیشو درارم اگر بسته بهش بگو بازش کنه اگر نمیکنه از روش اول استفاده کن , ماهم اذیت نکن. 😀", buttons= TextButtons.CHANEL_PROCEC)
317 | AdminResponsive.append(event.sender_id)
318 | # give admin user id for add to database
319 |
320 | @client.on(NewMessage(func=lambda e: e.is_private and e.sender_id in AdminResponsive))
321 | async def GetUserIDForAddAdmin(event2: custom.message.Message):
322 | if event2.message.message == event.message.message or event.sender_id != event2.sender_id:
323 | return False
324 | elif event2.message.message == "❌ کنسل کردن ❌":
325 | client.remove_event_handler(GetUserIDForAddAdmin)
326 | AdminResponsive.remove(event2.sender_id)
327 | await client.send_message(event2.sender_id, "عملیات لغو شد\n\nبه پنل بازگشتید", buttons= TextButtons.ADMIN_PANEL)
328 | elif event2.fwd_from:
329 | try:
330 | Admins = await Database.admin_list()
331 | if int(event2.fwd_from.from_id.user_id) not in Admins:
332 | client.remove_event_handler(GetUserIDForAddAdmin)
333 | await Database.add_admin(int(event2.fwd_from.from_id.user_id))
334 | AdminResponsive.remove(event.sender_id)
335 | await client.send_message(event2.sender_id, f"ادمین با ایدی عددی {event2.fwd_from.from_id.user_id} به لیست ادمین ها اضافه شد\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_SETTING)
336 | else:
337 | await client.send_message(event2.sender_id, "ایشان در لیست ادمین ها حضور دارد", buttons= TextButtons.CHANEL_PROCEC)
338 |
339 | except AttributeError:
340 | await client.send_message(event2.sender_id, "اوه یه مشکلی پیش اومد\nمیتونه 2 تا دلیل داشته باشه\n1️⃣ پیام رو از شخص نفرستادی و از جای دیگه فوروارد زدی 🤨\n2️⃣ فوروارد شخص بسته است و نمیشه ایدی عددیشو دراورد , پس پیشنهاد من اینه ایدی عددیشو درار بفرست برام تا اضافش کنم , برای این کار میتونی ازین ربات استفاده کنی 🥹\n🆔 @usinfobot", buttons= TextButtons.CHANEL_PROCEC)
341 |
342 | elif event2.message.message.isnumeric():
343 | try:
344 | Admins = await Database.admin_list()
345 | if int(event2.message.message) not in Admins:
346 | client.remove_event_handler(GetUserIDForAddAdmin)
347 | await Database.add_admin(int(event2.message.message))
348 | AdminResponsive.remove(event2.sender_id)
349 | await client.send_message(event2.sender_id, f'ادمین با ایدی عددی {str(event2.message.message)} به لیست ادمین ها افزوده شد', buttons= TextButtons.ADMIN_PANEL)
350 | else:
351 | await client.send_message(event2.sender_id, "ایشان در لیست ادمین ها حضور دارد قربان", buttons= TextButtons.CHANEL_PROCEC)
352 | except ValueError:
353 | await client.send_message(event2.sender_id, "این ایدی عددی متعلق به کسی نیست و فیکه :)", buttons= TextButtons.CHANEL_PROCEC)
354 | else:
355 | await client.send_message(event2.sender_id, "جناب لطفا اموزش رو مطالعه کنید دوباره سپس اقدام کنید , یا پیام رو از شخص فوروراد کنید یا ایدی عددی ایشان رو وارد کنید چیزی خارج از این نباشه", buttons= TextButtons.CHANEL_PROCEC)
356 |
357 |
358 | @client.on(NewMessage(pattern='🫧 حذف ادمین 🫧', func= admins_check))
359 | async def remove_admin(event):
360 | global DelAdminText
361 | DelAdminText = event.message.message
362 | Pack = {
363 | "AdminsList": await Database.admin_list(),
364 | "Admins": "",
365 | "Num": 0,
366 | }
367 | if Pack['AdminsList'] != []:
368 | for i in Pack['AdminsList']:
369 | Pack['Num'] += 1
370 | Pack['Admins'] += f"{Pack['Num']} ) User ID : {i}\n\n"
371 | await client.send_message(event.sender_id, f"از لیست ادمین ها ایدی عددی را انتخاب کرده و ارسال کنی\nتوجه کنید چیز دیگری جز این نباشد\n\n{Pack['Admins']}", buttons= TextButtons.CHANEL_PROCEC)
372 | AdminResponsive.append(event.sender_id)
373 | Pack = 0
374 | # give admin user id for delete from database
375 |
376 | @client.on(NewMessage(func=lambda e: e.is_private and e.sender_id in AdminResponsive))
377 | async def GetAdminUserIDForDelete(event2):
378 | if event2.message.message == event.message.message or event2.sender_id != event.sender_id:
379 | return False
380 | elif event2.message.message == "❌ کنسل کردن ❌":
381 | client.remove_event_handler(GetAdminUserIDForDelete)
382 | AdminResponsive.remove(event2.sender_id)
383 | await client.send_message(event2.sender_id, "عملیات لغو شد\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_SETTING)
384 | elif event2.message.message.isnumeric():
385 | Admins = await Database.admin_list()
386 | if int(event2.message.message) in Admins:
387 | client.remove_event_handler(GetAdminUserIDForDelete)
388 | await Database.del_admin(int(event2.message.message))
389 | AdminResponsive.remove(event2.sender_id)
390 | await client.send_message(event2.sender_id, f"ادمین با ایدی عددی {event2.message.message} از لیست ادمین ها حذف شد\n\nبه پنل مدیریت بازگشتید", buttons= TextButtons.ADMIN_PANEL)
391 | else:
392 | await client.send_message(event2.sender_id, f"ادمینی با این ایدی عددی اصلا در لیست ادمین ها حضور ندارد قربان", buttons= TextButtons.CHANEL_PROCEC)
393 |
394 | else:
395 | await client.send_message(event2.sender_id, f"جناب لطفا ایدی عددی رو ارسال کنید و به شکل عدد باشه فقط :|", buttons= TextButtons.CHANEL_PROCEC)
396 |
397 | else:
398 | await client.send_message(event.sender_id, "ادمینی وجود ندارد")
399 |
400 |
401 | @client.on(NewMessage(pattern='❄️ لیست ادمین ها ❄️', func= admins_check))
402 | async def admins_list(event):
403 | Pack = {
404 | "AdminsList": await Database.admin_list(),
405 | "Admins": "",
406 | "Num": 0,
407 | }
408 | if Pack['AdminsList'] != []:
409 | for i in Pack['AdminsList']:
410 | Pack['Num'] += 1
411 | Pack['Admins'] += f"{Pack['Num']} ) User ID : {i}\n\n"
412 | await client.send_message(event.sender_id, Pack['Admins'])
413 | Pack = 0
414 | else:
415 | await client.send_message(event.sender_id, "ادمینی وجود ندارد")
416 |
417 | # ------------------------------------------------------- User pack --------------------------------------------------------------
418 |
419 |
420 |
421 | @client.on(NewMessage(pattern="📣 پیام رسانی 📣", func= admins_check))
422 | async def send_panel_sender(event):
423 | await client.send_message(event.sender_id, "⚡ فوروارد کنم یا ارسال کنم قربان؟", buttons= TextButtons.SENDER_PANEL)
424 |
425 |
426 | @client.on(NewMessage(pattern="🖇 پیام همگانی", func= admins_check))
427 | async def send_message_to_all(event):
428 | AdminResponsive.append(event.sender_id)
429 | await client.send_message(event.sender_id, "⚠ پیام خود را برای ارسال همگانی , ارسال کنید", buttons= TextButtons.CHANEL_PROCEC)
430 |
431 | @client.on(NewMessage(func=lambda e: e.is_private and e.sender_id in AdminResponsive))
432 | async def get_message_for_send_all(event2):
433 | if event2.message.message == event.message.message:
434 | return False
435 | elif event2.message.message == "❌ کنسل کردن ❌":
436 | client.remove_event_handler(get_message_for_send_all)
437 | AdminResponsive.remove(event2.sender_id)
438 | await client.send_message(event.sender_id, "❌ عملیات ارسال همگانی کنسل شد", buttons= TextButtons.ADMIN_PANEL)
439 | else:
440 | client.remove_event_handler(get_message_for_send_all)
441 | AdminResponsive.remove(event2.sender_id)
442 | await send_to_all(event2.sender_id, event2.message, await Database.user_list())
443 |
444 |
445 | @client.on(NewMessage(pattern="📎 فوروارد همگانی", func= admins_check))
446 | async def forward_message_to_all(event):
447 | AdminResponsive.append(event.sender_id)
448 | await client.send_message(event.sender_id, "⚠ پیام خود را برای فوروارد همگانی ارسال کنید", buttons= TextButtons.CHANEL_PROCEC)
449 |
450 | @client.on(NewMessage(func=lambda e: e.is_private and e.sender_id in AdminResponsive))
451 | async def get_message_for_forward_all(event2):
452 | if event2.message.message == event.message.message:
453 | return False
454 | elif event2.message.message == "❌ کنسل کردن ❌":
455 | client.remove_event_handler(get_message_for_forward_all)
456 | AdminResponsive.remove(event2.sender_id)
457 | await client.send_message(event.sender_id, "❌ عملیات فوروراد همگانی کنسل شد", buttons= TextButtons.ADMIN_PANEL)
458 | else:
459 | client.remove_event_handler(get_message_for_forward_all)
460 | AdminResponsive.remove(event2.sender_id)
461 | await forward_to_all(event2.sender_id, event2.message, await Database.user_list())
462 |
463 |
464 | @client.on(NewMessage(pattern='🔙 برگشت 🔙', func= admins_check))
465 | async def back(event):
466 | await ADMIN_SETTING(event)
467 |
468 |
469 | @client.on(NewMessage(pattern='❌ بستن پنل مدیر ❌', func= admins_check))
470 | async def close_panel(event):
471 | await start_panel(event)
472 |
473 | # ------------------------------------------------------ User pack -------------------------------------------------------------
474 |
475 |
476 | @client.on(NewMessage(pattern='/start', func= users_check))
477 | async def start_panel(event):
478 | await Database.add_user_to_database(event.sender_id)
479 | if await forced_to_join(event.sender_id):
480 | await client.send_message(event.sender_id, "😎 سلام به ربات آدور دانلودر خوش اومدی, لینک ویدیو یوتیوب رو ارسال کن تا لینک دانلود بهت بدم و بتونی دانلودش کنی", buttons= Button.clear())
481 |
482 |
483 | @client.on(CallbackQuery(data='check', func= users_check))
484 | async def check_forced(event):
485 | if await forced_to_join(event.sender_id):
486 | await event.delete()
487 | await start_panel(event)
488 |
489 |
490 |
491 | @client.on(NewMessage(func= users_check))
492 | async def youtube_panel(event):
493 | if str(event.message.message).lower() == "/start": return False
494 | elif await forced_to_join(event.sender_id):
495 | regex = match(r"(.+?)(\/)(watch\x3Fv=)?(embed\/watch\x3Ffeature\=player_embedded\x26v=)?([a-zA-Z0-9_-]{11})+", event.message.message)
496 | if regex:
497 | UserResponsive.append(event.sender_id)
498 | await client.send_message(event.sender_id, '⁉ لطفا صبر کنید')
499 | Urls = await YoutubeDownloader(str(event.message.message)).youtube_download()
500 | if Urls != False:
501 | ButtonsLink = [[Button.inline('🎭 نام', 'nothing'), Button.inline('📍 لینک دانلود', 'nothing')]]
502 | for i in range(len(Urls)):
503 | try:
504 | ButtonsLink.append([Button.inline(f'🎞 Video : {str(Urls["formats"][i]["qualityLabel"])}'), Button.url('دانلود',str(Urls["formats"][i]["url"]))])
505 | except KeyError:
506 | break
507 | await client.send_message(event.sender_id, 'لینک دانلود ویدیو تقدیم شما 🌹', buttons= ButtonsLink)
508 | ButtonsLink = None
509 | UserResponsive.remove(event.sender_id)
510 | else:
511 | UserResponsive.remove(event.sender_id)
512 | await client.send_message(event.sender_id, "❌ لینک ارسالی اشتباه است ❌")
513 |
514 |
515 |
516 | print('Bot is online :)')
517 | client.run_until_disconnected()
518 |
--------------------------------------------------------------------------------