Optionnellement, lier les messages au sujet parent dans l'intégration Slack

Au travail, nous utilisons beaucoup Slack. Il y a du contenu qui doit être accessible sur Slack, mais qui doit aussi être bien organisé et facilement consultable, deux aspects où Discourse excelle, d’après ce que j’ai observé. Nous avons essayé plusieurs options de type wiki, mais elles finissent toutes par tomber en désuétude, en partie à cause du manque de lien avec Slack. C’est pourquoi je mène actuellement une évaluation de Discourse pour qu’il fonctionne en parallèle et soit connecté à notre Slack existant, d’autant plus que je gère déjà un forum communautaire Discourse. :smiling_face:

Cependant, nous avons de nombreux canaux qui utilisent intensivement les fils de discussion. Cela inclut le canal Slack prioritaire, qui doit être intégré de manière bidirectionnelle (pour la surveillance et la publication) entre Discourse et Slack.

Serait-ce une dénaturation du plugin d’intégration de chat que d’avoir un mode non par défaut qui publierait les nouveaux sujets sous forme de messages sur Slack, stockerait l’association entre l’ID du message Slack et le sujet, puis enverrait les nouveaux commentaires sur ce sujet vers Slack sous forme de messages dans un fil de discussion ? Pour mon cas d’usage, cela pourrait bien être le facteur décisif entre le succès et l’échec.

Mise à jour : Pour mon cas d’usage, ce serait une option de surveillance (watch) et non une configuration globale de chat Slack, car la préférence pour les fils de discussion ou non dépend du canal Slack concerné, en fonction de son objectif (et de ses participants habituels).

4 « J'aime »

Cela semble être une excellente idée ! L’ajouter au plugin serait certainement pr-welcome

Je vérifie simplement… par « poster », voulez-vous dire la fonctionnalité existante de publication de transcriptions ? Ou essayez-vous de faire en sorte qu’un fil Slack se « synchronise » avec un sujet Discourse ? Je pense que ce dernier cas est assez complexe à mettre en œuvre correctement et ne conviendrait probablement pas au plugin chat-integration.

1 « J'aime »

Non, il ne s’agit pas de synchroniser bidirectionnellement un seul fil de discussion afin de pouvoir publier des messages des deux côtés et les voir reflétés de l’autre. J’ai été responsable de la mise en œuvre d’une synchronisation entièrement bidirectionnelle pour une synchronisation active-actif entre deux domaines très actifs, et je suis parfaitement conscient des pièges à éviter dans ce contexte. :smiling_face:

Notre scénario concerne un canal dans lequel :

  • Les réponses sous forme de fils de discussion sont la norme, car ce canal tend à regrouper des conversations simultanées sur des sujets non liés (le canal est dédié à un objectif professionnel plutôt qu’à un sujet précis ; l’alternative, qui consisterait à inviter la moitié de l’équipe d’ingénierie dans de nouveaux canaux temporaires créés une douzaine de fois par jour, serait peu pratique)
  • Beaucoup, mais pas toutes, de ces conversations en fil de discussion doivent être identifiées comme des réponses à des questions que quelqu’un d’autre voudra consulter plus tard, et l’intégration doit permettre de les promouvoir comme étant fiables dans la catégorie associée de Discourse (une tâche que j’assure activement en sélectionnant les réponses utiles)
  • Les nouveaux sujets créés dans cette catégorie associée de Discourse doivent générer des messages Slack dans ce canal Slack
    • Les commentaires supplémentaires sur ces nouveaux sujets doivent être publiés sur Slack dans un fil de discussion suivant le premier message Slack initial
  • Nos utilisateurs sont invités à consulter Discourse en priorité avant de poser une question sur Slack

De plus, le fait que vous posiez cette question me fait penser qu’en tant que fonctionnalité connexe, il serait excellent de pouvoir, lors de la synthèse d’un fil Slack en un message Discourse, que l’intégration publie un lien vers le nouveau sujet Discourse à la fin du fil Slack original qui vient d’être résumé. Cela nous aiderait à maintenir la conversation au même endroit.

