Commit 34862121 authored by Jan Luc Tavares's avatar Jan Luc Tavares
Browse files

redesenhadas as funcionalidades do BOT e inseridos os placeholders

parent bc2957a5
......@@ -2,27 +2,29 @@ import sqlite3
class DBHelper:
def __init__(self, dbname="todo.sqlite"):
def __init__(self, dbname="atribuicoes.sqlite"):
self.dbname = dbname
self.conn = sqlite3.connect(dbname)
def setup(self):
stmt = "CREATE TABLE IF NOT EXISTS items (description text)"
print("creating table")
stmt = "CREATE TABLE IF NOT EXISTS opcoes (usuarios text, estacoes text, grupos text)"
self.conn.execute(stmt)
self.conn.commit()
def add_item(self, item_text):
stmt = "INSERT INTO items (description) VALUES (?)"
args = (item_text, )
def add_item(self, usuario, estacao, grupo):
stmt = "INSERT INTO opcoes (usuarios, estacoes, grupos) VALUES (?, ?, ?)"
args = (usuario, estacao, grupo)
self.conn.execute(stmt, args)
self.conn.commit()
def delete_item(self, item_text):
stmt = "DELETE FROM items WHERE description = (?)"
args = (item_text, )
def delete_item(self, usuario, estacao, grupo):
stmt = "DELETE FROM opcoes WHERE usuarios = (?) AND estacoes = (?) AND grupos = (?)"
args = (usuario,estacao, grupo)
self.conn.execute(stmt, args)
self.conn.commit()
def get_items(self):
stmt = "SELECT description FROM items"
return [x[0] for x in self.conn.execute(stmt)]
\ No newline at end of file
def get_items(self, usuario, grupo):
stmt = "SELECT estacoes FROM opcoes where usuarios=(?) AND grupos = (?)"
args = (usuario, grupo)
return [x[0] for x in self.conn.execute(stmt)]
# Esse codigo para bot do Telegram foi construido baseado no seguinte tutorial:
# https://www.codementor.io/garethdwyer/building-a-telegram-bot-using-python-part-1-goi5fncay
#
# Pode ser mais simples (tanto no desenvolvimento quanto para portabilidade e aprendizagem a ser realizada com esse codigo)
# Programa principal do bot para Telegram
# das estacoes meteorologicas.
#
# O objetivo inicial é escrever um MVP para comunicacao dos dados das EMM.
#
# VERSION 2: Nessa versao implementarei o banco de dados. A versao anterior somente respondia as mensagens recebidas "echo".
# TODO: * Fazer funcao de selecionar estacao
# * Escrever texto e interacoes de "boas-vindas"
# * Escrever texto do "tchau" (ele tambem deve remover o usuario do BD)
#
#
#
......@@ -22,18 +27,27 @@ URL = "https://api.telegram.org/bot{}/".format(TOKEN)
def get_url(url):
'''
Envia a url para o Telegram.
'''
response = requests.get(url)
content = response.content.decode("utf8")
return content
def get_json_from_url(url):
'''
Carrega a resposta do servidor em JSON de forma mais legivel.
'''
content = get_url(url)
js = json.loads(content)
return js
def get_updates(offset=None):
'''
Recebe as novas mensagens.
'''
url = URL + "getUpdates?timeout=100"
if offset:
url += "&offset={}".format(offset)
......@@ -41,6 +55,9 @@ def get_updates(offset=None):
return js
def get_next_update_id(updates):
'''
Informa qual o proximo update para avisar o servidor que já lidamos com os updates anteriores.
'''
update_ids = []
for update in updates["result"]:
update_ids.append(int(update["update_id"]))
......@@ -48,39 +65,103 @@ def get_next_update_id(updates):
def get_last_chat_id_and_text(updates):
'''
Obtem o ultimo texto e "ID" recebido para lidar com isso.
'''
num_updates = len(updates["result"])
last_update = num_updates - 1
text = updates["result"][last_update]["message"]["text"]
chat_id = updates["result"][last_update]["message"]["chat"]["id"]
return (text, chat_id)
def send_message(text, chat_id, reply_markup=None):
'''
Envia mensagem com o texto para certo chat.
reply_markup pode conter o json necessario para enviar um teclado personalizado.
'''
text = urllib.parse.quote_plus(text)
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
if reply_markup:
url += "&reply_markup={}".format(reply_markup)
get_url(url)
############# Respostas as entradas do usuario ########################
# Imagino que essas respostas poderiam estar mais bem "compartimentadas", mas nao sei como fazer isso.
#######################################################################
def boas_vindas(chat_id):
text = "Oi!\nVocê está falando com o Bot das Estações Meteorológicas Modulares\nReceba minhas sinceras boas-vindas!\nConfira os comandos em /ajuda"
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def ajuda(chat_id):
text="Comandos: \n/start - Boas-vindas\n/ajuda - Receba essa lista de comandos\n/selecionar - Selecione a estacao de seu interesse\n/tchau - Cancele o recebimento das minhas mensagens \n\nDepois de escolher a estação, você poderá escolher o perído de tempo para visualizar dados e selecionar o tipo de dado de seu interesse \n/ultimo - Veja a última medida realizada\n/dia - Veja a medida do último dia\n/semana - Veja a medida da ultima semana\n/mes - Veja a medida do último mês"
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def sel_emm(chat_id):
text = "Ainda nao tenho essa funcionalidade :( \n me desgupe \n hashtag xatiado" #placeholder apenas
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def tchau(chat_id):
text = "Ainda nao tenho essa funcionalidade :( \n me desgupe \n hashtag xatiado" #placeholder apenas
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def ultimo(chat_id):
text = "Ainda nao tenho essa funcionalidade :( \n me desgupe \n hashtag xatiado" #placeholder apenas
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def dia(chat_id):
text = "Ainda nao tenho essa funcionalidade :( \n me desgupe \n hashtag xatiado" #placeholder apenas
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def semana(chat_id):
text = "Ainda nao tenho essa funcionalidade :( \n me desgupe \n hashtag xatiado" #placeholder apenas
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
def mes(chat_id):
text = "Ainda nao tenho essa funcionalidade :( \n me desgupe \n hashtag xatiado" #placeholder apenas
url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
get_url(url)
entradas = { "/start" : boas_vindas,
"/ajuda": ajuda ,
"/selecionar": sel_emm,
"/tchau": tchau,
"/ultimo": ultimo,
"/dia": dia,
"/semana": semana,
"/mes": mes,
}
# Fim da definicao de respostas possiveis
#############################################################################
def handle_updates(updates):
'''
Lida com os updates de acordo com a entrada.
'''
for update in updates["result"]:
try:
text = update["message"]["text"]
chat = update["message"]["chat"]["id"]
items = db.get_items()
if text in items:
db.delete_item(text)
items = db.get_items()
else:
db.add_item(text)
items = db.get_items()
message = "\n".join(items)
teclado = build_keyboard(items)
send_message(message, chat, teclado)
# items = db.get_items()
entradas[text](chat)
except KeyError:
answer = "Ainda não sei o que quer dizer {} \nSó sei o que está em /ajuda :(".format(text)
url = URL + "sendMessage?text={}&chat_id={}".format(answer, chat)
get_url(url)
pass
def build_keyboard(items):
'''
Constroi JSON que informa o Telegram qual deve ser o teclado personalizado.
'''
keyboard = [[item] for item in items]
reply_markup = {"keyboard":keyboard, "one_time_keyboard": True}
return json.dumps(reply_markup)
......@@ -108,7 +189,3 @@ if __name__ == '__main__':
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment