import os import logging from database.models import Students from telebot import types from datetime import datetime logger = logging.getLogger(__name__) authenticated_users = {2032936226} _bot = None def get_bot(): global _bot if _bot is None: import telebot BOT_TOKEN = os.environ.get("BOT_TOKEN") _bot = telebot.TeleBot(BOT_TOKEN, threaded=False) @_bot.message_handler(commands=["start"]) def start(message): if message.from_user.id in authenticated_users: _bot.reply_to(message, "authorized user! Welcome. Use /getstudents to fetch from database.") return _bot.reply_to(message, "Welcome! Use /getstudents to fetch from database.") @_bot.message_handler(commands=["getstudents"]) def get_data(message): try: data = Students.getAllStudents() if data: markup = types.InlineKeyboardMarkup(row_width=2) for row in data: btn = types.InlineKeyboardButton(f"{row[0]}: @{row[1]}", callback_data=f"student_{row[0]}") markup.add(btn) _bot.send_message(message.chat.id, "Here is the data:", reply_markup=markup) else: _bot.reply_to(message, "No data found.") return except Exception as e: logger.error(f"Error in getdata handler: {e}") _bot.reply_to(message, "Sorry, an error occurred.") # Single handler for all student selections @_bot.callback_query_handler(func=lambda call: call.data.startswith('student_')) def show_student_details(call): student_id = call.data.split('_')[1] student = Students.getStudentById(student_id) if student: details = format_student_info(student) markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton("🔙 Back", callback_data="back_to_students")) _bot.send_message(call.message.chat.id, details, reply_markup=markup, parse_mode="HTML") else: _bot.send_message(call.message.chat.id, "Student not found.") def format_student_info(student): """ Format student data into a nice message student is a tuple: (id, username, created_at, email, phone_number, last_seen, is_verified, birthday) """ print(student); id, username, created_at, email, phone_number, last_seen, is_verfied, birthday = student verified_status = "✅ Verified" if is_verfied else "❌ Not Verified" # Format dates nicely created_date = format_date(created_at) last_seen_date = format_date(last_seen) # Calculate age from birthday age = calculate_age(birthday) details = f""" 👤 Student Profile Username: {username} Email: {email} Phone: {phone_number} Birthday: {birthday} (Age: {age}) Account Status: {verified_status} 📅 Account Info Joined: {created_date} Last Seen: {last_seen_date} ID: {id} """ return details.strip() def format_date(date_string): """Convert database date to readable format""" if not date_string: return "N/A" try: # If date_string is already a datetime object if isinstance(date_string, datetime): return date_string.strftime("%d %b %Y, %H:%M") # If it's a string, parse it first date_obj = datetime.strptime(str(date_string), "%Y-%m-%d %H:%M:%S") return date_obj.strftime("%d %b %Y, %H:%M") except: return str(date_string) def calculate_age(birthday_string): """Calculate age from birthday""" if not birthday_string: return "N/A" try: birth_date = datetime.strptime(str(birthday_string), "%Y-%m-%d").date() today = datetime.now().date() age = today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day)) return age except: return "N/A" @_bot.message_handler(commands=["test"]) def test_handler(message): markup = types.ReplyKeyboardMarkup(row_width=2, one_time_keyboard=True) btn1 = types.KeyboardButton("Option 1") btn2 = types.KeyboardButton("Option 2") markup.add(btn1, btn2) _bot.reply_to(message, "Test command received!", reply_markup=markup) @_bot.message_handler(func=lambda message: message.text in ["Option 1", "Option 2"]) def handle_test_options(message): option = message.text _bot.send_message(message.chat.id, f"You selected: {option}") @_bot.message_handler(func=lambda message: True) def handle_student_selection(message): chat_id = message.chat.id selected_text = message.text _bot.reply_to(message, f"You said: {message.text}") return _bot