-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
executable file
·1400 lines (1268 loc) · 73.9 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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
from telegram import Update, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, ConversationHandler, filters, MessageHandler
import pandas as pd
import random
import time
import nest_asyncio
from datetime import datetime
import smtplib
from email.message import EmailMessage
import logging
import os
from tokens import gmail_token, telegram_token
# Defino paths segun donde se ejecute el bot
if os.path.exists('/home/facundol/deltix/'):
base_path = '/home/facundol/deltix/'
else:
base_path = ''
# Paths
user_experience_path = base_path + 'user_experience.csv'
subscribers_mareas_path = base_path + 'subscribers_mareas.csv'
subscribers_windguru_path = base_path + 'subscribers_windguru.csv'
subscribers_hidrografia_path = base_path + 'subscribers_hidrografia.csv'
marea_image_path = base_path + 'marea.png'
windguru_image_path = base_path + 'windguru.png'
memes_path = base_path + 'memes/'
jilguero_ida_path = base_path + 'colectivas/jilguero_ida.png'
jilguero_vuelta_path = base_path + 'colectivas/jilguero_vuelta.png'
interislena_ida_invierno_path = base_path + 'colectivas/interislena_ida_invierno.png'
interislena_ida_verano_path = base_path + 'colectivas/interislena_ida_verano.png'
interislena_vuelta_invierno_path = base_path + 'colectivas/interislena_vuelta_invierno.png'
interislena_vuelta_verano_path = base_path + 'colectivas/interislena_vuelta_verano.png'
lineas_delta_ida_no_escolar_path = base_path + 'colectivas/lineas_delta_ida_no_escolar.png'
lineas_delta_ida_escolar_path = base_path + 'colectivas/lineas_delta_ida_escolar.png'
lineas_delta_vuelta_no_escolar_path = base_path + 'colectivas/lineas_delta_vuelta_no_escolar.png'
lineas_delta_vuelta_escolar_path = base_path + 'colectivas/lineas_delta_vuelta_escolar.png'
carpinchix_trabajando_path = base_path + 'carpinchix_trabajando.png'
almaceneras_path = base_path + 'rag/almaceneras.txt'
mareas_hidrografia_path = base_path + 'table_data.txt'
amanita_path = base_path + 'actividades_productos/amanita.png'
alfareria_path = base_path + 'actividades_productos/alfareria.png'
labusqueda_path = base_path + 'actividades_productos/labusqueda.png'
# Read the user experience CSV with error handling
try:
user_experience = pd.read_csv(user_experience_path)
except pd.errors.ParserError:
# If there's a parser error, try with more robust error handling
print("Warning: Issues detected in the CSV file. Attempting to load with error handling...")
# Use on_bad_lines='skip' for newer pandas versions or error_bad_lines=False for older versions
try:
# Try with newer pandas syntax
user_experience = pd.read_csv(user_experience_path, on_bad_lines='skip')
except TypeError:
# Fall back to older pandas syntax if needed
user_experience = pd.read_csv(user_experience_path, error_bad_lines=False)
# Save a clean version of the file to prevent future errors
print("Saving a cleaned version of the user experience data...")
user_experience.to_csv(user_experience_path, index=False)
print("File cleaned and saved successfully.")
logging.basicConfig(
filename='deltix_log.log',
level=logging.WARNING,
format='%(asctime)s - %(message)s',
force=True # This ensures that the logging configuration is reset
)
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
nest_asyncio.apply()
ANSWER_charlar, ANSWER_meme, ANSWER_colaborar, ANSWER_mensajear, ANSWER_informacion, ANSWER_mareas_suscribir, ANSWER_windguru_suscribir, ANSWER_desuscribir, ANSWER_meme2, ANSWER_charlar_windguru, ANSWER_colectivas, ANSWER_jilguero, ANSWER_interislena, ANSWER_lineasdelta, ANSWER_direction, ANSWER_schedule, ANSWER_almacenera_select, ANSWER_hidrografia_suscribir, ANSWER_suscribirme = range(19)
def update_user_experience(user_id, option):
global user_experience
timestamp_col = f'timestamp_{option}'
q_col = f'q_{option}'
if user_id in user_experience['User ID'].values:
user_experience.loc[user_experience['User ID'] == user_id, timestamp_col] = datetime.now().strftime('%d-%m-%Y %H:%M')
user_experience.loc[user_experience['User ID'] == user_id, q_col] += 1
user_experience.to_csv(user_experience_path, index=False)
def generate_main_menu():
'''
Genera el menu principal
Ese menu se ejecuta desde las funciones /start, /start2 y /menu
Las lineas comentadas del menu son proyectos e ideas de funcionalidades
para agregar a Deltix
'''
return ("- <b>/mareas </b> <i> pronóstico de mareas INA ⚓</i>\n"
"- <b>/hidrografia </b> <i> mareas hidrografia</i>\n"
"- <b>/windguru </b> <i> pronóstico del clima de windgurú</i>\n"
"- <b>/colectivas </b> <i> horarios lanchas colectivas 🕑</i>\n"
"- <b>/almaceneras </b> <i> lanchas almaceneras 🚤</i>\n"
"- <b>/memes </b> <i> los memes más divertidos de la isla 🤣 </i>\n"
"- <b>/suscribirme </b> <i> suscribirte a mis envíos 🦉</i>\n"
# "- <b>/voy_y_vuelvo </b> <i> compartir viajes desde y hacia a la isla</i>\n"
# "- <b>/notiDeltix </b> <i> suscribirte al envío de info de interés sobre la isla</i>\n"
"- <b>/charlar</b> <i> charlar conmigo y suscribirte a mis envíos </i>\n"
"- <b>/informacion </b> <i> saber más sobre Deltix 🐹</i>\n"
"- <b>/colaborar </b> <i> hacer sugerencias o aportar</i>\n"
"- <b>/desuscribirme </b> <i> darte de baja de mis envíos 🦉</i>\n"
"- <b>/mensajear </b> <i> mandarle un mensajito al equipo Deltix</i>"
"\n"
"\n"
"<b>Actividades y emprendimientos isleños</b>\n"
"\n"
"- <b>/amanita </b> <i> paseos en canoa isleña por Amanita</i>\n"
"- <b>/alfareria</b> <i> encuentros con el barro por Kutral alfarería</i>\n"
"- <b>/labusqueda</b> <i> espacio para encuentros, ceremonias y hostal</i>\n")
main_menu_keyboard = ReplyKeyboardMarkup([["/windguru", "/mareas", "/hidrografia"],
["/colectivas", "/almaceneras", "/memes"],
["/mensajear", "/suscribirme", "/desuscribirme"]])
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE)-> None:
'''
Respuesta cuando el usuario comienza por /start
'''
global user_experience
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} comenzó charla con comando start en chat {chat_id}")
if user.id not in user_experience['User ID'].values:
user_info = {
"User ID": update.message.from_user.id,
"Username": update.message.from_user.username,
"First Name": update.message.from_user.first_name,
"Last Name": update.message.from_user.last_name,
"first_interaction": datetime.now().strftime('%d-%m-%Y %H:%M'),
"suscr_windguru_ofrecida": None,
"suscr_marea_ofrecida": None,
"q_mareas": 0,
"timestamp_mareas": None,
"q_windguru": 0,
"timestamp_windguru": None,
"q_colectivas": 0,
"timestamp_colectivas": None,
"q_memes": 0,
"timestamp_memes": None,
"q_charlar": 0,
"timestamp_charlar": None,
"q_informacion": 0,
"timestamp_informacion": None,
"q_colaborar": 0,
"timestamp_colaborar": None,
"q_desuscribirme": 0,
"timestamp_desuscribirme": None,
"q_mensajear": 0,
"timestamp_mensajear": None
}
user_experience = user_experience.append(user_info, ignore_index=True)
user_experience.to_csv(user_experience_path, index=False)
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=(f"Hola {update.effective_user.first_name}! soy Deltix, el bot del humedal 🐹"),
parse_mode='HTML')
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=("En qué te puedo ayudar? Elegí alguna actividad para continuar:\n "),
parse_mode='HTML')
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=generate_main_menu(),
parse_mode='HTML',
reply_markup=main_menu_keyboard)
async def start2(update: Update, context: ContextTypes.DEFAULT_TYPE)-> None:
'''
Respuesta cuando el bot no entiende respuesta del usuario
'''
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} usó comando start2 en chat {chat_id}")
responses = [
"upss.. perdón! estaba distraído chapoteando en el pantanix 🦟 No entendí lo que dijiste",
"upsss... no entendí eso",
"Hmm... eso no lo entendí bien",
"Perdón, no capté eso. Itentemos de vuelta"
]
response = random.choice(responses)
time.sleep(2)
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=response,
parse_mode='HTML'
)
time.sleep(2)
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=("En qué te puedo ayudar? Elegí alguna actividad para continuar:\n "),
parse_mode='HTML'
)
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=generate_main_menu(),
parse_mode='HTML',
reply_markup=main_menu_keyboard
)
async def menu(update: Update, context: ContextTypes.DEFAULT_TYPE)-> None:
'''
Respuesta cuando el usuario pide el menu
'''
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} usó comando menu en chat {chat_id}")
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=generate_main_menu(),
parse_mode='HTML',
reply_markup=main_menu_keyboard)
async def amanita(update: Update, context: ContextTypes.DEFAULT_TYPE)-> None:
'''
Respuesta cuando el usuario pide información de Amanita
'''
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} solicitó información sobre Amanita en chat {chat_id}")
await context.bot.send_photo(chat_id, open(amanita_path, "rb"))
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=(
"<b>Experiencias en Canoa Isleña</b>\n\n"
"<i>Paseos por el Delta del Paraná</i>\n"
"<i>Con Guía Bilingüe (opcional)</i>\n"
"<i>Servicio puerta a puerta (opcional)</i>\n\n"
"Instagram: instagram.com/amanitaturismodelta\n"
"Contacto: 1169959272"
),
parse_mode='HTML')
return ConversationHandler.END
async def alfareria(update: Update, context: ContextTypes.DEFAULT_TYPE)-> None:
'''
Respuesta cuando el usuario pide información de Kutral alfarería
'''
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} solicitó información sobre Kutral alfarería en chat {chat_id}")
await context.bot.send_photo(chat_id, open(alfareria_path, "rb"))
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=(
"<b>Kutral Alfarería</b>\n\n"
"<i>Encuentros con el barro</i>\n"
"<i>Talleres de alfarería</i>\n"
"<i>Experimentación y creación con arcilla</i>\n\n"
"Instagram: instagram.com/kutralalfareria\n"
),
parse_mode='HTML')
return ConversationHandler.END
async def labusqueda(update: Update, context: ContextTypes.DEFAULT_TYPE)-> None:
'''
Respuesta cuando el usuario pide información de La Búsqueda
'''
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} solicitó información sobre La Búsqueda en chat {chat_id}")
await context.bot.send_photo(chat_id, open(labusqueda_path, "rb"))
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=(
"<b>La Búsqueda</b>\n\n"
"<i>Espacio para encuentros y ceremonias</i>\n"
"<i>Hostal en el Delta</i>\n"
"<i>Conexión con la naturaleza</i>\n\n"
"Instagram: instagram.com/labusqueda_cabanadelta\n"
"Contacto: 1150459556"
),
parse_mode='HTML')
return ConversationHandler.END
async def charlar(update: Update, context: ContextTypes.DEFAULT_TYPE):
'''
1era respuesta para el comando /charlar
La idea de esta respuesta es que el bot vaya llevando al usuario por todas
sus funcionalidades (falta mejorarlo)
'''
chat_id = update.effective_chat.id
user = update.effective_user
update_user_experience(user.id, 'charlar')
logger.warning(f"{user.id} - {user.first_name} comenzó charla con comando charlar en chat {chat_id}")
await update.message.reply_text("Soy un bot en desarrollo. Puedo mandarte una vez por día el pronóstico de mareas del INA y del clima de WindGurú. ¿Querés recibir el pronóstico de mareas de San Fernando todos los días?",
reply_markup=ReplyKeyboardMarkup([["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"))
return ANSWER_charlar
async def answer_charlar(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
2da respuesta para el comando /charlar
Suscribe al usuario a pronostico de mareas y luego le pregunta si quiere
ver memes
'''
user_response = update.message.text.lower()
chat_id=update.effective_chat.id
subscribers_mareas = pd.read_csv(subscribers_mareas_path)
if user_response == 'si':
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a mareas en chat {chat_id}")
#Chequeo si ya está suscrito
user_id = update.message.from_user.id
if user_id in subscribers_mareas['User ID'].values:
await update.message.reply_text(
"Me parece que ya estabas suscriptx vos! Igual te voy a estar enviando los reportes todos los días. Ahí te mando el reporte actual"
)
await context.bot.send_photo(chat_id, open(marea_image_path, "rb"))
time.sleep(5)
await update.message.reply_text(
"También te puedo mandar todos los días una captura de pantalla del pronóstico de Windgurú para la zona de las islas. Querés?",
reply_markup=ReplyKeyboardMarkup([["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"))
return ANSWER_charlar_windguru
#Si no está suscrito lo subo a la lista
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_mareas = subscribers_mareas.append(user_df, ignore_index=True)
subscribers_mareas.to_csv(subscribers_mareas_path, index=False)
await update.message.reply_text(
"¡Gracias por suscribirte! Voy a intentar mandarte el pronóstico de mareas una vez al día. A veces fallo porque dependo de que me ande la internet isleña")
await update.message.reply_text(
"Te mando ahora el último pronóstico que tengo...",
)
await context.bot.send_photo(chat_id, open(marea_image_path, "rb"))
time.sleep(5)
await update.message.reply_text(
"También te puedo mandar todos los días una captura de pantalla del pronóstico de Windgurú para la zona de las islas. Querés?",
reply_markup=ReplyKeyboardMarkup([["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"))
return ANSWER_charlar_windguru
if user_response == 'no':
await update.message.reply_text(
"Bueno... otra cosa que puedo ofrecerte es mandarte todos los días una captura de pantalla del pronóstico de Windgurú para la zona de las islas. Querés?",
reply_markup=ReplyKeyboardMarkup([["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"))
return ANSWER_charlar_windguru
async def charlar_windguru(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user_response = update.message.text.lower()
if user_response == 'si':
subscribers_windguru = pd.read_csv(subscribers_windguru_path)
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a windguru en charla {chat_id}")
# Check if the user is already subscribed
user_id = update.message.from_user.id
if user_id in subscribers_windguru['User ID'].values:
await update.message.reply_text("Creo que ya estabas suscritx a los pronósticos de Windguru... ¡Te los seguiré enviando todos los días! Siemmpre y cuando wired.com me lo permita 🤣 ",
parse_mode='HTML')
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_windguru = subscribers_windguru.append(user_df, ignore_index=True)
subscribers_windguru.to_csv('subscribers_windguru.csv', index=False)
await update.message.reply_text("Ya te anoté!!! aiiii... tengo unas ganas de verme unos memes 🐹 Vemos uno?", parse_mode='HTML')
return ANSWER_meme
elif user_response == 'no':
await update.message.reply_text("Bueno... otra cosa que puedo ofrecerte es un meme de la isla.. querés?")
return ANSWER_meme
async def mareas(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Envia el pronostico de mareas cuando el usuario elige /mareas
Luego le ofrece suscripcion
'''
global user_experience
user = update.effective_user
chat_id=update.effective_chat.id
update_user_experience(user.id, 'mareas')
if random.random() < 1/3:
await update.message.reply_text(f"Ya te busco el informe del INA {update.effective_user.first_name}")
await context.bot.send_photo(chat_id, open(carpinchix_trabajando_path, "rb"))
time.sleep(3)
logger.warning(f"{user.id} - {user.first_name} pidió informe de mareas en chat {chat_id}")
# await update.message.reply_text("No estoy enviando reporte de mareas :( El INA no está publicando su pronóstico debido a los recortes de personal en el estado")
await update.message.reply_text("Acá tenés el informe de mareas")
await context.bot.send_photo(chat_id, open(marea_image_path, "rb"))
time.sleep(4)
if user.id in user_experience['User ID'][user_experience['suscr_marea_ofrecida'].isna()].values:
await update.message.reply_text("Querés suscribirte para recibir esto todos los días?",
reply_markup=ReplyKeyboardMarkup(
[["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"
),)
user_experience.loc[user_experience['User ID'] == user.id, 'suscr_marea_ofrecida'] = datetime.now().strftime('%d-%m-%Y %H:%M')
user_experience.to_csv(user_experience_path, index=False)
return ANSWER_mareas_suscribir
else:
return ConversationHandler.END
async def windguru(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Envia el pronostico de windguru cuando el usuario elige /windguru
Luego le ofrece suscripcion
'''
global user_experience
user = update.effective_user
chat_id=update.effective_chat.id
update_user_experience(user.id, 'windguru')
logger.warning(f"{user.id} - {user.first_name} pidió pronóstico de windguru en chat {chat_id}")
await update.message.reply_text("Ahí te mando el pronóstico de windguru")
await context.bot.send_photo(chat_id, open(windguru_image_path, "rb"))
time.sleep(4)
if user.id in user_experience['User ID'][user_experience['suscr_windguru_ofrecida'].isna()].values:
await update.message.reply_text("Querés suscribirte para recibir esto todos los días?",
reply_markup=ReplyKeyboardMarkup(
[["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"
),)
user_experience.loc[user_experience['User ID'] == user.id, 'suscr_windguru_ofrecida'] = datetime.now().strftime('%d-%m-%Y %H:%M')
user_experience.to_csv(user_experience_path, index=False)
return ANSWER_windguru_suscribir
else:
return ConversationHandler.END
async def hidrografia_suscribir_directo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Suscripcion directa
'''
subscribers_hidrografia = pd.read_csv(subscribers_hidrografia_path)
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a hidrografia en chat {chat_id}")
#Chequeo si ya está suscrito
user_id = update.message.from_user.id
if user_id in subscribers_hidrografia['User ID'].values:
await update.message.reply_text("Me parece que ya estabas suscriptx vos! Igual te voy a estar enviando los pronósticos de Hidrografía Naval todos los días")
#Si no está suscrito lo subo a la lista
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_hidrografia = pd.concat([subscribers_hidrografia, user_df], ignore_index=True)
subscribers_hidrografia.to_csv(subscribers_hidrografia_path, index=False)
await update.message.reply_text("¡Gracias por suscribirte! Voy a intentar mandarte el pronóstico de mareas de Hidrografía Naval una vez al día.")
return ConversationHandler.END
async def mareas_suscribir_directo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Funcion para obtener respuesta si/no de suscripcion a mareas y realizar
la suscripción
'''
subscribers_mareas = pd.read_csv(subscribers_mareas_path)
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a mareas en chat {chat_id}")
#Chequeo si ya está suscrito
user_id = update.message.from_user.id
if user_id in subscribers_mareas['User ID'].values:
await update.message.reply_text("Me parece que ya estabas suscriptx vos! Igual te voy a estar enviando los reportes todos los días")
#Si no está suscrito lo subo a la lista
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_mareas = subscribers_mareas.append(user_df, ignore_index=True)
subscribers_mareas.to_csv(subscribers_mareas_path, index=False)
await update.message.reply_text("¡Gracias por suscribirte! Voy a intentar mandarte el pronóstico de mareas una vez al día. A veces fallo porque dependende de que me ande la internet isleña")
return ConversationHandler.END
async def windguru_suscribir_directo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
subscribers_windguru = pd.read_csv(subscribers_windguru_path)
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a windguru en chat {chat_id}")
# Check if the user is already subscribed
user_id = update.message.from_user.id
if user_id in subscribers_windguru['User ID'].values:
await update.message.reply_text("Ya estás suscrito a los pronósticos de Windguru. ¡Te los seguiré enviando todos los días!")
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_windguru = subscribers_windguru.append(user_df, ignore_index=True)
subscribers_windguru.to_csv('/home/facundol/deltix/subscribers_windguru.csv', index=False)
await update.message.reply_text("¡Gracias por suscribirte! Te enviaré el pronóstico de Windguru una vez al día.")
return ConversationHandler.END
async def mareas_suscribir(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Funcion para obtener respuesta si/no de suscripcion a mareas y realizar
la suscripción
'''
user_response = update.message.text.lower()
if user_response == 'si':
subscribers_mareas = pd.read_csv(subscribers_mareas_path)
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a mareas en chat {chat_id}")
#Chequeo si ya está suscrito
user_id = update.message.from_user.id
if user_id in subscribers_mareas['User ID'].values:
await update.message.reply_text("Me parece que ya estabas suscriptx vos! Igual te voy a estar enviando los reportes todos los días")
#Si no está suscrito lo subo a la lista
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_mareas = subscribers_mareas.append(user_df, ignore_index=True)
subscribers_mareas.to_csv(subscribers_mareas_path, index=False)
await update.message.reply_text("¡Gracias por suscribirte! Voy a intentar mandarte el pronóstico de mareas una vez al día. A veces fallo porque dependende de que me ande la internet isleña")
return ConversationHandler.END
if user_response == 'no':
await update.message.reply_text("Bueno dale! avisame si necesitás algo más")
await context.bot.send_message(
chat_id=update.effective_chat.id,
text=generate_main_menu(),
parse_mode='HTML',
reply_markup=main_menu_keyboard)
async def windguru_suscribir(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user_response = update.message.text.lower()
if user_response == 'si':
subscribers_windguru = pd.read_csv(subscribers_windguru_path)
chat_id = update.effective_chat.id
user = update.effective_user
logger.warning(f"{user.id} - {user.first_name} se inscribió a windguru en chat {chat_id}")
# Check if the user is already subscribed
user_id = update.message.from_user.id
if user_id in subscribers_windguru['User ID'].values:
await update.message.reply_text("Ya estás suscrito a los pronósticos de Windguru. ¡Te los seguiré enviando todos los días!")
else:
user_info = {"User ID": [update.message.from_user.id],
"Username": [update.message.from_user.username],
"First Name": [update.message.from_user.first_name],
"Last Name": [update.message.from_user.last_name],}
user_df = pd.DataFrame(user_info)
subscribers_windguru = subscribers_windguru.append(user_df, ignore_index=True)
subscribers_windguru.to_csv('/home/facundol/deltix/subscribers_windguru.csv', index=False)
await update.message.reply_text("¡Gracias por suscribirte! Te enviaré el pronóstico de Windguru una vez al día.")
return ConversationHandler.END
elif user_response == 'no':
await update.message.reply_text("Entendido. Si cambias de opinión, siempre puedes suscribirte más tarde. ¿Hay algo más en lo que te pueda ayudar?")
return ConversationHandler.END
async def memes(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta cuando el usuario pide directamente memes por comando /memes
'''
user = update.effective_user
chat_id=update.effective_chat.id
#update_user_experience(user.id, 'memes')
logger.warning(f"{user.id} - {user.first_name} pidió memes en chat {chat_id}")
await context.bot.send_message(chat_id, "...me encantan los memes islenials 😂 Te mando uno.",
parse_mode='HTML')
numero = random.randint(1, 56)
await context.bot.send_photo(chat_id, open(f"{memes_path}{numero}.png", "rb"))
time.sleep(6)
await context.bot.send_message(chat_id, "Buenísimo, no? Son de la página Memes Islenials. Te recomiendo que la sigas en las redes",)
await context.bot.send_message(chat_id, "Querés otro meme?")
return ANSWER_meme
async def answer_meme(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta para enviar o no más memes después de haber mandado el 1ero
'''
chat_id=update.effective_chat.id
user_response = update.message.text.lower()
if user_response == 'si':
numero = random.randint(1, 56)
await context.bot.send_photo(chat_id, open(f"{memes_path}{numero}.png", "rb"))
await context.bot.send_message(chat_id,"Uno más?")
return ANSWER_meme2
if user_response == 'no':
await update.message.reply_text(
"Bueno... si querés podes elegir otra de las actividades para hacer conmigo",
reply_markup=ReplyKeyboardMarkup([["/charlar", "/mareas", "/memes"],
["/informacion", "/colaborar", "/desuscribirme"] ]))
return ConversationHandler.END
async def answer_meme2(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta para enviar o no más memes después de haber mandado otro
'''
chat_id=update.effective_chat.id
user_response = update.message.text.lower()
if user_response == 'si':
numero = random.randint(1, 56)
await context.bot.send_photo(chat_id, open(f"{memes_path}{numero}.png", "rb"))
time.sleep(5)
await context.bot.send_message(chat_id,"Te mando otro?")
return ANSWER_meme
if user_response == 'no':
await update.message.reply_text(
"Bueno... si querés podes elegir otra de las actividades para hacer conmigo",
reply_markup=ReplyKeyboardMarkup([["/charlar", "/mareas", "/memes"],
["/informacion", "/colaborar", "/desuscribirme"] ]))
return ConversationHandler.END
async def desuscribirme(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.effective_user
chat_id = update.effective_chat.id
update_user_experience(user.id, 'desuscribirme')
logger.warning(f"{user.id} - {user.first_name} quiere desuscribirse en chat {chat_id}")
reply_markup = ReplyKeyboardMarkup([["Mareas", "Windguru", "Hidrografía"]], one_time_keyboard=True, input_field_placeholder="¿A cuál envío quieres desuscribirte?")
await update.message.reply_text("¿A cuál envío quieres desuscribirte: Mareas, Windguru o Hidrografía?", reply_markup=reply_markup)
return ANSWER_desuscribir
async def answer_desuscribir(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user_response = update.message.text.lower()
if user_response == "mareas":
subscribers_mareas = pd.read_csv(subscribers_mareas_path)
user_id = update.message.from_user.id
if user_id in subscribers_mareas['User ID'].values:
subscribers_mareas = subscribers_mareas[~subscribers_mareas['User ID'].eq(user_id)]
subscribers_mareas.to_csv(subscribers_mareas_path, index=False)
await update.message.reply_text("Te has desuscrito con éxito del pronóstico de mareas. Si deseas desuscribirte de otro servicio o realizar otra acción, decime nomas")
else:
await update.message.reply_text("No estabas suscrito previamente al pronóstico de mareas. Si deseas desuscribirte de otro servicio o realizar otra acción, decime nomas")
elif user_response == "windguru":
subscribers_windguru = pd.read_csv(subscribers_windguru_path)
user_id = update.message.from_user.id
if user_id in subscribers_windguru['User ID'].values:
subscribers_windguru = subscribers_windguru[~subscribers_windguru['User ID'].eq(user_id)]
subscribers_windguru.to_csv(subscribers_windguru_path, index=False)
await update.message.reply_text("Te has desuscrito con éxito del pronóstico de Windguru. Si deseas desuscribirte de otro servicio o realizar otra acción, decime nomas")
else:
await update.message.reply_text("No estabas suscrito previamente al pronóstico de Windguru. Si deseas desuscribirte de otro servicio o realizar otra acción, decime nomas")
elif user_response == "hidrografía" or user_response == "hidrografia":
subscribers_hidrografia = pd.read_csv(subscribers_hidrografia_path)
user_id = update.message.from_user.id
if user_id in subscribers_hidrografia['User ID'].values:
subscribers_hidrografia = subscribers_hidrografia[~subscribers_hidrografia['User ID'].eq(user_id)]
subscribers_hidrografia.to_csv(subscribers_hidrografia_path, index=False)
await update.message.reply_text("Te has desuscrito con éxito del pronóstico de Hidrografía Naval. Si deseas desuscribirte de otro servicio o realizar otra acción, decime nomas")
else:
await update.message.reply_text("No estabas suscrito previamente al pronóstico de Hidrografía Naval. Si deseas desuscribirte de otro servicio o realizar otra acción, decime nomas")
else:
await update.message.reply_text("No comprendí tu elección. Por favor, selecciona 'Mareas', 'Windguru' o 'Hidrografía' para desuscribirte.")
return ANSWER_desuscribir
return ConversationHandler.END
async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Cierra la conversación cuando el usuario usa /cancel
'''
await update.message.reply_text(
"Chauuu! Hablamos!", reply_markup=ReplyKeyboardRemove()
)
return ConversationHandler.END
async def colaborar(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta para cuando se usa el comando /colaborar
'''
await update.message.reply_text("Qué bueno que quieras colaborar con Deltix 💕",
parse_mode='HTML')
time.sleep(1)
await update.message.reply_text("Podés ayudar mandando algún comentario o sugerencia a Facu, que es mi desarrollador. O también podés darnos una ayudita monetaria para posteriores desarrollos y poder pagar un servidor. Si llegamos a juntar suficiente dinero voy a poder funcionar las 24hs todos los días durante todo el año",
parse_mode='HTML')
await update.message.reply_text("Qué querés hacer?",
reply_markup=ReplyKeyboardMarkup(
[["Mensajear", "Aportar"]], one_time_keyboard=True, input_field_placeholder="Mensajear o Aportar??"
),)
return ANSWER_colaborar
async def mensaje_trigger(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta cuando el usuario quiere mandar un mensaje al desarrollador
Luego hay que dirigirlo a la funcion mensajear para que el mensaje se mande
'''
await update.message.reply_text("Escribí el mensaje y yo se lo reenvío al equipo Deltix",
parse_mode='HTML')
return ANSWER_mensajear
async def mensajear(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Envia mensaje por mail a Facu
'''
user = update.message.from_user
message_text = update.message.text
update_user_experience(user.id, 'mensajear')
body = f'Mensaje de {user.first_name}: {message_text}'
message = EmailMessage()
message['From'] = "[email protected]"
message['To'] = "[email protected]"
message['Subject'] = "Mensaje de deltix"
message.set_content(body)
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login("[email protected]", gmail_token)
server.send_message(message)
# context.bot.send_message(chat_id=672134330, text=f'Mensaje de {user.first_name}: {message_text}')
await update.message.reply_text('Mensaje enviado con éxito. ¡Gracias!')
return ConversationHandler.END
async def answer_colaborar(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta a interacción por medio de /colaborar que dirige al usuario a
mensajear o a colaborar economicamente
'''
user_response = update.message.text.lower()
if user_response == 'mensajear':
await update.message.reply_text("Escribí el mensaje y yo se lo reenvío al desarrollador", parse_mode='HTML')
return ANSWER_mensajear
if user_response == 'aportar':
user = update.effective_user
chat_id=update.effective_chat.id
logger.warning(f"{user.id} - {user.first_name} entró en aportar en chat {chat_id}")
await update.message.reply_text("Muchas gracias por pensar en aportar 🙏 Nos viene muy bien para poder seguir dedicándole tiempo a Deltix y hacer que crezca este proyecto", parse_mode='HTML')
await update.message.reply_text("Podés aportar por medio de la página cafecito:", parse_mode='HTML')
await update.message.reply_text("<a href='https://cafecito.app/deltix' rel='noopener' target='_blank' > 'Entrá a este enlace para hacer tu aporte' </a>",
parse_mode='HTML')
return ConversationHandler.END
async def informacion(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta al comando /informacion
'''
await update.message.reply_text('Te cuento un poco de mí! Soy un bot en desarrollo que tiene como objetivo ayudar a quienes habitamos en la isla, principalmente en la 1era sección')
await update.message.reply_text('Mis primeras funcionalidades son mandar el reporte de mareas del Instituto Nacional del Agua y el pronóstico del clima de WindGurú. Si te suscribís, lo vas a recibir todos los días. Hace poquito que también mando horarios de lanchas colectivas')
time.sleep(3)
await update.message.reply_text('En el futuro espero sumar más funcionalidades, como enviar info con notas de interés y eventos de la isla a quienes quieran, o armar un sistema automático de avisos de voy-y-vuelvo para compartir viajes en botes desde y hacia la isla')
await update.message.reply_text('Pero bueno, vamos de a poquito. Soy un proyecto que recién empieza y hacemos todo a pulmón... querés saber más?',
reply_markup=ReplyKeyboardMarkup(
[["Si", "No"]], one_time_keyboard=True, input_field_placeholder="Si o No?"
),)
return ANSWER_informacion
async def answer_informacion(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta a si quiere saber más el usuario en /informacion
'''
user_response = update.message.text.lower()
if user_response == 'si':
await update.message.reply_text("Estoy desarrollado en código python por Facu, vecino de 1era sección de la isla, y los diseños tan lindos están hechos por Eli. Si querés decirle algo lo podés mensajear. Se aceptan mensajitos de aliento, sugerencias o cualquier comentario :) También les podés pedir que te desarrollen un bot para tu emprendimiento...",
parse_mode='HTML',
reply_markup=ReplyKeyboardMarkup(
[["/mensajear", "/colaborar", "/menu"], ["/charlar", "/mareas", "/memes"]],
one_time_keyboard=True,
input_field_placeholder="querés hacer otra cosa?")
)
return ConversationHandler.END
if user_response == 'no':
await update.message.reply_text("okisss... igual no había mucho más para contar tampocoo",
parse_mode='HTML',
reply_markup=ReplyKeyboardMarkup(
[["/mensajear", "/colaborar", "/menu"], ["/charlar", "/mareas", "/memes"]],
one_time_keyboard=True,
input_field_placeholder="qué querés hacer?")
)
return ConversationHandler.END
async def de_nada(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Respuesta a agradecimiento por parte del usuario
'''
await update.message.reply_text("De nada! es un placer a ayudar a lxs humanos que visitan el humedal 🐹\n",
parse_mode='HTML')
return ConversationHandler.END
async def colectivas(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Seleccion de empresas de colectiva para pedir horario
'''
#user = update.effective_user
#update_user_experience(user.id, 'colectivas')
await update.message.reply_text("""Elegí la empresa de lancha colectiva:\n
- <b>Jilguero</b> <i> va por el Carapachay-Angostura</i>
- <b>Interisleña</b> <i> Sarmiento, San Antonio y muchos más</i>
- <b>Lineas Delta</b> <i> Caraguatá, Canal Arias, Paraná Miní</i>""",
parse_mode='HTML',
reply_markup=ReplyKeyboardMarkup(
[["Jilguero", "Interisleña", "Lineas Delta"]],
one_time_keyboard=True,
input_field_placeholder="Empresa de lanchas"))
# Return to ANSWER_colectivas state to handle the selection
return ANSWER_colectivas
async def answer_colectivas(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Maneja la selección de la empresa de lancha colectiva
'''
user_response = update.message.text.lower()
if "jilguero" in user_response:
return await Jilguero(update, context)
elif "interisleña" in user_response or "interislena" in user_response:
return await Interislena(update, context)
elif "lineas delta" in user_response or "lineasdelta" in user_response:
return await LineasDelta(update, context)
else:
await update.message.reply_text("No reconozco esa empresa de lanchas. Por favor, selecciona una de las opciones disponibles.")
return await colectivas(update, context)
async def Interislena(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
await update.message.reply_text("Para Interisleña, por ahora solo tengo los horarios de Ida hacia la isla. Querés los horarios de verano o de inverno?",
reply_markup=ReplyKeyboardMarkup(
[["Verano", "Invierno"]],
one_time_keyboard=True,
input_field_placeholder="Invierno o verano"))
return ANSWER_interislena
async def answer_interislena(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
chat_id=update.effective_chat.id
user_response = update.message.text.lower()
if 'invierno' in user_response:
await context.bot.send_photo(chat_id, open(interislena_ida_invierno_path, "rb"))
await context.bot.send_message(chat_id, f"Estos son los horarios de {user_response} de Interisleña. Si ves que hay algún horario incorrecto o información a corregir, no dudes en mandarle un mensajito al equipo Deltix")
time.sleep(1)
await context.bot.send_message(chat_id, f"Siempre recomiendo llamar antes a la empresa porque los horarios suelen cambiar. El teléfono es 4749-0900",
reply_markup=ReplyKeyboardMarkup(
[["Jilguero", "LineasDelta", "Interislena"],
["/mensajear", "/menu", "/memes"] ],
one_time_keyboard=True,
input_field_placeholder="Querés hacer algo más??"))
return ConversationHandler.END
elif 'verano' in user_response:
await context.bot.send_photo(chat_id, open(interislena_ida_verano_path, "rb"))
await context.bot.send_message(chat_id, f"Estos son los horarios de {user_response} de Interisleña. Si ves que hay algún horario incorrecto o información a corregir, no dudes en mandarle un mensajito al equipo Deltix")
time.sleep(1)
await context.bot.send_message(chat_id, f"Siempre recomiendo llamar antes a la empresa porque los horarios suelen cambiar. El teléfono es 4749-0900",
reply_markup=ReplyKeyboardMarkup(
[["Jilguero", "LineasDelta", "Interislena"],
["/mensajear", "/menu", "/memes"] ],
one_time_keyboard=True,
input_field_placeholder="Si querés, elegí otra empresa de lanchas u otra actividad para hacer conmigo"))
return ConversationHandler.END
else:
await update.message.reply_text("No comprendí tu elección")
return ConversationHandler.END
async def Jilguero(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
await update.message.reply_text("En qué sentido querés viajar? Ida a la isla o vuelta a Tigre?",
reply_markup=ReplyKeyboardMarkup(
[["Ida a la isla", "Vuelta a Tigre"]],
one_time_keyboard=True,
input_field_placeholder="Ida a la isla o Vuelta a Tigre"))
return ANSWER_jilguero
async def answer_jilguero(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
chat_id=update.effective_chat.id
user_response = update.message.text.lower()
if 'ida' in user_response or 'isla' in user_response:
await context.bot.send_message(chat_id, f"Estos son los horarios de ida a la isla de Jilguero. Si ves que hay algún horario incorrecto o información a corregir, no dudes en mandarle un mensajito al equipo Deltix")
await context.bot.send_photo(chat_id, open(jilguero_ida_path, "rb"))
time.sleep(1)
await context.bot.send_message(chat_id, f"Siempre recomiendo llamar antes a la empresa porque los horarios suelen cambiar. El teléfono es 4749-0987",
reply_markup=ReplyKeyboardMarkup(
[["Jilguero", "LineasDelta", "Interislena"],
["/mensajear", "/menu", "/memes"] ],
one_time_keyboard=True,
input_field_placeholder="Elegí otra empresa de lanchas o actividad para hacer conmigo"))
return ConversationHandler.END
elif 'vuelta' in user_response or 'tigre' in user_response:
await context.bot.send_message(chat_id, f"Estos son los horarios de vuelta a Tigre de Jilguero. Si ves que hay algún horario incorrecto o información a corregir, no dudes en mandarle un mensajito al equipo Deltix")
await context.bot.send_photo(chat_id, open(jilguero_vuelta_path, "rb"))
time.sleep(1)
await context.bot.send_message(chat_id, f"Siempre recomiendo llamar antes a la empresa porque los horarios suelen cambiar. El teléfono es 4749-0987",
reply_markup=ReplyKeyboardMarkup(
[["Jilguero", "LineasDelta", "Interislena"],
["/mensajear", "/menu", "/memes"] ],
one_time_keyboard=True,
input_field_placeholder="Te ayudo en algo más?"))
return ConversationHandler.END
else:
await update.message.reply_text("No comprendí tu elección")
return ConversationHandler.END
async def LineasDelta(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
# Ask user for direction (Ida or Vuelta)
await update.message.reply_text(
"Qué recorrido necesitás? Ida a la isla o vuelta a Tigre?",
reply_markup=ReplyKeyboardMarkup(
[["Ida", "Vuelta"]],
one_time_keyboard=True,
input_field_placeholder="Ida o Vuelta?"
)
)
return ANSWER_direction
async def direction(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user_choice = update.message.text.lower()
# Match flexible inputs for "Ida" or "Vuelta"
if "ida" in user_choice:
context.user_data['direction'] = 'ida a la isla'
elif "vuelta" in user_choice:
context.user_data['direction'] = 'vuelta a tigre'
else:
await update.message.reply_text("Por favor, elegí 'Ida' o 'Vuelta'.")
return ANSWER_direction
# Ask if it's during the school period or not
await update.message.reply_text(
"En época escolar o no escolar?",
reply_markup=ReplyKeyboardMarkup(
[["Escolar", "No escolar"]],
one_time_keyboard=True,
input_field_placeholder="Escolar o No escolar?"
)
)
return ANSWER_schedule
async def schedule(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
chat_id = update.effective_chat.id
user_choice = update.message.text.lower()
if "escolar" in user_choice and "no" not in user_choice:
context.user_data['epoca'] = 'escolar'
elif "no escolar" in user_choice:
context.user_data['epoca'] = 'no escolar'
else:
await update.message.reply_text("Por favor, elegí 'Escolar' o 'No escolar'.")
return ANSWER_schedule
await update.message.reply_text(f"Estos son los horarios de {context.user_data['direction']} en época {context.user_data['epoca']}.")
# Send the appropriate image based on the user choices
if context.user_data['direction'] == 'ida a la isla':
if context.user_data['epoca'] == 'escolar':
await context.bot.send_photo(chat_id, open(lineas_delta_ida_escolar_path, "rb"))
else: # 'no escolar'
await context.bot.send_photo(chat_id, open(lineas_delta_ida_no_escolar_path, "rb"))
else: # 'vuelta a tigre'
if context.user_data['epoca'] == 'escolar':
await context.bot.send_photo(chat_id, open(lineas_delta_vuelta_escolar_path, "rb"))
else: # 'no escolar'
await context.bot.send_photo(chat_id, open(lineas_delta_vuelta_no_escolar_path, "rb"))
return ConversationHandler.END
async def suscribirme(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
'''
Permite al usuario elegir a qué suscribirse: mareas, hidrografia o windguru
'''
await update.message.reply_text(
"¿A qué te gustaría suscribirte?",
reply_markup=ReplyKeyboardMarkup(
[["Mareas", "Hidrografia", "Windguru"]],
one_time_keyboard=True,
input_field_placeholder="Selecciona una opción"
)
)
return ANSWER_suscribirme
async def answer_suscribirme(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user_response = update.message.text.lower()
if user_response == "mareas":
return await mareas_suscribir_directo(update, context)
elif user_response == "hidrografia":
return await hidrografia_suscribir_directo(update, context)
elif user_response == "windguru":
return await windguru_suscribir_directo(update, context)
else:
await update.message.reply_text("No comprendí tu elección. Por favor, selecciona 'Mareas', 'Hidrografia' o 'Windguru'.")
return ANSWER_suscribirme
# Almaceneras data organized as a dictionary with title case keys
ALMACENERAS_DATA = {
"Nilda Alicia (Anita)": {
"propietario": "Miguel Machado",