Cela est en fait lié à l’idée initiale de la fonctionnalité : si nous disposions des deux, il serait logique que, au lieu de publier un nouveau message Slack lors de la synthèse, l’intégration publie le message directement dans le fil résumé, et indique que ce fil est l’endroit où poster les commentaires supplémentaires de Discourse. Elle ne synthétiserait pas les commentaires Slack supplémentaires de ce fil vers Discourse ; elle serait destinée à rediriger la conversation vers Discourse sur ce sujet. Cela me semble logique :

  • Étant donné : qu’il existe un endroit pour stocker l’ID du message Slack associé à un sujet
  • Et : que les nouveaux commentaires sur un sujet sont publiés comme commentaires du message Slack stocké
  • Alors : définir l’ID du message Slack pour un sujet lors de l’utilisation de la fonctionnalité d’intégration Slackbot post thread, ce qui entraînera l’annonce des nouveaux commentaires Discourse sur le sujet dans ce fil, y compris des liens vers le sujet/commentaire Discourse

Cela aiderait grandement à promouvoir le concept de « consulter Discourse en priorité avant de poser une question ».

5 « J'aime »

Tout cela me semble très bien !

:100:

3 « J'aime »

À titre d’aide visuelle, cela ressemble-t-il à l’expérience utilisateur Slack que vous souhaitez promouvoir ?

… oh là là, l’année a disparu du sujet du fil. Des idées ?

@riking Un peu, mais avec quelques différences.

L’annonce ne ressemblerait pas tout à fait à cela ; elle serait publiée par le côté watch de l’intégration. Elle n’indiquerait pas qu’il y a eu déplacement. Voici un exemple de l’interface actuelle (non threadée), issue de l’intégration Slack telle que je l’ai implémentée pour makerforums :

Dans le modèle threadé, le premier de ces messages lancerait un thread Slack, et le commentaire de Nedman se trouverait dans une réponse Slack threadée. Lorsque post thread :thread_url est utilisé, l’URL du thread (:thread_url) serait stockée avec le nouveau sujet, et le côté watch de l’intégration de chat publierait le message initial du sujet et tous les commentaires ultérieurs dans ce thread Slack, mais le contenu resterait identique.

L’intégration watch thread vous redirige vers Discourse, où vous devez rédiger le titre et avez la possibilité de modifier le message du nouveau sujet avant de le publier. Ainsi, l’annonce publiée sur Slack crédite déjà la personne ayant exécuté post thread en tant qu’auteur, puis inclut une ligne avec le titre du sujet comme texte du lien pointant vers Discourse, suivie d’une citation extraite du début du message. La modification que je propose ici est que, grâce à une configuration non par défaut et par canal (donc une option watch, et non une configuration globale du plugin d’intégration de chat), ce contenu serait publié dans le thread plutôt que dans le canal. (Pas « envoyer également au canal », ce qui annulerait l’objectif du changement pour nous.) Les commentaires ultérieurs sur ce nouveau sujet dans Discourse iraient également dans ce même thread Slack.

Et, puisque vous demandez des hypothèses, 2017, l’année où Slack a lancé les threads ?

2 « J'aime »

J’ai réfléchi à cela et lu la documentation de l’API Slack chat.postMessage, et je pense pouvoir résumer mon pavé de mots en quelque chose de beaucoup plus simple.

Seule l’action watch et non follow a la capacité de choisir les réponses en fil de discussion, grâce à un mécanisme que j’essaie encore de déterminer. Sinon, @david, que penses-tu d’un nouveau filtre de règle thread avec la priorité mute thread watch follow, et de faire passer cette règle via trigger_notification pour activer un comportement sensible aux règles ?

  1. Si watch est configuré pour les fils de discussion (ou si une règle thread est définie), lors de l’envoi d’une notification de nouveau post vers un canal Slack, si le sujet du post a un ts Slack associé, publier dans ce fil Slack en définissant thread_ts sur la valeur ts fournie par Slack.

  2. Lors de l’envoi d’une notification de nouveau post vers un canal Slack, et si le sujet du post n’a pas de ts associé, stocker la valeur ts de la réponse retournée pour le sujet (afin que les futurs posts sur ce sujet puissent être mis en fil si watch est configuré pour les fils).

  3. Lors de l’utilisation de la commande post thread :thread_url, stocker le ts du fil dans le sujet créé, qui ne sera utilisé que par les règles watch en fil.

