Skip to content

Commit

Permalink
Orario treni 3.1
Browse files Browse the repository at this point in the history
- Aggiunto il tracciamento dei treni
- Aggiunti i grafici dei ritardo dei treni
- Migliorati gli arrivi e le partenze delle stazioni
- Abilitato il logging per prevenire flood in chat del bot
- Bug fixes
  • Loading branch information
MarcoBuster authored Jan 1, 2017
2 parents e17c3f3 + c334fbd commit 1375b17
Show file tree
Hide file tree
Showing 9 changed files with 479 additions and 34 deletions.
197 changes: 166 additions & 31 deletions API.py

Large diffs are not rendered by default.

27 changes: 26 additions & 1 deletion Bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@
from Inlinemode import Inline
from Callback.InlineCallback import INCallback

import logging
logger = logging.getLogger("bot")
logging.getLogger("requests").setLevel(logging.WARNING)

format = "%(asctime)s [%(levelname)s]: %(message)s"
level = logging.INFO
logging.basicConfig(format=format, level=level)

import botogram.objects.base
class CallbackQuery(botogram.objects.base.BaseObject):
required = {
Expand Down Expand Up @@ -73,6 +81,7 @@ def process_inline(bot, chains, update):

@bot.command("start")
def start(chat, message, args):
logger.info("Utente {} comando /start".format(message.sender.id))

if len(args) == 1:
if args[0] == "inline":
Expand Down Expand Up @@ -168,6 +177,8 @@ def cerca_treno(chat, message):
if state != "treno1":
return

logger.info("Utente {} process message cerca treno".format(message.sender.id))

id_treno = str(message.text)
data, success, error = API.orarioTreni.cercaTreno(id_treno)
if success == False and error == 404:
Expand All @@ -185,7 +196,10 @@ def cerca_treno(chat, message):
"reply_markup":
'{"inline_keyboard":[[{"text":"🚉Lista fermate","callback_data":"'+callbackdata1+'"},'
'{"text":"🔄Aggiorna le informazioni","callback_data":"'+callbackdata2+'"}],'
'[{"text": "🚦Traccia il treno [BETA]", "callback_data": "traccia@'+id_treno+'"},'
'{"text": "📊Grafico ritardo", "callback_data": "grafico@'+id_treno+'"}],'
'[{"text":"🔙Torna indietro","callback_data":"home"}]]}'})

API.db.updateState(chat.id, "nullstate", 0)

@bot.process_message
Expand All @@ -195,6 +209,8 @@ def cerca_stazione(chat, message):
if state != "stazione1":
return

logger.info("Utente {} process message cerca stazione".format(message.sender.id))

stazione = message.text

esiste, data = API.orarioTreni.stazione.check(stazione)
Expand All @@ -220,6 +236,7 @@ def cerca_stazione(chat, message):
'{"inline_keyboard":[[{"text":"Arrivi","callback_data":"'+callbackdata1+'"},{"text":"Partenze","callback_data":"'+callbackdata2+'"}],'\
'[{"text":"📍Posizione","callback_data":"'+callbackdata3+'"}],[{"text":"🔙Torna indietro","callback_data":"home"}]]}'}
)
return

