Kit de construcción para Discord Bot 🤖

Propósito de este plugin

Este plugin realiza varias funciones:

  1. Te permite alimentar un bot de Discord usando tu servidor Discourse para realizar tareas que vinculen ambos sistemas. Haz un fork de este repositorio y amplíalo con Ruby simple para crear todo tipo de funcionalidades para el bot.

  2. Funcionalidad existente que sirve como ejemplos y utilidad práctica:

  • Proporciona cierta publicación automática bidireccional de contenido que cumple ciertos criterios.
  • Comando para copiar mensajes de forma ad hoc a Discourse.
  • Comando para sincronizar la pertenencia a grupos con la pertenencia a roles de tu servidor de Discord con tu instancia de Discourse.

El plugin proporciona un esqueleto extensible sobre el cual podrías construir características adicionales. Se aceptan PRs para adiciones generalmente útiles.


\u003csup\u003eestos no son los dos comandos de sincronización, solo una ilustración de la interacción del bot que es posible. El segundo comando en la captura de pantalla fue obsoleto durante el desarrollo ;)\u003c/sup\u003e

Su configuración es necesariamente compleja, pero es excelente para los fanáticos de ambos sistemas que están dispuestos a invertir el tiempo en entender cómo funciona cada uno, al menos a nivel funcional y conceptual. Necesitas entender algunos de los fundamentos de cómo funciona la gestión de usuarios de Discourse y Discord para sacar el máximo provecho de este plugin.

Comandos del Bot

Hay cuatro comandos:

  1. Ping!
  2. !disckick
  3. !discsync
  4. !disccopy

Ping!

Para verificar si el bot está respondiendo, simplemente escribe “Ping!” y el bot debería responder con “:robot: : Pong!” - maravilloso, ¿verdad? :smiley: (esto es un poco de meme, por cierto!)

!disckick <nivel_mínimo_de_confianza: predeterminado 2>

Escribir esto expulsará a cualquier usuario que exista en tu Discourse pero con un Nivel de Confianza inferior al valor proporcionado. El valor predeterminado si no proporcionas uno es 2.

ej.:

!discsync <limpiar: predeterminado false, visibilidad_mínima: predeterminado 0, incluir grupos automatizados: predeterminado false>

Este comando intentará copiar todos los grupos a Roles en Discord que coincidan con los criterios proporcionados (o los predeterminados si no se proporcionan). Luego intentará poblar los roles según la pertenencia a Grupos en Discourse. Es una sincronización unidireccional únicamente. Nunca se modifica ningún dato de Discourse.

!disccopy <número_de_mensajes> <nombre_de_categoría_destino_opcional> <nombre_de_tópico_destino_opcional>

Te permite copiar el historial de mensajes de Discord a tu instancia de Discourse desde el chat de Discord. Esto puede manejar miles de mensajes de una sola vez (pero para ese volumen tomará tiempo).

Comunicación bidireccional

Estos son los ajustes

  • 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 Tópico 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 Tópico (uno o ambos).
  • Copia automatizada 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 a Discourse.

image

Además, he agregado un nuevo archivo para gestionar 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 utilidad general para la comunidad).

NB: Para cualquier mensaje copiado en Discourse desde Discord, el Usuario se mostrará correctamente si ese usuario ha iniciado sesión en Discourse usando el inicio de sesión con Discord (por lo que el Bot de Discord puede coincidir con los usuarios).

Estado de este plugin

Este es un plugin complejo de configurar. Eso fue bastante inevitable.

Sin embargo, es un juego de niños de usar una vez que todo está funcionando.

Considera el código como actualmente en Beta. Ha sido probado, incluso en Producción, pero es probable que contenga errores. Recomiendo probarlo primero en un servidor de Discord nuevo antes de aplicarlo a tu servidor principal de Discord en “Producción”, a menos que apenas estés comenzando.

Cualquier error es mucho más probable que afecte tu instancia de Discord que tu instancia de Discourse, porque no se realizan cambios en Discourse. Sin embargo, lo he escrito de una manera que significa que la mayoría de las cosas son recuperables y usualmente puedes simplemente repetir algo para solucionar un problema. Discourse se utiliza como maestro para la información de membresía y grupos, y estos datos se utilizan para actualizar la membresía y los Roles en tu servidor de Discord.

Instrucciones de configuración

Prerrequisitos

  1. un servidor de Discord en el que seas Administrador
  2. una Aplicación de Discord (ver abajo)
  3. un Bot de Discord (ver abajo)
  4. acceso root ssh a tu servidor Discourse
  5. actualizaciones en app.yml para instalar el plugin
  6. Todos los usuarios de tu Discourse necesitarán iniciar sesión usando el inicio de sesión OAuth de Discord que aparecerá en tu página de inicio de sesión una vez instalado el plugin.

Aplicación de Discord

Ve aquí y crea una aplicación:

Haz clic en “Nueva Aplicación”

Necesitarás crear un Bot y se verá algo así (déjalo no ‘público’):

Necesitarás autorizar al bot en el navegador, ver OAuth2 - Documentation - Discord

Una vez configurado el bot, copia el Token. Necesitarás ingresarlo en Discourse más tarde.

Cambios en app.yml

plugin

Solo necesitas un plugin para esto ahora que el Inicio de Sesión Social de Discord es nativo del núcleo de Discourse (¡guau :tada: )

Luego en el prompt ./launcher rebuild app como de costumbre.

Esto debería funcionar, sin problemas.

Puedes obtener algunos errores en la consola y en los registros que indican un fallo del bot en la primera compilación ya que aún no has ingresado las credenciales del bot en la interfaz frontal de la configuración de Discourse. (manejar esto de manera más elegante es una tarea pendiente, eliminaré esta parte cuando se haga). Sin embargo, no causará ningún daño y Discourse en sí funcionará con normalidad.

Una vez en tu área de administración de Discourse, ve a Configuración del Plugin y completa esto:

Obtendrás los IDs de la interfaz de Discord. Necesitarás activar el Modo Desarrollador para permitirte copiar estos IDs. En Discord, ve a tu Configuración - \u003e Apariencia - \u003e AVANZADO y habilita el Modo Desarrollador:

Luego puedes obtener los IDs desde la interfaz, ej.:

También necesitarás completar la configuración de OAuth de Discord. El ID de Cliente y el Secreto provienen de tu misma Aplicación de Discord.

Una vez que hayas configurado esto, vuelve a tu prompt raíz en Linux y escribe:

./launcher restart app

Si has configurado correctamente tus servidores de Discord y Discourse, deberías ver que el bot se une al servidor.

Si alguna vez el bot falla (se desconectará), necesitarás hacer lo mismo nuevamente para traerlo de vuelta. Una mayor independencia del bot del servidor principal de Discourse es una tarea pendiente. Dicho esto, he ejecutado un bot en Producción durante mucho tiempo y aún no ha fallado.

¿Próximos comandos?

Si tienes una idea para otro comando que aproveche el vínculo entre Discourse y Discord y crees que sería útil para la comunidad más amplia, házmelo saber en las respuestas y podemos explorar el potencial de implementarlo. NB: este bot no está destinado a realizar tareas fuera del alcance de Discourse.

Limitaciones

El objetivo principal de este plugin fue permitir al usuario crear un bot en su Discord que fuera alimentado por su servidor Discourse y pudiera realizar algunas funciones básicas de gestión de membresía. También proporciona una base para cualquier interacción adicional tipo bot entre los dos sistemas en el futuro. Parte de la motivación para usar bots es que son simplemente divertidos.

Los comandos del bot son ad hoc por su propia naturaleza.

Problemas conocidos

  • El bot iniciará una instancia de sí mismo si entras en una sesión de consola rails en el servidor. Esto hará que el bot parezca responder dos veces (pero en realidad ahora hay dos bots). En la consola rails simplemente detén el bot adicional escribiendo: ::DiscordBot::Bot.discord_bot.stop Esto ya no debería ser necesario.

  • El Robot es un poco parlanchín durante las actualizaciones de Discourse en ‘línea’ ya que sigue siendo reactivado durante el proceso de actualización. Esto se debe a encontrar una buena manera de ejecutar el bot en un proceso separado y gestionado en lugar de un hilo derivado del servidor web. Creo que todo esto es inofensivo, pero si la salida de los bots es solo a tu canal de administración en Discord, ¿realmente te importa? Esto debería estar casi resuelto ahora, con el bot anunciándose solo dos veces durante una reconstrucción.

Gracias

Hay varios patrocinadores a quienes agradecer por este plugin, lo cual me llevó mucho tiempo llegar a esta etapa, incluyendo a @Wedgebert, @FoohonPie. Gracias a Jeff por su generosa contribución. Gracias a @angus por todo el aliento y por gestionar el apoyo financiero.

El plugin fue inspirado por el trabajo que @Watercolor_Games realizó en una etapa anterior y depende del plugin de OAuth de Discord creado por @featheredtoast.

El plugin depende de la biblioteca Ruby discordrb semi-oficial respaldada por Discord y del trabajo fantástico que el equipo de Discord ha realizado para hacer accesible su sistema. Gracias a @Falco por ayudarme con una dependencia de una manera extremadamente receptiva.

Además, por supuesto, esto no sería posible sin el increíble ecosistema de plugins de Discourse (¡guau!)

Estado de estas instrucciones

Se mejorarán con el tiempo y agradezco los comentarios. Hay áreas que seguramente serán poco claras.

47 Me gusta
Discord<-> Discourse Selective Group Sync
Discord login and obtain discord roles in discourse
Discord and Discourse - Better Together | Blog
Convert Existing Plugin to do Discord to Discourse role/group sync
Slack Bot Construction Kit :robot:
2019: The Year in Review
Creat a user automatically when granted a Discord Role?
Discord Sync: sync a Discourse forum with a Discord server
Creating bot on discourse
Using "custom" ruby gems
Discourse Trust Levels for Discord
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Copy + Pasting text from Discord into Discourse mangles paragraph breaks
Discord Role Badge Sync
Discord Bot: Topics not Posts
How do I go about making a very customized theme?
API feature request for additonal info about external accounts
Can anyone help me to add chat option of discord on forum?
How to Integrate/Sync Discord User MEE6 Points with Discourse Leaderboard?
LF Developer, Theme Creator, and Discord/Discourse Hero
Discord Sync: sync a Discourse forum with a Discord server
[PAID] Discourse/Discord integration needed (roles/user groups)
Can anyone help me to add chat option of discord on forum?
Discord and Discourse - Better Together | Blog
How to easily make Discourse bots?
Discourse to Discord bot possible?
Migrating from Discord to Discourse
Convert Existing Plugin to do Discord to Discourse role/group sync
Is migration from other chat apps supported?
Partially enable login option
Introducing Discourse Chat (BETA)
Which instant messenger do you use with Discourse?
Request widgetbot.io
Discord Sync: sync a Discourse forum with a Discord server

¡Hola! Me interesa mucho esto.

¿Sería posible lo contrario? Me encantaría tener una forma de configurar Discourse para mi servidor de Discord. No estoy seguro de si existe un evento de la API de Discord para la asignación de roles, pero probablemente podrías verificar cuándo alguien inicia sesión con Discord o usar CRON.

2 Me gusta

Sí, absolutamente.

Podrías construirlo como un comando de bot para aplicaciones bajo demanda, pero con una función de repetición que vuelva a ejecutar el comando después de un tiempo (agradable, pero no muy transparente y sin forma de gestionar individualmente estas repeticiones).

O BIEN

Como insinué anteriormente, programarlo como un trabajo en Discourse mediante Sidekiq. Esto podría ser un plugin separado (de hecho, empecé el esqueleto de ese enfoque antes de pasar a una solución solo de bot, principalmente porque el enfoque de ‘bot’ era más bien lo típico de Discord: divertido y ofrecía un enfoque y resultado únicos), pero si puedo lograr que Discourse ejecute comandos de bot, entonces eso queda sin efecto (aún no he tenido la oportunidad de probarlo). De esa manera, podríamos escribir el código una sola vez y que funcione en ambos casos (¡qué bien!).

Ambas soluciones dependerían del mismo inicio de sesión con OAuth.

Aunque esta es una excelente idea, no puede ser una prioridad para mí en este momento porque tengo mucho otro trabajo de clientes que debo entregar. Sin embargo, si deseas apoyar dicha extensión, podemos hablarlo fuera de línea mediante un mensaje privado y programarlo.

4 Me gusta

Puede ser interesante experimentar con ello, pero no tengo ni cerca el nivel de habilidad necesario para voluntariarme en el desarrollo o mantenimiento de un complemento como este. Quizás en algún momento cree una bifurcación desordenada, pero definitivamente no quiero que mi nombre aparezca en nada oficial. :slight_smile:

3 Me gusta

¡Manéjense sin miedo! Es la única forma de aprender. :).

4 Me gusta

Se ha implementado una corrección menor de errores:

Obtuve esto durante la reconstrucción:

El bot sigue sin estar en línea. Verifiqué todo tres veces y está configurado correctamente. No estoy seguro de cómo proceder ahora… ¿Quizás necesito abrir un puerto en mi instancia del servidor?

2 Me gusta

Gracias por probarlo y tan poco después de la actualización. Intentaré reproducirlo y te avisaré. No he cambiado nada con respecto a la configuración del puerto.

2 Me gusta

Aquí no hay problemas al reconstruir, el Bot se inicia correctamente… ¿has cambiado algo en la configuración de tu servidor en el ínterin?

Tu 400 Bad Request suena como si tu servidor hubiera enviado una solicitud corrupta o inválida al servidor de Discord y esta fue la respuesta. Esto sugiere que la recibió correctamente y no fue bloqueada.

Puedes obtener esto por:

  • solicitudes malformadas
  • falta de autorización
  • exceder los límites de velocidad

Desafortunadamente, el mensaje de error no parece ayudarnos a determinar cuál de estos fue el problema específico.

Suponemos que tu Discourse está activo, ¿verdad? Verifica que todas las configuraciones de los plugins estén completadas correctamente.

Solo para descartar un problema temporal, ejecuta ./launcher restart app cuando tengas oportunidad… esto dejará tu sitio fuera de línea solo por unos segundos (¡lo sentimos por eso!).

Veo que ejecuta el bot en el bloque after_initialize, por lo que evitará las migraciones (y las reconstrucciones) si el bot está mal configurado o si Discord está caído.

¿Quizás podrías intentar manejar esta excepción y simplemente registrarla?

5 Me gusta

¿Se ejecuta en un hilo separado? Entonces, supongo que eso no será un problema.

Sin embargo, esta llamada parece ejecutarse varias veces durante una reconstrucción, por lo que el problema principal será que un bot mal configurado podría realmente exceder los límites de tasa si la autorización falla demasiadas veces en rápida sucesión. Si eso ocurre, la cuenta, en el peor de los casos, podría quedar bloqueada durante algún tiempo.

En cualquier caso, haré un parche rápido para manejar esto con la implementación actual y reducir el impacto. Gracias por la sugerencia.

ACTUALIZACIÓN: @falco, esto está hecho, por ejemplo:

image

3 Me gusta

Primero, quiero darles las gracias por crear esto. Una vez que logre que funcione, será de gran ayuda para nosotros al gestionar nuestro Discourse y Discord para una comunidad de voluntarios.

Estoy obteniendo un error 400 al intentar ejecutar este bot. Antes de agregar este plugin, hemos estado utilizando con éxito el plugin oficial de autenticación de Discord y los webhooks a través del plugin de integración de chat. He verificado que ambos siguen funcionando correctamente.

Creé el bot dentro de la misma aplicación de Discord que había creado anteriormente, autoricé el bot en el servidor de Discord y aparece en la lista de miembros como desconectado. La documentación no especificaba qué valor de permisos aplicar, pero dado que la mayoría de los bots de Discord que he encontrado lo solicitaban, configuré el valor de permisos en 8 para Administrador.

Dentro del servidor de Discord, copié el ID del rol que creó, que lleva el nombre de mi aplicación, y el ID del canal de texto para administradores. Agregué el rol de la aplicación a ese canal con todos los derechos, solo para asegurarme, y luego añadí los IDs a Discourse y reinicié.

Lamentablemente, sin importar lo que intente, sigo obteniendo un error 400. Incluso intenté una reconstrucción solo para estar seguro.

3 Me gusta

Gracias, son palabras muy amables. Esto también fue posible gracias a la generosidad de los financiadores.

Sí, eso es excelente. Debería tener permisos de Administrador.

Este es el segundo informe sobre este problema.

Si eliminas intencionalmente el último carácter del token en la configuración (recuerda qué es esto), ¿obtienes un error 401 en su lugar?

Muy bien, movamos esto a mensajes privados porque podría complicarse :wink: (siempre podemos publicar la solución aquí).

4 Me gusta

Solo para publicar una actualización por si alguien más ve esto: estamos investigando activamente el problema, pero aún no hemos identificado la causa. Diría que si alguien más está experimentando este problema, por favor lo comente; ayudaría tener a otras personas haciendo pruebas.

1 me gusta

Esto ya está solucionado. Fue un caso extraño de rastrear.

Gracias a @ransim por plantearlo y trabajar conmigo para llegar al fondo del asunto.

Un enorme agradecimiento al grupo #ruby_discordrb en Discord API por su ayuda paciente e inmediata.

@neemiasvf

5 Me gusta

@merefield no hay problema, tu plugin es genial. Pero ahora he encontrado algunos problemas.
como este:

Discourse Sync:  Iniciando. Por favor, ten paciencia, estoy limitado por la tasa de solicitudes para respetar los servicios de Discord.
Discourse Sync:  Verificando si hay algún grupo elegible para sincronizar ...
Discourse Sync: Se encontraron 1 grupo(s) elegible(s)
Discourse Sync: Preparando lista de usuarios que también tienen una cuenta registrada en Discord ...
Discourse Sync: Preparando lista de grupos a los que pertenecen en Discourse los usuarios que tienen una cuenta registrada en Discord ...
Discourse Sync: No se encontraron 0 grupo(s) elegible(s) con usuarios de Discord
Discourse Sync: ¡No se encontraron usuarios en los grupos elegibles para sincronizar usando los criterios proporcionados o predeterminados!

mi comando es: !discsync 4

y el comando cambiado: !discsync false 5 false

Discourse Sync:  Iniciando. Por favor, ten paciencia, estoy limitado por la tasa de solicitudes para respetar los servicios de Discord.
Discourse Sync:  Verificando si hay algún grupo elegible para sincronizar ...
Discourse Sync: Se encontraron 10 grupo(s) elegible(s)
Discourse Sync: Preparando lista de usuarios que también tienen una cuenta registrada en Discord ...
Discourse Sync: Preparando lista de grupos a los que pertenecen en Discourse los usuarios que tienen una cuenta registrada en Discord ...
1 me gusta

Hola @p0nda, disculpa la tardanza en responder.

Si incluyes algún parámetro, debes incluirlos todos. Es posible que el sistema esté interpretando algo de forma extraña.

3 Me gusta

¿No puedes hacer que aparezcan la configuración extendida del bot? He realizado los cambios en app.yml y he instalado los plugins. Tengo configurado el OAuth correctamente, pero no la configuración del bot. ¿Alguna idea?

1 me gusta

La configuración de OAuth está presente, pero no hay configuración de bot.

1 me gusta


Estas

2 Me gusta