Voici mes réflexions et préoccupations actuelles :

  1. Comment déterminer s’il faut poster dans des fils de discussion au niveau de chaque règle. Un nouveau filtre me semble pour l’instant la solution la plus simple, mais peut-être que je passe à côté de quelque chose.

  2. Faire passer l’URL du post Slack original et l’ID du fil dans le flux de transcript est ce qui m’est le plus opaque pour le moment. Cela ressemble à un besoin réel d’ajouter un ID de fil par fournisseur quelque part et de le préserver jusqu’à l’enregistrement du post. Je l’implémenterais uniquement pour le ts Slack, mais il ne sera probablement pas le seul à intégrer les fils de discussion.

  3. Pour la publication, je pense devoir stocker le ts Slack dans un champ personnalisé spécifique à Slack sur Topic, et non dans un champ personnalisé général DiscourseChat pour les fils.

1 « J'aime »

Le booléen « threading » a-t-il vraiment besoin d’être défini par règle ? Pourquoi ne pas créer un nouveau paramètre du site

chat_integration_slack_thread_responses

Si cette option est activée et que nous disposons de l’ID du fil de discussion du sujet, nous envoyons les notifications suivantes au fil Slack correspondant.

Oui, je pense que c’est tout à fait acceptable. Utilisez simplement un champ personnalisé spécifique à Slack pour le sujet. Si nous ressentons le besoin d’implémenter cela pour d’autres fournisseurs plus tard, nous pourrons rendre la solution plus générique.

Oui, c’est très délicat. En tant que version 1, je serais tenté d’inclure quelque chose comme

<!--SLACK_THREAD_ID=abcdefg-->

au début du message. Ensuite, le plugin peut vérifier les messages qui commencent par cette chaîne et assigner le champ personnalisé. Ce n’est pas parfait, mais peut-être un bon point de départ ?

2 « J'aime »

Merci beaucoup !

Hier soir, j’ai implémenté mes deux premiers critères d’acceptation (AC) avec des tests réussis dans toute la stack (bien que je n’aie pas encore testé en production), en utilisant un champ personnalisé sur Topic et une règle thread. Je ne me suis pas encore penché sur le flux de transcription. Donc, je fais de bons progrès vers la possibilité d’afficher du code dans au moins une PR de brouillon.

J’ai également un commit séparé pour supprimer pstore_get inutilisé du fournisseur Slack. Puisque c’est la seule utilisation de pstore dans toute la stack, souhaitez-vous que je supprime également toutes les références pstore_* dans app/initializers/discourse_chat.rb lors de ce commit de nettoyage ?

C’est exactement là que j’ai commencé, et cela aurait certainement été plus simple !

Cependant, du moins pour mon cas d’utilisation (et j’ai entendu cela de la part de personnes dans d’autres entreprises, nous ne sommes pas uniques), différents canaux ont des préférences différentes concernant l’utilisation des fils de discussion. Il y a des canaux destinés à être utilisés avec des fils de discussion (car la plupart des gens ne s’intéressent qu’à certains sujets) et des canaux qui sont très fortement opposés aux fils de discussion (car ils enfouissent les informations importantes).

J’ai observé deux aspects essentiellement indépendants qui influencent cette préférence :

  • Membres : Les canaux dont la majorité des membres utilisent IRC depuis des décennies sont habitués à dissocier mentalement les fils de conversation entremêlés dans un seul canal et ne veulent pas cliquer dans les fils pour voir le contenu important, tandis que les canaux dont la majorité des membres ont grandi avec le courrier électronique s’attendent à ce que les conversations soient threadées et à cliquer sur les conversations qui les intéressent.
  • Objectif : Les canaux à vocation d’annonce ont tendance à être fortement threadés, mais les canaux à vocation de recherche ou de collaboration sont souvent intentionnellement non threadés, car les fils de discussion cachent les informations à moins de les remarquer et d’y cliquer.

