diff --git a/edu_master/webinar-checker/checker.py b/edu_master/webinar-checker/checker.py index 5ecef74..d09c9fe 100644 --- a/edu_master/webinar-checker/checker.py +++ b/edu_master/webinar-checker/checker.py @@ -98,11 +98,59 @@ async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): "/help - Show this message\n" ) if update.effective_user.id == ADMIN_ID: - msg += "\nAdmin Commands:\nUse the panel below to manage settings." + msg += ( + "\nAdmin Commands:\n" + "/adduser [user_id] - Add user to whitelist\n" + "/removeuser [user_id] - Remove user from whitelist\n" + "Or use the panel below to manage settings." + ) await update.message.reply_text(msg, parse_mode='HTML', reply_markup=get_admin_keyboard()) else: await update.message.reply_text(msg, parse_mode='HTML') +async def add_user(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Add user to whitelist (admin only).""" + if update.effective_user.id != ADMIN_ID: + await update.message.reply_text("⛔ Admin only!") + return + + if not context.args: + await update.message.reply_text("Usage: /adduser [user_id]") + return + + try: + user_id = int(context.args[0]) + redis_client.sadd(KEY_WHITELIST, str(user_id)) + await update.message.reply_text(f"✅ User {user_id} added to whitelist") + logger.info(f"Admin added user {user_id} to whitelist") + except ValueError: + await update.message.reply_text("❌ Invalid user ID. Must be a number.") + +async def remove_user(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Remove user from whitelist (admin only).""" + if update.effective_user.id != ADMIN_ID: + await update.message.reply_text("⛔ Admin only!") + return + + if not context.args: + await update.message.reply_text("Usage: /removeuser [user_id]") + return + + try: + user_id = int(context.args[0]) + if str(user_id) == str(ADMIN_ID): + await update.message.reply_text("❌ Cannot remove admin from whitelist") + return + + removed = redis_client.srem(KEY_WHITELIST, str(user_id)) + if removed: + await update.message.reply_text(f"✅ User {user_id} removed from whitelist") + logger.info(f"Admin removed user {user_id} from whitelist") + else: + await update.message.reply_text(f"⚠️ User {user_id} was not in whitelist") + except ValueError: + await update.message.reply_text("❌ Invalid user ID. Must be a number.") + # --- Admin Callbacks --- async def admin_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): @@ -137,18 +185,29 @@ async def admin_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): elif data == "force_check": await query.message.reply_text("🔄 Running immediate check...") - await check_webinars_job(context) + result = await check_webinars_job(context) + + if result is None: + await query.message.reply_text("❌ Check failed. See logs for details.") + elif result == 0: + await query.message.reply_text("✅ Check completed. No webinars found.") + else: + await query.message.reply_text(f"✅ Check completed. Found {result} webinar(s)!") # --- Webinar Checking Job --- async def check_webinars_job(context: ContextTypes.DEFAULT_TYPE): - """Background job to check for webinars using Async Playwright.""" + """Background job to check for webinars using Async Playwright. + + Returns: + int: Number of webinars found, or None if check failed + """ logger.info("Running webinar check...") phpsessid = redis_client.get(KEY_PHPSESSID) if not phpsessid: logger.warning("PHPSESSID missing. Skipping check.") - return + return None webinar_details = [] @@ -199,6 +258,7 @@ async def check_webinars_job(context: ContextTypes.DEFAULT_TYPE): except Exception as e: logger.error(f"Error checking page: {e}") + return None finally: await page.close() await context_browser.close() @@ -208,7 +268,7 @@ async def check_webinars_job(context: ContextTypes.DEFAULT_TYPE): except Exception as e: logger.error(f"Playwright error: {e}") - return + return None # Notify subscribers if webinars found if webinar_details: @@ -221,6 +281,8 @@ async def check_webinars_job(context: ContextTypes.DEFAULT_TYPE): logger.info(f"Notification sent to {sub_id}") except Exception as e: logger.error(f"Failed to send to {sub_id}: {e}") + + return len(webinar_details) # --- Main --- @@ -242,6 +304,8 @@ def main(): # Handlers app.add_handler(CommandHandler("start", start)) app.add_handler(CommandHandler("help", help_command)) + app.add_handler(CommandHandler("adduser", add_user)) + app.add_handler(CommandHandler("removeuser", remove_user)) app.add_handler(CallbackQueryHandler(admin_callback)) # Job Queue