from datetime import datetime
from pyrogram import Client, enums, filters
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message
from Backend import db
from Backend.config import Telegram
from Backend.helper.settings_manager import SettingsManager
from Backend.logger import LOGGER
#----- /start: hand out the Stremio addon link, gated by subscription state
@Client.on_message(filters.command('start') & filters.private, group=10)
async def send_start_message(client: Client, message: Message):
try:
user_id = (message.from_user.id if message.from_user else None) or (message.sender_chat.id if message.sender_chat else None) or message.chat.id
base_url = SettingsManager.current().base_url
addon_url = f"{base_url}/stremio/manifest.json"
#----- No subscription mode: owner-only, single personal token
if not SettingsManager.current().subscription:
if user_id != Telegram.OWNER_ID:
return
user_name = (message.from_user.first_name or message.from_user.username or f"User {user_id}") if message.from_user else f"Chat {user_id}"
try:
token_doc = await db.add_api_token(name=user_name, user_id=user_id)
addon_url = f"{base_url}/stremio/{token_doc.get('token')}/manifest.json"
except Exception as e:
LOGGER.error(f"Error ensuring token for free user: {e}")
await message.reply_text(
'🎉 Welcome to the Telegram Stremio Media Server!\n\n'
'Here is your personal Stremio Addon link:\n\n'
'🎬 Stremio Addon — Install Link:\n'
f'{addon_url}\n\n'
'Tap the link above → Install in Stremio to start watching!',
quote=True,
parse_mode=enums.ParseMode.HTML
)
return
#----- Subscription mode: verify active subscription, else offer plans
user = await db.get_user(user_id)
now = datetime.utcnow()
is_active = db.is_subscription_active(user, now)
if not is_active and user and user.get("subscription_status") == "active":
await db.mark_user_expired(user_id)
if not is_active:
plans = await db.get_subscription_plans()
if not plans:
return await message.reply_text(
'Welcome to the Telegram Stremio Private Group!\n\n'
'Currently, no subscription plans are set up. Please contact the administrator.',
quote=True,
parse_mode=enums.ParseMode.HTML
)
keyboard = InlineKeyboardMarkup([
[InlineKeyboardButton(f"{plan['days']} Days - ₹{plan['price']}", callback_data=f"plan_{plan['_id']}")]
for plan in plans
])
return await message.reply_text(
'Welcome to the Telegram Stremio Private Group!\n\n'
'Access to this bot and the Stremio Addon requires an active subscription.\n'
'Please select a subscription plan below to continue:',
reply_markup=keyboard,
quote=True,
parse_mode=enums.ParseMode.HTML
)
#----- Active subscriber: return their existing token link
all_tokens = await db.get_all_api_tokens()
token_doc = next((t for t in all_tokens if t.get("user_id") == user_id), None)
if token_doc and "token" in token_doc:
addon_url = f"{base_url}/stremio/{token_doc['token']}/manifest.json"
await message.reply_text(
'🎉 Welcome back to the Telegram Stremio Subscription Manager!\n\n'
'Your subscription is active. Here is your personal addon link:\n\n'
'🎬 Stremio Addon — Install Link:\n'
f'{addon_url}\n\n'
'Tap the link above → Install in Stremio to start watching!',
quote=True,
parse_mode=enums.ParseMode.HTML
)
except Exception as e:
await message.reply_text(f"⚠️ Error: {e}")
LOGGER.error(f"Error in /start handler: {e}")