def info_booking(bot, update):
    """
    Fornisce delle semplici informazioni all'utente riguardo il funzionamento delle prenotazioni.
    """
    chat_id = str(update.callback_query.from_user.id)

    if common.is_sessione():
        text = "Durante le sessioni d'esame, tutte le prenotazioni valgono per una e una sola volta." \
               " Non sono previste distinzioni tra prenotazioni temporanee o permanenti."
    else:
        text = "Prenotazione *Temporanea (una-tantum)*:" \
               "\nLe prenotazioni una-tantum valgono per una singola volta . Una volta completato il" \
               " viaggio, vengono automaticamente cancellate ed addebitate il giorno dopo la prenotazione." \
               " E' possibile prenotarsi a un viaggio già avvenuto nella stessa giornata, ma verrà addebitato" \
               " comunque e non sarà valido per la settimana successiva." \
               "\n\nPrenotazione *Permanente*" \
               "\nLe prenotazioni permanenti valgono dal momento della prenotazione fino alla" \
               " cancellazione del viaggio o della prenotazione, ogni settimana. Verranno" \
               " addebitate anche per i viaggi prenotati per la giornata corrente."

    keyboard = [[
        InlineKeyboardButton("↩ Indietro", callback_data=ccd("BOOKING_MENU"))
    ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

    bot.edit_message_text(chat_id=chat_id,
                          message_id=update.callback_query.message.message_id,
                          text=text,
                          parse_mode="Markdown",
                          reply_markup=InlineKeyboardMarkup(keyboard))
Beispiel #2
0
def parcheggio(bot, update):
    chat_id = str(update.message.chat_id)

    # Controllo per evitare che i non autisti usino il comando
    if not is_driver(chat_id):
        return

    keyboard = [
        [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]
    ]

    day = common.today()
    day_trips = get_trip_group("Discesa", day)

    if common.is_weekday(day):
        if chat_id in day_trips and not day_trips[chat_id]["Suspended"]:
            for location in common.locations:
                keyboard.insert(0, [InlineKeyboardButton(location, callback_data=ccd("CONFIRM_PARK", location))])

            if "Location" in day_trips[chat_id]:
                message = f"La posizione di ritrovo corrente è settata a: {day_trips[chat_id]['Location']}." \
                    f"\nSeleziona un nuovo luogo di ritrovo."
            else:
                message = "Seleziona il luogo di ritrovo per il viaggio di ritorno."
        else:
            message = "Mi dispiace, non sembra che tu abbia viaggi in programma da Povo verso il NEST oggi." \
                      " Inseriscine uno e riprova.",
    else:
        message = "Mi dispiace, è possibile selezionare il luogo di parcheggio nei giorni in cui UberNEST è attivo.",

    bot.send_message(chat_id=chat_id, text=message, reply_markup=InlineKeyboardMarkup(keyboard))
Beispiel #3
0
def booking_keyboard(mode, day, show_bookings=True):
    keyboard = []

    if common.is_sessione():
        today_number = datetime.datetime.today().weekday()
        for item in range(len(common.days)):
            _day = common.day_to_string((item + today_number) % len(common.days))

            if _day == "Sabato" or _day == "Domenica":  # Sabato, domenica
                continue

            bookings = get_all_trips_day(_day)

            for time, name, direction, driver in bookings:
                if not is_suspended(direction, _day, driver):
                    shortened_direction = "Povo" if direction == "Salita" else "NEST"
                    keyboard.append(
                        [InlineKeyboardButton(f"🚗 {name.split(' ')[-1]}/"
                                              f"{_day[:2]} "
                                              f"{datetime.datetime.today().day + item} "
                                              f"{time}/{shortened_direction}",
                                              callback_data=ccd("BOOKING", "CONFIRM", direction,
                                                                _day, driver, "Temporary"))])

        keyboard.append([InlineKeyboardButton(f"Vai a /oggi", callback_data=ccd("SHOW_BOOKINGS", "Lunedì"))])
        keyboard.append([InlineKeyboardButton("↩ Indietro", callback_data=ccd("BOOKING_MENU"))])

    else:
        if show_bookings:
            bookings = get_all_trips_day(day)

            for time, name, direction, driver in bookings:
                if not is_suspended(direction, day, driver):
                    keyboard.append(
                        [InlineKeyboardButton(f"🚗 {name.split(' ')[-1]} 🕓 {time} "
                                              f"{common.dir_name(direction)}",
                                              callback_data=ccd("BOOKING", "CONFIRM", direction, day, driver, mode))])

        day_subkeyboard = []
        for wkday in common.work_days:
            text = "☑" if wkday == day and show_bookings else wkday[:2]
            day_subkeyboard.append(InlineKeyboardButton(text, callback_data=ccd("BOOKING", "DAY", mode, wkday)))

        alternate_text = "🔂 Cambia metodo (Temp.)" if mode == "Permanent" else "🔁 Cambia metodo (Perm.)"
        alternate_payload = "Temporary" if mode == "Permanent" else "Permanent"
        alternate_ccd = ccd("BOOKING", "DAY", alternate_payload, day) if show_bookings else \
            ccd("BOOKING", "START", alternate_payload)

        keyboard.append(day_subkeyboard)
        keyboard.append([InlineKeyboardButton(alternate_text, callback_data=alternate_ccd)])

        if show_bookings:
            keyboard.append(
                [InlineKeyboardButton(f"Vai a /{day[:-1].lower()}ì", callback_data=ccd("SHOW_BOOKINGS", day))])
        else:
            keyboard.append([InlineKeyboardButton("↩ Indietro", callback_data=ccd("BOOKING_MENU"))])

    keyboard.append([InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))])

    return InlineKeyboardMarkup(keyboard)
Beispiel #4
0
def confirm_parking(bot, update):
    chat_id = str(update.callback_query.message.chat_id)
    data = separate_callback_data(update.callback_query.data)

    location = data[1]

    keyboard = [
        [InlineKeyboardButton("📍 Mostra sulla mappa", callback_data=ccd("SEND_LOCATION", location))],
        [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]
    ]

    day_group = get_trip("Discesa", common.today(), chat_id)
    day_group["Location"] = location

    bot.edit_message_text(chat_id=chat_id,
                          message_id=update.callback_query.message.message_id,
                          text=f"Posizione impostata con successo: {location}",
                          reply_markup=InlineKeyboardMarkup(keyboard))

    for passenger_group in day_group["Temporary"], day_group["Permanent"]:
        for passenger in passenger_group:
            bot.send_message(chat_id=passenger,
                             text=f"Per il viaggio di ritorno,"
                             f" [{get_name(chat_id)}](tg://user?id={chat_id})"
                             f" ha impostato il luogo di ritrovo:\n📍 {location}.",
                             reply_markup=InlineKeyboardMarkup(keyboard))
Beispiel #5
0
def trips_keyboard(chat_id):
    keyboard = [[InlineKeyboardButton("Aggiungi un nuovo viaggio", callback_data=ccd("TRIPS", "ADD"))]]
    today_number = datetime.datetime.today().weekday()

    for item in range(len(common.days)):
        day = common.day_to_string((item + today_number) % len(common.days))

        if day == "Sabato" or day == "Domenica":  # Sabato, domenica
            continue

        for direction in "Salita", "Discesa":
            try:
                group = get_trip(direction, day, chat_id)

                if group["Suspended"]:
                    counter = "SOSP."
                else:
                    counter = f"{len(group['Permanent']) + len(group['Temporary'])}"

                if common.is_sessione():
                    shown_day = f"{day} {datetime.datetime.today().day + item}"
                else:
                    shown_day = day

                keyboard.append(
                    [InlineKeyboardButton(f"{shown_day}: {group['Time']}"
                                          f" {common.dir_name(direction)} ({counter})",
                                          callback_data=ccd("TRIPS", "EDIT_TRIP", direction, day))])
            except Exception:  # Viaggio non segnato...
                continue

    keyboard.append([InlineKeyboardButton("↩ Indietro", callback_data=ccd("ME_MENU"))])
    keyboard.append([InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))])

    return InlineKeyboardMarkup(keyboard)
def check_money(bot, update):
    chat_id = str(update.callback_query.message.chat_id)

    keyboard = [[
        InlineKeyboardButton("↩ Indietro", callback_data=ccd("ME_MENU"))
    ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

    message = []

    # Prima raccolgo sottoforma di stringa i debiti (per tutti gli utenti)
    debit_list = get_debit_tuple(chat_id)

    if len(debit_list) > 0:
        people = []
        for creditor_id, value in debit_list:
            people.append(
                f"[{get_name(creditor_id)}](tg://user?id={creditor_id})"
                f" 🚗 {str(value)} {'viaggi' if value > 1 else 'viaggio'}\n")

        message.append(
            f"💸 Al momento risultano viaggi da pagare alle seguenti persone:\n{''.join(people)}"
            f"\nContatta ciascun autista per saldare i relativi debiti.")
    else:
        message.append("💰 Al momento non hai viaggi non saldati.")

    # Poi creo un bottone separato per ogni credito.
    # Questa sezione del codice viene fatta girare solo se l'utente è un autista.
    if is_driver(chat_id):
        keyboard.insert(0, [
            InlineKeyboardButton("âž• Aggiungi un nuovo debitore",
                                 callback_data=ccd("NEW_DEBITOR", 0))
        ])

        credit_list = get_credits(chat_id)
        if len(credit_list) > 0:
            for debitor_id, value in credit_list:
                keyboard.insert(0, [
                    InlineKeyboardButton(
                        f"{get_name(debitor_id)} 🚗 {str(value)} {'viaggi' if value > 1 else 'viaggio'}",
                        callback_data=ccd("EDIT_MONEY", "VIEW", debitor_id))
                ])

            message.append(
                "\n\n💰 Al momento possiedi queste persone hanno viaggi non saldati con te. "
                "Clicca su una persona per modificare o azzerare il debito:")
        else:
            message.append("\n\n💸 Nessuno ti deve denaro al momento.")

    bot.edit_message_text(chat_id=chat_id,
                          message_id=update.callback_query.message.message_id,
                          parse_mode="Markdown",
                          text="".join(message),
                          reply_markup=InlineKeyboardMarkup(keyboard))
def new_debitor(bot, update):
    """
    Questo metodo lista tutti gli utenti del sistema, selezionabili per aggiungere un nuovo debito.

    I potenziali passeggeri vengono listati su più pagine per evitare messaggi infiniti. A ogni pagina è
    associata un bottone che permette di aprirla immediatamente. In ogni pagina vi sono PAGE_SIZE persone,
    costante definita in util/common.py.

    Una volta selezionato un utente, viene aperto edit_money(bot, update) con il debito automaticamente
    settato a zero.
    """
    chat_id = str(update.callback_query.message.chat_id)
    page = int(separate_callback_data(update.callback_query.data)[1])

    keyboard = []
    users = get_new_debitors(chat_id)

    for index in range(PAGE_SIZE * page, PAGE_SIZE * (page + 1), 1):
        try:
            name, name_chat_id = users[index]
            keyboard.append([
                InlineKeyboardButton(name,
                                     callback_data=ccd("EDIT_MONEY", "NEW",
                                                       name_chat_id))
            ])
        except IndexError:
            break

    # Aggiungo un bottone per ogni pagina, in quanto la lista è troppo grande
    page_buttons = []
    for index in range(0, int(math.ceil(len(users) / PAGE_SIZE)), 1):
        if index == page:
            text = "☑"
        else:
            text = str(index + 1)

        page_buttons.append(
            InlineKeyboardButton(text, callback_data=ccd("NEW_DEBITOR",
                                                         index)))

    keyboard.append(page_buttons)
    keyboard.append(
        [InlineKeyboardButton("↩ Indietro", callback_data=ccd("MONEY"))])
    keyboard.append(
        [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))])

    bot.edit_message_text(
        chat_id=chat_id,
        message_id=update.callback_query.message.message_id,
        text="Scegli un utente a cui aggiungere un viaggio da pagare.",
        reply_markup=InlineKeyboardMarkup(keyboard))
Beispiel #8
0
def fetch_sessione():
    text = ["Riepilogo viaggi:"]
    today_number = datetime.datetime.today().weekday()

    for item in range(len(common.days)):
        day = common.day_to_string((item + today_number) % len(common.days))

        if day == "Sabato" or day == "Domenica":  # Sabato, domenica
            continue

        empty_day = True
        for direction in "Salita", "Discesa":
            bookings = get_all_trips_fixed_direction(direction, day)

            if len(bookings) > 0:
                if empty_day:
                    text.append(
                        f"\n\n🗓 Viaggi di {day.lower()} {datetime.datetime.today().day + item}"
                    )

                empty_day = False
                for time, driver in bookings:
                    trip = get_trip(direction, day, driver)
                    # Raccolgo in una list comprehension le persone che partecipano al viaggio
                    people = [
                        f"[{get_name(user)}](tg://user?id={user})"
                        for user in trip["Temporary"]
                    ]

                    # Aggiungo ogni viaggio trovato alla lista
                    text.append(
                        f"\n🚗 [{get_name(driver)}](tg://user?id={driver}) "
                        f"(*{time}*, {common.dir_name(direction)}): {', '.join(people)}\n"
                    )

        if empty_day:
            text.append(
                f"\n😱 Nessuno viaggio previsto per {day.lower()} {datetime.datetime.today().day + item}."
            )

    keyboard = [[
        InlineKeyboardButton("🔂 Prenota",
                             callback_data=ccd("BOOKING", "START",
                                               "Temporary"))
    ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

    return "".join(text), InlineKeyboardMarkup(keyboard)
Beispiel #9
0
def me_keyboard(chat_id):
    keyboard = []
    if is_driver(chat_id):
        trips_string = "💰 Gestire i debiti e crediti"
        driver_string = "🚫 Smettere di essere un autista"
        keyboard.append([InlineKeyboardButton("🚗 Gestire i miei viaggi", callback_data=ccd("ME", "TRIPS"))])
        keyboard.append([InlineKeyboardButton(f"{common.emoji_numbers[get_slots(chat_id)]}"
                                              f" Modificare il numero di posti", callback_data=ccd("ME", "ED_DR_SL"))])
    else:
        trips_string = "💸 Gestire i debiti"
        driver_string = "🚗 Diventare un autista"

    keyboard.append([InlineKeyboardButton(trips_string, callback_data=ccd("MONEY"))])
    keyboard.append([InlineKeyboardButton(driver_string, callback_data=ccd("ME", "DRIVER"))])
    keyboard.append([InlineKeyboardButton("❌ Cancellarmi da UberNEST", callback_data=ccd("ME", "US_RE"))])
    keyboard.append([InlineKeyboardButton("🔚 Uscire", callback_data=ccd("EXIT"))])

    return InlineKeyboardMarkup(keyboard)
Beispiel #10
0
def booking_menu_keyboard():
    if common.is_sessione():
        return InlineKeyboardMarkup([
            [InlineKeyboardButton("🔂 Prenotare",
                                  callback_data=ccd("BOOKING", "START", "Temporary"))],
            [InlineKeyboardButton("📚 Gestire le mie prenotazioni",
                                  callback_data=ccd("EDIT_BOOK", "LIST"))],
            [InlineKeyboardButton("ℹ Informarmi sulle modalità",
                                  callback_data=ccd("INFO_BOOK"))],
            [InlineKeyboardButton("🔚 Uscire", callback_data=ccd("EXIT"))]
        ])
    else:
        return InlineKeyboardMarkup([
            [InlineKeyboardButton("🔂 Prenotare una-tantum",
                                  callback_data=ccd("BOOKING", "START", "Temporary"))],
            [InlineKeyboardButton("🔁 Prenotare in maniera permanente",
                                  callback_data=ccd("BOOKING", "START", "Permanent"))],
            [InlineKeyboardButton("📚 Gestire le mie prenotazioni",
                                  callback_data=ccd("EDIT_BOOK", "LIST"))],
            [InlineKeyboardButton("ℹ Informarmi sulle modalità",
                                  callback_data=ccd("INFO_BOOK"))],
            [InlineKeyboardButton("🔚 Uscire", callback_data=ccd("EXIT"))]
        ])
Beispiel #11
0
def fetch_bookings(chat_id, day):
    if common.is_weekday(day):
        text = [f"Lista dei viaggi di {day.lower()}:"]

        for direction in "Salita", "Discesa":
            text.append(f"\n\n{common.dir_name(direction)}\n")

            bookings = get_all_trips_fixed_direction(direction, day)

            if len(bookings) > 0:
                for time, driver in bookings:
                    trip = get_trip(direction, day, driver)
                    # Raccolgo in una list comprehension le persone che partecipano al viaggio
                    people = [
                        f"[{get_name(user)}](tg://user?id={user})"
                        for mode in trip
                        if mode == "Temporary" or mode == "Permanent"
                        for user in trip[mode]
                    ]

                    # Aggiungo ogni viaggio trovato alla lista
                    text.append(
                        f"\n🚗 [{get_name(driver)}](tg://user?id={driver})"
                        f" - 🕓 *{time}*:"
                        f"\n👥 {', '.join(people)}\n")
            else:
                text.append("\n🚶🏻‍♂ Nessuna persona in viaggio oggi.")

        if is_registered(chat_id):
            day_subkeyboard = []

            for wkday in common.work_days:
                ccd_text = "☑" if wkday == day else wkday[:2]
                day_subkeyboard.append(
                    InlineKeyboardButton(ccd_text,
                                         callback_data=ccd(
                                             "SHOW_BOOKINGS", wkday)))

            if common.is_booking_time():
                keyboard = [
                    day_subkeyboard,
                    [
                        InlineKeyboardButton("🔂 Prenota una tantum",
                                             callback_data=ccd(
                                                 "BOOKING", "DAY", "Temporary",
                                                 day))
                    ],
                    [
                        InlineKeyboardButton("🔁 Prenota permanentemente",
                                             callback_data=ccd(
                                                 "BOOKING", "DAY", "Permanent",
                                                 day))
                    ],
                    [
                        InlineKeyboardButton("🔚 Esci",
                                             callback_data=ccd("EXIT"))
                    ]
                ]
            else:
                keyboard = [
                    day_subkeyboard,
                    [
                        InlineKeyboardButton("🔚 Esci",
                                             callback_data=ccd("EXIT"))
                    ]
                ]
        else:
            keyboard = []

        return "".join(text), InlineKeyboardMarkup(keyboard)

    else:
        keyboard = [[
            InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))
        ]]

        return f"{day} UberNEST non è attivo.", InlineKeyboardMarkup(keyboard)
def booking_handler(bot, update):
    """
    Gestore dei metodi delle prenotazioni. Da questo menù è possibile aggiungere prenotazioni.
    """
    data = separate_callback_data(update.callback_query.data)
    action = data[1]
    chat_id = str(update.callback_query.message.chat_id)

    #
    # Dati in entrata ("BOOKING", "START", mode)
    # Questo menù viene chiamato solo dal menù /prenota e mostra solo i giorni disponibili.
    #
    if action == "START":
        mode = data[2]

        if common.is_booking_time():
            if common.is_sessione():
                bot.edit_message_text(
                    chat_id=chat_id,
                    message_id=update.callback_query.message.message_id,
                    text=f"Scegli la prenotazione.",
                    reply_markup=booking_keyboard(mode, common.today()))
            else:
                bot.edit_message_text(
                    chat_id=chat_id,
                    message_id=update.callback_query.message.message_id,
                    text=f"{common.mode_name(mode)}"
                    f"\n\nSeleziona il giorno della prenotazione.",
                    reply_markup=booking_keyboard(mode,
                                                  common.today(),
                                                  show_bookings=False))
        else:
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text=f"Mi dispiace, non è possibile effettuare prenotazioni"
                f" tramite UberNEST dalle 02:00 alle 02:15.")
    #
    # Dati in entrata ("BOOKING", "DAY", mode, day)
    # Questo menù viene chiamato rispettivamente dal metodo sopra (BOOKING) e dai visualizzatori
    # delle prenotazioni dei singoli giorni (/lunedi, /martedi, etc...).
    #
    elif action == "DAY":
        mode, day = data[2:4]

        if day not in common.work_days:
            # Caso in cui siamo di sabato o domenica
            day = common.work_days[0]

        if common.is_booking_time():
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text=f"🗓 {day}"
                f"\n{common.mode_name(mode)}"
                f"\n\nSeleziona il viaggio da prenotare.",
                reply_markup=booking_keyboard(mode, day))
        else:
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text=f"Mi dispiace, non è possibile effettuare prenotazioni"
                f" tramite UberNEST dalle 02:30 alle 03:30.")
    #
    # Dati in entrata ("BOOKING", "CONFIRM", direction, day, driver, mode)
    # Messaggio finale di conferma all'utente e all'autista. Il metodo calcola se la prenotazione scelta è
    # legale (ovvero che è disponibile spazio nell'auto, che il passeggero non è l'autista e che non si è
    # già prenotato). In caso positivo viene avvisato anche l'autista dell'avvenuta prenotazione
    #
    elif action == "CONFIRM":
        direction, day, driver, mode = data[2:]

        user_keyboard = [[
            InlineKeyboardButton("↩ Indietro",
                                 callback_data=ccd("BOOKING", "START", mode))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        trip = get_trip(direction, day, driver)
        occupied_slots = len(trip["Permanent"]) + len(trip["Temporary"])
        total_slots = get_slots(driver)

        # Caso in cui l'autista tenta inutilmente di prenotarsi con sè stesso...
        if chat_id == driver:
            user_text = "Sei tu l'autista!"

        # Caso in cui tutti gli slot sono occupati
        elif occupied_slots >= total_slots:
            user_text = "Macchina piena, vai a piedi LOL. 🚶🏻‍♂️"

        # Caso in cui lo stolto passeggero si era già prenotato
        elif chat_id in trip["Temporary"] or chat_id in trip[
                "Permanent"] or chat_id in trip["SuspendedUsers"]:
            user_text = "Ti sei già prenotato in questa data con questa persona!"

        else:
            # Si attende conferma dall'autista prima di aggiungere
            trip_time = trip["Time"]
            slots = str(total_slots - occupied_slots - 1)

            if "Location" in trip:
                location = trip["Location"]
                user_keyboard.insert(0, [
                    InlineKeyboardButton("📍 Mostra sulla mappa",
                                         callback_data=ccd(
                                             "SEND_LOCATION", location))
                ])
            elif direction == "Salita":
                location = "Macchinette"
            else:
                location = "Non definita"

            driver_keyboard = [[
                InlineKeyboardButton("✔ Conferma",
                                     callback_data=ccd("ALERT_USER", "CO_BO",
                                                       direction, day, chat_id,
                                                       mode))
            ]]

            user_text = f"Prenotazione completata. Dati del viaggio:" \
                f"\n\n🚗: [{get_name(driver)}](tg://user?id={driver})" \
                f"\n🗓 {day}" \
                f"\n🕓 {trip_time}" \
                f"\n{common.dir_name(direction)}" \
                f"\n{common.mode_name(mode)}" \
                f"\n📍 {location}" \
                f"\n\nLa prenotazione sarà resa valida al momento della conferma dall'autista."

            driver_text = "Hai una nuova prenotazione: " \
                f"\n\n👤: [{get_name(chat_id)}](tg://user?id={chat_id}) " \
                f"({slots} posti rimanenti)" \
                f"\n🗓 {day}" \
                f"\n🕓 {trip_time}" \
                f"\n{common.dir_name(direction)}" \
                f"\n{common.mode_name(mode)}" \
                f".\n\nPer favore, conferma la presa visione della prenotazione. In caso negativo," \
                f" la prenotazione verrà considerata non valida."

            bot.send_message(
                chat_id=driver,
                text=driver_text,
                reply_markup=InlineKeyboardMarkup(driver_keyboard),
                parse_mode="Markdown")

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text=user_text,
            reply_markup=InlineKeyboardMarkup(user_keyboard),
            parse_mode="Markdown")
def edit_booking(bot, update):
    """
    Questo metodo viene chiamato al momento della richiesta di visione della lista delle prenotazioni da 
    parte dell'utente. Le prenotazione vengono prese tramite query dal metodo search_by_booking presente
    in common.py. Dal menù, una volta selezionata una prenotazione, è possibile cancellarla oppure sospenderla
    a lato utente, ovvero bloccarla per una settimana.
    """
    chat_id = str(update.callback_query.message.chat_id)
    data = separate_callback_data(update.callback_query.data)
    action = data[1]

    #
    #  Comando base chiamato dal metodo prenota. Effettua una query di tutti i viaggi presentandoli
    #  sottoforma di bottoni all'utente.
    #
    if action == "LIST":
        bookings = get_bookings(chat_id)

        keyboard = [[
            InlineKeyboardButton("↩ Indietro",
                                 callback_data=ccd("BOOKING_MENU"))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        if len(bookings) > 0:
            user_keyboard = []

            for item in bookings:
                direction, day, driver, mode, time = item
                driver_name = get_name(driver)

                if is_suspended(direction, day, driver):
                    tag = " 🚫 Sospesa"
                else:
                    tag = f" 🗓 {day} 🕓 {time}"

                # Aggiunta del bottone
                user_keyboard.append([
                    InlineKeyboardButton(
                        f"🚗 {driver_name.split(' ')[-1]}{tag}\n{common.dir_name(direction)} {common.mode_name(mode)}",
                        callback_data=ccd("EDIT_BOOK", "ACTION", direction,
                                          day, driver, mode))
                ])

            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text=
                "Clicca su una prenotazione per cancellarla o sospenderla.",
                reply_markup=InlineKeyboardMarkup(user_keyboard + keyboard))
        else:
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text="Mi dispiace, ma non hai prenotazioni all'attivo.",
                reply_markup=InlineKeyboardMarkup(keyboard))
    #
    # Menù disponibile all'utente una volta selezionato un viaggio. I bottoni cambiano a seconda della prenotazione:
    # Temporanea -> solo cancellazione
    # Permanente e sospesa -> sospensione e cancellazione
    #
    elif action == "ACTION":
        direction, day, driver, mode = data[2:]
        keyboard = [
            [
                InlineKeyboardButton("❌ Annulla prenotazione",
                                     callback_data=ccd("EDIT_BOOK", "DELETION",
                                                       direction, day, driver,
                                                       mode))
            ],
            [
                InlineKeyboardButton("↩ Indietro",
                                     callback_data=ccd("EDIT_BOOK", "LIST"))
            ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]
        ]

        text_string = []
        trip_time = get_time(direction, day, driver)

        if mode == "Permanent":
            keyboard.insert(0, [
                InlineKeyboardButton(
                    "Sospendi prenotazione",
                    callback_data=ccd("EDIT_BOOK", "SUS_BOOK", direction, day,
                                      driver, mode))
            ])

        elif mode == "SuspendedUsers":
            text_string.append(" - SOSPESA dall'utente")
            keyboard.insert(0, [
                InlineKeyboardButton(
                    "Annulla sospensione prenotazione",
                    callback_data=ccd("EDIT_BOOK", "SUS_BOOK", direction, day,
                                      driver, mode))
            ])

        if is_suspended(direction, day, driver):
            text_string.append(" - SOSPESA dall'autista")

        text_string = "".join(text_string)

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text=f"Prenotazione selezionata: {text_string}\n"
            f"\n🚗 [{get_name(driver)}](tg://user?id={driver})"
            f"\n🗓 {day}"
            f"\n{common.dir_name(direction)}"
            f"\n🕓 {trip_time}"
            f"\n{common.mode_name(mode)}",
            reply_markup=InlineKeyboardMarkup(keyboard),
            parse_mode="Markdown")
    #
    # SUS_BOOK = SUSPEND_BOOKING
    #
    elif action == "SUS_BOOK":
        booking = data[2:]
        mode = booking[3]

        keyboard = [
            InlineKeyboardButton("✔ Sì",
                                 callback_data=ccd("EDIT_BOOK", "CO_SUS_BOOK",
                                                   *booking)),
            InlineKeyboardButton("❌ No",
                                 callback_data=ccd("EDIT_BOOK", "LIST"))
        ]

        if mode == "Permanent":
            message = "Si ricorda che la sospensione di una prenotazione è valida per una sola settimana." \
                      "\n\nSei sicuro di voler sospendere questo viaggio?"

        elif mode == "SuspendedUsers":
            message = "Vuoi rendere di nuovo operativa questa prenotazione?"

        else:
            message = "Errore fatale nel Bot. Contatta il creatore del bot al più presto."

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text=message,
            reply_markup=InlineKeyboardMarkup([keyboard]))
    #
    # CO_SUS_BOOK = CONFIRM_SUSPEND_BOOKING
    # Il metodo scambia la chiave di un utente da Permanente a SuspendUsers e vice-versa.
    #
    elif action == "CO_SUS_BOOK":
        direction, day, driver, mode = data[2:]
        trip = get_trip(direction, day, driver)

        keyboard = [[
            InlineKeyboardButton("↩ Indietro",
                                 callback_data=ccd("EDIT_BOOK", "LIST"))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        if mode == "Permanent":
            trip["Permanent"].remove(chat_id)
            trip["SuspendedUsers"].append(chat_id)

            user_message = "Prenotazione sospesa. Verrà ripristinata il prossimo viaggio."
            driver_message = f"[{get_name(chat_id)}](tg://user?id={chat_id})" \
                f" ha sospeso la sua prenotazione permanente" \
                f" per {day.lower()} {common.dir_name(direction)}."

        elif mode == "SuspendedUsers":
            occupied_slots = len(trip["Permanent"]) + len(trip["Temporary"])
            total_slots = get_slots(driver)

            if occupied_slots >= total_slots:
                # Può capitare che mentre un passeggero ha reso la propria prenotazione sospesa,
                # altre persone hanno preso il suo posto.
                bot.edit_message_text(
                    chat_id=chat_id,
                    message_id=update.callback_query.message.message_id,
                    text=f"Mi dispiace, ma non puoi rendere operativa la"
                    f" tua prenotazione in quanto la macchina è ora piena."
                    f"Contatta [{get_name(driver)}](tg://user?id={driver})"
                    f" per risolvere la questione.",
                    reply_markup=InlineKeyboardMarkup(keyboard),
                    parse_mode="Markdown")
                return

            trip["Permanent"].append(chat_id)
            trip["SuspendedUsers"].remove(chat_id)

            user_message = "La prenotazione è di nuovo operativa."
            driver_message = f"[{get_name(chat_id)}](tg://user?id={chat_id})" \
                f" ha reso operativa la sua prenotazione permanente" \
                f" di {day.lower()} {common.dir_name(direction)}."

        else:
            user_message = "Errore fatale nel Bot. Contatta il creatore del bot al più presto."
            driver_message = "Errore: un tuo passeggero ha cercato di sospendere " \
                             "una prenotazione temporanea. Contatta il creatore del bot al più presto."

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text=user_message,
            reply_markup=InlineKeyboardMarkup(keyboard),
            parse_mode="Markdown")
        bot.send_message(chat_id=driver,
                         text=driver_message,
                         parse_mode="Markdown")
    #
    # Metodo per cancellare per sempre una data prenotazione.
    #
    elif action == "DELETION":
        booking = data[2:]

        keyboard = [
            InlineKeyboardButton("✔ Sì",
                                 callback_data=ccd("EDIT_BOOK", "CO_DEL",
                                                   *booking)),
            InlineKeyboardButton("❌ No",
                                 callback_data=ccd("EDIT_BOOK", "LIST"))
        ]

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text="Sei sicuro di voler cancellare questo viaggio?",
            reply_markup=InlineKeyboardMarkup([keyboard]))
    #
    # CO_DEL = CONFIRM_DELETION
    #
    elif action == "CO_DEL":
        direction, day, driver, mode = data[2:]
        remove_passenger(direction, day, driver, mode, chat_id)

        keyboard = [[
            InlineKeyboardButton("↩ Indietro",
                                 callback_data=ccd("EDIT_BOOK", "LIST"))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text="Prenotazione cancellata con successo.",
            reply_markup=InlineKeyboardMarkup(keyboard))
        bot.send_message(
            chat_id=driver,
            text=f"Una prenotazione al tuo viaggio è stata cancellata:"
            f"\n\n👤 [{get_name(chat_id)}](tg://user?id={chat_id})"
            f"\n🗓 {day}"
            f"\n{common.dir_name(direction)}",
            parse_mode="Markdown")
Beispiel #14
0
def me_handler(bot, update):
    action = separate_callback_data(update.callback_query.data)[1]
    chat_id = str(update.callback_query.message.chat_id)

    #
    # Da questo menù viene invocata la keyboard in keyboards.py.
    #
    if action == "TRIPS":
        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text="Viaggi (clicca su un viaggio per modificarlo):",
            reply_markup=trips_keyboard(chat_id))
    #
    # Da questo menù è possibile iscriversi e disiscriversi dalla modalità autista.
    #
    elif action == "DRIVER":
        if is_driver(chat_id):
            keyboard = [[
                InlineKeyboardButton("✔ Sì",
                                     callback_data=ccd("ME", "CO_DR_RE")),
                InlineKeyboardButton("❌ No", callback_data=ccd("ME_MENU"))
            ]]
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text="Sei sicuro di voler confermare la tua rimozione dalla"
                " lista degli autisti? Se cambiassi idea, puoi sempre iscriverti"
                " di nuovo da /me. La cancellazione dal sistema comporterà il reset"
                " completo di tutti i viaggi, impostazioni e crediti.",
                reply_markup=InlineKeyboardMarkup(keyboard))
        else:
            keyboard = [[
                InlineKeyboardButton("✔ Sì",
                                     callback_data=ccd("ME", "ED_DR_SL")),
                InlineKeyboardButton("❌ No", callback_data=ccd("ME_MENU"))
            ]]
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text=
                "Una volta finalizzata l'iscrizione come autista, potrai gestire i tuoi"
                " viaggi direttamente da questo bot. Contatta un membro del direttivo di"
                " UberNEST per ulteriori informazioni.\n\n"
                "Sei sicuro di voler diventare un autista di UberNEST?",
                reply_markup=InlineKeyboardMarkup(keyboard))
    #
    # US_RE = USER_REMOVAL
    # Da questo menù è possibile attuare la cancellazione completa e totale di tutti i dati dell'utente.
    # Nulla rimarrà, a parte i debiti che verranno inoltrati ai rispettivi creditori.
    #
    elif action == "US_RE":
        keyboard = [[
            InlineKeyboardButton("✔ Sì", callback_data=ccd("ME", "CO_US_RE")),
            InlineKeyboardButton("❌ No", callback_data=ccd("ME_MENU"))
        ]]

        user_debits = get_all_debits(chat_id)
        debitors = []

        for creditor in user_debits:
            creditor_name = get_name(creditor)
            debitors.append(
                f" {creditor_name} - {str(user_debits[creditor])} EUR\n")

        message_text = [
            f"Sei sicuro di voler confermare la tua rimozione completa dal sistema?"
            f" L'operazione è reversibile, ma tutte le tue prenotazioni e viaggi"
            f" verranno cancellati per sempre."
        ]

        if debitors:
            message_text.append(
                f"\n\nATTENZIONE! Hai debiti con le seguenti persone,"
                f" in caso di cancellazione dal sistema"
                f" verranno avvisate dei tuoi debiti non saldati!\n\n{''.join(debitors)}"
            )

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text="".join(message_text),
            reply_markup=InlineKeyboardMarkup(keyboard))
    #
    # ED_DR_SL = EDIT_DRIVER_SLOTS
    # Questo menù permette di modificare gli slot a disposizione del guidatore.
    #
    elif action == "ED_DR_SL":
        # Inserisco 5 bottoni per i posti con la list comprehension
        keyboard = [[
            InlineKeyboardButton(str(i),
                                 callback_data=ccd("ME", "CO_DR", str(i)))
            for i in range(1, 6, 1)
        ], [InlineKeyboardButton("↩ Indietro", callback_data=ccd("ME_MENU"))
            ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]
        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text=
            "Inserisci il numero di posti disponibili nella tua macchina, autista escluso.",
            reply_markup=InlineKeyboardMarkup(keyboard))
    #
    # CO_DR = CONFIRM_DRIVER
    # Questo metodo svolge due diverse funzioni: se l'utente è un autista, è l'endpoint per la conferma
    # degli slot, altrimenti dell'iscrizione
    #
    elif action == "CO_DR":
        keyboard = [[
            InlineKeyboardButton("↩ Indietro", callback_data=ccd("ME_MENU"))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        slots = int(separate_callback_data(update.callback_query.data)[2])
        if is_driver(chat_id):
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text="Numero di posti della vettura aggiornato con successo.",
                reply_markup=InlineKeyboardMarkup(keyboard))
        else:
            add_driver(chat_id, slots)
            bot.edit_message_text(
                chat_id=chat_id,
                message_id=update.callback_query.message.message_id,
                text=
                "Sei stato inserito nella lista degli autisti! Usa il menu /me per aggiungere"
                " viaggi, modificare i posti auto, aggiungere un messaggio da mostrare ai tuoi"
                " passeggeri ed altro.",
                reply_markup=InlineKeyboardMarkup(keyboard))
    #
    # CO_DR_RE = CONFIRM_DRIVER_REMOVAL
    # Metodo di conferma della rimozione di un autista, vedi sopra.
    #
    elif action == "CO_DR_RE":
        keyboard = [[
            InlineKeyboardButton("↩ Indietro", callback_data=ccd("ME_MENU"))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        delete_driver(chat_id)
        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text="Sei stato rimosso con successo dall'elenco degli autisti.",
            reply_markup=InlineKeyboardMarkup(keyboard))
    #
    # CO_US_RE = CONFIRM_USER_REMOVAL
    # Metodo di conferma rimozione utente, vedi sopra.
    #
    elif action == "CO_US_RE":
        keyboard = [[
            InlineKeyboardButton("↩ Indietro", callback_data=ccd("ME_MENU"))
        ], [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]]

        user_debits = get_all_debits(chat_id)
        for creditor in user_debits:
            bot.send_message(
                chat_id=creditor,
                text=f"ATTENZIONE! [{get_name(chat_id)}](tg://user?id={chat_id})"
                f" si è cancellato da UberNEST. Ha ancora "
                f"{str(user_debits[creditor])} EUR di debito con te.",
                parse_mode="Markdown")

        delete_user(chat_id)

        bot.edit_message_text(
            chat_id=chat_id,
            message_id=update.callback_query.message.message_id,
            text="Sei stato rimosso con successo dal sistema.",
            reply_markup=InlineKeyboardMarkup(keyboard))
Beispiel #15
0
def edit_money(bot, update):
    action, user = separate_callback_data(update.callback_query.data)[1:]
    chat_id = str(update.callback_query.message.chat_id)

    try:
        trips = str(get_single_debit(user, chat_id))
    except KeyError:
        set_single_debit(user, chat_id, 0)
        trips = "0"

    #
    # Tre azioni possibili: SUBTRACT (sottrae il prezzo di un viaggio), ADD (aggiunge il prezzo
    # di un viaggio), ZERO (cancella completamente il debito)
    #

    edit_money_keyboard = [
        InlineKeyboardButton(f"+",
                             callback_data=ccd("EDIT_MONEY", "ADD", user)),
        InlineKeyboardButton(f"-",
                             callback_data=ccd("EDIT_MONEY", "SUBTRACT", user))
    ]

    if action == "SUBTRACT":
        trips = quick_debit_edit(user, chat_id, "-")

        user_text = f"💶 Hai saldato un viaggio con " \
            f"[{get_name(chat_id)}](tg://user?id={chat_id}). " \
            f"Viaggi da pagare rimanenti: {trips}."

    elif action == "ADD":
        trips = quick_debit_edit(user, chat_id, "+")
        user_text = f"💶 [{get_name(chat_id)}](tg://user?id={chat_id})" \
            f" ha aggiunto un viaggio da pagargli.\n" \
            f"Viaggi da pagare rimanenti: {trips}."

    elif action == "ZERO":
        remove_single_debit(user, chat_id)
        trips = 0
        user_text = f"💸 [{get_name(chat_id)}](tg://user?id={chat_id})" \
            f" ha azzerato i viaggi da pagare con te."

    elif action == "NEW":
        trips = 0
        user_text = ""

    elif action == "VIEW":
        user_text = ""

    else:
        user_text = "Sembra che questo messaggio sia stato mandato inavvertitamente.\n" \
                    "Contatta il creatore del bot per segnalare il problema."

    if trips != 0:
        edit_money_keyboard.append(
            InlineKeyboardButton("Azzera",
                                 callback_data=ccd("EDIT_MONEY", "ZERO",
                                                   user)))

    keyboard = [
        edit_money_keyboard,
        [InlineKeyboardButton("↩ Indietro", callback_data=ccd("MONEY"))],
        [InlineKeyboardButton("🔚 Esci", callback_data=ccd("EXIT"))]
    ]

    bot.edit_message_text(
        chat_id=chat_id,
        message_id=update.callback_query.message.message_id,
        text=f"👤 [{get_name(user)}](tg://user?id={user})"
        f"\n🚗 *{trips} {'viaggi' if trips > 1 else 'viaggio'}*",
        reply_markup=InlineKeyboardMarkup(keyboard),
        parse_mode="Markdown")

    if action == "ADD" or action == "ZERO" or action == "SUBTRACT":
        bot.send_message(chat_id=user, text=user_text, parse_mode="Markdown")