Kit de construction pour bot Discord đŸ€–

Objectif de ce plugin

Ce plugin effectue plusieurs tĂąches :

  1. Il vous permet d’alimenter un bot Discord Ă  l’aide de votre serveur Discourse pour effectuer des actions reliant les deux systĂšmes. Forkez ce dĂ©pĂŽt et Ă©tendez-le avec du Ruby simple pour crĂ©er toutes sortes de fonctionnalitĂ©s de bot.

  2. FonctionnalitĂ©s existantes servant d’exemples et d’utilitaires utiles :

  • Fournit une publication automatique bidirectionnelle de contenu rĂ©pondant Ă  certains critĂšres.
  • Commande pour copier des messages Ă  la demande vers Discourse.
  • Commande pour synchroniser l’appartenance aux groupes avec l’appartenance aux rĂŽles de votre serveur Discord et votre instance Discourse.

Le plugin fournit un squelette extensible sur lequel vous pouvez construire des fonctionnalités supplémentaires. Les PR pour des ajouts généralement utiles sont les bienvenues.


ce ne sont pas les deux commandes de synchronisation, mais simplement une illustration de l’interaction possible avec le bot. La deuxiĂšme commande de la capture d’écran a Ă©tĂ© obsolĂšte pendant le dĂ©veloppement :wink:

Sa configuration est nécessairement complexe, mais elle est idéale pour les fans des deux systÚmes qui sont désireux de consacrer du temps à comprendre le fonctionnement de chaque systÚme, au moins au niveau fonctionnel et conceptuel. Vous devez comprendre certains des fondamentaux de la gestion des utilisateurs de Discourse et de Discord pour tirer le meilleur parti de ce plugin.

Commandes du bot

Il existe quatre commandes :

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

Ping!

Pour vĂ©rifier si le bot rĂ©pond, tapez simplement « Ping! » et le bot devrait rĂ©pondre par « :robot: : Pong! » - magnifique, n’est-ce pas ? :smiley: (c’est un peu un mĂšme, au fait !)

!disckick <min_trust_level: défaut 2>

Taper cette commande expulsera tout utilisateur qui existe sur votre Discourse mais dont le niveau de confiance est inférieur à la valeur fournie. La valeur par défaut si vous ne fournissez pas de valeur est 2.

Par exemple :

!discsync <clean up: défaut false, min_visibility: défaut 0, include automated groups: défaut false>

Cette commande tentera de copier tous les groupes vers des RĂŽles sur Discord qui correspondent aux critĂšres fournis (ou aux valeurs par dĂ©faut si non fournis). Elle tentera ensuite de peupler les rĂŽles conformĂ©ment Ă  l’appartenance aux groupes sur Discourse. Il s’agit d’une synchronisation unidirectionnelle uniquement. Aucune donnĂ©e Discourse n’est jamais modifiĂ©e.

!disccopy <number_of_messages> <optional_target_category_name> <optional_target_topic_name>

Vous permet de copier l’historique des messages Discord vers votre instance Discourse depuis le chat Discord. Cela peut gĂ©rer des milliers de messages d’un coup (mais pour ce volume, cela prendra du temps).

Communication bidirectionnelle

Voici les paramĂštres :

  • Vous pouvez dĂ©signer un canal d’annonces sur Discord dans les paramĂštres du plugin.
  • Vous pouvez maintenant taper dans le canal d’annonces Discord assignĂ© et cela publiera votre message dans votre sujet Discourse assignĂ© dans les paramĂštres du plugin.
  • Vous pouvez configurer une liste de catĂ©gories dans Discourse pour publier dans le canal d’annonces de votre Discord si quelqu’un y publie ou ajoute un nouveau sujet (l’un, l’autre ou les deux).
  • Copie automatique de chat par message, par canal vers n’importe quelle catĂ©gorie identiquement nommĂ©e sur Discourse : si le nom du canal correspond au nom de la catĂ©gorie, le message sera copiĂ© dans Discourse.

image

De plus, j’ai ajoutĂ© un nouveau fichier pour gĂ©rer les Ă©vĂ©nements Discord pris en charge par l’API discordrb, la logique des annonces Ă©tant le premier exemple (n’hĂ©sitez pas Ă  en dĂ©velopper de nouveaux et Ă  soumettre une PR si cela est utile Ă  la communautĂ©).

NB : Pour tout message copiĂ© dans Discourse depuis Discord, l’utilisateur s’affichera correctement si cet utilisateur s’est connectĂ© Ă  Discourse en utilisant la connexion Discord (ainsi, le bot Discord peut faire correspondre les utilisateurs).

État de ce plugin

C’est un plugin complexe Ă  configurer. C’était inĂ©vitable.

Cependant, son utilisation est un jeu d’enfant une fois qu’il est entiĂšrement opĂ©rationnel.

ConsidĂ©rez le code comme Ă©tant actuellement en BĂȘta. Il a Ă©tĂ© testĂ©, mĂȘme en production, mais contient probablement des bogues. Je recommande de le tester d’abord sur un nouveau serveur Discord avant de l’appliquer Ă  votre serveur Discord principal « Production », sauf si vous commencez tout juste.

Tout bug est beaucoup plus susceptible de perturber votre instance Discord que votre instance Discourse, car aucune modification n’est apportĂ©e Ă  Discourse. Cependant, je l’ai Ă©crit de maniĂšre Ă  ce que la plupart des choses soient rĂ©cupĂ©rables et que vous puissiez gĂ©nĂ©ralement simplement rĂ©pĂ©ter une action pour rĂ©soudre un problĂšme. Discourse est utilisĂ© comme maĂźtre pour les informations d’appartenance et de groupes, et ces donnĂ©es sont utilisĂ©es pour mettre Ă  jour l’appartenance et les rĂŽles sur votre serveur Discord.

Instructions de configuration

Prérequis

  1. Un serveur Discord sur lequel vous ĂȘtes administrateur.
  2. Une application Discord (voir ci-dessous).
  3. Un bot Discord (voir ci-dessous).
  4. Un accĂšs SSH root Ă  votre serveur Discourse.
  5. Des mises Ă  jour du fichier app.yml pour installer le plugin.
  6. Tous les utilisateurs de votre Discourse devront se connecter en utilisant la connexion OAuth Discord qui apparaßtra sur votre page de connexion une fois le plugin installé.

Application Discord

Rendez-vous ici et créez une application :

Cliquez sur « New Application ».

Vous devrez crĂ©er un bot et cela ressemblera Ă  ceci (laissez-le non ‘public’) :

Vous devrez autoriser le bot dans le navigateur, voir OAuth2 - Documentation - Discord

Une fois le bot configuré, copiez le jeton (Token). Vous devrez le saisir dans Discourse plus tard.

Modifications de app.yml

plugin

Vous n’avez besoin que d’un seul plugin maintenant que la connexion sociale Discord est native au cƓur de Discourse (ouais :tada: )

Ensuite, à l’invite, tapez ./launcher rebuild app comme d’habitude.

Cela devrait fonctionner, pas de problĂšme.

Vous pourriez obtenir des erreurs de console et de journal indiquant un Ă©chec du bot lors de la premiĂšre construction car vous n’avez pas encore saisi les identifiants du bot dans l’interface de configuration de Discourse. (gĂ©rer cela plus Ă©lĂ©gamment est une tĂąche Ă  faire, je supprimerai cette partie lorsque cela sera fait). Cela ne fera aucun mal et Discourse lui-mĂȘme fonctionnera normalement.

Une fois dans votre zone d’administration Discourse, allez dans Paramùtres du plugin et remplissez ces champs :

Vous obtiendrez les ID depuis l’interface Discord. Vous devrez activer le mode dĂ©veloppeur pour vous permettre de copier ces ID. Dans Discord, allez dans vos ParamĂštres → Apparence → AVANCÉ et activez le mode dĂ©veloppeur :

Vous pouvez ensuite obtenir les ID depuis l’interface, par exemple :

Vous devrez Ă©galement remplir les paramĂštres OAuth Discord. L’ID client et le secret proviennent de votre mĂȘme application Discord.

Une fois que vous avez défini ces paramÚtres, retournez à votre invite racine sous Linux et tapez :

./launcher restart app

Si vous avez correctement configuré vos serveurs Discord et Discourse, vous devriez voir le bot rejoindre le serveur.

Si jamais le bot plante (il passera hors ligne), vous devrez faire la mĂȘme chose pour le ramener. Une indĂ©pendance amĂ©liorĂ©e du bot par rapport au serveur cƓur de Discourse est une tĂąche Ă  faire. Cela dit, j’ai fait fonctionner un bot en production pendant longtemps et il n’a jamais plantĂ©.

Commandes futures ?

Si vous avez une idĂ©e pour une autre commande qui exploite le lien entre Discourse et Discord et que vous pensez ĂȘtre utile Ă  la communautĂ© plus large, faites-le-moi savoir dans les rĂ©ponses et nous pourrons examiner le potentiel de mise en Ɠuvre. NB : ce bot n’est pas destinĂ© Ă  effectuer des tĂąches en dehors du cadre de Discourse.

Limitations