Si vous souhaitez une syntaxe commune pour les options de règle, je pense que Rule pourrait être généralisé pour inclure une valeur :options, qui, comme :tags, est un tableau. Je suppose qu’il pourrait être logique de s’inspirer des shells en ligne de commande, de sorte que /discourse [watch|follow|mute] -something -here définisse :options à ['something', 'here'] — en réservant le préfixe - pour introduire une option. Ainsi, cela donnerait /discourse watch ma-catégorie-slug #tagged-foo -threaded. Je ne sais pas combien de travail supplémentaire cela représenterait par rapport à ce que j’ai déjà fait. Avez-vous des avis tranchés dans un sens ou dans l’autre ? Je vois des arguments des deux côtés : ajouter une autre valeur à Rule complique l’écriture d’un fournisseur de chat ; ajouter une autre valeur de filtre rend une autre fonctionnalité spécifique à Slack (comme la publication d’une transcription) qui complexifie l’interface pour les utilisateurs non-Slack. Bien sûr, il se peut que j’aie manqué quelque chose qui rendrait cela plus difficile que je ne le pense ; par exemple, si un slug de catégorie pouvait commencer par -, cela deviendrait soudainement ambigu ; le shell utilise -- pour signifier « tout ce qui suit n’est pas un argument », mais nous pourrions peut-être l’inverser pour que -- signifie « tout ce qui suit est une option ». Si vous souhaitez que j’explore cette piste, veuillez me donner des indications sur la syntaxe que vous jugeriez appropriée pour spécifier les options de règle. Mais ajouter simplement thread me semble plus simple, donc en l’absence d’instructions spécifiques pour ajouter une fonctionnalité générale « options », j’attendrai de faire tout changement dans cette direction.

[Édité : Passer d’un filtre de règle à une option compliquerait certainement l’interface utilisateur, qui devrait évoluer pour prendre en charge les options générales, et cela ne me semble pas être un bon choix. Maintenant, après avoir examiné l’interface utilisateur, je préfère rester sur le filtre ; je pense que c’est plus clair.]

Pour le flux de transcription des publications, merci pour l’idée du commentaire HTML. Pour mon cas d’utilisation, cela ne me posera aucun problème ; je m’attends honnêtement à être l’utilisateur principal, du moins initialement. C’est un petit hack simple et efficace.

J’ai une autre idée, à ne pas intégrer dans cette PR : il serait agréable d’avoir une correspondance entre le canal pour le message en cours de publication et la catégorie dans laquelle la publication Discourse résultante doit être créée. Pour que cela se produise, je pense que la transcription devrait mieux changer pour inclure une enveloppe ou un sidecar, auquel cas l’enveloppe ou le sidecar pourrait contenir à la fois la catégorie et l’ID Slack. Cela représente une quantité considérable d’apprentissage pour moi, car je suis encore dans la phase de « recherche avancée du problème sur Google » pour apprendre Ruby on Rails. :wink:

2 « J'aime »

Une autre idée pour peaufiner cette fonctionnalité :

Et si on ajoutait un autre paramètre, cross_post_to_channel_after_hours (par défaut 48 ?) ou quelque chose du genre, où si le temps écoulé depuis la dernière réponse dépasse x heures, le message est envoyé dans le fil avec le drapeau « envoyer également au canal ».

Ne prenez pas ma suggestion trop au sérieux pour l’instant si vous souhaitez simplement faire fonctionner les choses sans cela dans un premier temps (probablement une meilleure stratégie !). Juste une piste à explorer…

Loin d’être une idée folle, mais je n’ai pas l’intention de la mettre en œuvre, car cela casserait mon cas d’utilisation principal et je n’en ai besoin nulle part ailleurs. :smiling_face: Je comprends tout à fait que d’autres personnes pourraient le souhaiter !

Si c’était un paramètre normal plutôt qu’une option par canal, il s’appellerait chat_integration_slack_copy_threads_to_channel_after_hours, avec une valeur par défaut de 0 (ne pas envoyer), mais vous pouvez le définir à n’importe quelle valeur. Conceptuellement, c’est assez simple, mais cela demande plus de travail car vous devez récupérer le fil (en utilisant le code initialement écrit pour les transcriptions, et je ne sais pas immédiatement s’il faudrait le refactoriser) afin de prendre une décision concernant la définition d’un simple indicateur.

Mais si vous souhaitez travailler dessus, j’espère que ce que je fais fournira une bonne base. Je vous demanderais simplement de ne pas l’activer par défaut, car si cela se produisait lors d’une mise à niveau et que mes utilisateurs étaient « spammés » par moi en curant du contenu pour Discourse, j’aurais des utilisateurs mécontents.

