taslim19
uploading: by drag
de1ee14
# This file is part of the AutoAnime distribution.
# Copyright (c) 2025 Kaif_00z
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# License can be found in <
# https://github.com/kaif-00z/AutoAnimeBot/blob/main/LICENSE > .
# if you are using this following code then don't forgot to give proper
# credit to t.me/kAiF_00z (github.com/kaif-00z)
# little bit inspired from pyUltroid.BaseClient
import asyncio
import sys
from logging import Logger
from traceback import format_exc
from pyrogram import Client, utils
from telethon import TelegramClient
from telethon.errors import (
AccessTokenExpiredError,
AccessTokenInvalidError,
ApiIdInvalidError,
AuthKeyDuplicatedError,
)
from telethon.errors.rpcerrorlist import UserNotParticipantError
from telethon.sessions import StringSession
from telethon.tl.functions.channels import (
CreateChannelRequest,
EditPhotoRequest,
GetParticipantRequest,
)
from telethon.tl.functions.messages import ExportChatInviteRequest
from functions.config import Var
from libs.logger import LOGS, TelethonLogger
class Bot(TelegramClient):
def __init__(
self,
api_id=None,
api_hash=None,
bot_token=None,
logger: Logger = LOGS,
log_attempt=True,
exit_on_error=True,
*args,
**kwargs,
):
self._handle_error = exit_on_error
self._log_at = log_attempt
self.logger = logger
kwargs["api_id"] = api_id or Var.API_ID
kwargs["api_hash"] = api_hash or Var.API_HASH
kwargs["base_logger"] = TelethonLogger
utils.MIN_CHANNEL_ID = -1009147483647
super().__init__(None, **kwargs)
self.pyro_client = Client(
name="pekka",
api_id=kwargs["api_id"],
api_hash=kwargs["api_hash"],
bot_token=bot_token or Var.BOT_TOKEN,
in_memory=True,
)
self.user_client = None
if Var.SESSION:
self.user_client = TelegramClient(
StringSession(Var.SESSION), kwargs["api_id"], kwargs["api_hash"]
)
self.run_in_loop(self.start_client(bot_token=bot_token or Var.BOT_TOKEN))
def __repr__(self):
return "<AutoAnimeBot.Client :\n bot: {}\n>".format(self._bot)
async def start_client(self, **kwargs):
"""function to start client"""
if self._log_at:
self.logger.info("Trying to login.")
try:
await self.start(**kwargs)
if self.user_client:
await self.user_client.start()
await self.pyro_client.start()
except ApiIdInvalidError:
self.logger.critical("API ID and API_HASH combination does not match!")
sys.exit(1)
except (AuthKeyDuplicatedError, EOFError):
if self._handle_error:
self.logger.critical("String session expired. Create new!")
sys.exit(1)
self.logger.critical("String session expired.")
except (AccessTokenExpiredError, AccessTokenInvalidError):
self.logger.critical(
"Bot token is expired or invalid. Create new from @Botfather and add in BOT_TOKEN env variable!"
)
sys.exit(1)
self.me = await self.get_me()
if self.me.bot:
me = f"@{self.me.username}"
if self._log_at:
self.logger.info(f"Logged in as {me}")
if self.user_client:
user_me = await self.user_client.get_me()
self.logger.info(f"Logged in as @{user_me.username}")
self._bot = await self.is_bot()
async def upload_anime(self, file, caption, thumb=None, is_button=False):
if not self.pyro_client.is_connected:
try:
await self.pyro_client.connect()
except ConnectionError:
pass
post = await self.pyro_client.send_document(
Var.BACKUP_CHANNEL if is_button else Var.MAIN_CHANNEL,
file,
caption=f"`{caption}`",
force_document=True,
thumb=thumb or "thumb.jpg",
)
return post
async def upload_poster(self, file, caption, channel_id=None):
post = await self.send_file(
channel_id if channel_id else Var.MAIN_CHANNEL,
file=file,
caption=caption or "",
)
return post
async def is_joined(self, channel_id, user_id):
try:
await self(GetParticipantRequest(channel=channel_id, participant=user_id))
return True
except UserNotParticipantError:
return False
async def create_channel(self, title: str, logo=None):
try:
r = await self.user_client(
CreateChannelRequest(
title=title,
about="Powered By github.com/kaif-00z/AutoAnimeBot",
megagroup=False,
)
)
created_chat_id = r.chats[0].id
chat_id = int(f"-100{created_chat_id}")
await asyncio.sleep(2)
await self.user_client.edit_admin(
int(chat_id),
f"{((await self.get_me()).username)}",
post_messages=True,
edit_messages=True,
delete_messages=True,
ban_users=True,
pin_messages=True,
add_admins=True,
)
if logo:
try:
await self.user_client(
EditPhotoRequest(
chat_id, (await self.user_client.upload_file(logo))
)
)
except BaseException:
pass
return chat_id
except BaseException:
LOGS.error(format_exc())
async def generate_invite_link(self, channel_id):
try:
data = await self.user_client(
ExportChatInviteRequest(
peer=channel_id,
title=f"Generated By Ongoing Anime Bot",
request_needed=False,
usage_limit=None,
)
)
return data.link
except BaseException:
LOGS.error(format_exc())
def run_in_loop(self, function):
return self.loop.run_until_complete(function)
def run(self):
self.run_until_disconnected()
def add_handler(self, func, *args, **kwargs):
if func in [_[0] for _ in self.list_event_handlers()]:
return
self.add_event_handler(func, *args, **kwargs)