L’objectif principal de ce plugin Ă©tait de permettre Ă  l’utilisateur de crĂ©er un bot sur son Discord alimentĂ© par son serveur Discourse et capable d’effectuer certaines fonctions de base de gestion des membres. Il fournit Ă©galement une base pour toute interaction supplĂ©mentaire de type bot entre les deux systĂšmes pour le futur. Une partie de la motivation pour utiliser des bots est qu’ils sont tout simplement amusants.

Les commandes de bot sont par nature ad hoc.

ProblĂšmes connus

  • Le bot dĂ©marrera une instance de lui-mĂȘme si vous accĂ©dez Ă  une session de console Rails sur le serveur. Cela fera apparaĂźtre le bot comme rĂ©pondant deux fois (mais en fait, il y a maintenant deux bots). Dans la console Rails, arrĂȘtez simplement le bot supplĂ©mentaire en tapant : ::DiscordBot::Bot.discord_bot.stop Cela ne devrait plus ĂȘtre nĂ©cessaire !

  • Le Robot est un peu bavard pendant les mises Ă  niveau Discourse ‘en ligne’ car il est rĂ©activĂ© Ă  plusieurs reprises pendant le processus de mise Ă  niveau. Cela revient Ă  trouver un bon moyen d’exĂ©cuter le bot dans un processus sĂ©parĂ© et gĂ©rĂ© au lieu d’un thread dĂ©rivĂ© du serveur web. Je crois que tout cela est inoffensif, et si la sortie des bots est uniquement vers votre canal d’administration sur Discord, est-ce que cela vous importe vraiment ? Cela devrait ĂȘtre rĂ©solu pour la plupart maintenant, le bot s’annonçant seulement deux fois lors d’une reconstruction.

Remerciements

Plusieurs contributeurs sont Ă  remercier pour ce plugin qui m’a pris beaucoup de temps pour atteindre ce stade, notamment @Wedgebert, @FoohonPie. Merci Ă  Jeff pour sa gĂ©nĂ©reuse contribution. Merci Ă  @angus pour tout l’encouragement et la gestion du soutien financier.

Le plugin a été inspiré par le travail de @Watercolor_Games à un stade antérieur et repose sur le plugin OAuth Discord créé par @featheredtoast.

Le plugin repose sur la bibliothĂšque Ruby discordrb semi-officielle soutenue par Discord et le travail fantastique de l’équipe Discord pour rendre leur systĂšme accessible. Merci Ă  @Falco pour m’avoir aidĂ© avec une dĂ©pendance de maniĂšre extrĂȘmement rĂ©active.

De plus, bien sĂ»r, cela ne serait pas possible sans l’incroyable Ă©cosystĂšme de plugins de Discourse (ouais !)

État de ces instructions

Elles seront amĂ©liorĂ©es avec le temps et j’accueille favorablement les commentaires. Il y a des zones qui sont susceptibles d’ĂȘtre obscures.

47 « J'aime »
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

Salut, je suis super intéressé par ça.

Serait-il possible de faire l’inverse ? J’aimerais pouvoir crĂ©er une configuration Discourse pour mon serveur Discord. Je ne sais pas s’il existe un Ă©vĂ©nement de l’API Discord pour l’attribution de rĂŽles, mais vous pourriez probablement vĂ©rifier quand quelqu’un se connecte avec Discord ou via CRON.

2 « J'aime »

Oui, tout Ă  fait.

Vous pourriez soit le développer en tant que commande de bot pour une application ponctuelle, mais avec une fonction de répétition qui relance la commande aprÚs un certain délai (pratique mais pas trÚs transparent et sans moyen de gérer individuellement ces répétitions)

OU

Comme je l’ai suggĂ©rĂ© plus haut, le programmer comme une tĂąche dans Discourse via Sidekiq. Cela pourrait nĂ©cessiter un plugin sĂ©parĂ© (j’avais en fait commencĂ© Ă  esquisser cette approche avant de passer Ă  une solution uniquement basĂ©e sur un bot, principalement parce que l’approche « bot » correspondait Ă  l’esprit Discord, Ă©tait amusante et offrait une approche et un rĂ©sultat uniques), mais si je parviens Ă  faire en sorte que Discourse dĂ©clenche des commandes de bot, cela deviendra secondaire (je n’ai pas encore eu l’occasion de tester cela), et nous pourrons alors Ă©crire le code une seule fois pour qu’il fonctionne dans les deux cas (super !).

Ces deux solutions reposeraient toutes deux sur la mĂȘme connexion OAuth.

