forked from IIBMErs/CovidBotCL
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
251 lines (174 loc) · 8.1 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
import logging
from telegram import InlineKeyboardMarkup, Update
from telegram import InlineQueryResultArticle, ParseMode, InputTextMessageContent
from telegram.ext import Updater, InlineQueryHandler, CommandHandler, CallbackContext, CallbackQueryHandler, ConversationHandler, MessageHandler, Filters, CallbackContext
from menus import Menu
from respuestas import Respuesta
from uuid import uuid4
# Cargar parametros
from bot_token import TOKEN
from parameters import NOMBRE_BOT
from parameters import INFO_DATOS
from parameters import PATH_COVID
from check_updates import CheckData
# Enable logging
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
)
logger = logging.getLogger(__name__)
# Start of the bot
def start(update: Update, context: CallbackContext) -> int:
# Get user
user = update.message.from_user
logger.info(f"User {user.first_name} started the conversation.")
# Genera elementos del menu principal
keyboard_menu_principal = menu.principal
reply_markup = InlineKeyboardMarkup(keyboard_menu_principal)
# Actualizar Mensaje
update.message.reply_text("Bienvenido a miComuna Bot Chile. ¿Que deseas hacer?",reply_markup=reply_markup)
return PRINCIPAL
def start_over(update: Update, context: CallbackContext) -> None:
"""Send message on `/start`."""
# Get user that sent /start and log his name
query = update.callback_query
query.answer()
# Genera elementos del menu principal
keyboard_menu_principal = menu.principal
reply_markup = InlineKeyboardMarkup(keyboard_menu_principal)
# Actualizar Mensaje
query.edit_message_text(f"Bienvenido a {NOMBRE_BOT}. ¿Que deseas hacer?",reply_markup=reply_markup)
return PRINCIPAL
def menu_registro(update: Update, context: CallbackContext):
# Entrega las opciones del menu registrarse
query = update.callback_query
query.answer()
# Menu de registro
keyboard_menu_registro = menu.registro
reply_markup = InlineKeyboardMarkup(keyboard_menu_registro)
# Comprueba la respuesta
user_id = update.effective_user.id
response_text = respuesta.registro_response(user_id)
# Actualizar respuesta
query.edit_message_text(response_text, reply_markup=reply_markup, parse_mode='MarkdownV2')
return REGISTRO
def ingresar_comuna(update: Update, context: CallbackContext):
query = update.callback_query
query.answer()
query.edit_message_text(text="Escriba @micomuna_bot y posteriormente el nombre de la comuna para registrarla.")
def borrar_comuna(update: Update, context: CallbackContext):
message_text = update.message.text.replace("/borrar","").title().strip() # Nombre comuna
user_id = update.message.from_user.id
response_text = respuesta.borrar_comuna_response(user_id, message_text, COMUNAS)
update.message.reply_text(response_text, parse_mode='MarkdownV2')
def eliminar_comuna(update: Update, context: CallbackContext) -> None:
query = update.callback_query
query.answer()
query.edit_message_text(text="Escriba /borrar seguido por nombre de la comuna para borrarla.")
def inlinequery_comunas(update: Update, context: CallbackContext):
"""Handle the inline query."""
query = update.inline_query.query.lower()
listaComunas = [c for c in COMUNAS if query in c.lower().strip()]
results = [
InlineQueryResultArticle(
id=uuid4(), title=t, input_message_content=InputTextMessageContent(t), thumb_height=0, thumb_width=0
) for t in listaComunas
]
update.inline_query.answer(results)
def recivir_mensaje(update: Update, context: CallbackContext):
# Recive inputs del usuario para agregar comunas
message_text = update.message.text
user_id = update.message.from_user.id
response_text = respuesta.agregar_comuma_response(user_id, message_text, COMUNAS)
update.message.reply_text(response_text, parse_mode='MarkdownV2')
def menu_notificaciones(update: Update, context: CallbackContext):
# Entrega las opciones del menu de notificaciones
query = update.callback_query
query.answer()
user_id = update.effective_user.id
keyboard_menu_notificaciones = menu.notificaciones(user_id)
reply_markup = InlineKeyboardMarkup(keyboard_menu_notificaciones)
query.edit_message_text("Selecciona aquellas que te quieres suscribir", reply_markup=reply_markup)
return NOTIFICACIONES
def callbacks_notificaciones(update: Update, context: CallbackContext):
datos_disponibles = [info[1] for info in INFO_DATOS]
callbacks_list = []
for dato in datos_disponibles:
callbacks_list.append(CallbackQueryHandler(respuesta.notificaciones_call, pattern=dato))
callbacks_list.append(CallbackQueryHandler(start_over, pattern='volver'))
return callbacks_list
def menu_datos(update: Update, context: CallbackContext):
# Entrega las opciones del menu de notificaciones
query = update.callback_query
query.answer()
user_id = update.effective_user.id
keyboard_menu_datos = menu.datos(user_id)
reply_markup = InlineKeyboardMarkup(keyboard_menu_datos)
query.edit_message_text("Presiona el dato que quieras saber!", reply_markup=reply_markup)
return DATOS
def callbacks_datos(update: Update, context: CallbackContext):
datos_disponibles = [info[1] for info in INFO_DATOS]
callbacks_list = []
for dato in datos_disponibles:
callbacks_list.append(CallbackQueryHandler(respuesta.datos_call, pattern=dato))
callbacks_list.append(CallbackQueryHandler(start_over, pattern='volver'))
return callbacks_list
def enviar_notificaciones(context: CallbackContext):
(status_update, datos_updated) = check_data.check_nueva_data()
if not status_update: # si no hay nueva data return
return
respuesta.enviar_notificaciones(datos_updated)
def salir(update: Update, context: CallbackContext) -> None:
"""Returns `ConversationHandler.END`, which tells the
ConversationHandler that the conversation is over"""
query = update.callback_query
query.answer()
query.edit_message_text(text=f"Gracias por usar {NOMBRE_BOT}. Te mantendremos informado!")
return ConversationHandler.END
def main():
# Create updater
updater = Updater(TOKEN)
# Get the dispatcher to register handlers
dispatcher = updater.dispatcher
# Notificaciones
repeate = updater.job_queue
repeate.run_repeating(enviar_notificaciones, first=1, interval=60*30, name="notificaciones")
# Start conversation
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start',start)],
states={
PRINCIPAL: [
CallbackQueryHandler(menu_registro, pattern="menu_registro"),
CallbackQueryHandler(menu_notificaciones, pattern="notificaciones"),
CallbackQueryHandler(menu_datos, pattern="datos"),
CallbackQueryHandler(salir, pattern="salir"),
],
REGISTRO: [
CallbackQueryHandler(ingresar_comuna, pattern="ingresarComuna"),
CallbackQueryHandler(eliminar_comuna, pattern="eliminarComuna"),
CallbackQueryHandler(start_over, pattern="volver")
],
NOTIFICACIONES: callbacks_notificaciones(Update, CallbackContext),
DATOS: callbacks_datos(Update, CallbackContext)
},
fallbacks=[CommandHandler('start',start)]
)
# Command handler
dispatcher.add_handler(CommandHandler('borrar',borrar_comuna))
# updates
dispatcher.add_handler(conv_handler)
dispatcher.add_handler(InlineQueryHandler(inlinequery_comunas))
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, recivir_mensaje))
# Start the bot
updater.start_polling()
updater.idle()
if __name__ == "__main__":
import os
os.system('clear')
# Event rulers
PRINCIPAL, REGISTRO, NOTIFICACIONES, DATOS = range(4)
# Contains and generates all the menus
menu = Menu()
respuesta = Respuesta()
COMUNAS = Respuesta().get_comunas
check_data = CheckData(PATH_COVID, INFO_DATOS)
main()