1 « J'aime »

Pour simplifier les choses, je pense que vous pourriez simplement vérifier la date du dernier message dans le sujet Discourse.

(Cela se comporterait un peu différemment dans certains cas, mais cela pourrait être un bon point de départ)

@david J’ai un brouillon de PR qui passe les tests unitaires tels que je les ai écrits. Je n’ai pas encore essayé de l’exécuter en direct contre Slack, donc je ne voudrais pas le fusionner avant que cela soit fait. Mais au moins, tous les tests unitaires passent pour moi, et j’ai essayé d’ajouter des tests significatifs à leur sujet.

J’ai également placé le commentaire ID à la fin au lieu du début du message, car cela semblait plus susceptible de survivre et moins susceptible d’être altéré, et j’ai essayé d’être conservateur dans son analyse.

Merci pour votre travail sur ce plugin !

J’ai corrigé mes échecs initiaux de linting, mais maintenant les tests que je n’ai pas touchés échouent. Je suis basé sur la dernière version de master, et les tests passent localement. Avez-vous des informations sur les tests qui échouent ?

4 « J'aime »

J’ai beaucoup nettoyé la PR, mais elle n’est pas encore tout à fait prête. J’ai deux ou trois problèmes pour le moment que je ne sais pas encore résoudre.

  1. J’essaie d’utiliser fa-arrow-circle-o-right comme icône de fil, et elle s’affiche vide dans l’interface de mon site en production. (J’exécute su discourse -c 'bundle exec rake assets:precompile' && sv restart unicorn après avoir changé de branche sur mon site en production pour tester sur le serveur en direct.) Je l’ai ajoutée dans plugin.rb et je la référence également, donc je ne sais pas quelle étape suivre ensuite. Existe-t-il une liste des icônes FontAwesome approuvées pour Discourse ? J’ai trouvé lib/svg_sprite/svg_sprite.rb et chevron-right semble parfait pour cet usage.

  2. Les tests passent tous localement, mais dans Travis, je rencontre des erreurs constantes qui semblent sans rapport avec mes modifications, ce qui rend l’enquête et l’analyse particulièrement difficiles pour moi. 13 échecs avec une erreur 404 au lieu d’un code attendu (par exemple 200) dans spec/lib/discourse_chat/provider/slack/slack_command_controller_spec.rb Résolu en évitant de coder à l’aveugle avec isolate_namespace ; j’ai maintenant découvert rake routes.

J’ai publié avec succès :

Il pourrait rester quelques éléments à nettoyer, mais je pense que cela fonctionne.

Une fois cette fusion effectuée, je mettrai à jour Discourse Chat Integration de manière appropriée.

2 « J'aime »

Je continue de découvrir de nouvelles opportunités d’apprentissage ici. Maintenant, je sais comment exécuter yarn prettier, et ensuite, je vais apprendre à mettre à jour les tests front-end…

Erreur : Échec de l'assertion : Vous devez utiliser set() pour définir la propriété `channel` (de <(unknown):ember3806>) à `<(unknown):ember3799>`.

Merci beaucoup pour tout votre travail ici @mcdanlj — cela est maintenant fusionné :

4 « J'aime »

Je vous remercie pour vos commentaires très utiles ! J’ai mis à jour le message wiki de l’intégration officielle comme promis. Si vous préférez signaler les modifications d’autres manières, cela me convient parfaitement, sans aucun orgueil d’auteur ou autre chose du genre. :smiling_face:

3 « J'aime »

Pourriez-vous activer l’option de threading dans les paramètres d’intégration de chat pour Slack, comme suit :

Activer le threading des publications vers Slack

Vous voulez dire que vous souhaitez pouvoir configurer le plug-in pour qu’il refuse de prendre en compte l’option thread dans l’intégration ?

Nous avons mis à jour vers la version bêta 2.6 1a actuelle il y a quelques jours, et les tests se sont bien passés. Cependant, à ma connaissance, aucune publication Slack en croix n’est threadée depuis la mise à niveau. Nous voyons toujours les publications de sujets et les réponses affichées individuellement dans les canaux Slack.