Bien que ce soit une excellente idĂ©e, cela ne peut pas ĂȘtre une prioritĂ© pour moi pour le moment, car j’ai beaucoup d’autres travaux clients Ă  livrer actuellement. Cependant, si vous souhaitez soutenir le dĂ©veloppement d’une telle extension, nous pouvons en discuter en privĂ© par message privĂ© et le programmer.

4 « J'aime »

Cela pourrait ĂȘtre intĂ©ressant Ă  expĂ©rimenter, mais je suis loin d’avoir le niveau de compĂ©tence requis pour me porter volontaire afin de dĂ©velopper ou de maintenir un tel addon. Je pourrais Ă©ventuellement crĂ©er un fork un peu brouillon Ă  un moment donnĂ©, mais je ne veux absolument pas voir mon nom associĂ© Ă  quoi que ce soit d’officiel. :slight_smile:

3 « J'aime »

N’hĂ©sitez pas Ă  vous salir les mains. C’est le seul moyen d’apprendre. :).

4 « J'aime »

Correction d’un bug mineur dĂ©ployĂ©e :

J’ai obtenu ceci pendant la reconstruction :

Le bot est toujours hors ligne. J’ai vĂ©rifiĂ© trois fois tout et tout est correctement configurĂ©. Je ne sais pas comment procĂ©der maintenant
 Peut-ĂȘtre dois-je ouvrir un port sur mon instance de serveur ?

2 « J'aime »

Merci de tester cela, et si peu de temps aprĂšs la mise Ă  jour. Laissez-moi essayer de reproduire le problĂšme, et je reviendrai vers vous. Je n’ai rien modifiĂ© concernant la configuration du port.

2 « J'aime »

Aucun problÚme de reconstruction ici, Bot se lance correctement
 Avez-vous modifié quelque chose dans la configuration de votre serveur entre-temps ?

Votre 400 Bad Request indique que votre serveur a envoyĂ© une requĂȘte corrompue ou invalide au serveur Discord, et c’est la rĂ©ponse reçue. Cela suggĂšre que la requĂȘte a bien Ă©tĂ© reçue et n’a pas Ă©tĂ© bloquĂ©e.

Cela peut survenir dans les cas suivants :

  • requĂȘtes malformĂ©es
  • absence d’autorisation
  • dĂ©passement des limites de taux

Malheureusement, le message d’erreur ne semble pas nous permettre de dĂ©terminer laquelle de ces causes est en jeu.

Votre Discourse est-il censĂ© ĂȘtre en ligne ? VĂ©rifiez que tous les paramĂštres des plugins sont correctement remplis.

Pour Ă©carter un problĂšme temporaire, exĂ©cutez ./launcher restart app quand vous en avez l’occasion
 cela mettra votre site hors ligne pendant quelques secondes seulement (dĂ©solĂ© pour cela !).

Je vois qu’il lance le bot dans le bloc after_initialize, ce qui empĂȘchera les migrations (et les reconstructions) si le bot est mal configurĂ© ou si Discord est hors ligne.

Peut-ĂȘtre essayer de gĂ©rer cette exception et simplement la journaliser ?

5 « J'aime »

Il s’exĂ©cute sur un thread sĂ©parĂ© ? Donc je suppose que ce ne sera pas un problĂšme ?

Cependant, ce callback semble s’exĂ©cuter plusieurs fois lors d’une reconstruction, donc le problĂšme principal est qu’un bot mal configurĂ© pourrait rĂ©ellement dĂ©passer les limites de taux si l’authentification Ă©choue trop de fois en peu de temps. Si cela se produit, le compte pourrait, dans le pire des cas, ĂȘtre bloquĂ© pendant un certain temps.

En tout cas, je vais appliquer rapidement un correctif pour gĂ©rer cela avec l’implĂ©mentation actuelle afin d’en rĂ©duire l’impact. Merci pour la suggestion.

MISE À JOUR : @falco, c’est fait, par exemple :

image

3 « J'aime »

Tout d’abord, je tiens Ă  vous remercier d’avoir créé cet outil. Une fois que je parviendrai Ă  le faire fonctionner, il nous sera d’une grande aide pour gĂ©rer notre communautĂ© de bĂ©nĂ©voles sur Discourse et Discord.

Je rencontre une erreur 400 lors de l’exĂ©cution de ce bot. Avant l’ajout de ce plugin, nous utilisions avec succĂšs le plugin d’authentification Discord officiel et les webhooks via le plugin d’intĂ©gration de chat. J’ai vĂ©rifiĂ© que ces deux Ă©lĂ©ments fonctionnent toujours correctement.

