Browse Source

added "Fortuna" agent
added new options for testing

Pablo Barrera Yaksic 2 months ago
parent
commit
156a89fda8

+ 8 - 2
.env.example

@@ -1,7 +1,9 @@
 LOG_LEVEL = "debug"
 REDIS_CONN = "redis://localhost:6379/10"
 PUPPETEER_URL = "http://localhost:8000/api/v1/visit"
-MASTODON_URL = "https://<mastodon-domain>/api/v1/"
+MASTODON_URL = "https://<mastodon-domain>"
+MASTODON_API_URL = "https://<mastodon-domain>/api/v1/"
+MASTODON_STREAMING_URL = "wss://<mastodon-domain>/api/v1/streaming"
 MASTODON_ACCESS_TOKEN = "<access-token>"
 IMG_PLACEHOLDER = "https://placehold.co/600x400"
 
@@ -30,6 +32,10 @@ MASTODON_KEY_METROSANTIAGO = ""
 MASTODON_KEY_SISMOLOGIA = ""
 MASTODON_KEY_THECLINIC = ""
 
+## AGENTS
+MASTODON_KEY_FORTUNE = ""
+
 # Develop
 DEVELOP = false
-DEV_ACTIVE_PORTALS = "";
+DEV_ACTIVE_PORTALS = ""
+MASTODON_TEST_ACCESS_TOKEN = ""

+ 94 - 0
src/agents/fortune/fortune.ts

@@ -0,0 +1,94 @@
+import { createStreamingAPIClient, createRestAPIClient, mastodon } from "masto";
+
+import config from "../../config";
+import quotes from "./quotes";
+import Emojis from "../../enums/emojis";
+import LogLevels from "../../enums/log-levels";
+
+export default class Fortune {
+  private readonly _mastodonStreamingClient: mastodon.streaming.Client;
+  private readonly _mastodonRestClient: mastodon.rest.Client;
+
+  constructor (accessToken = config.MASTODON_TEST_ACCESS_TOKEN) {
+    this._mastodonStreamingClient = createStreamingAPIClient({ streamingApiUrl: config.MASTODON_STREAMING_URL, accessToken });
+    this._mastodonRestClient = createRestAPIClient({ url: config.MASTODON_API_URL, accessToken });
+  }
+
+  private async reply(inReplyToId: string | undefined, userName: string, iteration = 1, count = 1): Promise<void> {
+    let status = "";
+    let spoilerText;
+    let stop = false;
+    let result: mastodon.v1.Status;
+
+    if (count == 1) {
+      status = `${Emojis.FAIRY}: ${userName} prepárate para un viaje mágico ${Emojis.SPARKLES}`;
+      console.log("Sending status\n", status);
+      result = await this._mastodonRestClient.v1.statuses.create({ inReplyToId, status });
+      inReplyToId = result.id;
+      if (config.LOG_LEVEL === LogLevels.DEBUG) {
+        console.debug("Result", result);
+      }
+    }
+
+    console.log("Iteration", iteration++);
+    console.log("Count", count++);
+    iteration = count >= 4 ? 10 : iteration;
+    switch (iteration) {
+      case 1:
+        status = `${Emojis.GENIE}: "¡Oh! Ya lo veo..."`;
+        break;
+      case 2:
+        status = `${Emojis.MAGIC_SHELL}: ${Emojis.EAR} ${Emojis.WAVE} ${Emojis.WAVE} ${Emojis.WAVE}`;
+        break;
+      case 3:
+        status = `${Emojis.MAGIC_WAND}: "Alohomora!... ${Emojis.PADLOCK}"`;
+        break;
+      case 4:
+        status = `${Emojis.WIZARD}: "La magia no es mi fuerte, pero el caos sí ${Emojis.SPARKLES}"`;
+        break;
+      case 5:
+        status = `${Emojis.CRISTAL_BALL}: "Acércate... más cerca..."`;
+        break;
+      case 6:
+        status = `${Emojis.UNICORN}: "Flores! colores!" ${Emojis.RAINBOW}`;
+        break;
+      case 7:
+        status = `${Emojis.FAIRY}: ${Emojis.SPARKLES}`;
+        break;
+      default:
+        status = `${Emojis.MAGNIFYING_GLASS}${Emojis.SCROLL}: "${quotes[Math.floor(Math.random() * quotes.length)]}"`;
+        spoilerText = `Acá se encuentra tu fortuna ${Emojis.FORTUNE_COOKIE}`;
+        stop = true;
+    }
+
+    console.log("Sending status\n", status);
+    result = await this._mastodonRestClient.v1.statuses.create({ inReplyToId, spoilerText, status });
+
+    if (config.LOG_LEVEL === LogLevels.DEBUG) {
+      console.log("Result", result);
+    }
+
+    if (!stop && count < 4) {
+      setTimeout(async () => await this.reply(result.id, userName, iteration, count), 2000);
+    }
+  }
+
+  public async suscribe(): Promise<void> {
+    console.log("Listening to incoming events...");
+    for await (const event of this._mastodonStreamingClient.user.notification.subscribe()) {
+      switch(event.event) {
+        case "notification":
+          const {id, createdAt, url, content} = event.payload.status ?? {};
+          console.log("Event received\n", { id, createdAt, url, content });
+          await this.reply(event.payload.status?.id, event.payload.account.displayName, Math.floor(Math.random() * 10));
+          break;
+      }
+    };
+  }
+}
+
+try {
+  new Fortune().suscribe();
+} catch (error) {
+  console.error(error);
+}

