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 def _currency_symbol(code): return {"INR": "₹", "USD": "$", "EUR": "€", "GBP": "£", "JPY": "¥", "AUD": "A$", "CAD": "C$", "SGD": "S$", "AED": "د.إ", "BRL": "R$"}.get((code or "INR").upper(), f"{(code or 'INR')} ") #----- /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) #----- Honour a manual token grant (never-expires or a future token expiry) if not is_active: token_doc = await db.get_api_token_by_user(user_id) if token_doc and (token_doc.get("subscription_exempt") or (token_doc.get("expires_at") and token_doc["expires_at"] > now)): is_active = True 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 - {_currency_symbol(plan.get('currency'))}{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 token link, creating one if missing user_name = (user.get("first_name") or user.get("username")) if user else None token_doc = await db.ensure_api_token_for_user(user_id, user_name) if token_doc and token_doc.get("token"): 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}")