Kit de construcción para Discord Bot 🤖

Genial. Por cierto, estaré encantado de considerar cualquier mejora genérica útil para este plugin en caso de que decidas volver a programar :wink:

2 Me gusta

De acuerdo, empecemos despacio. Acabo de enviar mi primera solicitud de extracción a este repositorio :smile:.

4 Me gusta

fusionado :slight_smile: ¡gracias!

4 Me gusta

¡Hola! He estado intentando encontrar un plugin que asigne a los usuarios de Discord un rol basado en las insignias que tienen en su perfil de Discourse. ¿Es esto posible con tu plugin? Si no lo es, ¿es posible en absoluto? ¡Gracias!

2 Me gusta

Por ahora no, pero no hay razón por la que no puedas bifurcarlo y añadir un comando apropiado para implementar eso.

Si se implementa bien, consideraría fusionar un PR. Sin embargo, podría ser un poco específico para un uso general, ya que presumiblemente tendrías que mantener algún tipo de mapeo, a menos que los nombres de las insignias sean los mismos que los nombres de los roles. De cualquier manera, tendrías que filtrar la mayoría de ellos. Eso podría volverse desordenado para un uso general. Si encuentras una forma realmente limpia de gestionar esto que funcione para los usuarios generales del plugin, házmelo saber.

¡Pero adelante, bifúrcalo y haz lo que quieras!

2 Me gusta

Definitivamente me gustaría ver si es posible. Eso me haría aún más interesado en este complemento. :smiley:

1 me gusta

Solo una pequeña pregunta: ¿tenemos que ejecutar manualmente !discsync cada vez que queremos actualizar los roles, o es automático?

2 Me gusta

Desafortunadamente, sí. Sería una buena mejora añadir un parámetro ‘repetir en x horas’ (se aceptan PRs o puedes contratarme para implementarlo), pero como ya he mencionado antes en este tema, sería mejor que alguien creara un nuevo plugin utilizando su API y programara trabajos programados en Sidekiq para ello. Un bot es una solución divertida, pero no la mejor arquitectura para la sincronización programada.

2 Me gusta

Ah, gracias de todos modos. Sí, ya hemos pensado en una posible alternativa…
Queríamos sincronizar los grupos de Discourse con los roles de Discord, pero parece que no hay una solución perfecta que se ajuste.

Ahora vamos a crear un tipo de bot usando webhooks: Discourse activará un webhook cuando se actualicen los grupos de un usuario (o también si cambia su nombre de usuario) hacia una solución personalizada, que luego asignará roles en Discord. Seguiremos utilizando la opción de OAuth de Discord para obtener los servidores (guilds), y al crear una consulta personalizada en Data Explorer, podremos obtener esos servidores a través de la API.

Sería algo así:

  1. El usuario cambia de grupo o de nombre de usuario
  2. Se activa un webhook hacia la solución personalizada
  3. Esta solución personalizada llamará de nuevo a la API de Data Explorer para ejecutar una consulta personalizada que devuelva los servidores del usuario
  4. Con ese servidor, llamamos a Discord para actualizar los roles
2 Me gusta

Un trabajo por lotes adecuado sería mejor para no perder la integridad de los datos debido a fallos ocasionales de eventos. Ambas opciones serían perfectas.

2 Me gusta

Bueno, no pasé por ese camino… :sweat_smile:
He bifurcado tu repositorio y creado un nuevo plugin que se ajusta a nuestras necesidades:

Básicamente sincroniza todos los grupos con roles de Discord, pero de forma automática. Cuando un usuario se añade o elimina de un grupo, se ejecutará un trabajo de sincronización y se actualizarán sus roles según los grupos públicos. Además, he añadido una opción para marcar un “rol verificado”, que se asignará a todos los usuarios que tengan una cuenta en Discourse. También soporta añadir una lista de roles seguros, los cuales el bot ignorará al sincronizar usuarios (útil, por ejemplo, si quieres establecer administradores y moderadores diferentes en el servidor que en el foro).
También he añadido un sincronizador de nombre de usuario-apodo. Puede obligar a que los usuarios tengan el mismo apodo en el servidor que el nombre de usuario en el foro.

Abriré un tema en #plugin después de limpiar algunas cosas, ya que quizás alguien lo encuentre útil.

