def updateUserdata(chatId, data): userdata = Data.get(chatId=chatId) if data['didattica']: userdata.didattica = data['didattica'] if data['note']: userdata.note = data['note'] if data['voti']: userdata.voti = data['voti'] if data['agenda']: userdata.agenda = data['agenda'] if data['circolari']: userdata.circolari = data['circolari']
def inlinebutton(msg): chatId, query_data = glance(msg, flavor="callback_query")[1:3] user = User.get(chatId=chatId) data = Data.get(general=True) query_split = query_data.split("#") message_id = int(query_split[1]) button = query_split[0] if button == "latest": results = [0] n = data.disputedRaces[-1] pilots = get_html(get_results_url(get_state(n), n), 'tr') for num in range(1, 21): results.append(get_results_number(n, num, pilots)) message = "" for res in results: message += "- {}: {}".format(res['abbr'], res['time']) bot.editMessageText((chatId, message_id), "๐ {} Grand Prix\n" "{}".format(get_state(n), message), reply_markup=keyboards.back(message_id)) elif button == "start": bot.editMessageText((chatId, message_id), "What would you like to see?", reply_markup=keyboards.start(message_id)) else: bot.editMessageText((chatId, message_id), "Sorry, this function is currently not available.", reply_markup=None)
def fetchAndStore(api, chatId): data = Data.get(chatId=chatId) data.credito = api.credito() data.dataRinnovo = api.dataRinnovo().strftime("%d/%m alle %H:%M") data.nome = api.nome() data.accountId = api.id() data.numero = api.numero() data.totChiamate = api.totChiamate() data.costoChiamate = api.costoChiamate() data.totSms = api.totSms() data.costoSms = api.costoSms() data.totGiga = api.totGiga() data.costoGiga = api.costoGiga() data.pianoGiga = api.pianoGiga() data.totMms = api.totMms() data.costoMms = api.costoMms() data.ext_totChiamate = api.totChiamate(estero=True) data.ext_costoChiamate = api.costoChiamate(estero=True) data.ext_totSms = api.totSms(estero=True) data.ext_costoSms = api.costoSms(estero=True) data.ext_totGiga = api.totGiga(estero=True) data.ext_costoGiga = api.costoGiga(estero=True) data.ext_pianoGiga = api.pianoGiga(estero=True) data.ext_totMms = api.totMms(estero=True) data.ext_costoMms = api.costoMms(estero=True)
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 clearUserData(chatId): user = User.get(chatId=chatId) user.delete() userdata = Data.get(chatId=chatId) userdata.delete() stored = ParsedData.get(chatId=chatId) stored.delete()
def fetchRaces(): data = Data.get(general=True) now = datetime.now() disputed = [] length = len(get_html("https://www.formula1.com/en/racing/2019.html", "article")) for i in range(length): date = get_date(i) if (now.month > date[1]) or ((now.month == date[1]) and (now.day > date[0])): disputed.append(i) data.disputedRaces = disputed
def reply(msg): chatId = msg['chat']['id'] fromId = msg['from']['id'] name = msg['from']['first_name'] text = msg['text'].replace("@" + bot.getMe()['username'], "") if not Chat.exists(lambda c: c.chatId == str(chatId)): if chatId > 0: Chat(chatId=str(chatId), isGroup=False) else: Chat(chatId=str(chatId), isGroup=True) chat = Chat.get(chatId=str(chatId)) data = Data.get(id=0) if chat.isGroup: # Allow only group admins member = bot.getChatMember(chatId, fromId) if member['status'] not in ['creator', 'administrator']: return if text == "/start": bot.sendMessage(chatId, "<b>Welcome, {}!</b>\n" "I'm the BitchLasagna Bot. I can monitor the current situation of PewDiePie vs. T-Series " "subcount, send notifications on critical situations and more.\n\n" "<b>PewDiePie:</b> {:,} subs\n" "<b>T-Series:</b> {:,} subs\n" "<b>Difference:</b> {:,} subs".format(name, data.pewdiepie, data.tseries, data.difference), parse_mode="HTML") elif text == "/help": bot.sendMessage(chatId, "Hi, <b>{}</b>! I'm the <b>BitchLasagna Bot</b>.\n" "Here's a brief list of what I can do:\n\n" "/start - Welcome message\n" "/help - Show this list\n" "/show - Send current subscribers count\n" "/alert - Toggle on or off trigger notifications.\n" "<b>NB</b>: In a group, only admins can use this bot.\n\n" "<i>Reminder: due to limited API availability, subscribers data is updated about every 2 minutes.</i>" "".format(name), parse_mode="HTML") elif text == "/show": bot.sendMessage(chatId, "<b>Current subscribers status</b>\n" "<b>PewDiePie:</b> {:,} subs\n" "<b>T-Series:</b> {:,} subs\n" "<b>Difference:</b> {:,} subs".format(data.pewdiepie, data.tseries, data.difference), parse_mode="HTML") elif text == "/alert": chat.wantsAlert = not chat.wantsAlert if chat.wantsAlert: bot.sendMessage(chatId, "โ <i>Alerts have been successfully activated for this chat!</i>\n" "Use /alert again to toggle them off.", parse_mode="HTML") else: bot.sendMessage(chatId, "โ <i>Alerts have been successfully deactivated for this chat.</i>\n" "Use /alert again to toggle them on.", parse_mode="HTML")
def sendUpdates(): data = Data.get(id=0) goalInterval = 1000000 currentGoal = data.trees - data.trees % goalInterval if currentGoal > data.lastGoal: for chat in select(c for c in Chat)[:]: try: chatId = chat.chatId if not chat.isGroup else int( "-100" + str(chat.chatId)) bot.sendMessage( chatId, "๐ฒ #TeamTrees just reached <b>{:,} trees!</b>".format( currentGoal), parse_mode="HTML") except (BotWasBlockedError, BotWasKickedError): chat.delete() except TelegramError: pass data.lastGoal = currentGoal
def createMessage(): if not Message.exists(lambda m: m.id == 0): Message(id=0) message = Message.get(id=0) data = Data.get(id=0) trees = data.trees totalTrees = 20000000 remainingTrees = totalTrees - trees days = (datetime.now() - datetime(2019, 10, 25)).days totalDays = 68 remainingDays = totalDays - days remainingTrees = max(0, remainingTrees) remainingDays = max(0, remainingDays) message.trees = "<b>#TeamTrees Status</b>\n\n" \ "๐ฑ Trees Planted: <b>{:,} ({}%)</b>\n" \ "๐ฟ Remaining: <b>{:,} ({}%)</b>\n" \ "๐ณ Final Goal: <b>{:,} trees</b>\n\n" \ "๐ Days Passed: <b>{} days ({}%)</b>\n" \ "๐ Remaining: <b>{} days ({}%)</b>\n\n" \ "๐ฒ teamtrees.org".format(trees, round(trees * 100 / totalTrees, 1), remainingTrees, round(remainingTrees * 100 / totalTrees, 1), totalTrees, days, round(days * 100 / totalDays, 1), remainingDays, round(remainingDays * 100 / totalDays, 1))
def button_press(msg): chatId, query_data = glance(msg, flavor="callback_query")[1:3] query_split = query_data.split("#") message_id = int(query_split[1]) button = query_split[0] data = Data.get(chatId=chatId) if button == "logout_yes": helpers.clearUserData(chatId) bot.editMessageText((chatId, message_id), "๐ฏ Fatto, sei stato disconnesso!\n" "Premi /login per entrare di nuovo.\n\n" "Premi /help se serve aiuto.", reply_markup=None) elif button == "logout_no": bot.editMessageText((chatId, message_id), "<i>Logout annullato.</i>", parse_mode="HTML", reply_markup=None) elif button == "overview_ext": costo = data.ext_costoChiamate + data.ext_costoGiga + data.ext_costoSms + data.ext_costoMms bot.editMessageText((chatId, message_id), f"โน๏ธ <b>Riepilogo piano estero</b>\n\n" f"๐ Chiamate: <b>{data.ext_totChiamate}</b>\n" f"๐ Dati 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"โ๏ธ SMS Inviati: <b>{data.ext_totSms}</b>\n" f"๐ง MMS Inviati: <b>{data.ext_totMms}</b>\n\n" f"๐ธ Costi extra: {costo:.2f}โฌ", parse_mode="HTML", reply_markup=keyboards.overviewIta(message_id)) elif button == "overview_ita": costo = data.costoChiamate + data.costoGiga + data.costoSms + data.costoMms bot.editMessageText((chatId, message_id), 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", reply_markup=keyboards.overviewExt(message_id))
def updateData(): data = Data.get(id=0) data.pewdiepie, data.tseries, data.difference = youtube.fetchData()
def runUserUpdate(chatId, long_fetch, runDatetime, sendMessages=True): api = ClasseVivaAPI() if helpers.userLogin(chatId, api, _quiet=True): userdata = Data.get(chatId=chatId) settings = Settings.get(chatId=chatId) try: data = helpers.fetchStrict(api) except ApiServerError: return if settings.wantsNotifications: if (not settings.doNotDisturb) or (runDatetime.hour in range( 7, 21)): dataDidattica = parsers.parseNewDidattica( userdata.didattica, data['didattica']) dataNote = parsers.parseNewNote(userdata.note, data['note']) dataVoti = parsers.parseNewVoti(userdata.voti, data['voti'], chatId) dataAgenda = parsers.parseNewAgenda(userdata.agenda, data['agenda'], chatId) dataCircolari = parsers.parseNewCircolari( userdata.circolari, data['circolari']) if sendMessages: try: if dataDidattica and ("didattica" in settings.activeNews): bot.sendMessage(chatId, "๐ <b>Nuovi file caricati!</b>" "{0}".format(dataDidattica), parse_mode="HTML", disable_web_page_preview=True) if dataNote and ("note" in settings.activeNews): bot.sendMessage(chatId, "๐ <b>Hai nuove note!</b>" "{0}".format(dataNote), parse_mode="HTML", disable_web_page_preview=True) if dataVoti and ("voti" in settings.activeNews): bot.sendMessage(chatId, "๐ <b>Hai nuovi voti!</b>" "{0}".format(dataVoti), parse_mode="HTML", disable_web_page_preview=True) if dataAgenda and ("agenda" in settings.activeNews): bot.sendMessage(chatId, "๐ <b>Hai nuovi impegni!</b>\n" "{0}".format(dataAgenda), parse_mode="HTML", disable_web_page_preview=True) if dataCircolari and ("circolari" in settings.activeNews): bot.sendMessage(chatId, "๐ <b>Hai nuove circolari!</b>" "{0}".format(dataCircolari), parse_mode="HTML", disable_web_page_preview=True) except BotWasBlockedError: helpers.clearUserData(chatId) return except TelegramError: pass helpers.updateUserdata(chatId, data) helpers.fetchAndStore(chatId, api, data, long_fetch) user = User.get(chatId=chatId) user.remainingCalls = 3
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")
def clearUserData(chatId): user = User.get(chatId=chatId) user.delete() data = Data.get(chatId=chatId) data.delete()