From a7ab11e3bb1d692e54cc5464f829645d2a1fd415 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 5 Aug 2024 22:05:33 +0200 Subject: [PATCH] Bugfix + wip nested menu --- osiris_listener_telegram.py | 237 ++++++++++++++++++++++++++++++------ 1 file changed, 200 insertions(+), 37 deletions(-) diff --git a/osiris_listener_telegram.py b/osiris_listener_telegram.py index 66154ed..32777be 100644 --- a/osiris_listener_telegram.py +++ b/osiris_listener_telegram.py @@ -1,12 +1,22 @@ -import os import logging -import telegram -from telegram import Update -from telegram.ext import ApplicationBuilder, ContextTypes, CallbackContext, CommandHandler, MessageHandler, filters -import telegram.error +import asyncio +from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup +from telegram.ext import Application, CommandHandler, CallbackQueryHandler, MessageHandler, filters, ContextTypes +import os logging.basicConfig(filename='osiris_telegram.log', level=logging.DEBUG, format='%(asctime)s %(message)s') +# Telegram bot token +TELEGRAM_BOT_TOKEN = '6984289827:AAHNUM4F_U6233oa75nX5jXyQY6vC0NlZvw' + +# File to store subscriber chat IDs +SUBSCRIBERS_FILE = 'telegramm_subscribers.txt' +PASSWORD = '29102021' + +# Dictionary to store timers +timers = {} + + #### # Nested Menu Bäume #### @@ -44,6 +54,7 @@ minecraft_menu = [ {"text": "The 1.12.2 Pack (SanderPack)", "callback_data": "minecraft_sanderpack"}, {"text": "GT New Horizons 2.6.0 (SanderHorizons)", "callback_data": "minecraft_sanderhorizon"}, {"text": "RLCraft 2.9.3 (SanderHardcore)", "callback_data": "minecraft_sanderhardcore"}, + {"text": "HarvestMoon (SanderMoon)", "callback_data": "minecraft_sandermoon"}, {"text": "<- Zurück", "callback_data": "minecraft_back"} # Add neue Minecraft Commands here ] @@ -52,6 +63,7 @@ minecraft_menu = [ mc_vanilla_menu = [ [ {"text": "Start", "callback_data": "mc_vanilla_start"}, + {"text": "Stop", "callback_data": "mc_vanilla_stop"}, {"text": "<- Zurück", "callback_data": "mc_vanilla_back"} ] ] @@ -59,6 +71,7 @@ mc_vanilla_menu = [ mc_sanderpack_menu = [ [ {"text": "Start", "callback_data": "mc_sanderpack_start"}, + {"text": "Stop", "callback_data": "mc_sanderpack_stop"}, {"text": "<- Zurück", "callback_data": "mc_sanderpack_back"} ] ] @@ -66,20 +79,31 @@ mc_sanderpack_menu = [ mc_sanderhorizon_menu = [ [ {"text": "Start", "callback_data": "mc_sanderhorizon_start"}, + {"text": "Stop", "callback_data": "mc_sanderhorizon_stop"}, {"text": "<- Zurück", "callback_data": "mc_sanderhorizon_back"} ] ] mc_sanderhardcore_menu = [ [ - {"text": "Start", "callback_data": "mc_sanderhardcore_start"}, + {"text": "Start", "callback_data": "mc_sanderhardcore_start"}, + {"text": "Stop", "callback_data": "mc_sanderhardcore_stop"}, {"text": "<- Zurück", "callback_data": "mc_sanderhardcore_back"} ] ] +mc_sandermoon_menu = [ + [ + {"text": "Start", "callback_data": "mc_sandermoon_start"}, + {"text": "Stop", "callback_data": "mc_sandermoon_stop"}, + {"text": "<- Zurück", "callback_data": "mc_sandermoon_back"} + ] +] + ragnarok_online_menu = [ [ {"text": "Start", "callback_data": "ro_start"}, + {"text": "Stop", "callback_data": "ro_stop"}, {"text": "<- Zurück", "callback_data": "ro_back"} ] ] @@ -87,13 +111,110 @@ ragnarok_online_menu = [ wow_menu = [ [ {"text": "Start", "callback_data": "wow_start"}, + {"text": "Stop", "callback_data": "wow_stop"}, {"text": "<- Zurück", "callback_data": "wow_back"} ] ] +#### +# Timer Functions +#### + +async def start_timer(context: ContextTypes.DEFAULT_TYPE, chat_id: int): + if chat_id in timers: + timers[chat_id].cancel() + timers[chat_id] = context.application.create_task(timer(context, chat_id)) + +async def timer(context: ContextTypes.DEFAULT_TYPE, chat_id: int): + await asyncio.sleep(60) + await send_main_menu(context, chat_id) + +#### +# User functions +#### +def is_registered(user_id): + if not os.path.exists(SUBSCRIBERS_FILE): + return False + with open(SUBSCRIBERS_FILE, 'r') as file: + return str(user_id) in file.read().splitlines() + +# Utility function to register a user +def register_user(user_id): + with open(SUBSCRIBERS_FILE, 'a') as file: + file.write(f"{user_id}\n") + +# Password verification handler +async def verify_password(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + user_id = update.message.chat_id + if not is_registered(user_id): + if update.message.text == PASSWORD: + register_user(user_id) + await update.message.reply_text('Password accepted. Sie sind jetzt registriert.') + await send_main_menu(context, user_id) + await start_timer(context, user_id) + else: + await update.message.reply_text('Incorrect password. Bitte erneut eingeben.') + +#### +# Utils +#### +# Function to send the main menu +async def send_main_menu(context: ContextTypes.DEFAULT_TYPE, chat_id: int): + keyboard = [ + [InlineKeyboardButton("Option 1", callback_data='1')], + [InlineKeyboardButton("Option 2", callback_data='2')], + ] + reply_markup = InlineKeyboardMarkup(keyboard) + await context.bot.send_message(chat_id=chat_id, text='Bitte wählen:', reply_markup=reply_markup) + +# Broadcast message function +async def broadcast_message(application: Application, message: str): + subscribers = read_subscribers() + for chat_id in subscribers: + try: + await application.bot.send_message(chat_id=chat_id, text=message) + except Exception as e: + logging.error(f"Failed to send message to {chat_id}: {e}") + + +async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + await update.message.reply_text('Use /start to test this bot.') + + +def read_subscribers(): + if not os.path.exists(SUBSCRIBERS_FILE): + return [] + with open(SUBSCRIBERS_FILE, 'r') as file: + return [int(line.strip()) for line in file] + +def save_subscriber(chat_id): + """Save a new subscriber chat ID to the file.""" + with open(SUBSCRIBERS_FILE, 'a') as file: + file.write(f"{chat_id}\n") + +#### +# Initialize Bot +#### +async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + user_id = update.message.chat_id if update.message else update.callback_query.message.chat_id + if is_registered(user_id): + keyboard = [ + [InlineKeyboardButton("Option 1", callback_data='1')], + [InlineKeyboardButton("Option 2", callback_data='2')], + ] + reply_markup = InlineKeyboardMarkup(keyboard) + if update.message: + await update.message.reply_text('Bitte wählen:', reply_markup=reply_markup) + elif update.callback_query: + await update.callback_query.message.reply_text('Bitte wählen:', reply_markup=reply_markup) + else: + await update.message.reply_text('Bitte das Zugriffspassword eingeben.') + #### # Command-Verarbeitung #### + +""" def handle_callback(update: Update, context: CallbackContext) -> None: query = update.callback_query data = query.data @@ -104,50 +225,92 @@ def handle_callback(update: Update, context: CallbackContext) -> None: query.edit_message_text("Wähle eine Tool Funktion:", reply_markup=telegram.InlineKeyboardMarkup(tools_menu)) case "game_servers": query.edit_message_text("Wähle einen Gameserver Typ:", reply_markup=telegram.InlineKeyboardMarkup(gameserver_menu)) + # Tools - case "game_servers": - query.edit_message_text("Wähle einen Gameserver Typ:", reply_markup=telegram.InlineKeyboardMarkup(gameserver_menu)) + case "nuc_satus": + pass + case "nuc_shutdown": + pass + case "nuc_back": + query.edit_message_text("Wähle ein Themengebiet aus:", reply_markup=telegram.InlineKeyboardMarkup(main_menu)) - # TODO: Weiter bauen # Game Servers + case "gameservers_status": + pass + case "gameservers_minecraft": + pass + case "gameservers_ragnarok_online": + pass + case "gameservers_wow": + pass + case "gameservers_back": + query.edit_message_text("Wähle ein Themengebiet aus:", reply_markup=telegram.InlineKeyboardMarkup(main_menu)) + # Minecraft + case "minecraft_back": + query.edit_message_text("Wähle ein Game aus:", reply_markup=telegram.InlineKeyboardMarkup(gameserver_menu)) + # Ragnarok Online + case "ro_back": + query.edit_message_text("Wähle ein Game aus:", reply_markup=telegram.InlineKeyboardMarkup(gameserver_menu)) # World of Warcraft + case "wow_back": + query.edit_message_text("Wähle ein Game aus:", reply_markup=telegram.InlineKeyboardMarkup(gameserver_menu)) + + # Default Case case _: print() -#### -# Initialize Bot -#### -# Telegram bot token -TELEGRAM_BOT_TOKEN = '6984289827:AAHNUM4F_U6233oa75nX5jXyQY6vC0NlZvw' - -# File to store subscriber chat IDs -SUBSCRIBERS_FILE = 'telegramm_subscribers.txt' - -async def start_bot(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: - chat_id = update.message.chat_id - save_subscriber(chat_id) - await context.bot.send_message(chat_id=update.effective_chat.id, text="Sie wurden angemeldet für Nachrichten vom nuc_morroc.") +""" +async def handle_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + query = update.callback_query + await query.answer() + await start_timer(context, query.message.chat_id) + data = query.data + + match data: + case "tools": + query.message.reply_text("Wähle eine Tool Funktion:", reply_markup=InlineKeyboardMarkup(tools_menu)) -def load_subscribers(): - """Load subscriber chat IDs from the file.""" - if os.path.exists(SUBSCRIBERS_FILE): - with open(SUBSCRIBERS_FILE, 'r') as file: - return [line.strip() for line in file.readlines()] - return [] + match query.data_: == '1': #todo cases einbauen +finalisieren + # Nested menu for Option 1 + gameserver_menu = [ + [InlineKeyboardButton("Game 1", callback_data='game1')], + [InlineKeyboardButton("Game 2", callback_data='game2')], + [InlineKeyboardButton("Back", callback_data='start')], + ] + await query.message.reply_text(text="Wähle ein Game aus:", reply_markup=InlineKeyboardMarkup(gameserver_menu)) + elif query.data == '2': + # Nested menu for Option 2 + other_menu = [ + [InlineKeyboardButton("Service 1", callback_data='service1')], + [InlineKeyboardButton("Service 2", callback_data='service2')], + [InlineKeyboardButton("Back", callback_data='start')], + ] + await query.message.reply_text(text="Wähle einen Service aus:", reply_markup=InlineKeyboardMarkup(other_menu)) + elif query.data == 'start': + await start(update, context) + elif query.data.startswith('game'): + await query.message.reply_text(f"You selected {query.data}") + elif query.data.startswith('service'): + await query.message.reply_text(f"You selected {query.data}") -def save_subscriber(chat_id): - """Save a new subscriber chat ID to the file.""" - with open(SUBSCRIBERS_FILE, 'a') as file: - file.write(f"{chat_id}\n") +async def on_startup(application: Application): + # Broadcast message on startup + await broadcast_message(application, "Nuc-Morroc hier. Bin jetzt wach :)") + if __name__ == '__main__': logging.info("Starte Telegram-Bot") - telegramm_app = ApplicationBuilder().token(TELEGRAM_BOT_TOKEN).build() - - start_handler = CommandHandler('start', start_bot) - telegramm_app.add_handler(start_handler) + application = Application.builder().token(TELEGRAM_BOT_TOKEN).build() + + application.add_handler(CommandHandler("start", start)) + application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, verify_password)) + application.add_handler(CallbackQueryHandler(handle_callback)) + application.add_handler(CommandHandler("help", help_command)) + + # Set up the startup handler + application.post_init(on_startup) - telegramm_app.run_polling() + application.run_polling() \ No newline at end of file