2
0
mirror of https://github.com/Nick80835/microbot synced 2025-08-22 10:09:40 +00:00
microbot/ubot/__init__.py
2023-10-21 19:30:14 -04:00

91 lines
2.8 KiB
Python

import asyncio
import sys
from logging import INFO, basicConfig, getLogger
from time import time
import telethon
from telethon import TelegramClient
from telethon.errors.rpcerrorlist import (AccessTokenExpiredError,
AccessTokenInvalidError,
TokenInvalidError)
from telethon.network.connection.tcpabridged import \
ConnectionTcpAbridged as CTA
from .custom import (ExtendedCallbackQuery, ExtendedInlineQuery,
ExtendedNewMessage)
from .loader import Loader
from .settings import Settings
if sys.version_info.major < 3 or (sys.version_info.major == 3 and sys.version_info.minor < 10):
print("This program requires at least Python 3.10.0 to work correctly, exiting.")
sys.exit(1)
basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=INFO)
logger = getLogger(__name__)
startup_time = time()
loop = asyncio.get_event_loop()
class MicroBot():
settings = Settings()
logger = logger
client: TelegramClient
loader: Loader
def __init__(self):
loop.run_until_complete(self._initialize_bot())
async def _initialize_bot(self):
global ldr
try:
self.client = await TelegramClient(
self.settings.get_config("session_name", "bot0") or "bot0",
self.settings.get_config("api_id"),
self.settings.get_config("api_hash"),
connection=CTA
).start(
bot_token=self.settings.get_config("bot_token")
)
self.me = await self.client.get_me()
except (TokenInvalidError, AccessTokenExpiredError, AccessTokenInvalidError):
logger.error("The bot token provided is invalid, exiting.")
sys.exit(1)
self.me = await self.client.get_me()
self.loader = Loader(self)
ldr = self.loader
self.loader.load_all_modules()
logger.info("Bot successfully started.")
async def run_until_done(self):
await self.client.run_until_disconnected()
await self.stop_client(reason="Bot disconnected.")
async def stop_client(self, reason=None, exit_code=None):
if reason:
logger.info("Stopping bot for reason: %s", reason)
else:
logger.info("Stopping bot.")
await self.loader.aioclient.close()
if exit_code is not None:
logger.info("Exiting with exit code: %i", exit_code)
sys.exit(exit_code)
else:
sys.exit(0)
telethon.events.NewMessage.Event = ExtendedNewMessage
telethon.events.CallbackQuery.Event = ExtendedCallbackQuery
telethon.events.InlineQuery.Event = ExtendedInlineQuery
micro_bot = MicroBot()
try:
loop.run_until_complete(micro_bot.run_until_done())
except KeyboardInterrupt:
loop.run_until_complete(micro_bot.stop_client())