J’ai créé le bot dans la mĂȘme application Discord que celle que j’avais prĂ©cĂ©demment configurĂ©e. Le bot a Ă©tĂ© autorisĂ© sur le serveur Discord et apparaĂźt dans la liste des membres comme Ă©tant hors ligne. Votre documentation ne prĂ©cisait pas quelle valeur de permission appliquer, mais comme la plupart des bots Discord que j’ai rencontrĂ©s le demandent, j’ai configurĂ© une valeur de permission de 8 (Administrateur).

Dans le serveur Discord, j’ai ensuite copiĂ© l’ID du rĂŽle qu’il a créé (nommĂ© d’aprĂšs mon application) ainsi que l’ID du canal pour les messages administratifs. J’ai ajoutĂ© le rĂŽle de l’application Ă  ce canal avec tous les droits, juste pour ĂȘtre sĂ»r, puis j’ai ajoutĂ© les IDs dans Discourse et redĂ©marrĂ© le systĂšme.

Malheureusement, quoi que j’essaie, je continue de recevoir une erreur 400. J’ai mĂȘme tentĂ© une reconstruction pour ĂȘtre certain.

3 « J'aime »

Merci, ce sont de gentils mots. Cela a également été rendu possible grùce à la générosité de nos bailleurs de fonds.

Oui, c’est parfait. Cela devrait nĂ©cessiter des droits d’administrateur.

C’est le deuxiùme signalement de ce problùme.

Si vous supprimez intentionnellement le dernier caractùre du jeton dans les paramùtres (rappelez-vous ce que c’est), obtenez-vous une erreur 401 à la place ?

Déplaçons cela en message privé car cela pourrait devenir confus :wink: (nous pourrons toujours publier la solution ici).

4 « J'aime »

Je poste simplement une mise Ă  jour au cas oĂč d’autres verraient ceci : nous enquĂȘtons activement sur le problĂšme, mais nous n’avons pas encore identifiĂ© la cause. Si quelqu’un d’autre rencontre ce problĂšme, merci de le signaler ; cela nous aiderait Ă  avoir d’autres personnes pour tester.

1 « J'aime »

C’est maintenant corrigĂ©. C’était un cas Ă©trange Ă  identifier.

Merci à @ransim pour avoir soulevé le problÚme et travaillé avec moi pour en comprendre la cause.

Un grand merci Ă  l’équipe #ruby_discordrb sur Discord API pour leur aide patiente et immĂ©diate !

@neemiasvf

5 « J'aime »

@merefield pas de problĂšme, votre plugin est gĂ©nial. Mais j’ai rencontrĂ© quelques problĂšmes maintenant.
par exemple :

Discourse Sync:  Démarrage. Veuillez patienter, je suis limité en taux pour respecter les services Discord.
Discourse Sync:  Vérification de l'existence de groupes éligibles pour la synchronisation ...
Discourse Sync: 1 groupe(s) éligible(s) a/ont été trouvé(s)
Discourse Sync:  Préparation de la liste des utilisateurs ayant également un compte enregistré sur Discord ...
Discourse Sync:  Préparation de la liste des groupes auxquels appartiennent sur Discourse les utilisateurs ayant un compte enregistré sur Discord ...
Discourse Sync: 0 groupe(s) éligible(s) avec des utilisateurs Discord a/ont été trouvé(s)
Discourse Sync:  Aucun utilisateur n'a été trouvé dans les groupes éligibles pour la synchronisation selon les critÚres fournis ou par défaut !

ma commande est : !discsync 4

et la commande modifiée : !discsync false 5 false

Discourse Sync:  Démarrage. Veuillez patienter, je suis limité en taux pour respecter les services Discord.
Discourse Sync:  Vérification de l'existence de groupes éligibles pour la synchronisation ...
Discourse Sync: 10 groupe(s) éligible(s) a/ont été trouvé(s)
Discourse Sync:  Préparation de la liste des utilisateurs ayant également un compte enregistré sur Discord ...
Discourse Sync:  Préparation de la liste des groupes auxquels appartiennent sur Discourse les utilisateurs ayant un compte enregistré sur Discord ...
1 « J'aime »

Salut @p0nda désolé pour la réponse tardive.

Si tu inclus des paramÚtres, tu dois les inclure tous. Le systÚme pourrait les interpréter de maniÚre étrange.

3 « J'aime »

Impossible d’afficher les paramĂštres Ă©tendus du bot ? J’ai apportĂ© les modifications au fichier app.yml et installĂ© les plugins. La configuration OAuth fonctionne, mais pas les paramĂštres du bot. Des idĂ©es ?

1 « J'aime »

Les paramÚtres OAuth sont présents, mais aucun paramÚtre de bot.

1 « J'aime »


Voici

2 « J'aime »