+ 147 - 0
src/agents/fortune/quotes.ts

@@ -0,0 +1,147 @@
+export default [  
+  "No podemos dirigir el viento pero si ajustar las velas", 
+  "Es la fortuna y no la sabiduría lo que decide la vida de cada uno",
+  "Por cada minuto que estás enfadado, pierdes 60 segundos de felicidad",
+  "La felicidad no es hacer lo que uno quiere sino querer lo que uno hace",
+  "Escucha tu intuición, te ayudará a saber elegir",
+  "La vida es como una moneda, puedes gastarla como quieras pero sólo puedes hacerlo una vez",
+  "Tropezando se aprende a caminar",
+  "La paciencia es un árbol de raíz amarga pero de frutos muy dulces",
+  "Una acción vale más que todo un mundo de promesas",
+  "Si te caes siete veces, levantate ocho",
+  "En 2 palabras se puede resumir lo que debemos aprender de la vida: Sigue adelante",
+  "El mejor consejo siempre es la experiencia, pero siempre llega demasiado tarde",
+  "Si buscas resultados distintos, no hagas siempre lo mismo",
+  "El amor y la tos, no se pueden ocultar",
+  "Amar no es mirarse el uno al otro, es mirar en la misma dirección",
+  "Recuerda que peor que una mala decisión, es la indecisión",
+  "No rechaces una proposición que te harán la próxima semana",
+  "Responde lo que tu corazón te dicte",
+  "No dejes que la duda y la sospecha se interpongan en tu camino hacia adelante",
+  "Sé lento en hablar pero rápido en actuar No dejes que la oportunidad pase, porque puede no volver",
+  "Un viejo conocido volverá a tu vida",
+  "Guíate por tu instinto",
+  "Tus esfuerzos verán su recompensa dentro de poco",
+  "Eres un ganador, sigue siempre tu intuición",
+  "No lo dejes pasar... vuelve a intentarlo porque esta es tu oportunidad",
+  "¿Cómo quieres que te toque la lotería si no compras? Un amigo dudoso, puede ser un enemigo camuflado",
+  "Con un buen comienzo, estarás en el buen camino",
+  "Un amigo es un regalo que te haces a tí mismo",
+  "Una nueva perspectiva vendrá con el Nuevo Año",
+  "Una persona nunca es demasiado mayor para aprender",
+  "Una persona de palabras y no de hechos es como un jardín lleno de hierbajos",
+  "Sonríe, es tu mejor bienvenida",
+  "Hay un gran viaje a la vista",
+  "Fantásticas expectativas",
+  "Una vida verdaderamente rica contiene amor y arte en abundancia",
+  "Aconsejar es como besar",
+  "No cuesta nada y supone un placer",
+  "El consejo, cuanto más se necesita, menos atención se le presta",
+  "Todo el esfuerzo que estás haciendo últimamente se verá por fín reconpensado",
+  "Todos los problemas que tienes pasarán de largo en poco tiempo",
+  "Todo irá bien con tu nuevo proyecto",
+  "La belleza en todas sus formas, apela a tí",
+  "Como te exiges tanto, los demás te respetan más",
+  "El cambio está en tu vida, así que déjate fluir",
+  "Tu capacidad está subestimada",
+  "Enhorabuena",
+  "Estás en el buen camino",
+  "La educación comienza en casa",
+  "Dedícate con la mente relajada a la tarea que tienes entre manos",
+  "La desconfianza destruye la magia",
+  "Toma distancia de tu vanidad",
+  "Que no te intimide la elocuencia de los demás",
+  "No confundas la imprudencia con la confianza",
+  "No solo pienses: Actúa",
+  "No te preocupes: la prosperidad llamará a tu puerta muy pronto",
+  "Oblígate a hacer algo cada día que normalmente no harías",
+  "La educación es la capacidad de afrontar cualquier situación en la vida",
+  "Emula lo que admiras de tus padres",
+  "Emula lo que respetas de tus amigos",
+  "Cada flor florece en su momento más dulce",
+  "Del silencio viene la sabiduría y el arrepentimiento de la oratoria",
+  "Las buenas noticias llegarán por email",
+  "En un beso, sabrás todo lo que he callado",
+  "Si te caes siete veces, levántate ocho Es duro caer, pero es peor no haber intentado nunca subir El ignorante afirma, el sabio duda y reflexiona",
+  "La sabiduría consiste en saber cuál es el siguiente paso; la virtud, en llevarlo a cabo",
+  "Daría todo lo que sé, por la mitad de lo que ignoro Por muy larga que sea la tormenta, el sol siempre vuelve a brillar entre las nubes  Al final, lo que importa no son los años de vida, sino la vida de los años",
+  "En la vida no hay premios ni castigos, sino consecuencias Si ya sabes lo que tienes que hacer y no lo haces entonces estás peor que antes Si ayudo a una sola persona a tener esperanza, no habré vivido en vano El que busca la verdad corre el riesgo de encontrarla El futuro pertenece a quienes creen en la belleza de sus sueños",
+  "Es una locura amar, a menos de que se ame con locura El mundo está lleno de pequeñas alegrías: el arte consiste en saber distinguirlas",
+  "La sonrisa cuesta menos que la electricidad y da más luz Hay días en que la vida se me hace bola Todo es muy difícil antes de ser sencillo La suerte buena o mala es el pretexto de los fracasados",
+  "Suerte, es la palabra que usa Dios cuando quiere permanecer anónimo",
+  "La suerte es tener todo lo que se busca",
+  "La suerte no existe, simplemente todo depende de nuestros actos",
+  "Quien busca suerte no la encontrará, es ella la que te debe encontrar",
+  "La cualidad más notable de la suerte es que puede ser buena o mala",
+  "La fortuna favorece a la mente preparada",
+  "Mala suerte es el pretexto de los perdedores..",
+  "La suerte, suceso donde favorece al individuo y el deseo de todos",
+  "Suerte es estar en el lugar y en el momento adecuado",
+  "He pasado una vida intentando hacer lo que debería y no haciendo lo que se debe",
+  "Cuando quieras creer en alguien, sólo cree en ti",
+  "Hipocresía, morir de sed teniendo tanta agua, queriendo amar y estar indiferente",
+  "Si tratas a los demás como te gustaría ser tratado, pocos valores más serían necesarios",
+  "Aprendamos a valorar lo que tenemos y no lo que perdimos",
+  "Los valores son esas cosas que todo el mundo sabe que existen, pero siempre olvidan",
+  "Usa tus valores con astucia y ten valor para no ser tan solo astuto",
+  "Los valores son razones del corazón que la razón no entiende",
+  "Bebe de la fuente cuando tenga agua, no cuando tengas sed",
+  "La oportunidad la tuviste pero para volver a caer se necesita ser ciego",
+  "Cuando pierdes una oportunidad ganas una lección",
+  "Si no das oportunidad a un corazón, nunca sabrás cual es su intención.",
+  "Nunca dejes pasar una oportunidad que te haga feliz a tí, aunque a los demás no les guste",
+  "Las oportunidades como los autobuses, nunca se presentan cuando más llueve...",
+  "Cuando la oportunidad toca a la puerta, la tensión la patea y la echa por debajo de ésta",
+  "No conocemos la oportunidad hasta que ésta pasa por nuestro lado y la dejamos ir..",
+  "Todos buscan su oportunidad, el mundo es así de sencillo",
+  "Sólo hay dos cosas que nunca vuelven atrás, la palabra pronunciada y la oportunidad perdida",
+  "El fuego quema nuestros sueños, no dejes que también queme nuestra realidad",
+  "Si no le das la oportunidad a un corazón puedes perder la posibilidad de ser feliz",
+  "Oportunidad es cuando tu tienes el poder de aprovecharla, sino no, no lo es",
+  "Pedir perdón no es tan difícil; hacer a un lado el orgullo sí lo es",
+  "Lo bueno se hace esperar y, aunque a veces llega tarde, siempre llega",
+  "Somos lo que hacemos para cambiar lo que somos",
+  "La forma más disimulada de dejar de amar a alguien es volver a empezar a quererlo",
+  "Fácil es ser bueno, difícil ser justo",
+  "No soy aburrido, sólo muy paciente",
+  "El aburrimiento es el primer paso de la desesperación",
+  "Por la puerta de la pereza entra el aburrimiento",
+  "El aburrimiento te ayuda a pensar o hacer cosas que no hubieses hecho si estuvieses ocupado en otra cosa",
+  "El aburrimiento es el placer de saber que no tienes nada que hacer No confundas tu Admiración con la Envidia..",
+  "El amor nace desde la admiración",
+  "No admires a nadie si no sabes admirarte a ti mismo...",
+  "Los mejores amigos son como las estrellas, aunque no siempre se ven, sabes que están ahí",
+  "Un amigo es aquel que conoce todos tus defectos y a pesar de ello te quiere",
+  "La única manera de poseer un amigo es serlo",
+  "Ofrecer amistad a quien pide amor es como dar pan a quien muere de sed",
+  "Un amigo es aquel que te tiende su mano aunque no la merezcas",
+  "La amistad supera a las circunstancias",
+  "Los amigos se hieren con la verdad para no destruirse con las mentiras",
+  "Si el día te sonríe, sonriele tu a él",
+  "Ríe cuando estes triste, llorar es demasiado fácil",
+  "La sonrisa es el idioma universal de los hombres inteligentes",
+  "No dejes de sonreir nunca; ni tan siquiera cuando estés triste, porque nunca sabes quién se puede enamorar de tu sonrisa",
+  "No hay día más perdido que aquél en el que no hemos reído",
+  "La sonrisa es el único virus que no hace daño al alma",
+  "Vivir con alegría no puede menos que agregar vida a los años",
+  "La alegría es uno de los objetivos de la vida",
+  "Una sonrisa alimenta el alma",
+  "Es de héroes sonreir cuando el corazón llora No existe la casualidad y lo que nos parece un mero accidente, surge de la más profunda fuente: el destino",
+  "No hagas nada hoy que comprometa tu mañana",
+  "Si no encuentras tu camino, háztelo",
+  "Si no intentas grandes cosas, no las lograrás",
+  "Síguete a ti mismo, sino te perderás",
+  "Si te sientas en el camino, hazlo mirando al camino que te queda por andar y no al camino ya andado",
+  "Que algo no funcione como tú esperabas no quiere decir que sea inútil",
+  "Antes de iniciar la labor de cambiar el mundo, da tres vueltas por tu propia casa El que no comete jamas ninguna tonteria nunca hará nada interesante",
+  "Jamás se desvía uno tan lejos como cuando cree conocer el camino",
+  "La astucia del que no tiene astucia es la paciencia",
+  "La promesa tiene piernas; sólo el don tiene manos",
+  "La preocupación, con frecuencia, proyecta una enorme sombra de algo muy pequeño",
+  "El sabio convive con la gente sin criticar, el necio critica sin convivir",
+  "Añorar el pasado es correr tras el viento",
+  "Si no quieres que nadie se entere, no lo hagas",
+  "Una mano sobre los ojos es suficiente para cubrir el cielo",
+  "Si tienes problemas, solucionalos; sino los tienes, no los busques",
+  "No siempre el mejor camino es el más corto."
+]

