|
from pyrogram import types |
|
from typing import Union, Optional, AsyncGenerator |
|
from utils import temp |
|
from info import SESSION, API_ID, API_HASH, BOT_TOKEN, LOG_STR |
|
from database.users_chats_db import db |
|
from database.ia_filterdb import Media |
|
from pyrogram.raw.all import layer |
|
from pyrogram import Client, __version__ |
|
import logging |
|
import logging.config |
|
|
|
|
|
logging.config.fileConfig('logging.conf') |
|
logging.getLogger().setLevel(logging.INFO) |
|
logging.getLogger("pyrogram").setLevel(logging.ERROR) |
|
logging.getLogger("imdbpy").setLevel(logging.ERROR) |
|
|
|
|
|
class Bot(Client): |
|
|
|
def __init__(self): |
|
super().__init__( |
|
name=SESSION, |
|
api_id=API_ID, |
|
api_hash=API_HASH, |
|
bot_token=BOT_TOKEN, |
|
workers=50, |
|
plugins={"root": "plugins"}, |
|
sleep_threshold=5, |
|
) |
|
|
|
async def start(self): |
|
b_users, b_chats = await db.get_banned() |
|
temp.BANNED_USERS = b_users |
|
temp.BANNED_CHATS = b_chats |
|
await super().start() |
|
await Media.ensure_indexes() |
|
me = await self.get_me() |
|
temp.ME = me.id |
|
temp.U_NAME = me.username |
|
temp.B_NAME = me.first_name |
|
self.username = f'@{me.username}' |
|
logging.info( |
|
f"{me.first_name} with for Pyrogram v{__version__} (Layer {layer}) started on {me.username}.") |
|
logging.info(LOG_STR) |
|
|
|
async def iter_messages( |
|
self, |
|
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 |
|
for message in app.iter_messages("pyrogram", 1, 15000): |
|
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 |
|
|
|
async def stop(self, *args): |
|
await super().stop() |
|
logging.info("Bot stopped. Bye.") |
|
|
|
|
|
app = Bot() |
|
app.run() |
|
|