import datetime import signal import sys import logging from os import getenv from telegram.ext import Updater, CommandHandler, CallbackContext from telegram import Update from sheets_client import authenticate_and_fetch_sheets_data from parser import filter_only_this_weeks_rows chats_mem_cache = set() ALLOWED_USER_IDS = map(lambda id: int(id), getenv("TELEGRAM_USER_IDS", "").split(",")) def _signal_handler(sig, frame): print("You pressed Ctrl+C!") updater = frame.f_locals["updater"] for chat_id in chats_mem_cache: updater.bot.send_message(chat_id=chat_id, text="HommaBot-palvelin sammutettu!") updater.stop() sys.exit(0) def _callback_alarm(context: CallbackContext): chat_id: int = context.job.context logging.info(f"Authenticating and fetching data from Sheets...") rows = authenticate_and_fetch_sheets_data() logging.info(f"Processing data...") processed_data = filter_only_this_weeks_rows(rows) logging.info(f"Sending sheet data to chat id {chat_id}...") message = "Tällä viikolla tehtävät hommat:\n" + "\n".join( map(lambda task: f"{task[1]} ({task[2]})", processed_data) ) context.bot.send_message(chat_id=chat_id, text=message) def _callback_timer(update: Update, context: CallbackContext): chat_id = update.message.chat_id user_id = update.message.from_user.id if user_id not in ALLOWED_USER_IDS: logging.info(f"User {user_id} is not allowed to start timer.") update.message.reply_text( "Käyttäjälläsi ei ole oikeuksia startata HommaBottia." ) return logging.info(f"Starting timer in chat id {chat_id}...") update.message.reply_text( "HommaBot startattu. Uusia hommapäivityksiä viikon välein." ) chats_mem_cache.add(chat_id) context.job_queue.run_repeating( _callback_alarm, datetime.timedelta(weeks=1), 1, # run once immediately after 1 sec context=chat_id, ) def _stop_timer(update: Update, context: CallbackContext): chat_id = update.message.chat_id user_id = update.message.from_user.id if user_id not in ALLOWED_USER_IDS: logging.info(f"User {user_id} is not allowed to stop timer.") update.message.reply_text( "Käyttäjälläsi ei ole oikeuksia pysäyttää HommaBottia." ) return logging.info(f"Stopping timer in chat id {chat_id}...") update.message.reply_text("HommaBot pysäytetty!") chats_mem_cache.remove(chat_id) context.job_queue.stop() def run_telegram(): tg_token = getenv("TELEGRAM_TOKEN") logging.info("Creating Telegram bot object...") updater = Updater(tg_token) logging.info("Registering Telegram bot /start handler...") updater.dispatcher.add_handler( CommandHandler("start", _callback_timer, pass_job_queue=True) ) logging.info("Registering Telegram bot /stop handler...") updater.dispatcher.add_handler( CommandHandler("stop", _stop_timer, pass_job_queue=True) ) logging.info("Starting Telegram bot (HommaBot)...") updater.start_polling() logging.info("Registering SIGINT handler...") signal.signal(signal.SIGINT, _signal_handler) logging.info("Bot started successfully. Pausing main thread... (this is expected)") signal.pause()