-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
134 lines (115 loc) · 4.32 KB
/
bot.py
File metadata and controls
134 lines (115 loc) · 4.32 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 os
import time
import asyncio
import uvloop
# Pyrogram imports
from pyrogram import types
from pyrogram import Client
from pyrogram.errors import FloodWait
# aiohttp imports
from aiohttp import web
from typing import Union, Optional, AsyncGenerator
# Local imports
from web import web_app
from info import LOG_CHANNEL, API_ID, API_HASH, BOT_TOKEN, PORT, BIN_CHANNEL, ADMINS, DATABASE_URL
from utils import temp, get_readable_time
from database.users_chats_db import db
from database.ia_filterdb import Media
from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi
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"}
)
async def start_web_server(self):
"""Start the aiohttp web server for health checks and other routes."""
app = web.AppRunner(web_app)
await app.setup()
site = web.TCPSite(app, "0.0.0.0", PORT)
await site.start()
print(f"Web server running on port {PORT}")
async def start(self):
# Retry logic for FloodWait
while True:
try:
await super().start()
break
except FloodWait as e:
time_ = get_readable_time(e.value)
print(f"Warning - Flood Wait Occurred, Wait For: {time_}")
await asyncio.sleep(e.value)
print("Info - Now Ready For Deploying!")
# Set startup time
temp.START_TIME = time.time()
# Load banned users and chats
b_users, b_chats = await db.get_banned()
temp.BANNED_USERS = b_users
temp.BANNED_CHATS = b_chats
# Connect to MongoDB
client = MongoClient(DATABASE_URL, server_api=ServerApi('1'))
try:
client.admin.command('ping')
print("Successfully connected to MongoDB!")
except Exception as e:
print(f"Error - Make sure MongoDB URL is correct: {e}")
raise
# Handle restart notification
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')
# Set bot instance and metadata
temp.BOT = self
await Media.ensure_indexes()
me = await self.get_me()
temp.ME = me.id
temp.U_NAME = me.username
temp.B_NAME = me.first_name
username = '@' + me.username
print(f"{me.first_name} is started now 🤗")
# Start web server as a background task
asyncio.create_task(self.start_web_server())
# Notify channels and admins
try:
await self.send_message(chat_id=LOG_CHANNEL, text=f"<b>{me.mention} Restarted! 🤖</b>")
except Exception as e:
print(f"Error - Make sure bot is admin in LOG_CHANNEL: {e}")
raise
try:
m = await self.send_message(chat_id=BIN_CHANNEL, text="Test")
await m.delete()
except Exception as e:
print(f"Error - Make sure bot is admin in BIN_CHANNEL: {e}")
raise
for admin in ADMINS:
try:
await self.send_message(chat_id=admin, text="<b>✅ ʙᴏᴛ ʀᴇsᴛᴀʀᴛᴇᴅ</b>")
except:
print(f"Info - Admin ({admin}) not started this bot yet")
async def stop(self, *args):
await super().stop()
print("Bot Stopped! Bye...")
async def iter_messages(self: Client, chat_id: Union[int, str], limit: int, offset: int = 0) -> Optional[AsyncGenerator["types.Message", None]]:
"""Iterate through a chat sequentially."""
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
if __name__ == "__main__":
app = Bot()
app.run()