def initialize(): global bot global youtube try: f = open('token.txt', 'r') token = f.readline().strip() f.close() except FileNotFoundError: token = input("Please paste the bot Token here: ") f = open('token.txt', 'w') f.write(token) f.close() try: f = open('apikey.txt', 'r') apikey = f.readline().strip() f.close() except FileNotFoundError: apikey = input("Please paste the YouTube v3 API Key here: ") f = open('apikey.txt', 'w') f.write(apikey) f.close() bot = Bot(token) youtube = YouTube(apikey) if not Data.exists(lambda d: d.id == 0): fetch = youtube.fetchData() Data(id=0, pewdiepie=fetch[0], tseries=fetch[1], difference=fetch[2])
def fetchData(): if not Data.exists(lambda d: d.id == 0): Data(id=0) data = Data.get(id=0) res = get('https://www.teamtrees.org') soup = BeautifulSoup(res.content, "html.parser") trees = int(soup.find(id="totalTrees").get_attribute_list("data-count")[0]) data.trees = trees
def initialize(): if not Data.exists(lambda d: d.general == True): Data(general=True) fetchRaces() try: f = open('token.txt', 'r') token = f.readline().strip() f.close() except FileNotFoundError: token = input("Paste the bot API Token: ") f = open('token.txt', 'w') f.write(token) f.close() bot = Bot(token)
def reply(msg): global restrictedMode chatId = msg['chat']['id'] name = msg['from']['first_name'] text = msg.get("text", "") if chatId < 0: return if not User.exists(lambda u: u.chatId == chatId): User(chatId=chatId) if not Data.exists(lambda u: u.chatId == chatId): Data(chatId=chatId) if not ParsedData.exists(lambda u: u.chatId == chatId): ParsedData(chatId=chatId) if not Settings.exists(lambda u: u.chatId == chatId): Settings(chatId=chatId) user = User.get(chatId=chatId) userdata = Data.get(chatId=chatId) stored = ParsedData.get(chatId=chatId) if (not restrictedMode) or helpers.isAdmin(chatId): if text == "/about": bot.sendMessage( chatId, "ℹ️ <b>Informazioni sul bot</b>\n" "ClasseVivaBot è un bot creato e sviluppato da Filippo Pesavento, che ti può aiutare " "durante l'anno scolastico mandando notifiche per le novità del registro e molto altro.\n" "Prova ad usarlo per scoprire quanto è comodo!\n\n" "<b>Sviluppo:</b> <a href=\"https://t.me/pesaventofilippo\">Filippo Pesavento</a> e Francesco De Benedittis\n" "<b>Contributori:</b> Gianluca Parri e PolpOnline\n" "<b>Hosting:</b> Filippo Pesavento\n\n" "<b>Info sicurezza:</b> /aboutprivacy", parse_mode="HTML", disable_web_page_preview=True) elif text == "/aboutprivacy": bot.sendMessage( chatId, "ℹ️ <b>Informazioni sulla privacy</b>\n" "La mia password è al sicuro? 🤔\n\n" "🔐 <b>Sì: la tua password viene criptata.</b>\n" "Il bot conserva la tua password in maniera sicura, salvandola in un formato non leggibile da " "persone estranee. Sei al sicuro: i tuoi dati non verranno visti nè rubati da nessuno!\n\n" "🔐 <b>Spiegazione dettagliata:</b>\n" "Tecnicamente potrei decriptare a mano le password e vederle, ma sostanzialmente è complicato, " "perchè il bot genera una chiave per l'algoritmo (visto che il cripting deve essere reversibile, " "per poter mandare le notifiche automatiche) prendendo come dati una chiave comune (che salvo nella RAM, " "per evitare che qualcuno che non sia io possa leggere il database e i dati degli utenti) " "e anche l'username dell'utente. Quindi ogni utente ha la propria password criptata con una chiave diversa da tutti " "gli altri, e sarebbe difficile anche per me risalire alla password, dovendo sapere di chi è l'username collegato a " "quella password specifica.\n" "Questo non vuol dire che non possa farlo: con un po' di lavoro ci riuscirei. Quindi alla fine devi decidere tu: " "io ti posso assicurare che non leggerò mai nè proverò mai a decriptare le password, sia per un discorso di etica " "che per scelta personale, ma non sono tuo amico nè tuo conoscente: quindi se decidi di non fidarti di uno sconosciuto " "che ti scrive su Telegram (ti posso capire benissimo) sei libero di non usare il bot 🙂\n\n" "<a href=\"https://kutt.it/botinfo\">Altre info & Privacy Policy</a>\n" "<a href=\"https://t.me/pesaventofilippo\">Contattami</a>\n\n" "<i>Se sei venuto qui prima di digitare la password per il login, scrivila adesso!</i>", parse_mode="HTML", disable_web_page_preview=True) elif user.status != "normal": if text == "/annulla": user.status = "normal" bot.sendMessage(chatId, "Comando annullato!") elif user.status == "login_0": if len(text) < 5: bot.sendMessage( chatId, "⚠️ Errore: l'username è troppo corto. Riprova!") return user.username = text user.status = "login_1" bot.sendMessage( chatId, "👍 Ottimo. Adesso inviami la password.\n" "Ricorda che la password viene salvata solo per te e viene criptata, nessuno potrà leggerla.\n\n" "Sei preoccupato per la sicurezza della password? /aboutprivacy" ) elif user.status == "login_1": user.password = crypt_password(text, chatId) user.status = "normal" commit() api = ClasseVivaAPI() try: api.login(user.username, decrypt_password(chatId)) except ApiServerError: try: bot.sendMessage( chatId, "⚠️ I server di ClasseViva non sono raggiungibili.\n" "Riprova tra qualche minuto.") except (TelegramError, BotWasBlockedError): pass return except Exception: helpers.clearUserData(chatId) try: bot.sendMessage( chatId, "😯 Le tue credenziali di accesso sono errate.\n" "Effettua nuovamente il /login per favore.") except (TelegramError, BotWasBlockedError): pass return bot.sendMessage( chatId, "Fatto 😊\n" "Premi /help per vedere la lista dei comandi disponibili.") sent = bot.sendMessage(chatId, "🔍 Aggiorno il profilo...") data = helpers.fetchStrict(api) helpers.updateUserdata(chatId, data) helpers.fetchAndStore(chatId, api, data, fetch_long=True) bot.editMessageText((chatId, sent['message_id']), "✅ Profilo aggiornato!") elif user.status == "calling_support": user.status = "normal" for a in helpers.isAdmin(): bot.sendMessage( a, "🆘 <b>Richiesta di aiuto</b>\n" "Da: <a href=\"tg://user?id={0}\">{1}</a>\n\n" "<i>Rispondi al messaggio per parlare con l'utente.</i>" .format(chatId, name), parse_mode="HTML") if "reply_to_message" in msg: bot.forwardMessage( a, chatId, msg["reply_to_message"]["message_id"]) bot.forwardMessage(a, chatId, msg['message_id'], disable_notification=True) bot.sendMessage(chatId, "<i>Richiesta inviata.</i>\n" "Un admin ti risponderà il prima possibile.", parse_mode="HTML") elif user.status == "sending_orario": if msg.get("photo"): fileId = msg.get("photo")[0]["file_id"] ext = "photo" elif msg.get("document"): fileId = msg.get("document")["file_id"] ext = "document" else: bot.sendMessage( chatId, "🤔 Documento non valido. Invia una foto o un file.\n" "Premi /annulla per annullare.") return if not Document.exists( lambda d: (d.chatId == chatId and d.type == "orario")): Document(chatId=chatId, type="orario", data={ "fileId": fileId, "ext": ext }) else: doc = Document.get(chatId=chatId, type="orario") doc.data = {"fileId": fileId, "ext": ext} bot.sendMessage( chatId, "✅ Orario impostato!\n" "Richiamalo con /orario.") user.status = "normal" elif user.status == "memo_date": if not text: bot.sendMessage( chatId, "Inviami la data in formato GG/MM.\n" "Premi /annulla per annullare.") return try: now = datetime.now() when = datetime.strptime(text, "%d/%m") when.replace(year=now.year) if when < now: when.replace(year=now.year + 1) if when > now + timedelta(days=28): bot.sendMessage( chatId, "⚠️ Data non valida.\n" "La data non può essere oggi, nel passato oppure fra più di 4 settimane.\n" "Premi /annulla per annullare.") return memoDate = when.strftime("%d/%m/%Y") user.status = f"memo_text#{memoDate}" bot.sendMessage( chatId, f"💡 <b>Data memo: {memoDate}</b>\n" f"Inviami il testo del memo, o premi /annulla per annullare.", parse_mode="HTML") except ValueError: bot.sendMessage( chatId, "⚠️ Data non valida.\n" "Inviami la data in formato GG/MM.\n" "Premi /annulla per annullare.") elif user.status.startswith("memo_text"): if not text or len(text) > 400: bot.sendMessage( chatId, "⚠️ Inviami il testo della memo (max. 400 caratteri).\n" "Premi /annulla per annullare.") return memoDate = user.status.split("#")[1] memo = Document(chatId=chatId, type="memo", data={ "date": memoDate, "text": text }) user.status = "normal" stored.agenda = parsers.parseAgenda(userdata.agenda, chatId) stored.domani = parsers.parseDomani(userdata.agenda, chatId) bot.sendMessage( chatId, f"✅ Ho creato la memo per il <b>{memo.data['date']}</b>:\n" f"\"{memo.data['text']}\"\n\n" f"Vedilo in /agenda!", parse_mode="HTML") elif text == "/help": bot.sendMessage( chatId, "Ciao, sono il bot di <b>ClasseViva</b>! 👋🏻\n" "Posso aiutarti a <b>navigare</b> nel registro e posso mandarti <b>notifiche</b> quando hai nuovi avvisi.\n\n" "<b>Lista dei comandi</b>:\n" "- /login - Effettua il login\n" "- /aggiorna - Aggiorna manualmente tutti i dati, per controllare se ci sono nuovi avvisi.\n" "Oppure, puoi lasciarlo fare a me ogni mezz'ora :)\n" "- /agenda - Visualizza agenda (compiti e verifiche)\n" "- /domani - Vedi i compiti che hai per domani\n" "- /promemoria - Vedi un promemoria con i compiti da fare per domani e le lezioni svolte oggi.\n" "- /memo - Aggiungi un memo all'agenda\n" "- /voti - Visualizza la lista dei voti\n" "- /lezioni - Visualizza la lista delle lezioni\n" "- /didattica - Visualizza la lista dei file in didattica\n" "- /circolari - Visualizza le circolari da leggere\n" "- /orario - Imposta o visualizza l'orario delle lezioni\n" "- /settings - Modifica le impostazioni personali del bot\n" "- /assenze - Visualizza assenze, ritardi e uscite anticipate\n" "- /note - Visualizza la lista delle note\n" "- /info - Visualizza le tue info utente\n" "- /prof - Visualizza la lista delle materie e dei prof\n" "- /about - Informazioni sul bot\n" "- /aboutprivacy - Più informazioni sulla privacy\n" "- /logout - Disconnettiti\n" "- /support - Contatta lo staff (emergenze)\n\n" "<b>Notifiche</b>: ogni mezz'ora, se vuoi, ti invierò un messaggio se ti sono arrivati nuovi voti, note, compiti, materiali, avvisi o circolari.\n" "<b>Impostazioni</b>: con /settings puoi cambiare varie impostazioni, tra cui l'orario delle notifiche, quali notifiche ricevere e se riceverle di notte." "", parse_mode="HTML") elif text.startswith("/broadcast ") and helpers.isAdmin(chatId): bdText = text.split(" ", 1)[1] pendingUsers = select(u.chatId for u in User)[:] userCount = len(pendingUsers) for u in pendingUsers: try: bot.sendMessage(u, bdText, parse_mode="HTML", disable_web_page_preview=True) except (TelegramError, BotWasBlockedError): userCount -= 1 bot.sendMessage( chatId, "📢 Messaggio inviato correttamente a {0} utenti!".format( userCount)) elif text.startswith("/sendmsg ") and helpers.isAdmin(chatId): selId = int(text.split(" ", 2)[1]) selText = str(text.split(" ", 2)[2]) bot.sendMessage(selId, selText, parse_mode="HTML") bot.sendMessage(chatId, selText + "\n\n- Messaggio inviato!", parse_mode="HTML") elif text == "/globalupdate" and helpers.isAdmin(chatId): bot.sendMessage(chatId, "🕙 Inizio aggiornamento globale...") runUpdates(long_fetch=True) bot.sendMessage(chatId, "✅ Aggiornamento globale completato!") elif text == "/silentupdate" and helpers.isAdmin(chatId): bot.sendMessage(chatId, "🕙 [BG] Inizio aggiornamento globale...") runUpdates(long_fetch=True, sendMessages=False) bot.sendMessage(chatId, "✅ [BG] Aggiornamento globale completato!") elif text == "/users" and helpers.isAdmin(chatId): totalUsers = len(select(u for u in User)[:]) loggedUsers = len(select(u for u in User if u.password != "")[:]) bot.sendMessage(chatId, "👤 Utenti totali: <b>{}</b>\n" "👤 Utenti loggati: <b>{}</b>".format( totalUsers, loggedUsers), parse_mode="HTML") elif text == "/restrict" and helpers.isAdmin(chatId): restrictedMode = True bot.sendMessage(chatId, "<i>Modalità ristretta attiva.\n" "Solo gli admin possono usare il bot.</i>", parse_mode="HTML") elif text == "/unrestrict" and helpers.isAdmin(chatId): restrictedMode = False bot.sendMessage(chatId, "<i>Modalità ristretta disattivata.\n" "Tutti gli utenti potranno usare il bot.</i>", parse_mode="HTML") elif "reply_to_message" in msg: if helpers.isAdmin(chatId): try: userId = msg['reply_to_message']['forward_from']['id'] bot.sendMessage(userId, "💬 <b>Risposta dello staff</b>\n" "{0}".format(text), parse_mode="HTML") bot.sendMessage(chatId, "Risposta inviata!") except Exception: bot.sendMessage(chatId, "Errore nell'invio.") else: if text.lower() == "no": bot.sendMessage(chatId, "<i>Ah ok, scusa.</i>", parse_mode="HTML") else: bot.sendMessage( chatId, "Scrivi /support per parlare con lo staff.") elif text == "/annulla": bot.sendMessage(chatId, "😴 Nessun comando da annullare!") elif helpers.hasStoredCredentials(chatId): if text == "/start": bot.sendMessage(chatId, "Bentornato, <b>{0}</b>!\n" "Cosa posso fare per te? 😊".format(name), parse_mode="HTML") elif text == "/login": bot.sendMessage( chatId, "Sei già loggato.\n" "Premi /logout per uscire.") elif text == "/logout": bot.sendMessage( chatId, "Tutti i tuoi dati scolastici e le credenziali verranno eliminate dal bot.\n" "Sei <b>veramente sicuro</b> di voler uscire?", parse_mode="HTML", reply_markup=keyboards.logout()) elif text == "/didattica": helpers.sendLongMessage( chatId, "📚 <b>Files caricati in didattica</b>:\n\n" "{0}".format(stored.didattica), parse_mode="HTML", disable_web_page_preview=True) elif text == "/info": bot.sendMessage(chatId, "ℹ️ <b>Ecco le tue info</b>:\n\n" "{0}".format(stored.info), parse_mode="HTML") elif text == "/prof": helpers.sendLongMessage(chatId, "📚 <b>Lista materie e prof</b>:\n\n" "{0}".format(stored.prof), parse_mode="HTML") elif text == "/note": helpers.sendLongMessage(chatId, "❗️<b>Le tue note</b>:\n\n" "{0}".format(stored.note), parse_mode="HTML") elif text == "/voti": helpers.sendLongMessage(chatId, "📝 <b>I tuoi voti</b>:\n\n" "{0}".format(stored.voti), parse_mode="HTML") elif text == "/assenze": helpers.sendLongMessage(chatId, "{0}".format(stored.assenze), parse_mode="HTML") elif text == "/agenda": bot.sendMessage( chatId, "📆 <b>Agenda compiti per le prossime 2 settimane</b>:\n\n" "{0}".format(stored.agenda), parse_mode="HTML", disable_web_page_preview=True) elif text == "/domani": isSaturday = datetime.now().isoweekday() == 6 dayString = "lunedì" if isSaturday else "domani" bot.sendMessage(chatId, "📆 <b>Compiti e verifiche per {0}</b>:\n\n" "{1}".format(dayString, stored.domani), parse_mode="HTML", disable_web_page_preview=True) elif text == "/circolari": bot.sendMessage(chatId, "📩 <b>Circolari da leggere</b>:\n\n" "{0}".format(stored.circolari), parse_mode="HTML", disable_web_page_preview=True) elif text == "/lezioni": bot.sendMessage(chatId, "📚 <b>Lezioni di oggi</b>:\n\n" "{0}".format(stored.lezioni), parse_mode="HTML", disable_web_page_preview=True, reply_markup=keyboards.lezioni()) elif text == "/settings": bot.sendMessage( chatId, "🛠 <b>Impostazioni</b>\n" "Ecco le impostazioni del bot. Cosa vuoi modificare?", parse_mode="HTML", reply_markup=keyboards.settings_menu()) elif text == "/promemoria": bot.sendMessage(chatId, "🕙 <b>Promemoria!</b>\n\n" "📆 <b>Cosa devi fare per domani</b>:\n\n" "{0}\n\n\n" "📚 <b>Le lezioni di oggi</b>:\n\n" "{1}".format(stored.domani, stored.lezioni), parse_mode="HTML", disable_web_page_preview=True) elif text == "/aggiorna": if (user.remainingCalls > 0) or (helpers.isAdmin(chatId)): if not updateLock.acquire(blocking=False): bot.sendMessage( chatId, "ℹ️ <b>Aspetta!</b>\n" "Il bot sta già eseguendo degli aggiornamenti globali per tutti gli utenti.", parse_mode="HTML") return sent = bot.sendMessage(chatId, "📙📙📙 Cerco aggiornamenti... 0%") user.remainingCalls -= 1 commit() updateLock.release() bot.editMessageText((chatId, sent['message_id']), "📗📙📙 Cerco aggiornamenti... 10%") api = ClasseVivaAPI() bot.editMessageText((chatId, sent['message_id']), "📗📙📙 Cerco aggiornamenti... 20%") if helpers.userLogin(chatId, api): bot.editMessageText((chatId, sent['message_id']), "📗📙📙 Cerco aggiornamenti... 35%") try: data = helpers.fetchStrict(api) except ApiServerError: bot.editMessageText(( chatId, sent['message_id'] ), "⚠️ I server di ClasseViva non sono raggiungibili.\n" "Riprova tra qualche minuto.") return bot.editMessageText((chatId, sent['message_id']), "📗📗📙 Cerco aggiornamenti... 50%") dataDidattica = parsers.parseNewDidattica( userdata.didattica, data['didattica']) bot.editMessageText((chatId, sent['message_id']), "📗📗📙 Cerco aggiornamenti... 60%") dataNote = parsers.parseNewNote( userdata.note, data['note']) bot.editMessageText((chatId, sent['message_id']), "📗📗📙 Cerco aggiornamenti... 70%") dataVoti = parsers.parseNewVoti( userdata.voti, data['voti'], chatId) bot.editMessageText((chatId, sent['message_id']), "📗📗📙 Cerco aggiornamenti... 80%") dataAgenda = parsers.parseNewAgenda( userdata.agenda, data['agenda'], chatId) bot.editMessageText((chatId, sent['message_id']), "📗📗📙 Cerco aggiornamenti... 90%") dataCircolari = parsers.parseNewCircolari( userdata.circolari, data['circolari']) bot.editMessageText((chatId, sent['message_id']), "📗📗📗 Cerco aggiornamenti... 100%") if dataDidattica is not None: bot.sendMessage( chatId, "🔔 <b>Nuovi file caricati!</b>{0}".format( dataDidattica), parse_mode="HTML", disable_web_page_preview=True) if dataNote is not None: bot.sendMessage( chatId, "🔔 <b>Hai nuove note!</b>{0}".format(dataNote), parse_mode="HTML") if dataVoti is not None: bot.sendMessage( chatId, "🔔 <b>Hai nuovi voti!</b>{0}".format(dataVoti), parse_mode="HTML") if dataAgenda is not None: bot.sendMessage( chatId, "🔔 <b>Hai nuovi impegni!</b>\n{0}".format( dataAgenda), parse_mode="HTML", disable_web_page_preview=True) if dataCircolari is not None: bot.sendMessage( chatId, "🔔 <b>Hai nuove circolari!</b>{0}".format( dataCircolari), parse_mode="HTML", disable_web_page_preview=True) if not any([ dataDidattica, dataNote, dataVoti, dataAgenda, dataCircolari ]): bot.editMessageText((chatId, sent['message_id']), "📗 Dati aggiornati!\n" "📗 Nessuna novità!") else: bot.deleteMessage((chatId, sent['message_id'])) helpers.updateUserdata(chatId, data) helpers.fetchAndStore(chatId, api, data, fetch_long=True) else: bot.sendMessage( chatId, "⛔️ Hai usato troppi /aggiorna recentemente. Aspetta un po'!" ) elif (text == "/support") or (text == "/start support"): user.status = "calling_support" bot.sendMessage( chatId, "🆘 <b>Richiesta di supporto</b>\n" "Se hai qualche problema che non riesci a risolvere, scrivi qui un messaggio, e un admin " "ti contatterà il prima possibile.\n\n" "<i>Per annullare, premi</i> /annulla.", parse_mode="HTML") elif text == "/orario": if not Document.exists( lambda d: (d.chatId == chatId and d.type == "orario")): user.status = "sending_orario" bot.sendMessage( chatId, "🕑 <b>Impostazione orario</b>\n" "Inviami un documento (PDF oppure foto) per salvarlo e richiamarlo " "quando serve con /orario!", parse_mode="HTML") else: doc = Document.get(chatId=chatId, type="orario") sendFunc = bot.sendPhoto if doc.data[ "ext"] == "photo" else bot.sendDocument sendFunc(chatId, doc.data["fileId"], reply_markup=keyboards.mod_orario()) elif text == "/memo": user.status = "memo_date" today = datetime.now().weekday() bot.sendMessage( chatId, "💡 <b>Memo personale</b>\n" "Crea un memo personale per aggiungere i compiti da fare all'agenda!\n" "Inviami <b>la data</b> di consegna, nel formato GG/MM, oppure scegli un'opzione " "da quelle qui sotto.\n\n" "Premi /annulla per annullare.", parse_mode="HTML", reply_markup=keyboards.create_memo(today)) elif text == "/resetmemo": memos = select(m for m in Document if m.chatId == chatId and m.type == "memo")[:] for memo in memos: memo.delete() bot.sendMessage(chatId, "✅ Ho eliminato tutte le memo!") # Custom Start Parameters elif text.startswith("/start "): param = text.split(' ')[1] if param.startswith("circ"): evtCode = param.split("-")[0].replace("circ", "") pubId = int(param.split("-")[1]) sendFile(chatId, "circolare", evtCode, pubId) elif param.startswith("file"): intId = int(param[4:]) sendFile(chatId, "file", intId) elif param.startswith("link"): intId = int(param[4:]) sendFile(chatId, "link", intId) elif text == "⬆️⬆️⬇️⬇️⬅️➡️⬅️➡️🅱️🅰️" or text == "⬆️⬆️⬇️⬇️⬅️➡️⬅️➡️🅱🅰": from random import choice today = datetime.today().strftime("%d/%m/%Y") subject = choice( ["MATEMATICA", "ITALIANO", "INGLESE", "STORIA"]) bot.sendMessage(chatId, "🔔 <b>Hai nuovi voti!</b>\n\n" "📚 <b>{}</b>\n\n" "📗 <b>Voto 10</b> • Scritto • {}\n" "<i>Start!</i>".format(subject, today), parse_mode="HTML") # Text is not a keyword else: bot.sendMessage( chatId, "Non ho capito...\n" "Serve aiuto? Premi /help") # User not logged in else: if text == "/login": user.status = "login_0" bot.sendMessage( chatId, "Per favore, inviami il tuo <b>username</b> (quello che usi per accedere al registro).\n" "Usa /annulla se serve.", parse_mode="HTML") else: bot.sendMessage(chatId, "Benvenuto, <b>{0}</b>!\n" "Per utilizzarmi devi eseguire il /login.\n\n" "Premi /help se serve aiuto.".format(name), parse_mode="HTML") # Normal user with restricted mode else: if text == "/moreinfo": bot.sendMessage( chatId, "❓ <b>Che genere di problemi?</b>\n" "ClasseViva ha recentemente imposto un limite alle sue API, che questo bot utilizza, " "anche se è nascosto e non sempre uguale. Con l'aumentare degli utenti, il bot doveva fare " "sempre più richieste e una volta raggiunto il limite ha cominciato a non funzionare più.\n" "La soluzione sarebbe avere una lista di minimo 20 proxy da utilizzare per fare le richieste " "(si tratta di max. 200KB di traffico ogni 30 minuti, non è quello il problema), che " "però è molto difficile da trovare senza pagare qualche servizio, che al momento non posso permettermi.\n\n" "❔ <b>Posso contattarti?</b>\n" "Certo, puoi scrivermi per qualsiasi motivo <a href=\"https://t.me/pesaventofilippo\">qui</a> " "o mandarmi una mail a [email protected].\n" "Non sono un bot, quindi magari non rispondo subito 🙂", parse_mode="HTML", disable_web_page_preview=True) else: bot.sendMessage( chatId, "ℹ️ <b>Bot in manutenzione</b>\n" "Il bot è attualmente in manutenzione per problemi con ClasseViva, e tutte le sue " "funzioni sono temporaneamente disabilitate.\n" "Non eliminare questa chat: se vuoi puoi archiviarla su Telegram, così appena " "ci saranno notizie ti manderò un messaggio.\n\n" "/moreinfo", parse_mode="HTML")
def reply(msg): chatId = msg['chat']['id'] name = msg['from']['first_name'] if "text" in msg: text = msg['text'] else: bot.sendMessage(chatId, "🤨 Formato file non supportato. /help") return if not User.exists(lambda u: u.chatId == chatId): User(chatId=chatId) if not Data.exists(lambda d: d.chatId == chatId): Data(chatId=chatId) user = User.get(chatId=chatId) data = Data.get(chatId=chatId) if text == "/about": bot.sendMessage(chatId, "ℹ️ <b>Informazioni sul bot</b>\n" "IliadInfoBot è un bot creato e sviluppato da Filippo Pesavento, che ti permette " "di visualizzare tutte le info sul tuo account Iliad in mancanza dell'app.\n" "Prova ad usarlo per scoprire quanto è comodo!\n\n" "<b>Sviluppo:</b> Filippo Pesavento\n" "<b>Hosting:</b> Filippo Pesavento\n" "<b>Info sicurezza:</b> /aboutprivacy\n\n" "<i>IliadInfoBot non è in alcun modo affiliato con Iliad Italia S.p.A ed è una creazione " "esclusiva di Filippo Pesavento.</i>", parse_mode="HTML") elif text == "/aboutprivacy": bot.sendMessage(chatId, "ℹ️ <b>Informazioni sulla privacy</b>\n" "La mia password è al sicuro? 🤔\n\n" "🔐 <b>Sì: la tua password viene criptata.</b>\n" "Il bot conserva la tua password in maniera sicura, salvandola in un formato non leggibile da " "persone estranee. Sei al sicuro: i tuoi dati non verranno visti nè rubati da nessuno!\n\n" "🔐 <b>Spiegazione dettagliata:</b>\n" "Tecnicamente potrei decriptare a mano le password e vederle, ma sostanzialmente è complicato, " "perchè il bot genera una chiave per l'algoritmo (visto che il cripting deve essere reversibile, " "per poter mandare le notifiche automatiche) prendendo come dati una chiave comune (che salvo nella RAM " "e inserisco ad ogni avvio, per evitare che qualcuno che non sia io possa leggere il database e i dati degli utenti) " "e anche l'username dell'utente. Quindi ogni utente ha la propria password criptata con una chiave diversa da tutti " "gli altri, e sarebbe difficile anche per me risalire alla password, dovendo sapere di chi è l'username collegato a " "quella password specifica.\n" "Questo non vuol dire che non possa farlo: con un po' di lavoro ci riuscirei. Quindi alla fine devi decidere tu: " "io ti posso assicurare che non leggerò mai nè proverò mai a decriptare le password, sia per un discorso di etica " "che per scelta personale, ma non sono tuo amico nè tuo conoscente: quindi se decidi di non fidarti di uno sconosciuto " "che ti scrive su Telegram (ti posso capire benissimo) sei libero di non usare il bot 🙂\n\n" "<a href=\"https://t.me/pesaventofilippo\">Contattami</a>\n\n" "<i>Se sei venuto qui prima di digitare la password per il login, scrivila adesso!</i>", parse_mode="HTML", disable_web_page_preview=True) elif user.status != "normal": if text == "/annulla": user.status = "normal" bot.sendMessage(chatId, "Comando annullato!") elif user.status == "login_0": if len(text) != 8 or not text.isdigit(): bot.sendMessage(chatId, "⚠️ Errore: l'username deve essere un numero 8 cifre. Riprova!") return user.username = text user.status = "login_1" bot.sendMessage(chatId, "👍 Ottimo. Adesso inviami la password.\n" "Ricorda che la password viene salvata solo per te e viene criptata, nessuno potrà leggerla.\n\n" "Sei preoccupato per la sicurezza della password? /aboutprivacy") elif user.status == "login_1": user.password = crypt_password(text, chatId) user.status = "normal" commit() api = IliadApi(user.username, decrypt_password(chatId)) try: api.load() except AuthenticationFailedError: helpers.clearUserData(chatId) try: bot.sendMessage(chatId, "😯 Le tue credenziali di accesso sono errate.\n" "Controlla i dati inseriti e rieffettua il /login.") except (TelegramError, BotWasBlockedError): pass return bot.sendMessage(chatId, "Fatto 😊\n" "Premi /help per vedere la lista dei comandi disponibili.\n\n" "<i>Se vuoi, puoi eliminare il messaggio che mi hai mandato contenente la password: "******"non mi serve più!</i>", parse_mode="HTML") sent = bot.sendMessage(chatId, "🔍 Aggiorno il profilo...") helpers.fetchAndStore(api, chatId) bot.editMessageText((chatId, sent['message_id']), "✅ Profilo aggiornato!") elif user.status == "calling_support": user.status = "normal" for a in helpers.isAdmin(): bot.sendMessage(a, "🆘 <b>Richiesta di aiuto</b>\n" "Da: <a href=\"tg://user?id={0}\">{1}</a>\n\n" "<i>Rispondi al messaggio per parlare con l'utente.</i>".format(chatId, name), parse_mode="HTML") if "reply_to_message" in msg: bot.forwardMessage(a, chatId, msg["reply_to_message"]["message_id"]) bot.forwardMessage(a, chatId, msg['message_id'], disable_notification=True) bot.sendMessage(chatId, "<i>Richiesta inviata.</i>\n" "Un admin ti risponderà il prima possibile.", parse_mode="HTML") elif text == "/help": bot.sendMessage(chatId, "Ciao, sono il bot di <b>Iliad</b>! 👋🏻\n" "Posso aiutarti a <b>controllare</b> il tuo piano dati e posso mandarti <b>notifiche</b> (in futuro).\n\n" "<b>Lista dei comandi</b>:\n" "- /start - Avvia bot\n" "- /login - Effettua il login\n" "- /profilo - Informazioni sul profilo Iliad\n" "- /overview - Riepilogo generale dei consumi\n" "- /credito - Credito residuo\n" "- /internet - Visualizza piano dati\n" "- /chiamate - Visualizza piano chiamate\n" "- /sms - Visualizza piano SMS\n" "- /mms - Visualizza piano MMS\n" "- /logout - Disconnettiti\n" "- /aggiorna - Aggiorna tutti i dati. <b>Nota</b>: lo faccio già in automatico ogni mezz'ora per te!\n" "- /help - Mostra questa lista\n" "- /about - Informazioni sul bot\n" "- /aboutprivacy - Più informazioni sulla privacy\n" "- /support - Contatta lo staff (emergenze)\n\n" "<i>IliadInfoBot non è in alcun modo affiliato con Iliad Italia S.p.A ed è una creazione " "esclusiva di Filippo Pesavento.</i>", parse_mode="HTML") elif text == "/users" and helpers.isAdmin(chatId): totalUsers = len(select(u for u in User)[:]) loggedUsers = len(select(u for u in User if u.password != "")[:]) bot.sendMessage(chatId, "👤 Utenti totali: <b>{}</b>\n" "👤 Utenti loggati: <b>{}</b>".format(totalUsers, loggedUsers), parse_mode="HTML") elif text == "/globalupdate" and helpers.isAdmin(chatId): bot.sendMessage(chatId, "🕙 Inizio aggiornamento globale...") runUpdates() bot.sendMessage(chatId, "✅ Aggiornamento globale completato!") elif text.startswith("/broadcast ") and helpers.isAdmin(chatId): bdText = text.split(" ", 1)[1] pendingUsers = select(u.chatId for u in User)[:] userCount = len(pendingUsers) for u in pendingUsers: try: bot.sendMessage(u, bdText, parse_mode="HTML", disable_web_page_preview=True) except (TelegramError, BotWasBlockedError): userCount -= 1 bot.sendMessage(chatId, "📢 Messaggio inviato correttamente a {0} utenti!".format(userCount)) elif text.startswith("/sendmsg ") and helpers.isAdmin(chatId): selId = int(text.split(" ", 2)[1]) selText = str(text.split(" ", 2)[2]) bot.sendMessage(selId, selText, parse_mode="HTML") bot.sendMessage(chatId, selText + "\n\n- Messaggio inviato!", parse_mode="HTML") elif "reply_to_message" in msg: if helpers.isAdmin(chatId): try: userId = msg['reply_to_message']['forward_from']['id'] bot.sendMessage(userId, "💬 <b>Risposta dello staff</b>\n" "{0}".format(text), parse_mode="HTML") bot.sendMessage(chatId, "Risposta inviata!") except Exception: bot.sendMessage(chatId, "Errore nell'invio.") else: bot.sendMessage(chatId, "Scrivi /support per parlare con lo staff.") elif text == "/annulla": bot.sendMessage(chatId, "😴 Nessun comando da annullare!") elif helpers.hasStoredCredentials(chatId): if text == "/start": bot.sendMessage(chatId, "Bentornato, <b>{0}</b>!\n" "Cosa posso fare per te? 😊".format(name), parse_mode="HTML") elif text == "/login": bot.sendMessage(chatId, "Sei già loggato.\n" "Premi /logout per uscire.") elif text == "/logout": sent = bot.sendMessage(chatId, "Tutti i tuoi dati relativi all'account e le credenziali verranno eliminate dal bot.\n" "Sei <b>veramente sicuro</b> di voler uscire?", parse_mode="HTML") bot.editMessageReplyMarkup((chatId, sent['message_id']), keyboards.logout(sent['message_id'])) elif text == "/profilo": bot.sendMessage(chatId, f"👤 <b>Info profilo</b>\n\n" f"ℹ️ Nome: <b>{data.nome}</b>\n" f"📞 Numero: <b>{data.numero}</b>\n" f"🆔 ID Account: <b>{data.accountId}</b>\n\n" f"💶 Credito residuo: <b>{data.credito:.2f}€</b>\n" f"📅 Data rinnovo: <b>{data.dataRinnovo}</b>", parse_mode="HTML") elif text == "/overview": costo = data.costoChiamate + data.costoGiga + data.costoSms + data.costoMms sent = bot.sendMessage(chatId, f"ℹ️ <b>Riepilogo piano</b>\n\n" f"📞 Chiamate: <b>{data.totChiamate}</b>\n" f"🌐 Dati consumati: <b>{data.totGiga['count']}{data.totGiga['unit']}</b> su <b>" f"{data.pianoGiga['count']}{data.pianoGiga['unit']}</b>\n" f"✉️ SMS Inviati: <b>{data.totSms}</b>\n" f"📧 MMS Inviati: <b>{data.totMms}</b>\n\n" f"💸 Costi extra: {costo:.2f}€", parse_mode="HTML") bot.editMessageReplyMarkup((chatId, sent['message_id']), keyboards.overviewExt(sent['message_id'])) elif text == "/credito": bot.sendMessage(chatId, f"Il tuo credito residuo è di <b>{data.credito:.2f} euro</b>.", parse_mode="HTML") elif text == "/chiamate": bot.sendMessage(chatId, f"🇮🇹 <b>Chiamate in Italia</b>\n" f"🕙 Tempo: <b>{data.totChiamate}</b>\n" f"💸 Costi extra: <b>{data.costoChiamate:.2f}€</b>\n\n" f"🇪🇺 <b>Chiamate in Europa</b>\n" f"🕙 Tempo: <b>{data.ext_totChiamate}</b>\n" f"💸 Costi extra: <b>{data.ext_costoChiamate:.2f}€</b>", parse_mode="HTML") elif text == "/sms": bot.sendMessage(chatId, f"🇮🇹 <b>SMS in Italia</b>\n" f"✉️ Inviati: <b>{data.totSms} SMS</b>\n" f"💸 Costi extra: <b>{data.costoSms:.2f}€</b>\n\n" f"🇪🇺 <b>SMS in Europa</b>\n" f"✉️ Inviati: <b>{data.ext_totSms} SMS</b>\n" f"💸 Costi extra: <b>{data.ext_costoSms:.2f}€</b>", parse_mode="HTML") elif text == "/mms": bot.sendMessage(chatId, f"🇮🇹 <b>MMS in Italia</b>\n" f"📧 Inviati: <b>{data.totMms} MMS</b>\n" f"💸 Costi extra: <b>{data.costoSms:.2f}€</b>\n\n" f"🇪🇺 <b>MMS in Europa</b>\n" f"📧 Inviati: <b>{data.ext_totMms} MMS</b>\n" f"💸 Costi extra: <b>{data.ext_costoMms:.2f}€</b>", parse_mode="HTML") elif text == "/internet": bot.sendMessage(chatId, f"🇮🇹 <b>Piano dati in Italia</b>\n" f"📶 Consumati: <b>{data.totGiga['count']}{data.totGiga['unit']}</b> su <b>" f"{data.pianoGiga['count']}{data.pianoGiga['unit']}</b>\n" f"💸 Costi extra: <b>{data.costoGiga:.2f}€</b>\n\n" f"🇪🇺 <b>Piano dati in Europa</b>\n" f"📶 Consumati: <b>{data.ext_totGiga['count']}{data.ext_totGiga['unit']}</b> su <b>" f"{data.ext_pianoGiga['count']}{data.ext_pianoGiga['unit']}</b>\n" f"💸 Costi extra: <b>{data.ext_costoGiga:.2f}€</b>", parse_mode="HTML") elif text == "/support": user.status = "calling_support" bot.sendMessage(chatId, "🆘 <b>Richiesta di supporto</b>\n" "Se hai qualche problema che non riesci a risolvere, scrivi qui un messaggio, e un admin " "ti contatterà il prima possibile.\n\n" "<i>Per annullare, premi</i> /annulla.", parse_mode="HTML") elif text == "/aggiorna": if user.remainingCalls > 0: user.remainingCalls -= 1 commit() sent = bot.sendMessage(chatId, "📙📙📙 Aggiorno il profilo... 0%") api = IliadApi(user.username, decrypt_password(chatId)) bot.editMessageText((chatId, sent['message_id']), "📗📙📙 Cerco aggiornamenti... 10%") try: api.load() except AuthenticationFailedError: helpers.clearUserData(chatId) bot.editMessageText((chatId, sent['message_id']), "⚠️ Le tue credenziali non sono corrette.\n" "Rieffettua il /login!.") return bot.editMessageText((chatId, sent['message_id']), "📗📙📙 Cerco aggiornamenti... 50%") helpers.fetchAndStore(api, chatId) bot.editMessageText((chatId, sent['message_id']), "📗📗📗 Cerco aggiornamenti... 100%") bot.editMessageText((chatId, sent['message_id']), "✅ Profilo aggiornato!") else: bot.sendMessage(chatId, "⛔️ Hai usato troppi /aggiorna recentemente. Aspetta un po'!") else: bot.sendMessage(chatId, "Non ho capito...\n" "Serve aiuto? Premi /help") else: if text == "/login": user.status = "login_0" bot.sendMessage(chatId, "Per favore, inviami il tuo <b>username</b> (il codice da 8 cifre che usi per accedere " "all'Area Personale).\n" "Usa /annulla se serve.", parse_mode="HTML") else: bot.sendMessage(chatId, "Benvenuto, <b>{0}</b>!\n" "Per favore, premi /login per utilizzarmi.\n\n" "Premi /help se serve aiuto.".format(name), parse_mode="HTML")