forked from HA-Bots/Auto-Filter-Bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.py
134 lines (121 loc) · 4.83 KB
/
bot.py
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
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
# pymongo and database imports
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(self):
temp.START_TIME = time.time()
b_users, b_chats = await db.get_banned()
temp.BANNED_USERS = b_users
temp.BANNED_CHATS = b_chats
client = MongoClient(DATABASE_URL, server_api=ServerApi('1'))
try:
client.admin.command('ping')
print("Pinged your deployment. You successfully connected to MongoDB!")
except Exception as e:
print("Something Went Wrong While Connecting To Database!", e)
exit()
await super().start()
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
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 🤗")
#groups = await db.get_all_chats_count()
#for grp in groups:
#await save_group_settings(grp['id'], 'fsub', "")
app = web.AppRunner(web_app)
await app.setup()
await web.TCPSite(app, "0.0.0.0", PORT).start()
try:
await self.send_message(chat_id=LOG_CHANNEL, text=f"<b>{me.mention} Restarted! 🤖</b>")
except:
print("Error - Make sure bot admin in LOG_CHANNEL, exiting now")
exit()
try:
m = await self.send_message(chat_id=BIN_CHANNEL, text="Test")
await m.delete()
except:
print("Error - Make sure bot admin in BIN_CHANNEL, exiting now")
exit()
for admin in ADMINS:
await self.send_message(chat_id=admin, text="<b>✅ ʙᴏᴛ ʀᴇsᴛᴀʀᴛᴇᴅ</b>")
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.
This convenience method does the same as repeatedly calling :meth:`~pyrogram.Client.get_messages` in a loop, thus saving
you from the hassle of setting up boilerplate code. It is useful for getting the whole chat messages with a
single call.
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
For a contact that exists in your Telegram address book you can use his phone number (str).
limit (``int``):
Identifier of the last message to be returned.
offset (``int``, *optional*):
Identifier of the first message to be returned.
Defaults to 0.
Returns:
``Generator``: A generator yielding :obj:`~pyrogram.types.Message` objects.
Example:
.. code-block:: python
async for message in app.iter_messages("pyrogram", 1000, 100):
print(message.text)
"""
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()
try:
app.run()
except FloodWait as vp:
time = get_readable_time(vp.value)
print(f"Flood Wait Occured, Sleeping For {time}")
asyncio.sleep(vp.value)
print("Now Ready For Deploying !")
app.run()