bot.api.call("sendMessage", {
"chat_id":chat.id, "text":testo, "parse_mode":"HTML", "reply_markup":'{'
Expand All @@ -234,6 +251,8 @@ def sottoscrivi_itinerario_stazione1(chat, message): #CHIEDE NOME RICEVE USERNAM
conn.commit()
return

logger.info("Utente {} process message itinerario stazione".format(message.sender.id))

stazione = message.text
esiste, data = API.orarioTreni.stazione.check(stazione)
if esiste == False:
Expand Down Expand Up @@ -283,6 +302,8 @@ def sottoscrivi_itinerario_stazione2(chat, message): #CHIEDE NOME RICEVE USERNAM
conn.commit()
return

logger.info("Utente {} process message itinerario stazione 2".format(message.sender.id))

if completato == 0 and state == "itinerario2":
c.execute('''UPDATE stato SET completato=1 WHERE userid=?''',(chat.id,))
conn.commit()
Expand Down Expand Up @@ -332,6 +353,8 @@ def sottoscrivi_itinerario_orario(chat, message): #CHIEDE NOME RICEVE USERNAME
conn.commit()
return

logger.info("Utente {} process message itinerario orario".format(message.sender.id))

if completato == 0 and state == "itinerario3":
c.execute('''UPDATE stato SET completato=1 WHERE userid=?''',(chat.id,))
conn.commit()
Expand Down Expand Up @@ -370,6 +393,7 @@ def nullstate(chat, message):

@bot.command("feedback")
def feedback(chat, message, args):
logger.info("Utente {} comando /feedback".format(message.sender.id))
if len(args) == 0:
message.reply("*Comando /feedback*"
"\nQuesto comando *invia* direttamente un *feedback* allo *sviluppatore* (@MarcoBuster)"
Expand Down Expand Up @@ -420,4 +444,5 @@ def no_old_commands(chat, message):
return True

if __name__ == "__main__":
bot.run()
bot.process_backlog = True
bot.run(workers=5)
8 changes: 8 additions & 0 deletions CONFIG.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,11 @@
'''

TOKEN = "INSERT YOUR TOKEN HERE"

'''
Configurazione di Plotly (per i grafici)
Per avere le credenziali è necessario registrarsi su plot.ly
'''

PLOTLY_USERNAME = 'PLOTLY USERNAME'
PLOTLY_API_KEY = 'PLOTLY API KEY'
5 changes: 4 additions & 1 deletion Callback/Callback.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@
import API
import Bot

from Callback import Generale, Treni, Stazioni, Itinerario
from Callback import Generale, Treni, Stazioni, Itinerario, Tracciamento

import sqlite3
conn = sqlite3.connect('OrarioTreni.db')
c = conn.cursor()

def process(bot, chains, update):
Bot.logger.info("Utente {} callback {}".format(update.callback_query.sender.id, update.callback_query.data))

Generale.callback(bot, chains, update)
Treni.callback(bot, chains, update)
Stazioni.callback(bot, chains, update)
Itinerario.callback(bot, chains, update)
Tracciamento.callback(bot, chains, update)
33 changes: 32 additions & 1 deletion Callback/Generale.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def callback(bot, chains, update):
"\n\n<b>Link utili:</b>"
"\n<b>Creatore e sviluppatore</b>: 👉 @MarcoBuster"
"\n<b>Gruppo del bot</b>: 👉 @MarcoBusterGroup"
"\n<b>Canale con aggiornamenti e anteprime</b>: 👉 @OrarioTreni"
"\n<b>Vota il bot</b>: 👉 <a href=\"telegram.me/storebot?start=OrarioTreniBot\">Storebot</a>"
"\n<b>Codice sorgente</b>: <a href=\"www.github.com/MarcoBuster/OrarioTreniBot\">GitHub</a>")

Expand Down Expand Up @@ -86,9 +87,39 @@ def callback(bot, chains, update):
if callback_q == "altro":
testo = "Visualizza le *statistiche* o vai al codice sorgente di *GitHub*"
bot.api.call("editMessageText", {"chat_id":chat.id, "message_id": message.message_id, "text": testo, "parse_mode":"Markdown", "reply_markup":\
'{"inline_keyboard":[[{"text":"📊Statistiche","callback_data":"stats"},{"text":"💻GitHub","url":"www.github.com/MarcoBuster/OrarioTreniBot"}],'\
'{"inline_keyboard":[[{"text":"📊Statistiche","callback_data":"stats"}, {"text":"💻GitHub","url":"www.github.com/MarcoBuster/OrarioTreniBot"}],'\
'[{"text": "🚦 Treni in tracciamento", "callback_data": "lista_tracciamento"}],'
'[{"text":"🔙Torna indietro","callback_data":"home"}]]}'})

if callback_q == "lista_tracciamento":
c.execute('SELECT * FROM tracciamento WHERE userid=?', (chat.id,))
rows = c.fetchall()

text = "<b>Ecco la lista dei treni che sono in tracciamento in questa chat</b>"

if not rows:
text = text + "\n\n<i>Non stai tracciando nessun treno, per tracciarne uno, cerca un treno e premi su 🚦 Traccia treno</i>"

for res in rows:
request_id = str(res[0])
user_id = res[1]
id_treno = res[2]
solo_oggi = res[3]
stazione_ultimo_rilevamento = res[4]
random_string = res[5]

if solo_oggi == True:
solo_oggi = "<i>stai tracciando questo treno solo per oggi</i>"
else:
solo_oggi = "<i>il tracciamento del treno continuerà fino a quando non sarà annullato</i>"

text = text + "\n➡️ 🚅<b>Treno {treno}</b>, {solo_oggi}, #tr{random}".format(treno=id_treno, solo_oggi=solo_oggi, id=request_id, random=random_string)

bot.api.call("editMessageText",
{"chat_id":chat.id, "message_id": message.message_id, "text": text, "parse_mode": "HTML", "reply_markup":
'{"inline_keyboard":[[{"text":"🔙Torna indietro","callback_data":"home"}]]}'})


if callback_q == "stats":
data, success, error = API.orarioTreni.cercaStatistiche()
messaggio = API.Messaggi.statistiche(data)
Expand Down
47 changes: 47 additions & 0 deletions Callback/Tracciamento.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import API
import Callback
import Bot

import sqlite3
conn = sqlite3.connect('OrarioTreni.db')
c = conn.cursor()

def callback(bot, chains, update):
API.db.creaTutto()
message = update.callback_query.message
chat = message.chat
query = str(update.callback_query.data)
callback_id = update.callback_query.id

if "stop_tracciamento" in query:
query = query.split("T")
request_id = query[1]

c.execute('SELECT * FROM tracciamento WHERE request_id=?', (request_id,))
rows = c.fetchall()

for res in rows:
id_treno = str(res[2])

c.execute('DELETE FROM tracciamento WHERE request_id=?', (request_id,))
conn.commit()

text = (
"🚦 <b>Traccia treno</b> [BETA]"
"\n<code>Tracciamento del treno {treno} interrotto</code>".format(treno=id_treno)
)

bot.api.call("editMessageText", {
"chat_id": chat.id, "message_id": message.message_id, "text": text, "parse_mode": "HTML"
})

text = (
"🚦 <b>Traccia treno</b> [BETA]"
"\n<b>Tracciamento</b> del treno {treno} <b>interrotto</b>"
"\nPuoi sempre <b>annullare</b> questa operazione".format(treno=id_treno)
)

bot.api.call("sendMessage", {
"chat_id": chat.id, "text": text, "parse_mode": "HTML", "reply_markup":
'{"inline_keyboard": [[{"text": "🚅 Traccia il treno '+id_treno+'", "callback_data": "traccia@'+id_treno+'"}]]}'
})
66 changes: 66 additions & 0 deletions Callback/Treni.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
conn = sqlite3.connect('OrarioTreni.db')
c = conn.cursor()

import os

def callback(bot, chains, update):
API.db.creaTutto()
message = update.callback_query.message
Expand Down Expand Up @@ -37,6 +39,8 @@ def callback(bot, chains, update):
"reply_markup":
'{"inline_keyboard":[[{"text":"🚉Lista fermate","callback_data":"'+callbackdata1+'"},'
'{"text":"🔄Aggiorna le informazioni","callback_data":"'+callbackdata2+'"}],'
'[{"text": "🚦Traccia il treno [BETA]", "callback_data": "traccia@'+id_treno+'"},'
'{"text": "📊Grafico ritardo", "callback_data": "grafico@'+id_treno+'"}],'
'[{"text":"🔙Torna indietro","callback_data":"home"}]]}'})
except botogram.api.APIError:
bot.api.call("answerCallbackQuery", {"callback_query_id": callback_id,
Expand Down Expand Up @@ -114,3 +118,65 @@ def callback(bot, chains, update):
'[{"text":"🔙Torna indietro", "callback_data":"list@'+id_treno+'"}]'
']}'
})

if azione == "traccia":
if "T" in id_treno:
stringa = id_treno.split("T")
id_treno = stringa[0]
azione_2 = stringa[1]

if azione_2 == "oggi":
solo_oggi = True
stringa_solo_oggi = "<b>Il treno verrà tracciato solo per oggi</b>"
if azione_2 == "sempre":
solo_oggi = False
stringa_solo_oggi = "<b>Il treno verrà tracciato fino a interruzione</b>"

result = API.db.tracciaTreno(message.chat.id, id_treno, solo_oggi)
if type(result) == str:
bot.api.call("answerCallbackQuery", {
"callback_query_id": callback_id, "text": result, "show_alert": True
})
return

text = (
"<b>🚦 Traccia treno</b>"
"\n🚅 Sto tracciando il <b>treno {treno}</b>"
"\n\n{solo_oggi}".format(solo_oggi=stringa_solo_oggi, treno=id_treno)
)
bot.api.call("editMessageText", {
"chat_id": chat.id, "message_id": message.message_id, "text": text, "parse_mode": "HTML", "reply_markup":
'{"inline_keyboard": [[{"text": "❌ Annulla il tracciamento", "callback_data": "stop_tracciamentoT'+str(result)+'"}]]}'
})

return

text = (
"<b>Traccia treno {treno}</b>"
"\nVuoi tracciare questo treno <b>solo oggi</b> o ricevere notifiche <b>tutti i giorni?</b>".format(treno=id_treno)
)
bot.api.call("editMessageText", {
"chat_id": chat.id, "message_id": message.message_id, "text": text, "parse_mode": "HTML", "reply_markup":
'{"inline_keyboard":'
'[[{"text": "📅 Traccia solo per oggi", "callback_data": "traccia@'+id_treno+'Toggi"}, {"text": "🗓 Traccia tutti i giorni", "callback_data": "traccia@'+id_treno+'Tsempre"}],'
'[{"text":"🔙Torna indietro", "callback_data": "agg@'+id_treno+'"}]]}'
})

if azione == "grafico":
data, success, error = API.orarioTreni.cercaTreno(id_treno)
bot.api.call("answerCallbackQuery", {
"callback_query_id": callback_id, "text": "📊Sto generando il grafico, attendere..."
})

filename = API.Messaggi.grafico(data, id_treno)

if filename == False:
text = (
"❌<b>Impossibile generare il grafico</b>: troppi pochi dati"
"\n<i>Attendi che il treno fermi in qualche altra fermata e ritenta!</i>"
)
message.reply(text)
return

message.reply_with_photo(filename, caption="Grafico del treno "+id_treno+" generato con @OrarioTreniBot")
os.remove(filename)
2 changes: 2 additions & 0 deletions Inlinemode/Inline.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ def process(bot, chains, update):
sender = update.inline_query.sender
query = update.inline_query.query

Bot.logger.info("Utente {} inline query {}".format(update.inline_query.sender.id, update.inline_query.query))

if not query:
testo = "<b>Avviami in privata</b> per scoprire come si usa questo bot in <b>modalità inline</b>"
bot.api.call("answerInlineQuery", {
Expand Down
Loading

0 comments on commit 1375b17

Please sign in to comment.