diff --git a/bot.py b/bot.py index 05a8882..e54b102 100644 --- a/bot.py +++ b/bot.py @@ -7,7 +7,7 @@ import sys from pathlib import Path from typing import Dict, Any, Optional -from telegram import Update +from telegram import Update, InlineQueryResultArticle, InputTextMessageContent from telegram.constants import ParseMode from telegram.ext import ( ApplicationBuilder, @@ -16,6 +16,7 @@ from telegram.ext import ( MessageHandler, filters, ChatMemberHandler, + InlineQueryHandler, ) DATA_DIR = Path(os.environ.get("DATA_DIR", "/data")) @@ -203,6 +204,73 @@ async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE): except Exception: pass +# ---------------------- Inline Query ---------------------- + +async def inline_query(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Answer inline queries listing counters; selecting one increments it. + + Hinweis: Auswahl eines Counters inkrementiert ihn und sendet den neuen Wert. + Usage: @DeinBot [filter] + """ + if update.inline_query is None: + return + query_text = (update.inline_query.query or "").strip().lower() + counters: Dict[str, int] = context.bot_data.get('counters', {}) + results = [] + if not counters: + results.append( + InlineQueryResultArticle( + id="_no_counters_", + title="Keine Counter vorhanden", + description="/add legt einen neuen Counter an", + input_message_content=InputTextMessageContent( + "Noch keine Counter vorhanden. Nutze /add ." + ), + ) + ) + else: + # Erste Ergebniszeile ist ein Hinweis + results.append( + InlineQueryResultArticle( + id="_hint_", + title="Hinweis: Auswahl inkrementiert", + description="Beim Antippen eines Counters wird er um 1 erhöht", + input_message_content=InputTextMessageContent( + "(Inline Hinweis) — Auswahl eines Counters erhöht ihn um 1." + ), + ) + ) + all_items = sorted(counters.items()) + if query_text: + all_items = [kv for kv in all_items if query_text in kv[0]] + for name, value in all_items[:50]: + new_val = value + 1 + results.append( + InlineQueryResultArticle( + id=f"counter_{name}", + title=f"{name} -> {new_val}", + description=f"Aktuell: {value}; nach Auswahl: {new_val}", + input_message_content=InputTextMessageContent( + f"/increment {name}" + ), + ) + ) + if len(results) == 1: # nur Hinweis, keine Treffer + results.append( + InlineQueryResultArticle( + id="_no_match_", + title="Keine Treffer", + description="Filter ändern oder neuen Counter anlegen", + input_message_content=InputTextMessageContent( + "Keine passenden Counter gefunden." + ), + ) + ) + try: + await update.inline_query.answer(results, cache_time=0, is_personal=True) + except Exception as e: + logger.warning("Fehler beim Beantworten der Inline Query: %s", e) + # ---------------------- Group Events ---------------------- @@ -325,6 +393,7 @@ def main(): # Group / membership events application.add_handler(MessageHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, new_members)) application.add_handler(ChatMemberHandler(my_chat_member, ChatMemberHandler.MY_CHAT_MEMBER)) + application.add_handler(InlineQueryHandler(inline_query)) # Debug raw messages (placed last with low priority) application.add_handler(MessageHandler(filters.ALL, debug_all_messages), group=100) @@ -336,7 +405,7 @@ def main(): application.run_polling( stop_signals=(signal.SIGINT, signal.SIGTERM), - allowed_updates=["message", "chat_member", "my_chat_member"], + allowed_updates=["message", "chat_member", "my_chat_member", "inline_query"], ) diff --git a/docker-compose.yaml b/docker-compose.yaml index 0bd1b39..85fbd23 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,30 +1,30 @@ -version: '3.9' -services: - counterbot: - # Nutzt vorgebautes Image aus Registry - image: git.beging.de/troogs/gigalativbot:latest - container_name: counterbot - restart: unless-stopped - # Entweder environment Schlüssel direkt setzen oder eine .env Datei mit docker compose verwenden. - environment: - # Liefert das Telegram Bot Token (nicht in Git committen). Kann auch via .env Datei bereitgestellt werden. - - BOT_TOKEN=${BOT_TOKEN} - # Optional: Startup Ankündigung an kommagetrennte Chat IDs (z.B. -4549916385) - - STARTUP_ANNOUNCE_CHAT_IDS=${STARTUP_ANNOUNCE_CHAT_IDS:-} - # Optional: Begrüßung aller neuen Mitglieder (true/false) - - ANNOUNCE_ALL_JOINS=${ANNOUNCE_ALL_JOINS:-false} - # Standard Pfade - - CONFIG_FILE=/app/config.yaml - - DATA_DIR=/data - volumes: - - counterbot_data:/data - # Optional: eigene angepasste config.yaml aus Host einbinden - # - ./config.yaml:/app/config.yaml:ro - # Keine Ports nötig bei Long Polling - # healthcheck: - # test: ["CMD", "python", "-c", "import os,sys; sys.exit(0)"] - # interval: 1m - # timeout: 5s - # retries: 3 -volumes: - counterbot_data: +version: '3.9' +services: + counterbot: + # Nutzt vorgebautes Image aus Registry + image: git.beging.de/troogs/gigalativbot:latest + container_name: counterbot + restart: unless-stopped + # Entweder environment Schlüssel direkt setzen oder eine .env Datei mit docker compose verwenden. + environment: + # Liefert das Telegram Bot Token (nicht in Git committen). Kann auch via .env Datei bereitgestellt werden. + - BOT_TOKEN=${BOT_TOKEN} + # Optional: Startup Ankündigung an kommagetrennte Chat IDs (z.B. -4549916385) + - STARTUP_ANNOUNCE_CHAT_IDS=${STARTUP_ANNOUNCE_CHAT_IDS:-} + # Optional: Begrüßung aller neuen Mitglieder (true/false) + - ANNOUNCE_ALL_JOINS=${ANNOUNCE_ALL_JOINS:-false} + # Standard Pfade + - CONFIG_FILE=/app/config.yaml + - DATA_DIR=/data + volumes: + - counterbot_data:/data + # Optional: eigene angepasste config.yaml aus Host einbinden + # - ./config.yaml:/app/config.yaml:ro + # Keine Ports nötig bei Long Polling + # healthcheck: + # test: ["CMD", "python", "-c", "import os,sys; sys.exit(0)"] + # interval: 1m + # timeout: 5s + # retries: 3 +volumes: + counterbot_data: