diff --git a/data/img/logo_white_with_name_transparent.png b/data/img/logo_white_with_name_transparent.png new file mode 100644 index 0000000..3749393 Binary files /dev/null and b/data/img/logo_white_with_name_transparent.png differ diff --git a/docker-compose.yml b/docker-compose.yml index b4a696a..98691c5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,14 +3,12 @@ services: redis: image: redis container_name: orariotreni_redis - volumes: + volumes: - ./redis-data:/data - expose: - - "6379" - + + bot: build: . container_name: orariotreni_bot links: - redis - diff --git a/requirements.txt b/requirements.txt index 1906d5b..2c2a87c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,6 @@ botogram2 wikipedia dateutils progressbar2 -plotly==2.0.8 +matplotlib image pyowm diff --git a/src/updates/callback.py b/src/updates/callback.py index f1bddbe..3b02573 100644 --- a/src/updates/callback.py +++ b/src/updates/callback.py @@ -40,6 +40,9 @@ def process_callback(bot, cb, u): api = viaggiatreno.API() utils = viaggiatreno.Utils() + if cb.query[-1] == '@': + cb.query = cb.query[0:-1] + if cb.query == "home": u.state("home") text = ( @@ -49,7 +52,7 @@ def process_callback(bot, cb, u): "\nPremi uno dei tasti qui sotto per iniziare" ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {'inline_keyboard': [ @@ -66,17 +69,17 @@ def process_callback(bot, cb, u): text = ( "Informazioni sul bot" "\nLink utili" - "\nβž– πŸ‘€ Contatta lo sviluppatore su Telegram per avere assistenza gratuita " + "\n━ πŸ‘€ Contatta lo sviluppatore su Telegram per avere assistenza gratuita " "o per proporre una nuova funzione" - "\nβž– Entra nel πŸ“’ Canale ufficiale per ricevere news e aggiornamenti " + "\n━ Entra nel πŸ“’ Canale ufficiale per ricevere news e aggiornamenti " "in anteprima sul bot" - "\nβž– πŸ’° Dona quello che vuoi per tenere il bot online e per supportare " + "\n━ πŸ’° Dona quello che vuoi per tenere il bot online e per supportare " "il lavoro dello sviluppatore" - "\nβž– Dai un'occhiata o contribuisci al codice sorgente su πŸ”˜ GitHub" - "\nβž– Visualizza le πŸ“ˆ Statistiche di utilizzo del bot!" + "\n━ Dai un'occhiata o contribuisci al codice sorgente su πŸ”˜ GitHub" + "\n━ Visualizza le πŸ“ˆ Statistiche di utilizzo del bot!" ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {'inline_keyboard': [ @@ -99,7 +102,10 @@ def process_callback(bot, cb, u): users = [] for user in r.keys("user:*"): - users.append(int(user[5:])) + try: + users.append(int(user[5:])) + except: + pass active_users = 0 total_users = 0 @@ -142,18 +148,18 @@ def process_callback(bot, cb, u): text = ( "πŸ“ˆ Statistiche" - "\nβž–βž– πŸ‘€ Utenti" + "\n━━ πŸ‘€ Utenti" "\nUtenti attivi: {au}" "\nUtenti totali: {tu}" - "\nβž–βž– πŸ’¬ Comandi" + "\n━━ πŸ’¬ Comandi" "\nComando /start: {sc} (tu {psc})" "\nTastiere inline: {cc} (tu {pcc})" "\nRichieste inline: {iq} (tu {piq})" - "\nβž–βž– πŸ‘β€πŸ—¨ Query" + "\n━━ πŸ‘β€πŸ—¨ Query" "\nTreni cercati per numero: {tr_bynum} (tu {ptr_bynum})" "\nTreni cercati per itinerario: {tr_byiti} (tu {ptr_byiti})" "\nStazioni cercate per nome: {st} (tu {pst})" - "\nβž–βž– πŸš… Circolazione ferroviaria" + "\n━━ πŸš… Circolazione ferroviaria" "\nTreni di oggi: {tt}" "\nTreni circolanti: {ct}" "\nUltimo aggiornamento: {lu}" @@ -167,7 +173,7 @@ def process_callback(bot, cb, u): lu=format_timestamp(viaggiatreno_stats['ultimoAggiornamento'], "%H:%M")) ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "parse_mode": "HTML", + "chat_id": cb.chat.id, "message_id": cb.message.id, "parse_mode": "HTML", "text": text, "reply_markup": json.dumps( {"inline_keyboard": [ @@ -184,7 +190,7 @@ def process_callback(bot, cb, u): "\n\nVuoi cercare il treno 1️⃣ per numero di treno o πŸ›€ per itinerario?" ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {"inline_keyboard": [ @@ -204,7 +210,7 @@ def process_callback(bot, cb, u): "\nInserisci il numero di treno (senza nessuna sigla prima, per esempio 9650)" ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {"inline_keyboard": @@ -223,7 +229,7 @@ def process_callback(bot, cb, u): "\nInserisci, come prima cosa, la stazione di partenza" ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {"inline_keyboard": @@ -243,7 +249,7 @@ def process_callback(bot, cb, u): "\nInserisci il nome della stazione che vuoi cercare" ) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {"inline_keyboard": @@ -257,7 +263,7 @@ def process_callback(bot, cb, u): raw = api.call("news", 0, "it") text = format.formatNews(raw) bot.api.call("editMessageText", { - "chat_id": cb.chat.id, "message_id": cb.message.message_id, "text": text, + "chat_id": cb.chat.id, "message_id": cb.message.id, "text": text, "parse_mode": "HTML", "reply_markup": json.dumps( {"inline_keyboard": [ @@ -274,7 +280,8 @@ def process_callback(bot, cb, u): departure_station, train = arguments[0].split('_')[0:2] del(arguments[0]) - raw = api.call('andamentoTreno', departure_station, train) + departure_station = departure_station.split('-')[0] + raw = api.andamentoTreno(departure_station, train) if not arguments: u.increaseStat('stats_trains_bynum') @@ -282,7 +289,7 @@ def process_callback(bot, cb, u): text = format.formatTrain(raw) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -298,18 +305,22 @@ def process_callback(bot, cb, u): elif not arguments[0]: text = format.formatTrain(raw) - bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, - 'parse_mode': 'HTML', 'reply_markup': - json.dumps( - {"inline_keyboard": [ - [{"text": "πŸ”„ Aggiorna le informazioni", "callback_data": cb.query}], - [{"text": "πŸš‰ Fermate", "callback_data": "@".join(cb.query.split("@")[:-1]) + "@stops"}, - {"text": "πŸ“Š Grafico ritardo", "callback_data": cb.query + "@graph"}], - [{"text": "⬅️ Torna indietro", "callback_data": "home"}] - ]} - ) - }) + try: + bot.api.call('editMessageText', { + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, + 'parse_mode': 'HTML', 'reply_markup': + json.dumps( + {"inline_keyboard": [ + [{"text": "πŸ”„ Aggiorna le informazioni", "callback_data": cb.query}], + [{"text": "πŸš‰ Fermate", "callback_data": "@".join(cb.query.split("@")[:-1]) + "@stops"}, + {"text": "πŸ“Š Grafico ritardo", "callback_data": cb.query + "@graph"}], + [{"text": "⬅️ Torna indietro", "callback_data": "home"}] + ]} + ) + }) + except APIError: + pass + cb.notify('') return elif arguments[0] == "update": @@ -317,7 +328,7 @@ def process_callback(bot, cb, u): try: bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -337,7 +348,7 @@ def process_callback(bot, cb, u): inline_keyboard = format.getStopsInlineKeyboard(raw, cb.query) text = "Lista fermate del treno {x}".format(x=raw['compNumeroTreno']) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": inline_keyboard} @@ -349,7 +360,7 @@ def process_callback(bot, cb, u): text = format.formatTrainStop(raw, int(arguments[1])) inline_keyboard = format.generateTrainStopInlineKeyboard(raw, int(arguments[1])) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'disable_web_page_preview': True, 'reply_markup': json.dumps({"inline_keyboard": inline_keyboard}) }) @@ -387,7 +398,7 @@ def process_callback(bot, cb, u): "\nInserisci ora la stazione di arrivo" ) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -409,7 +420,7 @@ def process_callback(bot, cb, u): b=datetime.now().strftime("%H:%M")) ) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -427,7 +438,7 @@ def process_callback(bot, cb, u): text = format.formatStation(station_name, station) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -445,7 +456,7 @@ def process_callback(bot, cb, u): elif len(arguments) == 1 and arguments[0] == "wiki": text = format.formatStation(station_name, station, withWikiSummary=True) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -467,7 +478,7 @@ def process_callback(bot, cb, u): inline_keyboard = format.generateStationPagesInlineKeyboard([0, format.ELEMENTS_FOR_PAGE], format.getPagesCount(raw), station, arguments[0]) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'disable_web_page_preview': True, 'reply_markup': json.dumps( {"inline_keyboard": inline_keyboard} @@ -489,7 +500,7 @@ def process_callback(bot, cb, u): int(arguments[1])], format.getPagesCount(raw), station, arguments[0]) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'disable_web_page_preview': True, 'reply_markup': json.dumps( {"inline_keyboard": inline_keyboard} @@ -520,7 +531,7 @@ def process_callback(bot, cb, u): b=datetime.now().strftime("%H:%M")) ) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -556,7 +567,7 @@ def minifyStation(__str): raw = api.call('soluzioniViaggioNew', station_a, station_b, date) text = format.formatItinerary(raw) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'disable_web_page_preview': True, 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -575,7 +586,7 @@ def minifyStation(__str): "\nSeleziona un opzione:" ) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'reply_markup': json.dumps( {'inline_keyboard': [ @@ -597,7 +608,7 @@ def minifyStation(__str): "\nInvia il testo formattato in HTML del post globale" ) bot.api.call('editMessageText', { - 'chat_id': cb.chat.id, 'message_id': cb.message.message_id, 'text': text, + 'chat_id': cb.chat.id, 'message_id': cb.message.id, 'text': text, 'parse_mode': 'HTML', 'disable_web_page_preview': True, 'reply_markup': json.dumps( {"inline_keyboard": [ @@ -635,7 +646,7 @@ def process_inline_callback(bot, cb, u): departure_station, train = arguments[0].split('_')[0:2] del(arguments[0]) - raw = api.call('andamentoTreno', departure_station, train) + raw = api.andamentoTreno(departure_station, train) if not arguments: u.increaseStat('stats_trains_bynum') diff --git a/src/updates/deeplinking.py b/src/updates/deeplinking.py index ae4c73f..ac9967f 100644 --- a/src/updates/deeplinking.py +++ b/src/updates/deeplinking.py @@ -39,7 +39,7 @@ def process_deeplinking(bot, message, args): if arguments[0] == "train": departure_station, train = arguments[1].split('_')[0:2] - raw = api.call('andamentoTreno', departure_station, train) + raw = api.andamentoTreno(departure_station, train) u.increaseStat('stats_trains_bynum') diff --git a/src/updates/inline.py b/src/updates/inline.py index a090d69..d1ecd59 100644 --- a/src/updates/inline.py +++ b/src/updates/inline.py @@ -55,10 +55,10 @@ def default_answer(): "\n⏺ Cerca treni, stazioni e itinerari in qualsiasi chat" "\nPer usare questa funzione basta che scrivi @{username} query in qualsiasi chat: " "si aprirΓ  un pop-up da dove potrai selezionare il risultato desiderato." - "\nβž–βž–οΈ Cerca treni e stazioni" + "\n━━️ Cerca treni e stazioni" "\nScrivi il numero del treno o il nome della stazione, " "per esempio @{username} 9650 o @{username} Roma Termini" - "\nβž–βž–οΈ Cerca itinerari" + "\n━━️ Cerca itinerari" "\nScrivi la stazione di partenza, un trattino - e la stazione di arrivo: " "per esempio @{username} Milano Centrale - Roma Termini" "\nGli itinerari cercati inline sono basati sull'orario attuale" @@ -91,10 +91,10 @@ def not_found_answer(): "\n⏺ Cerca treni, stazioni e itinerari in qualsiasi chat" "\nPer usare questa funzione basta che scrivi @{username} query in qualsiasi chat: " "si aprirΓ  un pop-up da dove potrai selezionare il risultato desiderato." - "\nβž–βž–οΈ Cerca treni e stazioni" + "\n━━️ Cerca treni e stazioni" "\nScrivi il numero del treno o il nome della stazione, " "per esempio @{username} 9650 o @{username} Roma Termini" - "\nβž–βž–οΈ Cerca itinerari" + "\n━━️ Cerca itinerari" "\nScrivi la stazione di partenza, un trattino - e la stazione di arrivo: " "per esempio @{username} Milano Centrale - Roma Termini" "\nGli itinerari cercati inline sono basati sull'orario attuale" @@ -131,7 +131,7 @@ def not_found_answer(): inline_results = [] for result in results: - raw = api.call('andamentoTreno', result[1], iq.query) + raw = api.andamentoTreno(result[1], iq.query) text = format.formatTrain(raw) inline_results.append( { diff --git a/src/updates/messages.py b/src/updates/messages.py index 0bca964..5b210f4 100644 --- a/src/updates/messages.py +++ b/src/updates/messages.py @@ -61,7 +61,7 @@ def process_messages(bot, message, u): elif len(results) == 1: u.increaseStat('stats_trains_bynum') - raw = api.call('andamentoTreno', results[0][1], message.text) # andamentoTreno; departure station; number + raw = api.andamentoTreno(results[0][1], message.text) # andamentoTreno; departure station; number u.addRecentElement('trains', results[0][1] + "_" + message.text + "@" + raw['compNumeroTreno']) text = format.formatTrain(raw) bot.api.call('sendMessage', { diff --git a/src/viaggiatreno/format.py b/src/viaggiatreno/format.py index 33ab0df..aadb7e0 100644 --- a/src/viaggiatreno/format.py +++ b/src/viaggiatreno/format.py @@ -27,13 +27,11 @@ from datetime import datetime import botogram -import plotly -import plotly.graph_objs as go -import plotly.plotly as py import pyowm import wikipedia from PIL import Image from wikipedia.exceptions import PageError +import matplotlib.pyplot as plt import config from . import dateutils @@ -42,8 +40,7 @@ api = viaggiatreno.API() utils = viaggiatreno.Utils() bot = botogram.create(config.BOT_TOKEN) -owm = pyowm.OWM(config.OWM_API_KEY) -plotly.tools.set_credentials_file(username=config.PLOTLY_USERNAME, api_key=config.PLOTLY_API_KEY) +owm = pyowm.OWM(config.OWM_API_KEY).weather_manager() wikipedia.set_lang("it") @@ -104,7 +101,7 @@ def getWeather(station_id: str): return "" code = owm.weather_at_coords(station_coords[station_id]["lat"], station_coords[station_id]["lon"])\ - .get_weather().get_weather_code() + .weather.weather_code path = os.getcwd() + '/'.join(['', 'data', 'owm', 'weather_codes_it.json']) with open(path, 'r') as fp: @@ -259,7 +256,7 @@ def formatDepartures(raw: dict, station: str, xrange: int): platform = "sconosciuto (errore Trenitalia)" text += ( - "\n\nβž–βž– Treno {n} ({href})" + "\n\n━━ Treno {n} ({href})" "\nπŸš‰ Destinazione: {d}" "\nπŸ›€ Binario: {b}" "\nπŸ•’ Orario di partenza: {dt}" @@ -313,7 +310,7 @@ def formatArrivals(raw: dict, station: str, xrange: int): platform = "sconosciuto (errore Trenitalia)" text += ( - "\n\nβž–βž– Treno {n} ({href})" + "\n\n━━ Treno {n} ({href})" "\nπŸš‰ Origine: {d}" "\nπŸ›€ Binario: {b}" "\nπŸ•’ Orario di arrivo: {dt}" @@ -347,16 +344,17 @@ def formatItinerary(raw: dict): break x += 1 - text += "\n\nβž–βž– Soluzione {n}".format(n=x) + text += "\n┏━━ Soluzione {n}".format(n=x) duration = solution.get('durata', 'sconosciuta') - text += "\nπŸ•‘ Durata: {t}".format(t=duration if duration is not None else 'sconosciuta') + text += "\nβ”ƒπŸ•‘ Durata: {t}".format(t=duration if duration is not None else 'sconosciuta') for vehicle in solution['vehicles']: start_time = datetime.strptime(vehicle['orarioPartenza'], '%Y-%m-%dT%H:%M:%S').strftime('%H:%M') end_time = datetime.strptime(vehicle['orarioArrivo'], '%Y-%m-%dT%H:%M:%S').strftime('%H:%M') - text += "\nβž– Treno {n} ({href})".format(n=vehicle['numeroTreno'], href=gDLHREF(gTCQ(vehicle))) - text += "\nπŸš‰ Stazione di partenza: {d} ({dh})".format(d=vehicle['origine'], dh=start_time) - text += "\nπŸš‰ Stazione di arrivo: {a} ({ah})".format(a=vehicle['destinazione'], ah=end_time) + text += "\n┣━ {t} {n} ({href})".format(t=vehicle['categoriaDescrizione'], n=vehicle['numeroTreno'], href=gDLHREF(gTCQ(vehicle))) + text += "\n┃ πŸš‰ Stazione di partenza: {d} ({dh})".format(d=vehicle['origine'], dh=start_time) + text += "\n┃ πŸš‰ Stazione di arrivo: {a} ({ah})".format(a=vehicle['destinazione'], ah=end_time) + text +="\nβ”—" return text @@ -374,7 +372,7 @@ def __toBool(__str: str) -> bool: if not __toBool(news['primoPiano']): continue text += ( - "\n\n{pinned}βž–βž– {title}" + "\n\n{pinned}━━ {title}" "\nData: {date}" "\n{text}" .format( @@ -390,7 +388,7 @@ def __toBool(__str: str) -> bool: continue text += ( - "\n\n{pinned}βž–βž– {title}" + "\n\n{pinned}━━ {title}" "\nData: {date}" "\n{text}" .format( @@ -530,8 +528,9 @@ def generateTrainGraph(raw: dict): def apply(a, b): base = Image.open(a) logo = Image.open(b) - logo.thumbnail((120, 120), Image.ANTIALIAS) - base.paste(logo, (580, 5), mask=logo) + logo.thumbnail((150, 150), Image.ANTIALIAS) + img_width, img_height = base.size + base.paste(logo, (0, -15), mask=logo) base.save(a) stops = [] @@ -547,28 +546,21 @@ def apply(a, b): if len(stops) < 2 or len(delays) < 2: return False - line = go.Scatter( - x=stops, - y=delays, - name='Ritardo', - line=dict( - color='rgb(205, 12, 24)', - width=2, - ) - ) - - title = 'Ritardo del treno {train}'.format(train=raw['compNumeroTreno']) - layout = dict( - title=title, - xaxis=dict(title='Fermata'), - yaxis=dict(title='Ritardo (minuti)') - ) + title = 'Ritardo del treno {train}'.format(train=raw['compNumeroTreno']) + fig, ax = plt.subplots(dpi=200) - filename = os.getcwd() + ''.join( - random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(10)) + '.png' + ax.axhline(y=0, color='gray', linestyle='--') + if any(x >= 60 for x in delays): + ax.axhline(y=60, color='red', linestyle='--') - fig = dict(data=[line], layout=layout) - py.image.save_as(fig, filename=filename) + ax.plot(stops, delays, marker='o') + ax.set_title(title) + ax.set_xticks(stops, stops, rotation=45, ha='right') + ax.set_ylabel('Ritardo (minuti)') - apply(filename, os.getcwd() + "/data/img/logo_white_with_name.png") + fig.tight_layout() + filename = os.getcwd() + '/' + ''.join( + random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(10)) + '.png' + fig.savefig(filename) + apply(filename, os.getcwd() + "/data/img/logo_white_with_name_transparent.png") return filename diff --git a/src/viaggiatreno/viaggiatreno.py b/src/viaggiatreno/viaggiatreno.py index c7d6a78..aa06714 100644 --- a/src/viaggiatreno/viaggiatreno.py +++ b/src/viaggiatreno/viaggiatreno.py @@ -100,9 +100,9 @@ def _decode_lines(s, linefunc): def _decode_cercaNumeroTrenoTrenoAutocomplete(s): def linefunc(line): - r = re.search('^(\d+)\s-\s(.+)\|(\d+)-(.+)$', line) + r = re.search('^(\d+)\s-\s(.+)\|(\d+)-(\w+)-(\d+)', line) if r is not None: - return r.group(2, 4) + return r.group(2, 4, 5) return _decode_lines(s, linefunc) @@ -128,6 +128,7 @@ def __init__(self, **options): 'partenze': _decode_json, 'arrivi': _decode_json, 'news': _decode_json, + 'cercaNumeroTreno': _decode_json, } self.__default_decoder = lambda x: x @@ -139,7 +140,7 @@ def call(self, function, *params, **options): plain = options.get('plainoutput', self.__plainoutput) verbose = options.get('verbose', self.__verbose) - base = 'http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/' + base = 'http://www.viaggiatreno.it/infomobilita/resteasy/viaggiatreno/' path = '/'.join(quote(str(p)) for p in params) url = base + function + '/' + path @@ -156,3 +157,17 @@ def call(self, function, *params, **options): return data else: return self.__checkAndDecode(function, data) + + def cercaNumeroTreno(self, numeroTreno): + return self.call('cercaNumeroTreno', numeroTreno) + + def andamentoTreno(self, codOrigine, numeroTreno, dataPartenza=None): + if dataPartenza is None: + infoTreni = self.call('cercaNumeroTrenoTrenoAutocomplete', numeroTreno) + + for infoTreno in infoTreni: + if codOrigine == infoTreno[1]: + dataPartenza = infoTreno[2] + break + + return self.call('andamentoTreno', codOrigine, numeroTreno, dataPartenza)