def salvar_evento(eventos, cid, titulo, data, detalhes, lembrete, selecionarComando): # O bot vai tentar colocar as informações dentro da matriz de eventos (#1), mas se no dicionário nada estiver salvo no cid, vai dar KeyError, nesse caso (#2) é criada uma matriz com o evento dentro. try: #1 eventos[cid].append([titulo, data, detalhes, lembrete]) except KeyError: #2 eventos[cid] = [[titulo, data, detalhes, lembrete]] if lembrete == 0: lembreteTexto = "0" else: lembreteTexto = funcoes.datetime_para_texto(lembrete) f = open('eventos/{}.txt'.format(cid), 'a') f.write( str(titulo) + "\n" + funcoes.datetime_para_texto(data) + "\n" + str(detalhes) + "\n" + lembreteTexto + "\n") f.close() for k in range(len(eventos[cid])): for i in range(1, len(eventos[cid]) - k): if eventos[cid][i][1] < eventos[cid][i - 1][1]: eventos[cid][i], eventos[cid][i - 1] = eventos[cid][ i - 1], eventos[cid][i] bot.send_message(cid, "Evento \"{}\" - {} salvo!\nO que deseja fazer?".format( titulo, funcoes.datetime_para_texto(data)), reply_markup=selecionarComando)
def editar_horario(mensagem): try: cid = mensagem.chat.id horarioNovo = mensagem.text horarioNovo = [int(n) for n in horarioNovo.split(":")] if horarioNovo[0] < 0 or horarioNovo[0] > 23: raise ValueError("Hora inválida") if horarioNovo[1] < 0 or horarioNovo[1] > 59: raise ValueError("Minuto inválido") if len(horarioNovo) != 2: raise ValueError("Horário inválido") editartempdata[cid] = editartempdata[cid].replace( hour=horarioNovo[0], minute=horarioNovo[1]) newDate = editartempdata[cid] if eventos[cid][editartemp[cid]][3] != 0: if datetime.datetime.now() < eventos[cid][editartemp[cid]][3]: fila.cancel( lembretes[cid][eventos[cid][editartemp[cid]][0] + funcoes.datetime_para_texto(eventos[cid][ editartemp[cid]][1])]) eventos[cid][editartemp[cid]][1] = newDate del editartempdata[cid] with open('editartempdata/{}.txt'.format(cid), 'w') as f: f.write("") eventos[cid][editartemp[cid]][3] = 0 if newDate < datetime.datetime.now(): for k in range(len(eventos[cid])): for i in range(1, len(eventos[cid]) - k): if eventos[cid][i][1] < eventos[cid][i - 1][1]: eventos[cid][i], eventos[cid][i - 1] = eventos[cid][ i - 1], eventos[cid][i] funcoes.salvar_edicao(eventos, cid) bot.send_message(cid, "Data editada com sucesso!") passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) else: bot.send_message( cid, "Data editada com sucesso!\nDeseja colocar um lembrete?", reply_markup=sim_ou_não) passoUsuario[cid] = 15 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("15") except (ValueError, IndexError): bot.send_message( cid, "Horário inválido! Digite o horário no formato HH:MM !\nExemplo: duas e quarenta e cinco da tarde são 14:45" )
def editar(mensagem): cid = mensagem.chat.id if mensagem.text in [ str(n) + ")" for n in range(1, len(eventos[cid]) + 1) ]: edt = int(mensagem.text[:-1]) - 1 editartemp[cid] = edt with open('editartemp/{}.txt'.format(cid), 'w') as f: f.write(str(edt)) if eventos[cid][edt][3] == 0: texto2 = "Título:\n{}\n\nData:\n{}\n\nDetalhes:\n{}\n\nLembrete:\nNão definido".format( eventos[cid][edt][0], funcoes.datetime_para_texto(eventos[cid][edt][1]), eventos[cid][edt][2]) else: texto2 = "Título:\n{}\n\nData:\n{}\n\nDetalhes:\n{}\n\nLembrete:\n{}".format( eventos[cid][edt][0], funcoes.datetime_para_texto(eventos[cid][edt][1]), eventos[cid][edt][2], funcoes.datetime_para_texto(eventos[cid][edt][3])) bot.send_message(cid, texto2, reply_markup=opcoesTeclado) passoUsuario[cid] = 12 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("12") elif mensagem.text == "CANCELAR": passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "O que gostaria de fazer?", reply_markup=selecionarComando) else: bot.send_message(cid, "Por favor selecione uma das opções", reply_markup=teclado_editar(len(eventos[cid])))
def adicionar_evento3(mensagem): cid = mensagem.chat.id if mensagem.text == "CANCELAR": passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") del linhatemp[str(cid) + "titulo"] del linhatemp[str(cid) + "data"] with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.writelines(['']) bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) else: try: horario = mensagem.text horario = [int(n) for n in horario.split(":")] if horario[0] < 0 or horario[0] > 23: raise ValueError("Hora inválida") if horario[1] < 0 or horario[1] > 59: raise ValueError("Minuto inválido") if len(horario) != 2: raise ValueError("Horário inválido") linhatemp[str(cid) + "data"] = linhatemp[str(cid) + "data"].replace( hour=horario[0], minute=horario[1]) with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write(linhatemp[str(cid) + "titulo"] + "\n" + funcoes.datetime_para_texto(linhatemp[str(cid) + "data"]) + "\n") bot.send_message(cid, "Digite mais detalhes sobre o evento:", reply_markup=cancelar) # Pergunta os detalhes passoUsuario[cid] = 4 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("4") except (ValueError, IndexError): bot.send_message( cid, "Horário inválido! Digite o horário no formato HH:MM !\nExemplo: duas e quarenta e cinco da tarde são 14:45" )
def lista_de_eventos(mensagem): cid = mensagem.chat.id if len(eventos[cid]) == 0: bot.send_message(cid, "Não há eventos salvos", reply_markup=esconderTeclado) bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) else: texto1 = "Selecione qual evento deseja editar:\n\n" for i in range(len(eventos[cid])): texto1 += "{0}) {1}: {2}\n".format( i + 1, eventos[cid][i][0], funcoes.datetime_para_texto(eventos[cid][i][1])) bot.send_message(cid, texto1, reply_markup=teclado_editar(len(eventos[cid]))) passoUsuario[cid] = 10 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("10")
def adicionar_evento2(mensagem): # está no passo 2 cid = mensagem.chat.id if mensagem.text == "CANCELAR": passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") del linhatemp[str(cid) + "titulo"] f = open('linhatemp/{}.txt'.format(cid), 'w') f.writelines([""]) f.close() bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) else: try: data = mensagem.text data = [int(n) for n in data.split("/")] if funcoes.validar_data(data[0], data[1], data[2]) == False or len(data) != 3: raise ValueError("Data inválida") linhatemp[str(cid) + "data"] = datetime.datetime( data[-1], data[-2], data[-3]) with open('linhatemp/{}.txt'.format(cid), 'a') as f: f.write( funcoes.datetime_para_texto(linhatemp[str(cid) + "data"])) bot.send_message(cid, "Qual é o horário? (digite no formato HH:MM)", reply_markup=cancelar) # Pergunta o horário passoUsuario[cid] = 3 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("3") except (ValueError, IndexError): bot.send_message( cid, "Data inválida! Digite a data no formato DD/MM/AAAA !\nExemplo: dia 17 de janeiro de 2029 corresponde a data 17/01/2029.", reply_markup=cancelar)
def editar2(m): cid = m.chat.id if editartempcaso[cid] == 1: tituloNovo = m.text if eventos[cid][editartemp[cid]][3] != 0: if datetime.datetime.now() < eventos[cid][editartemp[cid]][3]: fila.cancel( lembretes[cid][eventos[cid][editartemp[cid]][0] + funcoes.datetime_para_texto(eventos[cid][ editartemp[cid]][1])]) st = (eventos[cid][editartemp[cid]][3] - datetime.datetime.now()).total_seconds() lembretes[cid][tituloNovo + funcoes.datetime_para_texto( eventos[cid][editartemp[cid]][1])] = fila.enter( st, 1, enviar_lembrete, argument=(cid, tituloNovo, funcoes.datetime_para_texto( eventos[cid][editartemp[cid]][1]))) t = threading.Thread(target=fila.run) t.start() eventos[cid][editartemp[cid]][0] = tituloNovo funcoes.salvar_edicao(eventos, cid) bot.send_message(cid, "Título editado com sucesso!") del editartempcaso[cid] with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("") del editartemp[cid] with open('editartemp/{}.txt'.format(cid), 'w') as f: f.write("") passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) elif editartempcaso[cid] == 2: try: dataNova = [int(n) for n in m.text.split("/")] validar = funcoes.validar_data(dataNova[0], dataNova[1], dataNova[2]) if validar == False or len(dataNova) != 3: raise ValueError("Data inválida") with open('editartempdata/{}.txt'.format(cid), 'w') as f: f.write(m.text) editartempdata[cid] = datetime.datetime(dataNova[-1], dataNova[-2], dataNova[-3]) bot.send_message(cid, "Digite o novo horário (no formato HH:MM): ") passoUsuario[cid] = 14 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("14") except (ValueError, IndexError): bot.send_message( cid, "Data inválida! Digite a data no formato DD/MM/AAAA !\nExemplo: dia 17 de janeiro de 2029 corresponde a data 17/01/2029." ) elif editartempcaso[cid] == 3: detalhesNovo = m.text eventos[cid][editartemp[cid]][2] = detalhesNovo funcoes.salvar_edicao(eventos, cid) bot.send_message(cid, "Detalhes editados com sucesso!") del editartempcaso[cid] with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("") del editartemp[cid] with open('editartemp/{}.txt'.format(cid), 'w') as f: f.write("") passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) elif editartempcaso[cid] == 4 or editartempcaso[cid] == 5: try: tempo = int(m.text) if tempo < 0: raise ValueError titulo = eventos[cid][editartemp[cid]][0] if editartempcaso[cid] == 4: lembrete = eventos[cid][ editartemp[cid]][1] - datetime.timedelta(days=tempo) else: lembrete = eventos[cid][ editartemp[cid]][1] - datetime.timedelta(hours=tempo) agora = datetime.datetime.now() if lembrete < agora: if eventos[cid][editartemp[cid]][1] < agora: bot.send_message(cid, "Não é possível criar um lembrete.") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") elif (eventos[cid][editartemp[cid]][1] - agora).days >= 1: bot.send_message( cid, "Número inválido!\nQuantos dias antes do evento você deseja ser lembrado?\n(O número máximo que você pode digitar é: {})" .format( (eventos[cid][editartemp[cid]][1] - agora).days)) editartempcaso[cid] == 4 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("4") else: bot.send_message( cid, "Número inválido!\nQuantos horas antes do evento você deseja ser lembrado?\n(O número máximo que você pode digitar é: {})" .format((eventos[cid][editartemp[cid]][1] - agora).total_seconds() // 3600)) editartempcaso[cid] == 5 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("5") else: try: fila.cancel( lembretes[cid][eventos[cid][editartemp[cid]][0] + funcoes.datetime_para_texto( eventos[cid][editartemp[cid]][1])]) except KeyError: pass st = (lembrete - datetime.datetime.now()).total_seconds() eventos[cid][editartemp[cid]][3] = lembrete lembretes[cid][ eventos[cid][editartemp[cid]][0] + funcoes.datetime_para_texto(eventos[cid][ editartemp[cid]][1])] = fila.enter( st, 1, enviar_lembrete, argument=(cid, eventos[cid][editartemp[cid]][0], funcoes.datetime_para_texto( eventos[cid][editartemp[cid]][1]))) t = threading.Thread(target=fila.run) t.start() bot.send_message( cid, "Lembrete definido para {}".format( funcoes.datetime_para_texto(lembrete))) funcoes.salvar_edicao(eventos, cid) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) except ValueError: agora = datetime.datetime.now() if eventos[cid][editartemp[cid]][1] < agora: bot.send_message(cid, "Não é possível criar um lembrete.") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") else: bot.send_message( cid, "Valor inválido! Por favor digite um número não negativo")
def editar2(mensagem): cid = mensagem.chat.id agora = datetime.datetime.now() if mensagem.text == "Título": bot.send_message(cid, "Digite o novo título:", reply_markup=esconderTeclado) editartempcaso[cid] = 1 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("1") passoUsuario[cid] = 13 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("13") elif mensagem.text == "Data": bot.send_message(cid, "Digite a nova data (no formato DD/MM/AAAA):", reply_markup=esconderTeclado) editartempcaso[cid] = 2 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("2") passoUsuario[cid] = 13 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("13") elif mensagem.text == "Detalhes": bot.send_message(cid, "Digite os novos detalhes:", reply_markup=esconderTeclado) editartempcaso[cid] = 3 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("3") passoUsuario[cid] = 13 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("13") elif mensagem.text == "Lembrete": if eventos[cid][editartemp[cid]][1] < datetime.datetime.now(): bot.send_message( cid, "Não é possível fazer isso! Esse evento já aconteceu!", reply_markup=esconderTeclado) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") del editartemp[cid] with open('editartemp/{}.txt'.format(cid), 'w') as f: f.write("") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) elif (eventos[cid][editartemp[cid]][1] - datetime.datetime.now()).days >= 1: bot.send_message( cid, "Quantos dias antes do evento você deseja ser lembrado?\n(O número máximo que você pode digitar é: {})" .format((eventos[cid][editartemp[cid]][1] - agora).days), reply_markup=esconderTeclado) editartempcaso[cid] = 4 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("4") passoUsuario[cid] = 13 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("13") else: bot.send_message( cid, "Quantos horas antes do evento você deseja ser lembrado?\n(O número máximo que você pode digitar é: {})" .format( (eventos[cid][editartemp[cid]][1] - agora).total_seconds() // 3600), reply_markup=esconderTeclado) editartempcaso[cid] = 5 with open('editartempcaso/{}.txt'.format(cid), 'w') as f: f.write("5") passoUsuario[cid] = 13 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("13") elif mensagem.text == "Deletar": if eventos[cid][editartemp[cid]][3] != 0: if datetime.datetime.now() < eventos[cid][editartemp[cid]][3]: fila.cancel( lembretes[cid][eventos[cid][editartemp[cid]][0] + funcoes.datetime_para_texto(eventos[cid][ editartemp[cid]][1])]) del eventos[cid][editartemp[cid]] funcoes.salvar_edicao(eventos, cid) del editartemp[cid] with open('editartemp/{}.txt'.format(cid), 'w') as f: f.write("") passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "Evento deletado com sucesso!", reply_markup=esconderTeclado) bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) elif mensagem.text == "CANCELAR": passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") bot.send_message(cid, "O que deseja fazer?", reply_markup=selecionarComando) else: bot.send_message(cid, "Por favor selecione uma das opções", reply_markup=opcoesTeclado)
def lembrete1(mensagem): cid = mensagem.chat.id agora = datetime.datetime.now() if linhatemp[str(cid) + "data"] < agora: bot.send_message(cid, "Não é mais possível criar um lembrete.") salvar_evento(eventos, cid, linhatemp[str(cid) + "titulo"], linhatemp[str(cid) + "data"], linhatemp[str(cid) + "detalhes"], 0, selecionarComando) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") del linhatemp[str(cid) + "titulo"] del linhatemp[str(cid) + "data"] del linhatemp[str(cid) + "detalhes"] with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write("") else: try: tempo = int(mensagem.text) if tempo < 0: raise ValueError dataE = linhatemp[str(cid) + "data"] titulo = linhatemp[str(cid) + "titulo"] if linhatemp[str(cid) + "casolembrete"] == 1: lembrete = dataE - datetime.timedelta(days=tempo) else: lembrete = dataE - datetime.timedelta(hours=tempo) agora = datetime.datetime.now() if lembrete < agora: if dataE < agora: bot.send_message(cid, "Não é mais possível criar um lembrete.") salvar_evento(eventos, cid, linhatemp[str(cid) + "titulo"], linhatemp[str(cid) + "data"], linhatemp[str(cid) + "detalhes"], 0, selecionarComando) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") del linhatemp[str(cid) + "titulo"] del linhatemp[str(cid) + "data"] del linhatemp[str(cid) + "detalhes"] with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write("") elif (dataE - agora).days >= 1: bot.send_message( cid, "Por favor digite um número válido!\nQuantos dias antes do evento você deseja ser lembrado?\n(O número máximo que você pode digitar é: {})" .format((linhatemp[str(cid) + "data"] - agora).days)) linhatemp[str(cid) + "casolembrete"] = 1 with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write(linhatemp[str(cid) + "titulo"] + "\n" + funcoes.datetime_para_texto(linhatemp[ str(cid) + "data"]) + "\n" + linhatemp[str(cid) + "detalhes"] + "1\n") else: bot.send_message( cid, "Quantos horas antes do evento você deseja ser lembrado?\n(O número máximo que você pode digitar é: {})" .format((linhatemp[str(cid) + "data"] - agora).total_seconds() // 3600)) linhatemp[str(cid) + "casolembrete"] = 2 with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write(linhatemp[str(cid) + "titulo"] + "\n" + funcoes.datetime_para_texto(linhatemp[ str(cid) + "data"]) + "\n" + linhatemp[str(cid) + "detalhes"] + "2\n") else: #2 bot.send_message( cid, "Lembrete definido para {}".format( funcoes.datetime_para_texto(lembrete))) salvar_evento(eventos, cid, linhatemp[str(cid) + "titulo"], linhatemp[str(cid) + "data"], linhatemp[str(cid) + "detalhes"], lembrete, selecionarComando) del linhatemp[str(cid) + "titulo"] del linhatemp[str(cid) + "data"] del linhatemp[str(cid) + "detalhes"] with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write("") passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") st = (lembrete - agora).total_seconds() lembretes[cid][ titulo + funcoes.datetime_para_texto(dataE)] = fila.enter( st, 1, enviar_lembrete, argument=(cid, titulo, funcoes.datetime_para_texto(dataE))) t = threading.Thread(target=fila.run) t.start() except ValueError: agora = datetime.datetime.now() if linhatemp[str(cid) + "data"] < agora: bot.send_message(cid, "Não é mais possível criar um lembrete.") salvar_evento(cid, eventos, linhatemp[str(cid) + "titulo"], linhatemp[str(cid) + "data"], linhatemp[str(cid) + "detalhes"], 0, selecionarComando) passoUsuario[cid] = 0 with open('passo/{}.txt'.format(cid), 'w') as v: v.write("0") del linhatemp[str(cid) + "titulo"] del linhatemp[str(cid) + "data"] del linhatemp[str(cid) + "detalhes"] with open('linhatemp/{}.txt'.format(cid), 'w') as f: f.write("") else: bot.send_message( cid, "Valor inválido! Por favor digite um número não negativo")
def enviar_lembrete(usuario, titulo, data): bot.send_message(usuario, "Você terá \"{}\" em {}".format(titulo, data)) for cid in usuariosConhecidos: agora = datetime.datetime.now() for i in range(len(eventos[cid])): if eventos[cid][i][-1] != 0: if eventos[cid][i][-1] < agora: eventos[cid][i][-1] = 0 else: st = (eventos[cid][i][-1] - agora).total_seconds() lembretes[cid][eventos[cid][i][0] + funcoes.datetime_para_texto( eventos[cid][i][1])] = fila.enter( st, 1, enviar_lembrete, argument=(cid, eventos[cid][i][0], funcoes.datetime_para_texto( eventos[cid][i][1]))) t = threading.Thread(target=fila.run) t.start() # Essa função é usada para mostrar na tela cada mensagem recebida num print do tipo: Nome [ID]: "mensagem" def listener(mensagens): # Usado somente para mostrar as mensagens recebidas no console. for mensagem in mensagens: if mensagem.content_type == 'text':