-
Notifications
You must be signed in to change notification settings - Fork 156
Expand file tree
/
Copy pathbot.py
More file actions
131 lines (112 loc) · 4.37 KB
/
bot.py
File metadata and controls
131 lines (112 loc) · 4.37 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
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 database.ia_filterdb import setup_database
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('Setting up your database, please wait a moment...')
await setup_database()
logger.info('Successfully setup the database!')
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()