From cac893784de34a767df1c76392cdf4f54264271d Mon Sep 17 00:00:00 2001 From: Roboron3042 Date: Wed, 4 Dec 2024 00:33:00 +0100 Subject: [PATCH] ADD: Insultabot --- common.py | 18 +++++ insultabot.py | 128 +++++++++++++++++++++++++++++ insultabot_hourly.py | 15 ++++ list/insultabot_insultos | 171 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 332 insertions(+) create mode 100644 insultabot.py create mode 100644 insultabot_hourly.py create mode 100644 list/insultabot_insultos diff --git a/common.py b/common.py index 34da97e..7dab5a2 100644 --- a/common.py +++ b/common.py @@ -61,3 +61,21 @@ def get_new_notifications(api, bot_name, types=None): list_write(bot_name + "_last_notifications", new_notifications_ids) return new_notifications +women_pronouns = ["she","her","ella","illa"] +nb_pronouns = ["they","them","elle", "ille"] + +def is_gender(pronouns, account): + for pronoun in pronouns: + if(pronoun in account.note): + return True + for value in account.fields: + if(pronoun in value): + return True + return False + +def get_gender(account): + if(is_gender(women_pronouns,account)): + return 1 + if(is_gender(nb_pronouns, account)): + return 2 + return 0 \ No newline at end of file diff --git a/insultabot.py b/insultabot.py new file mode 100644 index 0000000..71f32db --- /dev/null +++ b/insultabot.py @@ -0,0 +1,128 @@ +from common import get_api, get_gender, get_new_notifications, list_read +from random import choice + +articulos_indefinidos =["un", "una", "une"] +articulos_definidos = ["el", "la", "le"] + +mensaje_seguidores_vacio = "No pude consultar la lista de seguidos de la cuenta mencionada (tal vez está oculta o es demasiado grande). No pude comprobar si es amigo de ARTICULO_INDEFINIDO INSULTO como tú." +mensaje_no_amigo = "La cuenta mencionada no tiene una relación de seguimiento contigo. Es comprensible que no quiera ser amigo de ARTICULO_INDEFINIDO INSULTO como tú." +mensaje_nobot = "La cuenta objetivo tiene la etiqueta #nobot en su biografía. ¡No tengo poder aquí, INSULTO!" +mensaje_mismo = "Hay que ser muy INSULTO para insultarse a uno mismo. Enhorabuena." +mensaje_creador = "¿Cómo te atreves a intentar insultar a mi creador, INSULTO?" +mensaje_insuficientes = "Tú, INSULTO, no has escrito suficientes menciones para insultar a nadie." +mensaje_follow = "Bienvenido al club, INSULTO." + +mensajes = [ + "Según un prestigioso estudio de la universidad de INSULTADOR, eres ARTICULO_INDEFINIDO INSULTO, INSULTADO.", + "Un comité de expertos liderado por INSULTADOR ha llegado a la conclusión de que INSULTADO es muy INSULTO. Y tienen razón.", + "INSULTADO, eres un poco INSULTO, me he dado cuenta gracias a INSULTADOR. Háztelo mirar, ¿vale?", + "¡INSULTADO, INSULTO! ¿Lo has entendido? Seguramente no, porque aunque INSULTADOR me lo haya dicho, tú eres tan INSULTO que no te das cuenta.", + "INSULTADO que sepas que eres ARTICULO_INDEFINIDO INSULTO, como INSULTADOR ha hecho bien en señalar.", + "INSULTADOR te concede el dudoso honor de ser ARTICULO_DEFINIDO mastodonte más INSULTO de todos, INSULTADO.", + "A INSULTADOR le preocupa lo INSULTO que eres, INSULTADO. Pero no mucho.", + "Todos tus amigos piensan que eres ARTICULO_INDEFINIDO INSULTO, INSULTADO. Bueno, todos todos no, pero INSULTADOR sí.", + "Ya te vale, INSULTADO, podrías ser un poco menos INSULTO, que tienes a INSULTADOR hasta las narices.", + "INSULTADO, si fueses un poco menos INSULTO, INSULTADOR no habría tenido que mandar este mensaje.", + "No sabíamos que INSULTADO era ARTICULO_INDEFINIDO INSULTO, menos mal que INSULTADOR ha avisado.", + "INSULTADO Perdona que te lo diga pero eres un poco INSULTO. INSULTADOR quería decírtelo pero no se atrevía.", + "Después de todo INSULTADOR tenía razón, INSULTADO es ARTICULO_INDEFINIDO INSULTO.", + "Hoy estaba de bajona, pero luego INSULTADOR me recordó lo INSULTO que es INSULTADO y se me pasó.", + "Solo hay dos cosas ciertas en esta vida: que INSULTADO es ARTICULO_INDEFINIDO INSULTO y que esto me lo ha dicho INSULTADOR.", + "¿Se puede ser más INSULTO que INSULTADO? Es una pregunta retórica, solo INSULTADOR conoce la respuesta.", + "Hoy es un día perfecto para recordar a INSULTADO lo INSULTO que es. Bueno, hoy y cualquier día, siempre que esté INSULTADOR para recordármelo.", + "¿Sabes qué hora es, INSULTADOR? ¡La hora de llamar INSULTO a INSULTADO!", + "INSULTADO te digo que eres ARTICULO_INDEFINIDO INSULTO, y me quedo corto. Pero si quieres INSULTADOR te lo expande.", + "INSULTADO me han pedido que te diga que eres ARTICULO_INDEFINIDO INSULTO, que no sé muy bien lo que significa, pero tiene que ser algo malo porque me lo ha dicho INSULTADOR.", + "INSULTADO ¡INSULTO! ¡INSULTO_2! ¡INSULTO_3! ¡INSULTO_4!\n\nUff, qué ganas le tenía a esta cuenta. Gracias por la oportunidad, INSULTADOR" +] + +def get_insulto_inclusivo(insulto, gender): + insulto = insulto.split(",") + if(len(insulto) > 1): + insulto_inclusivo = insulto[gender] + else: + insulto_inclusivo = insulto[0] + return insulto_inclusivo + +def insultar_insultador(insulto, insultador, status, mensaje): + gender = get_gender(insultador) + insulto = get_insulto_inclusivo(insulto, gender) + mensaje = mensaje.replace("INSULTO", insulto).replace("ARTICULO_INDEFINIDO", articulos_indefinidos[gender]) + api.status_post("@" + insultador.acct + " " + mensaje.replace("INSULTO", insulto), in_reply_to_id=status.id, visibility="unlisted" ) + +def insultar_insultado(insulto, insultador, insultado, insultado_acct): + gender = get_gender(insultado) + insulto = get_insulto_inclusivo(insulto, gender) + mensaje = choice(mensajes) + mensaje = mensaje.replace("INSULTADOR", "@" + insultador.acct) + mensaje = mensaje.replace("INSULTADO", "@" + insultado_acct) + if("INSULTO_2" in mensaje): + mensaje = mensaje.replace("INSULTO_2", get_insulto_inclusivo(choice(insultos), gender).capitalize() ) + mensaje = mensaje.replace("INSULTO_3", get_insulto_inclusivo(choice(insultos), gender).capitalize()) + mensaje = mensaje.replace("INSULTO_4", get_insulto_inclusivo(choice(insultos), gender).capitalize()) + mensaje = mensaje.replace("INSULTO", insulto.capitalize()) + mensaje = mensaje.replace("INSULTO", insulto) + mensaje = mensaje.replace("ARTICULO_INDEFINIDO", articulos_indefinidos[gender]) + mensaje = mensaje.replace("ARTICULO_DEFINIDO", articulos_definidos[gender]) + api.status_post(mensaje, visibility="unlisted" ) + +bot_name = 'insultabot' +api = get_api('masto.es', bot_name) +insultos = list_read(bot_name + "_insultos") +notifications = get_new_notifications(api, bot_name, "mention,follow") + +for n in notifications: + insultador = n.account + if(n.type == "follow"): + choosen_insulto = choice(insultos) + insulto = get_insulto_inclusivo(choosen_insulto, get_gender(insultador)) + api.status_post("@" + insultador.acct + " " + mensaje_follow.replace("INSULTO", insulto), visibility="unlisted" ) + else: + choosen_insulto = choice(insultos) + menciones = n.status.mentions + insultado_mencion = {} + if(len(menciones) < 2): + insulto = get_insulto_inclusivo(choosen_insulto, get_gender(insultador)) + api.status_post("@" + insultador.acct + " " + mensaje_insuficientes.replace("INSULTO", insulto), in_reply_to_id=n.status.id, visibility="unlisted" ) + for mencion in menciones: + if(mencion.url == "https://masto.es/@rober"): + insultar_insultador(choosen_insulto, insultador, n.status, mensaje_creador) + break + elif(mencion.acct == insultador.acct): + insultar_insultador(choosen_insulto, insultador, n.status, mensaje_mismo) + break + elif(mencion.url == "https://masto.es/@insultabot"): + continue + else: + insultado_mencion = mencion + break + if(insultado_mencion == {}): + break + insultado_api = {} + if("masto.es" in insultado_mencion.url): + insultado_api = api + else: + domain = insultado_mencion.acct.split("@")[1] + insultado_api = get_api(domain) + insultado = insultado_api.account_lookup(insultado_mencion.acct) + if("nobot" in insultado.note): + insultar_insultador(choosen_insulto, insultador, n.status, mensaje_nobot) + break + # Para evitar rate-limits, descartamos cuentas que sigan demasiada gente + elif(insultado.following_count > 6000 or insultado.following_count == 0): + insultar_insultador(choosen_insulto, insultador, n.status, mensaje_seguidores_vacio) + break + follows = insultado_api.account_following(insultado.id, limit=80) + if(len(follows) == 0): + insultar_insultador(choosen_insulto, insultador, n.status, mensaje_seguidores_vacio) + break + else: + follows = insultado_api.fetch_remaining(follows) + encontrado = False + for follow in follows: + if(insultador.url == follow.url): + encontrado = True + insultar_insultado(choosen_insulto, insultador, insultado, insultado_mencion.acct) + break + if(encontrado == False): + insultar_insultador(choosen_insulto, insultador, n.status, mensaje_no_amigo) \ No newline at end of file diff --git a/insultabot_hourly.py b/insultabot_hourly.py new file mode 100644 index 0000000..8249fd5 --- /dev/null +++ b/insultabot_hourly.py @@ -0,0 +1,15 @@ +from common import get_api, get_gender, list_read +from random import choice +from insultabot import get_insulto_inclusivo + +bot_name = 'insultabot' +api = get_api('masto.es', bot_name) + +followers = api.account_followers(api.me().id, limit=80) +followers = api.fetch_remaining(followers) +insultos = list_read(bot_name + "_insultos") +choosen_insulto = choice(insultos) +choosen_user = choice(followers) +gender = get_gender(choosen_user) +insulto = get_insulto_inclusivo(choosen_insulto, gender) +api.status_post("@" + choosen_user.username + " ¡" + insulto + "!", visibility="unlisted" ) diff --git a/list/insultabot_insultos b/list/insultabot_insultos new file mode 100644 index 0000000..88ca847 --- /dev/null +++ b/list/insultabot_insultos @@ -0,0 +1,171 @@ +abanto,abanta,abante +abrazafarolas +aburrevacas +adufe +alcornoque +alfeñique +andurriasmo,andurriasma,andurriasme +arrastracueros +atascaburras +baboso,babosa,babose +bailaferias +barrabás +barriobajero,barriobajera,barriobajere +bebecharcos +bebesinsed +bellaco,bellaca,bellaque +berzotas +besugo,besuga,besugue +bobalicón,bobalicona,bobalicone +bocabuzón +bocachancla +bocallanta +borrico,borrica,borrique +botarate +brasas +cabestro,cabestra,cabestre +cabezabuque +cabezachorlito,cabezachorlita,cabezachorlite +cabezapony +cachibache +cafre +cagalindes +cagaprisas +cagarruta +cagatrufas +calientahielos +calzamonas +cansalmas +cantamañanas +caracartón +caraflema +carajaula +carajote +carapapa +carapijo,carapija,carapije +caratorta +cazurro,cazurra,cazurre +cebollino,cebollina,cebolline +cenizo,ceniza,cenize +cenutrio,cenutria,cenutrie +ceporro,ceporra,ceporre +cernícalo,cernícala,cernícale +chiquilicuatre +chirimbaina +chupacables +chupacharcos +chupasangre +cierrabares +cipote +comeberzas +comechapas +comesquinas +comeflores +cretino,cretina,cretine +culopollo +echacantos +esbaratabailes +escuelgagüindillas +esgarramantas +estripabarrancos +estripacharcos +fulastre +gañán +gilipuertas +giraesquinas +gurrumino,gurrumina,gurrumine +gurripato,gurripata,gurripate +hinchanarices +lameculos +lameplatos +legañoso.legañosa,legañose +lerdo,lerda,lerde +majadero,majadera,majadere +malababa +malasangre +malasombra +mascachapas +mastuerzo,mastuerza,mastuerze +matacandiles +meapilas +memo,mema,meme +mendrugo,mendruga,mendrugue +mentecato,mentecata,mentecate +mequetrefe +merluzo,merluza,merluze +mindundi +morroestufa +muerdealmohadas +muerdesartenes +nalgasprietas +pagafantas +palurdo,palurda,palurde +pamplinas +panarra +panoli +papafrita +papanatas +papirote +paquete +pardillo,pardilla,pardille +parguela +pasmarote +pasmasuegras +pataliebre +patán +pavisoso,pavisosa,pavisose +pavitonto,pavitonta,pavitonte +pazguato,pazguata,pazguate +pecholata +pedorro,pedorra,pedorre +peinabombillas +peinaovejas +pelagallos +pelagambas +pelagatos +pelatigres +pelavaras +pelazarzas +pelele +pelma +percebe +perroflauta +picapleitos +pillavispas +piltrafa,piltrafa,piltrafe +pinchatrenes +pintamonas +piojoso,piojosa,piojose +pocasluces +pollopera +rebañasandías +rebozapalillos +revientabaules +robaperas +rumiamierdas +sacamuelas +saltasurcos +sanguijuela +sinsustancia +soplagaitas +soplanucas +soplaguindas +soplapollas +tagarote +tocapelotas +tolai +tontoviava,tontaviava,tonteviava +tontucio,tontucia,tontucie +trepababas +tuercebotas +tunante +zamacuco,zamacuca,zamacuque +zambombo,zambomba,zambombe +zángano,zángana,zángane +zarrapastroso,zarrapastrosa,zarrapastrose +zascandil +zopenco,zopenca,zopenque +zoquete +zote +zullenco,zullenca,zullenque +zurcefrenillos \ No newline at end of file