def dar_basado(self, basado): #Un basadobot.models.ParienteBasado, None o False. pariente = security2(basado) #En caso de que pariente no exista, es decir que ese comentario no ha recibido un "basado" antes #se crea dicho pariente. if pariente == None: #El username del autor del comentario/post al cual ha sido comentado, #es decir, la persona que está basada. reci = basado.parent().author #Un basadobot.models.User o None. recibidor = session.query(User).filter( User.username == str(reci)).first() #Si existe (!None), se puede sumar 1, en caso contrario no se puede hacer. if not recibidor: recibidor = User(username=str(reci), basados=0, frasesCunado=True) #Aqui crea el basadobot.models.ParienteBasado, ya que no estaba creado antes. pariente = ParienteBasado(parentId=basado.parent_id, submissionId=basado.link_id, isComment=basado.parent_id[1] == 1, autor=recibidor) #En caso de que sea Falso significa que el basado no es valido por algun motivo. elif pariente == False: return #Finalmente, en caso de que exista el usuario, lo unico que hace es buscar #la persona basada (basadobot.models.User), debido a que el pariente existia #tiene que existir el recibidor. else: recibidor = session.query(User).filter( User.id == pariente.autorId).first() #Un basadobot.models.User o None. commenter = session.query(User).filter( User.username == str(basado.author)).first() #En caso de que sea None, crea el que ha escrito "basado" (basadobot.models.User) if not commenter: commenter = User(username=str(basado.author), frasesCunado=True) #Si la funcion de seguridad no da ningun error, procede a añadir los datos en la database if security1(commenter, pariente): recibidor.basados += 1 commenter.basadosHechos.append(pariente) session.add(commenter) session.add(pariente) session.add(recibidor) return recibidor
def convertirEurosAPesetas(self): subreddit_inspection = self.reddit.subreddit("BasadoBot+Asi_va_Espana") commit = False for comment in subreddit_inspection.comments(limit=100): try: if session.query(OtherComment).filter( OtherComment.commentId == comment.id).first(): break palabraEncontrada = "" for palabra in ["€", "euro"]: if palabra in comment.body.lower() and str( comment.author).lower() != "basadobot": palabraEncontrada = palabra break else: continue if "peseta" not in comment.body.lower(): continue euros = float( "".join(comment.body.lower().split(palabraEncontrada) [0].strip().split(" ")[-1].split(".")).replace( ",", ".").split("-")[-1]) commit = True cents = "" pesetas = euros * 166.3860 perraGorda = pesetas * 10 euros = f"{int(euros):,}" if int(euros) == float( euros) else f"{round(euros, 2):,.2f}" pesetas = f"{int(pesetas):,}" if int(pesetas) == float( pesetas) else f"{round(pesetas, 2):,.2f}" euros = euros.replace(",", "@").replace(".", ",").replace("@", ".") pesetas = pesetas.replace(",", "@").replace(".", ",").replace("@", ".") perraGordaTrunc = int(perraGorda) residuo = round((perraGorda - perraGordaTrunc) * 10) perraGordaTrunc = f"{perraGordaTrunc:,}".replace(",", ".") if residuo >= 5: cents += " con 1 perra chica" residuo -= 5 if residuo == 1: cents += f" y {residuo} centimo" residuo -= 1 if residuo != 0: cents += f" y {residuo} centimos" comment.reply( f"¿{euros}€? En mi epoca eso eran {pesetas} pesetas. Es decir, {perraGordaTrunc} perras gordas{cents}." + f"\n\n---\n\n^({mensajeduda})") session.add(OtherComment(commentId=comment.id)) except ValueError: pass if commit: self.commit_changes("pesetas")
def goodOrBadBot(self, comment): if not session.query(OtherComment).filter( OtherComment.commentId == comment.id).first(): if "bad bot" in comment.body.lower( ) or "bot malo" in comment.body.lower(): message = "¿Algún problema? ¡Puedes dar feedback en r/BasadoBot!" elif "good bot" in comment.body.lower( ) or "buen bot" in comment.body.lower(): if str(comment.author).lower() == "bot_goodbot_bot": message = respuestaBotCaliente() else: message = respuestaFeliz() elif "u/basadobot" in comment.body.lower(): return self.mencion(comment) else: return message += f"\n\n---\n\n^({mensajeduda})" session.add(OtherComment(commentId=comment.id)) comment.reply(message) self.commit_changes("bot")
def mencion(self, comment): if not session.query(OtherComment).filter( OtherComment.commentId == comment.id).first(): if "?" in comment.body: message = preguntaCunada() else: message = messageCunado() message += f"\n\n---\n\n^({mensajeduda})" session.add(OtherComment(commentId=comment.id)) comment.reply(message) self.commit_changes("mencion")
def frase_de_cunado(self): subreddit_inspection = self.reddit.subreddit("Asi_va_Espana") for comment in subreddit_inspection.comments(limit=200): if str( comment.author ) == "BasadoBot" and comment.score >= 13 and not session.query( OtherComment).filter( OtherComment.commentId == comment.id).first(): session.add(OtherComment(commentId=comment.id)) comment.reply(respuesta_basadobot_a_basadobot() + f"\n\n---\n\n^({mensajeduda})") return True if "premios españísima" not in comment.submission.title.lower( ) and abs(comment.score) >= 13 and not session.query( OtherComment).filter( OtherComment.commentId == comment.id).first(): usuario = session.query(User).filter( User.username == str(comment.author)).first() if not usuario: usuario = User(username=str(comment.author), basados=0, frasesCunado=True) session.add(usuario) if not usuario.frasesCunado: continue session.add(OtherComment(commentId=comment.id)) comment.reply( generador_frase(str(comment.author)) + f"\n\n---\n\n^({mensajeduda})") return True return False
def mirar_otros_comandos(self) -> list: comentarios = [] #Subreddit del donde buscara los mensajes. subreddit_inspection = self.reddit.subreddit("Asi_va_Espana+BasadoBot") #Mira los ultimos 100 comentarios y en caso que inicie con "/" y no esté en la #database se añadirá a posibles respuestas. for comment in subreddit_inspection.comments(limit=100): if str( comment.author ) != "BasadoBot" and "/" in comment.body and not session.query( OtherComment).filter( OtherComment.commentId == comment.id).first(): session.add(OtherComment(commentId=comment.id)) comentarios.append(comment) return comentarios
def security2(basado): try: parent = session.query(ParienteBasado).filter( ParienteBasado.parentId == basado.parent_id).first() try: reci = basado.parent().is_robot_indexable except AttributeError as e: reci = basado.parent().author != "None" and basado.parent( ).body != "[removed]" name = basado.parent().author if not reci or str(name) == str(basado.author): return False return parent except IntegrityError: session.rollback() return False
def responder_otros_comandos(self, comandos) -> bool: toReturn = False for comando in comandos: ind = comando.body.index("/") if "info" == comando.body[1 + ind:5 + ind]: toReturn = True message = "\n\n".join([ "¡Hola! ¡Soy un bot llamado BasadoBot!", "He sido creado por [u/TheRepSter](https://www.reddit.com/user/TheRepSter), por simple diversión.", "Cuento \"basados\", es decir, cuando estás de acuerdo con una persona.", "También llevo la cuenta de las píldoras que tiene cada usuario.", "Los comandos son los siguientes:", "- /info: muestra este mensaje.", "- /usuariosmasbasados (o /usuariosmásbasados): muestra el top 10 de basados.", "- /cantidaddebasado \{username\}: muestra los basados según el username", "- /tirarpildora \{píldora\}: tira la píldora que mencione el usuario que pone el comando", "- /frasecuñado \{valor\}: hace que BasadoBot comente o no en tus comentarios, según el valor (verdadero o falso)", "A veces suelto alguna que otra frase un tanto de cuñado.", "Si dices algo en euros, moneda inútil, lo diré en las clásicas pesetas.", "Soy de código abierto, es decir, ¡puedes ver mi código e incluso aportar!", "[Haz click aquí para ver el código.](https://github.com/TheRepSter/BasadoBot-Reddit)", "---", "^(¿Tienes alguna duda? ¡[Lee el post completo](https://www.reddit.com/r/Asi_va_Espana/comments/p4he0b/anuncio_basadobot_el_bot_de_los_basados/) o pregunta en [r/BasadoBot](https://www.reddit.com/r/BasadoBot/)!)" ]) elif "usuariosmasbasados" == comando.body[1 + ind:19 + ind].lower( ) or "usuariosmásbasados" == comando.body[1 + ind:19 + ind].lower(): toReturn = True usuarios = session.query(User).order_by( User.basados.desc()).limit(10).all() message = "El Top 10 de los usuarios más basados es actualmente:\n\n" message += "|Puesto|Username|Cantidad|\n--:|:--|:--|\n" for numb, i in enumerate(usuarios): message += f"|{numb+1}|[u/{i.username}](https://reddit.com/user/{i.username})|{i.basados}\n" message += f"\n\n---\n\n^({mensajeduda})" elif "cantidaddebasado" == comando.body[1 + ind:17 + ind].lower(): toReturn = True toBuscar = comando.body[ind:].split(" ")[1].strip("\n.,!?") if "u/" in toBuscar: toBuscar = toBuscar.split("/")[1] usuario = session.query(User).filter( User.username == toBuscar).first() if usuario: message = f"El usuario {usuario.username} tiene {usuario.basados} basados." message += f"\n\nTiene las siguientes píldoras: {', '.join(list(map(lambda x: x.name, usuario.pildoras)))}" else: message = f"El usuario {toBuscar} no existe o no ha recibido ni hecho ningún basado." message += f"\n\n---\n\n^({mensajeduda})" elif "tirarpildora" == comando.body[1 + ind:13 + ind].lower(): toReturn = True autor = session.query(User).filter( User.username == str(comando.author)).first() try: toBuscar = comando.body[ind:].split(" ")[1] except IndexError: toBuscar = "" pills = session.query(Pildora).filter( Pildora.name == toBuscar).all() if pills: for pill in pills: if pill.recibidor.id == autor.id: autor.pildoras.remove(pill) session.add(autor) message = f"La píldora {toBuscar} ha sido eliminada." break else: message = f"¡No tienes la píldora {toBuscar}!" else: message = f"¡No tienes la píldora {toBuscar}!" message += f"\n\n---\n\n^({mensajeduda})" elif "frasecunado" == comando.body[1 + ind:12 + ind].lower( ) or "frasecuñado" == comando.body[1 + ind:12 + ind].lower(): toReturn = True message = "" autor = session.query(User).filter( User.username == str(comando.author)).first() if not autor: autor = User(username=str(comando.author), basados=0, frasesCunado=True) try: val = comando.body[ind:].split(" ")[1].lower().strip( "\n.,!?") except IndexError: val = "" if val in ["verdadero", "si", "true", "sí"]: autor.frasesCunado = True message = "A partir de ahora se enviaran frases cuñadas a tus comentarios." elif val in ["falso", "no", "false"]: autor.frasesCunado = False message = "A partir de ahora no se enviaran frases cuñadas a tus comentarios." else: message = "Debes poner un valor correcto." if autor.frasesCunado: message += "\n\nActualmente se envían frases cuñadas a tus comentarios." else: message += "\n\nActualmente no se envían frases cuñadas a tus comentarios." message += f"\n\n---\n\n^({mensajeduda})" else: continue comando.reply(message) return toReturn
def security1(commenter, pariente): return not session.query(ParienteBasado, User).filter( BasadoHecho.user == commenter.id, BasadoHecho.pariente == pariente.id).first()