-
Notifications
You must be signed in to change notification settings - Fork 157
Expand file tree
/
Copy pathbot.py
More file actions
134 lines (115 loc) · 4.5 KB
/
bot.py
File metadata and controls
134 lines (115 loc) · 4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[logging.StreamHandler()]
)
logging.getLogger('pyrogram').setLevel(logging.WARNING)
logging.getLogger('aiohttp').setLevel(logging.WARNING)
logger = logging.getLogger(__name__)
import os
import time
import asyncio
try:
import uvloop
ul = True
except ImportError:
ul = False
pass
from pyrogram import types, Client, StopPropagation
from pyrogram.handlers import MessageHandler
from pyrogram.errors import FloodWait
from aiohttp import web
from typing import Union, Optional, AsyncGenerator
from web import web_app
from info import URL, INDEX_CHANNELS, SUPPORT_GROUP, LOG_CHANNEL, API_ID, DATA_DATABASE_URL, API_HASH, BOT_TOKEN, PORT, BIN_CHANNEL, ADMINS, SECOND_FILES_DATABASE_URL, FILES_DATABASE_URL
from utils import temp, get_readable_time, check_premium
from database.users_chats_db import db
from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi
from database.ia_filterdb import load_all_files
if ul:
uvloop.install()
class Bot(Client):
def __init__(self):
super().__init__(
name='Auto_Filter_Bot',
api_id=API_ID,
api_hash=API_HASH,
bot_token=BOT_TOKEN,
plugins={"root": "plugins"}
)
self.listeners = {}
self.add_handler(MessageHandler(self._listener_handler), group=-1)
async def _listener_handler(self, client: Client, message: types.Message):
if not message.chat or not message.from_user:
return
listener_id = (message.chat.id, message.from_user.id)
if listener_id in self.listeners:
future = self.listeners[listener_id]
if not future.done():
future.set_result(message)
raise StopPropagation
async def listen(self, chat_id: int, user_id: int, timeout: int = 60) -> Optional[types.Message]:
future = asyncio.get_event_loop().create_future()
listener_id = (chat_id, user_id)
if listener_id in self.listeners:
old_future = self.listeners[listener_id]
if not old_future.done():
old_future.cancel()
self.listeners[listener_id] = future
try:
message = await asyncio.wait_for(future, timeout)
return message
except asyncio.TimeoutError:
return None
finally:
self.listeners.pop(listener_id, None)
async def start(self, **kwargs):
logger.info("Fetching all files from the database... (This may take some time)")
files = load_all_files()
temp.DB_ALL_FILES = files
logger.info("Successfully fetched all files")
await super().start()
temp.START_TIME = time.time()
b_users, b_chats = await db.get_banned()
temp.BANNED_USERS = b_users
temp.BANNED_CHATS = b_chats
if os.path.exists('restart.txt'):
with open("restart.txt") as file:
chat_id, msg_id = map(int, file)
try:
await self.edit_message_text(chat_id=chat_id, message_id=msg_id, text='Restarted Successfully!')
except:
pass
os.remove('restart.txt')
temp.BOT = self
me = await self.get_me()
temp.ME = me.id
temp.U_NAME = me.username
temp.B_NAME = me.first_name
app = web.AppRunner(web_app)
await app.setup()
await web.TCPSite(app, "0.0.0.0", PORT).start()
asyncio.create_task(check_premium(self))
try:
await self.send_message(chat_id=LOG_CHANNEL, text=f"<b>{me.mention} Restarted! 🤖</b>")
except:
logger.error("Make sure bot admin in LOG_CHANNEL, exiting now")
exit()
logger.info(f"Bot [@{me.username}] and webapp [{URL}] is started now ✓")
async def stop(self, **kwargs):
await super().stop()
logger.info("Bot Stopped! Bye...")
async def iter_messages(self: Client, chat_id: Union[int, str], limit: int, offset: int = 0) -> Optional[AsyncGenerator[types.Message, None]]:
current = offset
while True:
new_diff = min(200, limit - current)
if new_diff <= 0:
return
messages = await self.get_messages(chat_id, list(range(current, current+new_diff+1)))
for message in messages:
yield message
current += 1
app = Bot()
app.run()