+ 7 - 3
src/config.ts

@@ -4,8 +4,9 @@ const config = {
   LOG_LEVEL: process.env.LOG_LEVEL ?? "debug",
   REDIS_CONN: process.env.REDIS_CONN ?? "redis://localhost:6379/10",
   PUPPETEER_URL: process.env.PUPPETEER_URL ?? "http://localhost:8000/api/v1/visit",
-  MASTODON_URL: process.env.MASTODON_URL ?? "https://mastodon.cl/api/v1/",
-  MASTODON_ACCESS_TOKEN: process.env.MASTODON_ACCESS_TOKEN ?? "",
+  MASTODON_URL: process.env.MASTODON_URL ?? "https://mastodon.cl",
+  MASTODON_API_URL: process.env.MASTODON_API_URL ?? "https://mastodon.cl/api/v1/",
+  MASTODON_STREAMING_URL: process.env.MASTODON_STREAMING_URL ?? "wss://mastodon.cl/api/v1/streaming",
   IMG_PLACEHOLDER: process.env.IMG_PLACEHOLDER ?? "https://placehold.co/600x400",
   // PORTALES
   CHILECULTURA: process.env.CHILECULTURA ?? "https://chilecultura.gob.cl/events/",
@@ -31,9 +32,12 @@ const config = {
   MASTODON_KEY_METRODESANTIAGO: process.env.MASTODON_KEY_METRODESANTIAGO ?? "",
   MASTODON_KEY_SISMOLOGIA: process.env.MASTODON_KEY_SISMOLOGIA ?? "",
   MASTODON_KEY_THECLINIC: process.env.MASTODON_KEY_THECLINIC ?? "",
+  // AGENTS
+  MASTODON_KEY_FORTUNE: process.env.MASTODON_KEY_FORTUNE ?? "",
   // Develop
   DEVELOP: !(process.env.DEVELOP === "false"),
-  DEV_ACTIVE_PORTALS: process.env.DEV_ACTIVE_PORTALS?.split(";") ?? []
+  DEV_ACTIVE_PORTALS: process.env.DEV_ACTIVE_PORTALS?.split(";") ?? [],
+  MASTODON_TEST_ACCESS_TOKEN: process.env.MASTODON_TEST_ACCESS_TOKEN ?? "",
 };
 
 export default config;

+ 16 - 0
src/enums/emojis.ts

@@ -1,13 +1,29 @@
 enum Emojis {
   CALENDAR = "📆",
+  CRISTAL_BALL = "🔮",
   DEPTH = "🕳️",
+  EAR = "👂",
+  FAIRY = "🧚",
+  FORTUNE_COOKIE = "🥠",
+  GENIE = "🧞‍♂️",
   LINK = "🔗",
   LOCATION = "📍",
+  MAGIC_SHELL = "🐚",
+  MAGIC_WAND = "🪄",
+  MAGNIFYING_GLASS = "🔎",
   MAGNITUDE = "🎚️",
   NEWS = "📰",
+  PADLOCK = "🔓",
   PIN = "📍",
+  RAINBOW = "🌈",
+  SCROLL = "📜",
   SIREN = "🚨",
+  SLOT_MACHINE = "🎰",
+  SPARKLES = "✨",
   TAGS = "🏷️",
+  UNICORN = "🦄",
+  WAVE = "🌊",
+  WIZARD = "🧙🏼‍♂️💭",
 };
 
 export default Emojis

+ 13 - 14
src/portales/portal.ts

@@ -1,5 +1,5 @@
 import { type Handler } from "aws-lambda";
-import { createRestAPIClient } from "masto";
+import { createRestAPIClient, mastodon } from "masto";
 
 import ScraperArticles from "../utils/scraper-articles";
 import RedisClient from "../libs/redis-client";
@@ -13,14 +13,16 @@ export default class Portal {
   private readonly _name: string;
   private readonly _scraperArticlesOptions: IScraperArticlesOptions
   private readonly _redisClient: RedisClient;
-  private readonly _mastodonClient: any
+  private readonly _mastodonClient: mastodon.rest.Client
   private readonly _scraperArticles: ScraperArticles;
 
-  constructor (name: string, accessToken: string, scraperArticlesOptions: IScraperArticlesOptions) {
+  constructor (name: string, accessToken = config.MASTODON_TEST_ACCESS_TOKEN, scraperArticlesOptions: IScraperArticlesOptions) {
     this._name = name;
     this._scraperArticlesOptions = scraperArticlesOptions;
     this._scraperArticles = new ScraperArticles(this._name, this._scraperArticlesOptions);
     this._redisClient = new RedisClient();
+
+    accessToken = config.DEVELOP ? config.MASTODON_TEST_ACCESS_TOKEN : accessToken;
     this._mastodonClient = createRestAPIClient({ url: config.MASTODON_URL, accessToken });
   }
 
@@ -67,16 +69,12 @@ export default class Portal {
           message = message.substring(0, 397) + "...";
         }
 
-        message += `\n${Emojis.LINK} ${article.link}`;
-
         // Adding hashtags if there is
         if (this._scraperArticlesOptions.hashtags) {
-          message += `\n${Emojis.TAGS} ` ;
-          this._scraperArticlesOptions.hashtags.forEach(hashtag => {
-            message += "#" + hashtag + " "
-          });
+          message += `${Emojis.TAGS} ${this._scraperArticlesOptions.hashtags?.map((hastag) => `#${hastag}`).join(" ")}\n\n`;
         }
-        message.trimEnd();
+
+        message += `\n${Emojis.LINK} ${article.link}`;
 
         if (this._name.toUpperCase() == "Chile Cultura".toUpperCase()) {
           // Icons Chilecultura
@@ -91,7 +89,8 @@ export default class Portal {
           // Expresión regular para capturar el texto antes del 📆 seguido de una fecha
           regex = new RegExp(/(.*?)📆 (\d{1,2} \w{3}( - \d{1,2} \w{3}))?/);
           message = message.replace(regex, (match, p1, p2) => {
-            return `🎭 ${p1 ? p1 : ""}\n📆 ${p2 ? p2 : ""}`;
+            const tags = p1 ? p1.split(" ").map(tag => `#${tag}`).join(" ") : "";
+            return `🎭 ${tags}\n📆 ${p2 ? p2 : ""}`;
           });
         }
 
@@ -101,16 +100,16 @@ export default class Portal {
           mediaIds.push(media.id);
         }
 
-        console.log(`\n${this._name} | Sending`, message);
+        console.log(`\n${this._name} | Sending\n`, message);
 
+        await this._mastodonClient.v1.statuses.create({ status: message, mediaIds });
+        totalPublished++
         if (!config.DEVELOP) {
-          await this._mastodonClient.v1.statuses.create({ status: message, mediaIds });
           await this._redisClient.store(
             article.link, 
             new Date(Date.now()).toLocaleDateString(), 
             { EX: this._scraperArticlesOptions.cacheExpiration ? this._scraperArticlesOptions.cacheExpiration : 60 * 60 * 24 } // EX: 24 hrs expiration
           );
-          totalPublished++
         }
       }
       console.log(`${this._name} | Published ${totalPublished} new articles`);

+ 10 - 6
src/portales/sismologiauchile/index.ts

@@ -1,5 +1,5 @@
 import { type Handler } from "aws-lambda";
-import { createRestAPIClient } from "masto";
+import { createRestAPIClient, mastodon } from "masto";
 
 import ScraperReports from "../../utils/scraper-reports";
 import RedisClient from "../../libs/redis-client";
@@ -13,10 +13,10 @@ export default class SismologiaCL {
   private readonly _name: string;
   private readonly _scraperReportsOptions: IScraperReportsOptions
   private readonly _redisClient: RedisClient;
-  private readonly _mastodonClient: any
+  private readonly _mastodonClient: mastodon.rest.Client;
   private readonly _scraperReports: ScraperReports;
 
-  constructor (name: string, accessToken: string, scraperReportsOptions: IScraperReportsOptions) {
+  constructor (name: string, accessToken = config.MASTODON_TEST_ACCESS_TOKEN, scraperReportsOptions: IScraperReportsOptions) {
     this._name = name;
     this._scraperReportsOptions = scraperReportsOptions;
     this._scraperReports = new ScraperReports(this._name, this._scraperReportsOptions);
@@ -49,7 +49,11 @@ export default class SismologiaCL {
         message += `\n${Emojis.MAGNITUDE} Magnitud: ${report.magnitude} - ${Emojis.DEPTH} Profundidad: ${report.depth}`;
         message += `\n${Emojis.LOCATION} ${report.location.replace(report.date, "").trim()}`;
         message += `\n${Emojis.LINK} ${report.link}`;
-        message += `\n${Emojis.TAGS} ${this._scraperReportsOptions.hashtags?.map((hastag) => `#${hastag}`).join(" ")}`
+
+        // Adding hashtags if there is
+        if (this._scraperReportsOptions.hashtags) {
+          message += `\n${Emojis.TAGS} ${this._scraperReportsOptions.hashtags?.map((hastag) => `#${hastag}`).join(" ")}`;
+        }
 
         if (message.trim().length === 0) {
           continue;
@@ -63,10 +67,10 @@ export default class SismologiaCL {
 
         console.log(`\n${this._name} | Sending\n`, message);
 
+        await this._mastodonClient.v1.statuses.create({ status: message, mediaIds });
+        totalPublished++;
         if (!config.DEVELOP) {
-          await this._mastodonClient.v1.statuses.create({ status: message, mediaIds });
           await this._redisClient.store(report.link, date, { EX: 60 * 60 * 168 }); // EX: 1 week
-          totalPublished++;
         }
       }
       console.log(`${this._name} | Published ${totalPublished} new reports`);

+ 1 - 1
src/portales/sismologiauchile/run.ts

@@ -6,7 +6,7 @@ const name = "Sismología UdeChile";
 
 new SismologiaCL(
   name, 
-  config.MASTODON_KEY_SISMOLOGIA,
+  config.DEVELOP ? config.MASTODON_TEST_ACCESS_TOKEN : config.MASTODON_KEY_SISMOLOGIA,
   {
     url: config.SISMOLOGIA,
     reportsSelector: "table.sismologia tbody tr.percibido",