Spaces:
Running on Zero
Running on Zero
File size: 8,978 Bytes
60e9648 | 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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | #(©) Codeflix_Bots
from aiohttp import web
from plugins import web_server
from pyrogram import Client
from pyrogram.enums import ParseMode
import sys
import asyncio
from datetime import datetime
from config import LOGGER, PORT, OWNER_ID, SHORT_URL, SHORT_API, SHORT_TUT
from helper import MongoDB
version = "v1.0.0"
class Bot(Client):
def __init__(self, session, workers, db, fsub, token, admins, messages, auto_del, db_uri, db_name, api_id, api_hash, protect, disable_btn):
super().__init__(
name=session,
api_hash=api_hash,
api_id=api_id,
plugins={
"root": "plugins"
},
workers=workers,
bot_token=token
)
self.LOGGER = LOGGER
self.name = session
self.db = db
self.fsub = fsub
self.owner = OWNER_ID
self.fsub_dict = {}
self.admins = admins + [OWNER_ID] if OWNER_ID not in admins else admins
self.messages = messages
self.auto_del = auto_del
self.protect = False # Protect content permanently disabled — ignore passed-in value
self.req_fsub = {}
self.disable_btn = disable_btn
self.reply_text = messages.get('REPLY', 'Do not send any useless message in the bot.')
self.mongodb = MongoDB(db_uri, db_name)
self.req_channels = []
self.db_channels = {} # Initialize DB channels dictionary
self.primary_db_channel = db # Set initial primary DB channel
async def start(self):
await super().start()
usr_bot_me = await self.get_me()
self.uptime = datetime.now()
# Load fsub channels from static config first
if len(self.fsub) > 0:
for channel in self.fsub:
try:
chat = await self.get_chat(channel[0])
name = chat.title
link = None
if not channel[1]:
link = chat.invite_link
if not link and not channel[2]:
chat_link = await self.create_chat_invite_link(channel[0], creates_join_request=channel[1])
link = chat_link.invite_link
if not channel[1]:
self.fsub_dict[channel[0]] = [name, link, False, 0]
if channel[1]:
self.fsub_dict[channel[0]] = [name, link, True, 0]
self.req_channels.append(channel[0])
if channel[2] > 0:
self.fsub_dict[channel[0]] = [name, None, channel[1], channel[2]]
except Exception as e:
self.LOGGER(__name__, self.name).warning("Bot can't Export Invite link from Force Sub Channel!")
self.LOGGER(__name__, self.name).warning("\nBot Stopped.")
sys.exit()
# Load dynamically added fsub channels from database
try:
db_fsub_channels = await self.mongodb.get_fsub_channels()
for channel_id_str, channel_data in db_fsub_channels.items():
channel_id = int(channel_id_str)
# Skip if already loaded from static config
if channel_id in self.fsub_dict:
continue
try:
chat = await self.get_chat(channel_id)
name = chat.title
# Update name in case it changed
channel_data[0] = name
self.fsub_dict[channel_id] = channel_data
if channel_data[2]: # if request is True
self.req_channels.append(channel_id)
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Could not load dynamic fsub channel {channel_id}: {e}")
# Remove invalid channel from database
await self.mongodb.remove_fsub_channel(channel_id)
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Error loading dynamic fsub channels: {e}")
await self.mongodb.set_channels(self.req_channels)
# Load DB channels from database
try:
db_channels_data = await self.mongodb.get_db_channels()
self.db_channels = {}
self.primary_db_channel = self.db
for channel_id_str, channel_data in db_channels_data.items():
channel_id = int(channel_id_str)
try:
# Verify channel still exists and is accessible
chat = await self.get_chat(channel_id)
# Update name in case it changed
channel_data['name'] = chat.title
self.db_channels[channel_id_str] = channel_data
# Set primary channel if marked as primary
if channel_data.get('is_primary', False):
self.primary_db_channel = channel_id
self.db = channel_id # Update current db reference
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Could not load DB channel {channel_id}: {e}")
# Remove invalid channel from database
await self.mongodb.remove_db_channel(channel_id)
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Error loading DB channels: {e}")
# Load shortner settings from database
try:
shortner_settings = await self.mongodb.get_shortner_settings()
self.short_url = shortner_settings.get('short_url', SHORT_URL)
self.short_api = shortner_settings.get('short_api', SHORT_API)
self.tutorial_link = shortner_settings.get('tutorial_link', SHORT_TUT)
self.shortner_enabled = shortner_settings.get('enabled', True)
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Error loading shortner settings: {e}")
# Set defaults from config if loading fails
self.short_url = SHORT_URL
self.short_api = SHORT_API
self.tutorial_link = SHORT_TUT
self.shortner_enabled = True
# Protect content is permanently disabled, regardless of any stored/config value
self.protect = False
try:
await self.mongodb.set_protect_content(False)
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Could not persist protect_content=False to DB: {e}")
self.LOGGER(__name__, self.name).info("Protect content is permanently OFF.")
try:
db_channel = await self.get_chat(self.db)
self.db_channel = db_channel
test = await self.send_message(chat_id = db_channel.id, text = "Testing Message by @ProYato")
await test.delete()
# Log DB channels info
self.LOGGER(__name__, self.name).info(f"Primary DB Channel: {self.primary_db_channel}")
self.LOGGER(__name__, self.name).info(f"Total DB Channels: {len(self.db_channels)}")
except Exception as e:
self.LOGGER(__name__, self.name).warning(e)
self.LOGGER(__name__, self.name).warning(f"Make Sure bot is Admin in DB Channel, and Double check the database channel Value, Current Value {self.db}")
self.LOGGER(__name__, self.name).info("\nBot Stopped. Join https://t.me/animes_cruise for support")
sys.exit()
self.LOGGER(__name__, self.name).info("Bot Started!!")
# Start anti-sleep ping loop
try:
from plugins.anti_sleep import keep_alive_loop
asyncio.create_task(keep_alive_loop())
self.LOGGER(__name__, self.name).info("Anti-sleep ping loop started.")
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Anti-sleep init failed: {e}")
# Send restart msge to owner
try:
restart_message = "<b>›› ʜᴇʏ sᴇɴᴘᴀɪ!!\n ɪ'ᴍ ᴀʟɪᴠᴇ ɴᴏᴡ 🍃...</b>"
await self.send_message(chat_id=self.owner, text=restart_message)
self.LOGGER(__name__, self.name).info(f"Restart notification sent to owner: {self.owner}")
except Exception as e:
self.LOGGER(__name__, self.name).warning(f"Failed to send restart notification to owner: {e}")
self.username = usr_bot_me.username
async def stop(self, *args):
await super().stop()
self.LOGGER(__name__, self.name).info("Bot stopped.")
async def web_app():
app = web.AppRunner(await web_server())
await app.setup()
bind_address = "0.0.0.0"
await web.TCPSite(app, bind_address, PORT).start()
|