2023-06-09 17:34:30 +00:00
import re
2023-04-23 11:47:16 +00:00
from bs4 import BeautifulSoup
from common import get_api
from common import list_append
from common import list_read
from common import list_write
# Messages
mensaje = " Alguien que te aprecia mucho quiere recordarte que eres una persona maravillosa :ablobcatheartsqueeze: ¡Sigue así, "
mensaje_croqueta = " Alguien que te aprecia mucho quiere enviarte croquetas :croqueta: :croqueta: :croqueta: "
2023-11-13 17:05:28 +00:00
mensaje_cumple = [ " Alguien me ha revelado que hoy es tu día, " , " . ¡Feliz cumpleaños de su parte! :blobcatbirthday: " ]
2023-04-23 11:47:16 +00:00
mensaje_mismo = " La persona más importante que debes apreciar eres tú. ¡Eres increíble! ❤ "
mensaje_nobot = " La cuenta objetivo tiene la etiqueta #nobot en su biografía. ¡No tengo poder aquí! "
mensaje_aviso = " Has intentado apreciar a alguien pero no has usado un mensaje directo/privado. ¡Tienes que mencionarme en un mensaje directo/privado para que funcione! "
mensaje_error = " No pude procesar tu apreciación. ¡Asegúrate de no incluir saltos de línea ni otros caracteres extraños! El mensaje debería ser tal que así: \" @apreciabot@masto.es usuario@servidor \n "
mensaje_no_encontrado = " No se pudo encontrar la cuenta del usuario especificado. \n \n Revisa que has escrito bien la cuenta con el formato \" usuario@servidor \" (por ejemplo, rober@masto.es, excluyendo el primer @ para evitar mencionarlo). \n \n Si lo has mencionado por error, ¡borra el mensaje antes de que se de cuenta! "
# Initialization
bot_name = ' apreciabot '
api = get_api ( ' masto.es ' , bot_name )
last_ids = list_read ( bot_name )
max_notifications = 10
new_last_ids = [ ]
notifications = api . notifications ( types = [ " mention " ] , limit = max_notifications )
2023-06-09 17:34:30 +00:00
no_unicode_spaces_pattern = r " [ \ u200B- \ u200D \ u202A \ u202C \ uFEFF] "
2023-11-13 17:05:28 +00:00
mode_croqueta_words = [ " croqueta " , " croquetas " ]
mode_cumple_words = [ " cumple " , " cumpleaños " , " felicidades " ]
def check_mode ( mode_words , content ) :
for word in mode_words :
if ( ( word in content ) or ( ( ' " ' + word + ' " ' ) in content ) ) :
return True
return False
2023-06-09 17:34:30 +00:00
2023-04-23 11:47:16 +00:00
for n in notifications :
new_last_ids . append ( n [ ' id ' ] )
# Some notifications may have been deleted since last fetch
# Therefore, it is better to check less than the maximum number of notifications
for i in range ( 0 , max_notifications - 5 ) :
n = notifications [ i ]
if str ( n [ ' id ' ] ) not in last_ids :
# Mentions data are HTML paragraphs so we delete everything between <> to clean it up
2024-10-15 19:18:52 +00:00
rawContent = n [ ' status ' ] [ ' content ' ] . replace ( " </br > " , " " )
text = BeautifulSoup ( rawContent , " html.parser " ) . get_text ( )
content = re . sub ( no_unicode_spaces_pattern , " " , text ) . split ( " " )
2023-04-23 11:47:16 +00:00
try :
first_mention = content [ 0 ]
target = " @ " + content [ 1 ]
user = " @ " + n [ ' account ' ] [ ' acct ' ]
except :
api . status_reply ( n [ ' status ' ] , mensaje_error )
continue
# The bot is meant to be anonymous so only allow directs
if n [ ' status ' ] [ ' visibility ' ] == " direct " :
if user == target :
api . status_reply ( n [ ' status ' ] , mensaje_mismo , visibility = " unlisted " )
else :
# Find account if it is not known by the server
try :
2024-10-15 19:31:56 +00:00
api . search ( target , result_type = " accounts " )
2023-04-23 11:47:16 +00:00
bio = api . account_lookup ( target )
except :
api . status_post ( user + mensaje_no_encontrado , in_reply_to_id = n [ ' status ' ] [ ' id ' ] , visibility = " direct " )
else :
if " nobot " in bio [ ' note ' ] :
api . status_reply ( n [ ' status ' ] , mensaje_nobot )
else :
#api.status_post(mensaje + target + "!", in_reply_to_id=n['status']['id'], visibility="unlisted")
2023-11-13 17:05:28 +00:00
if check_mode ( mode_croqueta_words , content ) :
2023-04-23 11:47:16 +00:00
new_status = api . status_post ( target + " " + mensaje_croqueta , visibility = " unlisted " )
2023-11-13 17:05:28 +00:00
elif check_mode ( mode_cumple_words , content ) :
new_status = api . status_post ( mensaje_cumple [ 0 ] + target + mensaje_cumple [ 1 ] , visibility = " unlisted " )
2023-04-23 11:47:16 +00:00
else :
new_status = api . status_post ( mensaje + target + " ! " , visibility = " unlisted " )
api . status_reply ( n [ ' status ' ] , ' Tu muestra de aprecio ha sido enviada ❤️ ' + new_status [ ' url ' ] , visibility = " direct " )
elif first_mention == " @apreciabot " and n [ ' status ' ] [ ' in_reply_to_id ' ] == None :
api . status_reply ( n [ ' status ' ] , mensaje_aviso , visibility = ' direct ' )
list_write ( bot_name , new_last_ids )