7 Me gusta

@barreeeiroo lo realmente interesante de tu fork fue tu aprovechamiento de los hooks de DiscourseEvents.

Había asumido que eso no era posible porque el bot se ejecuta en un hilo separado. Pero como has descubierto, parece que podemos actuar sobre eventos e influir en el bot. Así que gracias por eso, es una idea muy importante que podemos desarrollar de cara al futuro.

Por eso he empezado a adoptar esa técnica en el repositorio principal, comenzando con la capacidad de establecer algunas vigilancias en nuevas publicaciones o Temas que serán anunciadas en el canal de administración de Discord.

La funcionalidad puede ser de poco uso tal como está actualmente, pero demuestra el concepto para que otros lo aprovechen.

5 Me gusta

OK, he desarrollado un poco más el plugin y ya tengo un POC de comunicación bidireccional funcionando:

Estas son las nuevas configuraciones

  • Puedes designar un Canal de Anuncios en Discord en la configuración del plugin.

  • Ahora puedes escribir en el Canal de Anuncios de Discord asignado y esto publicará tu mensaje en el Tema de Discourse asignado en la configuración del plugin.

  • Puedes configurar una lista de Categorías en Discourse para publicar en el canal de Anuncios de tu Discord si alguien publica allí o agrega un nuevo Tema (una de las dos opciones o ambas).

Además, he agregado un nuevo archivo para gestionar los eventos de Discord compatibles con la API discordrb, siendo la lógica de Anuncios el primer ejemplo (siéntete libre de desarrollar nuevos y enviar un PR si son de uso general para la comunidad).

También he eliminado los cambios requeridos en app.yml para instalar libsodium-dev, ya que ahora es opcional al haber actualizado las dependencias y no es necesario para el plugin en este momento (no hay necesidad de manejar voz). Esto hará que la instalación sea mucho más sencilla.

9 Me gusta

Seguí las instrucciones de instalación y todo fue bien hasta el reinicio. El bot no se unió a la sala, así que revisé /logs:

¿Se refiere a discord_bot_token? Está completo y verifiqué el valor. ¿Alguna pista?

3 Me gusta

Mark, disculpa, de alguna manera me perdí esto.

¿Descubriste el problema?

¿Puedes actualizar e intentar la nueva versión y a partir de ahí seguiremos?

2 Me gusta

Una actualización importante financiada por el equipo de Discourse :tada:

FEATURES: nueva copia automática de mensajes y comando de copia de historial por merefield · Pull Request #4 ·
merefield/discourse-discord-bot (github.com)

  1. Un nuevo comando !disccopy <número-de-mensajes> <nombre-de-categoría-de-destino-opcional> <nombre-de-tema-de-destino-opcional> que te permite copiar el historial de mensajes de Discord (en ese canal) a tu instancia de Discourse desde el chat de Discord. Puede manejar de forma segura miles de mensajes a la vez (pero para ese volumen llevará tiempo).

  2. Copia automática de chat por mensaje, por canal a cualquier Categoría con el mismo nombre en Discourse: si el nombre del canal coincide con el nombre de la Categoría, copiará el mensaje en Discourse si esto está configurado:
    image

  3. Para cualquier mensaje copiado en Discourse desde Discord, el Usuario ahora se mostrará correctamente si ese usuario ha iniciado sesión en Discourse usando el inicio de sesión de Discord (por lo que el Bot de Discord puede hacer coincidir las cuentas de usuario).

  4. Se agregó soporte de localización para muchas funciones.

¡Gracias a @erlend_sh y al equipo de Discourse por especificar y patrocinar este trabajo! :pray:

Más cosas del bot próximamente :wink: :robot:

5 Me gusta

Si inician sesión con autenticación de Discourse o cualquier autenticación que no sea Discord OAuth, ¿este plugin simplemente los ignorará?

1 me gusta

No los ignora, simplemente no puede emparejar al usuario con la persona en el otro sistema. Como resultado, los mensajes copiados aparecerán como si fueran del “sistema”.

2 Me gusta

¿Se admiten hilos?

4 Me gusta

Todavía no, Klaus, pero potencialmente está en trámite. Esperando que se actualice la API de Ruby (bloqueo) y luego que un patrocinador añada esa función.

2 Me gusta