diff --git a/commands_admin.py b/commands_admin.py new file mode 100644 index 0000000..74b2ba0 --- /dev/null +++ b/commands_admin.py @@ -0,0 +1,50 @@ +from telegram import Update +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes +import configparser +import json +import os +import datetime +import shutil + +# /liste Handler (nur privat für Admins) +async def liste(update: Update, context: ContextTypes.DEFAULT_TYPE): + if update.effective_user.id not in config['admin']['ids']: + await update.message.reply_text("Epic fail, kein Zugriff für dich") + return + + if event_list: + antwort = "*Aktuelle Anmeldungen:*\n\n" + for i, name in enumerate(event_list, start=1): + antwort += f"{i}. {name}\n" + antwort += f"\n Insgesamt angemeldet: *{len(event_list)}*" + await update.message.reply_text( + antwort, parse_mode="Markdown" + ) + else: + await update.message.reply_text("Chill, es is noch gar keiner angemeldet.") + +# /reset Handler (nur privat für Admins, mit Archivierung) +async def reset(update: Update, context: ContextTypes.DEFAULT_TYPE): + if update.effective_user.id not in config['admin']['ids']: + await update.message.reply_text("Epic fail, Zugriff verweigert") + return + + # Nur archivieren, wenn es überhaupt etwas gibt + if event_list: + timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + backup_file = f"event_list_{timestamp}.json" + try: + shutil.copy(list_file, backup_file) + await update.message.reply_text( + f"Ich hab die Liste mal gespeichert, falls du sie aus Versehen resettet hast, liegt jetz unter:\n`{backup_file}`", + parse_mode="Markdown" + ) + except Exception as e: + await update.message.reply_text(f"Fehler beim Sichern: {e}") + else: + await update.message.reply_text("Liste ist leer, nichts zu sichern") + + # Liste zurücksetzen (neue, leere Liste) + event_list.clear() + save_list() + await update.message.reply_text("WOOOSH! Und die Liste is wieder leer.") \ No newline at end of file diff --git a/commands_user.py b/commands_user.py new file mode 100644 index 0000000..32490a1 --- /dev/null +++ b/commands_user.py @@ -0,0 +1,56 @@ +from telegram import Update +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes +import configparser +import json +import os + +# /anmeldung Handler +async def anmeldung(update: Update, context: ContextTypes.DEFAULT_TYPE): + if not context.args: + await update.message.reply_text("Bitte Namen angeben: /anmeldung Name") + return + name = " ".join(context.args) + if name in event_list: + await update.message.reply_text(f"{name}, du bist doch schon angemeldet.") + else: + event_list.append(name) + save_list() + await update.message.reply_text(f"{name} will unbedingt auch dabei sein!") + +# /abmeldung Handler +async def abmeldung(update: Update, context: ContextTypes.DEFAULT_TYPE): + if not context.args: + await update.message.reply_text("Bitte Namen angeben: /abmeldung Name") + return + name = " ".join(context.args) + if name in event_list: + event_list.remove(name) + save_list() + await update.message.reply_text(f"{name} kann nich mehr oder hat kein Bock auf uns.") + else: + await update.message.reply_text(f"{name}, du warst eh nich auf der Liste.") + +# /hilfe Handler +async def hilfe(update: Update, context: ContextTypes.DEFAULT_TYPE): + text = ( + "Dude, ich erklär dir mal wie das hier läuft:\n\n" + "In der Gruppe:\n" + "/anmeldung Name - zum Anmelden\n" + "/abmeldung Name - zum Abmelden\n" + "/status - check wie viele Fussel dabei sind\n\n" + ) + await update.message.reply_text(text) + +# /status Handler (für alle) +async def status(update: Update, context: ContextTypes.DEFAULT_TYPE): + count = len(event_list) + if count == 0: + text = "Is noch keiner eingecheckt..." + elif count == 1: + text = "Es ist aktuell *1 Fussel* dabei!" + else: + text = f"Es sind aktuell *{count} Fussel* dabei!" + await update.message.reply_text(text, parse_mode="Markdown") + +async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): + await hilfe(update, context) diff --git a/errors.py b/errors.py new file mode 100644 index 0000000..ee82b00 --- /dev/null +++ b/errors.py @@ -0,0 +1,9 @@ +from telegram import Update +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes +import configparser +import json +import os + +async def error(update: Update, context: ContextTypes.DEFAULT_TYPE): + await update.message.reply_text("nope") + return \ No newline at end of file diff --git a/handler_participant_lists.py b/handler_participant_lists.py new file mode 100644 index 0000000..c64ef93 --- /dev/null +++ b/handler_participant_lists.py @@ -0,0 +1,6 @@ +from telegram import Update +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes +import configparser +import json +import os + diff --git a/log.py b/log.py new file mode 100644 index 0000000..c64ef93 --- /dev/null +++ b/log.py @@ -0,0 +1,6 @@ +from telegram import Update +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes +import configparser +import json +import os + diff --git a/pawhub-bot.py b/pawhub-bot.py index 06efa49..b4d8c65 100644 --- a/pawhub-bot.py +++ b/pawhub-bot.py @@ -1,132 +1,43 @@ +# [ IMPORTS ] # from telegram import Update from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes import configparser import json import os +# other files in here +from errors import * +from commands_admin import * +from commands_user import * +from handler_participant_lists import * +from log import * + +############################################# +# [ CONFIG FILES ] # + # Konfiguration -list_file = "event_list.json" config = configparser.ConfigParser() config.read('telegram_bot_token.cfg') config.read('telegram_bot_config.cfg') print("Configs loaded.") -# Lade die Liste, falls vorhanden -if os.path.exists(list_file): - with open(list_file, "r") as f: - event_list = json.load(f) -else: - event_list = [] +############################################# +# [ MAIN LOOP ] # -# Hilfsfunktion zum Speichern -def save_list(): - with open(list_file, "w") as f: - json.dump(event_list, f) - -# /anmeldung Handler -async def anmeldung(update: Update, context: ContextTypes.DEFAULT_TYPE): - if not context.args: - await update.message.reply_text("Bitte Namen angeben: /anmeldung Name") - return - name = " ".join(context.args) - if name in event_list: - await update.message.reply_text(f"{name}, du bist doch schon angemeldet.") - else: - event_list.append(name) - save_list() - await update.message.reply_text(f"{name} will unbedingt auch dabei sein!") - -# /abmeldung Handler -async def abmeldung(update: Update, context: ContextTypes.DEFAULT_TYPE): - if not context.args: - await update.message.reply_text("Bitte Namen angeben: /abmeldung Name") - return - name = " ".join(context.args) - if name in event_list: - event_list.remove(name) - save_list() - await update.message.reply_text(f"{name} kann nich mehr oder hat kein Bock auf uns.") - else: - await update.message.reply_text(f"{name}, du warst eh nich auf der Liste.") - -# /liste Handler (nur privat für Admins) -async def liste(update: Update, context: ContextTypes.DEFAULT_TYPE): - if update.effective_user.id not in config['admin']['ids']: - await update.message.reply_text("Epic fail, kein Zugriff für dich") - return - - if event_list: - antwort = "*Aktuelle Anmeldungen:*\n\n" - for i, name in enumerate(event_list, start=1): - antwort += f"{i}. {name}\n" - antwort += f"\n Insgesamt angemeldet: *{len(event_list)}*" - await update.message.reply_text( - antwort, parse_mode="Markdown" - ) - else: - await update.message.reply_text("Chill, es is noch gar keiner angemeldet.") - -# /reset Handler (nur privat für Admins, mit Archivierung) -import datetime -import shutil - -async def reset(update: Update, context: ContextTypes.DEFAULT_TYPE): - if update.effective_user.id not in config['admin']['ids']: - await update.message.reply_text("Epic fail, Zugriff verweigert") - return - - # Nur archivieren, wenn es überhaupt etwas gibt - if event_list: - timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - backup_file = f"event_list_{timestamp}.json" - try: - shutil.copy(list_file, backup_file) - await update.message.reply_text( - f"Ich hab die Liste mal gespeichert, falls du sie aus Versehen resettet hast, liegt jetz unter:\n`{backup_file}`", - parse_mode="Markdown" - ) - except Exception as e: - await update.message.reply_text(f"Fehler beim Sichern: {e}") - else: - await update.message.reply_text("Liste ist leer, nichts zu sichern") - - # Liste zurücksetzen (neue, leere Liste) - event_list.clear() - save_list() - await update.message.reply_text("WOOOSH! Und die Liste is wieder leer.") - -# /hilfe Handler -async def hilfe(update: Update, context: ContextTypes.DEFAULT_TYPE): - text = ( - "Dude, ich erklär dir mal wie das hier läuft:\n\n" - "In der Gruppe:\n" - "/anmeldung Name - zum Anmelden\n" - "/abmeldung Name - zum Abmelden\n" - "/status - check wie viele Fussel dabei sind\n\n" - ) - await update.message.reply_text(text) - -# /status Handler (für alle) -async def status(update: Update, context: ContextTypes.DEFAULT_TYPE): - count = len(event_list) - if count == 0: - text = "Is noch keiner eingecheckt..." - elif count == 1: - text = "Es ist aktuell *1 Fussel* dabei!" - else: - text = f"Es sind aktuell *{count} Fussel* dabei!" - await update.message.reply_text(text, parse_mode="Markdown") - -# Bot starten def main(): app = ApplicationBuilder().token(config['telegram']['bot_token']).build() - app.add_handler(CommandHandler("anmeldung", anmeldung)) - app.add_handler(CommandHandler("abmeldung", abmeldung)) + # Admin commands app.add_handler(CommandHandler("liste", liste)) app.add_handler(CommandHandler("reset", reset)) + + # User commands + app.add_handler(CommandHandler("start", hilfe)) app.add_handler(CommandHandler("hilfe", hilfe)) + app.add_handler(CommandHandler("anmeldung", anmeldung)) + app.add_handler(CommandHandler("abmeldung", abmeldung)) app.add_handler(CommandHandler("status", status)) + app.add_handler(CommandHandler("error", error)) print("Bot läuft...") app.run_polling() @@ -135,3 +46,17 @@ if __name__ == "__main__": main() + + +######### NEEDS TO BE MOVED ##### +# Lade die Liste, falls vorhanden +if os.path.exists(list_file): + with open(config['list']['default'], "r") as f: + event_list = json.load(f) +else: + event_list = [] + +# Hilfsfunktion zum Speichern +def save_list(): + with open(config['list']['default'], "w") as f: + json.dump(event_list, f) diff --git a/telegram_bot_config.cfg b/telegram_bot_config.cfg index 09f61ff..467c39f 100644 --- a/telegram_bot_config.cfg +++ b/telegram_bot_config.cfg @@ -4,3 +4,6 @@ ids = [CHANGE_ME, CHANGE_ME] [chats] # allowed_chat_ids = [CHANGEME] # allow_dms_if_not_in_allowed_chats = True + +[list] +default = event_list.json