From b1907f16d8597555fad2daf5885e68f2ed826910 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Tue, 25 Jul 2023 19:21:39 +0200 Subject: [PATCH] initial commit --- .env.example | 2 + .gitignore | 9 ++ README.md | 0 bot.py | 377 +++++++++++++++++++++++++++++++++++++++++++++++++++ icon.jpeg | Bin 0 -> 41011 bytes 5 files changed, 388 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 bot.py create mode 100644 icon.jpeg diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ff3ba3f --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +BOT_TOKEN= +ADMIN_TELEGRAM_ID= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c2a004 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Local files +.env +*.local* + +# Python +env/ + +# Editors +.vscode/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..b6f911e --- /dev/null +++ b/bot.py @@ -0,0 +1,377 @@ +import os +import sqlite3 +import telebot +from telebot import types +from datetime import datetime, timedelta +from dotenv import load_dotenv + +import uuid + +import textwrap + +# Load environment variables from .env file +load_dotenv() + +# Telegram bot token +BOT_TOKEN = os.getenv("BOT_TOKEN") +TELEGRAM_ADMIN_ID = os.getenv("TELEGRAM_ADMIN_ID") + +# +# Error handling +# + + +class ExceptionHandler(telebot.ExceptionHandler): + def handle(self, exception): + print(exception) + bot = telebot.TeleBot(BOT_TOKEN, parse_mode="MARKDOWN") + bot.send_message(TELEGRAM_ADMIN_ID, "Il BOT è crashato") + bot.send_message(TELEGRAM_ADMIN_ID, f"`{exception}`") + + return True + + +# Initialize the bot +bot = telebot.TeleBot( + BOT_TOKEN, + parse_mode="MARKDOWN", + exception_handler=ExceptionHandler(), +) + +# SQLite database setup +conn = sqlite3.connect("cibo-aula-stud.local.db", check_same_thread=False) +conn.execute("PRAGMA foreign_keys = 1") +cursor = conn.cursor() + +cursor.execute( + """CREATE TABLE IF NOT EXISTS proposte ( + id TEXT PRIMARY KEY, + owner_id TEXT NOT NULL, + name TEXT NOT NULL, + description TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + expiration_datetime TIMESTAMP DEFAULT NULL, + FOREIGN KEY (owner_id) REFERENCES utenti (telegram_id) + ON DELETE CASCADE + )""" +) +conn.commit() + +cursor.execute( + """CREATE TABLE IF NOT EXISTS ordinazioni ( + id TEXT PRIMARY KEY, + owner_id TEXT NOT NULL, + proposta_id TEXT NOT NULL, + content TEXT NOT NULL, + FOREIGN KEY (owner_id) REFERENCES utenti (telegram_id) + ON DELETE CASCADE, + FOREIGN KEY (proposta_id) REFERENCES proposte (id) + ON DELETE CASCADE + )""" +) +conn.commit() + +cursor.execute( + """CREATE TABLE IF NOT EXISTS utenti ( + telegram_id TEXT PRIMARY KEY, + fullname TEXT NOT NULL, + notification BOOLEAN NOT NULL DEFAULT FALSE + )""" +) +conn.commit() + +# +# Delete old proposte +# + +import threading + + +def every_hour(): + threading.Timer(60 * 60, every_hour).start() + + +every_hour() + +# +# Bot Commands +# + + +@bot.message_handler(commands=["start"]) +def handle_start(message): + bot.send_message( + message.chat.id, + "Benvenuto!", + ) + + cursor.execute( + """ + INSERT OR IGNORE INTO utenti(telegram_id, fullname) VALUES (?, ?) + """, + (str(message.from_user.id), message.from_user.username), + ) + conn.commit() + + +@bot.message_handler(commands=["status"]) +def handle_status(message): + owner_id = str(message.from_user.id) + print(owner_id) + + ordinazioni_per_tue_proposte = list( + cursor.execute( + """ + SELECT * FROM proposte p INNER JOIN ordinazioni o ON p.id = o.proposta_id INNER JOIN utenti u ON o.owner_id = u.telegram_id WHERE p.owner_id = ? + """, + (owner_id,), + ) + ) + + nl = "\n" + + bot.send_message(message.chat.id, f"*Ordinazioni alle tue proposte:*") + for o in ordinazioni_per_tue_proposte: + (proposta_id, _, name, description, _, _, _, _, _, ordinazione, _, username, _) = o + bot.send_message(message.chat.id, f"- _{name}_ per @{username} {nl}{ordinazione}") + + tue_ordinazione = list( + cursor.execute( + """ + SELECT * FROM ordinazioni o INNER JOIN proposte p ON o.proposta_id = p.id INNER JOIN utenti u ON p.owner_id = u.telegram_id WHERE o.owner_id = ? + """, + (owner_id,), + ) + ) + + nl = "\n" + + bot.send_message(message.chat.id, f"*Le tue ordinazioni:*") + for o in tue_ordinazione: + (_, _, _, ordinazione, _, _, name, description, _, _, _, username, _) = o + bot.send_message(message.chat.id, f"- _{name}_ creata da @{username}{nl}{ordinazione}") + + +conversazioni_nuova_ordinazione = dict() +conversazioni_proposte = dict() + + +@bot.message_handler(commands=["nuova_proposta"]) +def handle_nuova_proposta(message): + bot.send_message( + message.chat.id, + "Inserisci nome e descrizione dell'ordine (sulla prima riga il nome ed il resto dopo un accapo sarà la descrizione, invia /stop per uscire)", + ) + + print(f"Inizio conversazione con @{message.chat.username} per aggiungere una proposta") + + conversazioni_proposte[message.chat.id] = True + + +@bot.message_handler(commands=["proposte"]) +def handle_proposte(message): + owner_id = str(message.from_user.id) + + proposte = list( + cursor.execute( + """ + SELECT * FROM proposte ORDER BY created_at ASC + """ + ) + ) + + bot.send_message(message.chat.id, "*Lista delle tue proposte*") + + testo = "" + for i, p in enumerate(proposte): + (uuid, _, name, description, _, expiration_time) = p + + testo += f"- *{name}*" + "\n" + + if len(description.strip()) > 0: + testo += f"{description}" + "\n" + + if testo == "": + testo = "Non hai ancora creato nessuna proposta" + + bot.send_message(message.chat.id, testo) + + +conversazioni_nuova_ordinazione = dict() + + +@bot.message_handler(commands=["nuova_ordinazione"]) +def handle_nuova_ordinazione(message): + owner_id = str(message.from_user.id) + + proposte = list( + cursor.execute( + """ + SELECT * FROM proposte ORDER BY created_at ASC + """, + ) + ) + + testo = "Lista delle proposte:\n" + for i, p in enumerate(proposte): + (uuid, _, name, description, _, expiration_time) = p + + testo += textwrap.dedent( + f""" + {i + 1}. *{name}*: + {description} + """ + ) + + indicizzazione = {str(i + 1): p[0] for i, p in enumerate(proposte)} + print(indicizzazione) + + conversazioni_nuova_ordinazione[message.chat.id] = { + "indicizzazione": indicizzazione, + "proposta_id": None, + } + + bot.send_message(message.chat.id, testo) + bot.send_message(message.chat.id, "Invia il numero della proposta a cui vuoi aggiungere un'ordinazione") + + +@bot.message_handler(commands=["attiva_notifiche"]) +def handle_attiva_notifiche(message): + owner_id = str(message.from_user.id) + + cursor.execute( + f""" + UPDATE utenti SET notification = TRUE WHERE telegram_id = ? + """, + (owner_id,), + ) + conn.commit() + + bot.send_message(message.chat.id, "Notifiche attivate") + + +@bot.message_handler(commands=["disattiva_notifiche"]) +def handle_disattiva_notifiche(message): + owner_id = str(message.from_user.id) + + cursor.execute( + f""" + UPDATE utenti SET notification = FALSE WHERE telegram_id = ? + """, + (owner_id,), + ) + conn.commit() + + bot.send_message(message.chat.id, "Notifiche disattivate") + + +@bot.message_handler() +def handle_conversazione(message): + print(f"handle_conversazione: {message.text}") + + if message.chat.id in conversazioni_proposte: + print(f"Continuo conversazione con @{message.from_user.username} per aggiungere una proposta") + + parts = message.text.split("\n", 1) + + proposta_id = str(uuid.uuid4()) + owner_id = str(message.from_user.id) + name = parts[0] + description = parts[1] if len(parts) > 1 else "" + + testo = "" + testo += f"*Proposta aggiunta con successo*" + "\n" + testo += f"Nome: {name}" + "\n" + testo += f"Descrizione: {description}" + "\n" + + bot.send_message(message.chat.id, testo) + + cursor.execute( + """ + INSERT INTO proposte(id, owner_id, name, description) VALUES (?, ?, ?, ?) + """, + (proposta_id, owner_id, name, description), + ) + conn.commit() + + del conversazioni_proposte[message.chat.id] + + users_to_notify = list( + cursor.execute( + """ + SELECT * FROM utenti WHERE notification = TRUE + """, + ) + ) + + for utente in users_to_notify: + (user_id, _, _) = utente + + print(repr(user_id), repr(owner_id)) + if user_id == owner_id: + continue + + testo = "" + testo += f"*Nuova proposta* da @{message.from_user.username}" + "\n" + testo += f"Nome: {name}" + "\n" + testo += f"Descrizione: {description}" + "\n" + + bot.send_message(user_id, testo) + + return + if message.chat.id in conversazioni_nuova_ordinazione: + conv = conversazioni_nuova_ordinazione[message.chat.id] + if conv["proposta_id"] is None: + indice = message.text.strip() + if indice not in conv["indicizzazione"]: + indici = ", ".join(str(k) for k in conv["indicizzazione"].keys()) + bot.send_message(message.chat.id, f"Numero non valido, inviane uno tra {indici}") + return + + proposta_uuid = conv["indicizzazione"][indice] + + conv["proposta_id"] = proposta_uuid + + bot.send_message(message.chat.id, f"Ok, ora dì cosa vuoi ordinare") + + print(conv) + return + else: + ordinazione_id = str(uuid.uuid4()) + ordinazione = message.text.strip() + + cursor.execute( + f""" + INSERT INTO ordinazioni(id, owner_id, proposta_id, content) VALUES (?, ?, ?, ?) + """, + (ordinazione_id, str(message.from_user.id), conv["proposta_id"], ordinazione), + ) + conn.commit() + + del conversazioni_nuova_ordinazione[message.chat.id] + + # Notifica al creatore della proposta del nuovo ordine + + bot.send_message(message.chat.id, f"Ok, ordinazione aggiunta") + + (proposta_owner_id, proposta_name) = cursor.execute( + f""" + SELECT owner_id, name from proposte WHERE id = ? + """, + (conv["proposta_id"],), + ).fetchone() + + testo = "" + testo = f"@{message.from_user.username} ha aggiunto un'ordinazione a _{proposta_name}_" + "\n" + + bot.send_message(proposta_owner_id, testo) + + return + + bot.send_message(message.chat.id, "Non hai cominciato una conversazione! Usa uno dei comandi") + + +print("Starting the bot...") + +# Start the bot +bot.infinity_polling() diff --git a/icon.jpeg b/icon.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..91c07b1a3b87cf7deb70fd5a7096b0ba0e9d054a GIT binary patch literal 41011 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 A4*&oF literal 0 HcmV?d00001