Opcionalmente, encadenar publicaciones al tema principal en la integración de Slack

En el trabajo, usamos mucho Slack. Hay contenido que debe ser accesible en Slack, pero que también necesita estar organizado y ser buscable; he visto que Discourse destaca en ambos aspectos. Hemos probado varias opciones tipo wiki y todas acaban abandonadas, en parte por la falta de conexión con Slack. Por eso, estoy impulsando una evaluación de Discourse para que funcione en paralelo y conectado a nuestro Slack existente, ya que ya administro un foro comunitario en Discourse. :smiling_face:

Sin embargo, tenemos muchos canales que utilizan hilos de forma agresiva. Esto incluye el canal de Slack de mayor prioridad para integrar bidireccionalmente (“observar” y “publicar”) entre Discourse y Slack.

¿Sería forzar demasiado el plugin de integraciones de chat tener un modo no predeterminado que publique nuevos temas como mensajes en Slack, guarde la asociación entre el ID del mensaje de Slack y el tema, y luego envíe los nuevos comentarios de ese tema a Slack como mensajes en hilo? Para mi caso de uso, esto podría ser el principal diferenciador entre el éxito y el fracaso.

Actualización: Para mi caso de uso, esto sería una opción para “observar” y no una configuración de chat de Slack a nivel de sitio, porque “preferir hilos” o “no preferir hilos” es una preferencia por canal basada en el propósito (y los participantes habituales) de un canal de Slack.

4 Me gusta

¡Suena como una idea genial! Añadir eso al plugin sería definitivamente pr-welcome.

Solo verificando… ¿con “publicar” te refieres a la función existente de publicación de transcripciones? ¿O estás intentando que un hilo de Slack se “sincronice” con un tema de Discourse? Creo que lo segundo es bastante complicado de implementar correctamente y probablemente no encajaría en el plugin de integración de chat.

1 me gusta

No, no estoy intentando sincronizar bidireccionalmente un solo hilo para que puedas publicar en cualquiera de los lados y que se refleje en el otro. He sido responsable de implementar una sincronización completamente bidireccional para la sincronización activo-activo entre dos dominios muy activos, y soy plenamente consciente de las oportunidades de cometer errores allí. :smiling_face:

Nuestro escenario es un canal en el que:

  • Las respuestas en hilos son la norma porque el canal tiende a recopilar conversaciones simultáneas sobre temas no relacionados (el canal está dedicado a un propósito empresarial, no a un tema; la alternativa poco práctica sería invitar a la mitad de ingeniería a nuevos canales temporales creados una docena de veces al día)
  • Muchas, pero no todas, de esas conversaciones en hilos deben identificarse como respuestas a preguntas que alguien más querrá más tarde, y la integración se utiliza para promoverlas como confiables en la categoría asociada de Discourse (alguien como yo, curando activamente respuestas útiles)
  • Los nuevos temas en esa categoría asociada de Discourse deben generar publicaciones en Slack en ese canal de Slack
    • Los comentarios adicionales sobre esos nuevos temas deben publicarse en Slack en un hilo que siga a la primera publicación nueva de Slack
  • Nuestros usuarios están dirigidos a buscar primero en Discourse antes de preguntar en Slack

Además, el hecho de que hagas esta pregunta me hace pensar que, como función relacionada, sería genial tener la capacidad de, al resumir un hilo de Slack en una publicación de Discourse, que la integración publique un puntero al nuevo tema de Discourse al final del hilo original de Slack que acaba de ser resumido. Esto nos ayudaría a mantener la conversación en un solo lugar.

Esto está realmente vinculado a la idea original de la función, porque si tuviéramos ambas, tendría sentido que, en lugar de publicar un nuevo mensaje en Slack al resumir, se publique el mensaje en el hilo resumido, y se indique ese hilo como el lugar para publicar comentarios adicionales de Discourse. No se resumirían los comentarios adicionales de Slack en ese hilo en Discourse; estaría destinado a redirigir la conversación a Discourse sobre ese tema. Esto me parece lógico:

  • DADO: que existe un lugar para almacenar el ID del mensaje de Slack asociado a un tema
  • Y: los nuevos comentarios sobre un tema se publican como comentarios en el mensaje de Slack almacenado
  • ENTONCES: establecer el ID del mensaje de Slack para un tema al usar la función de integración del slackbot post thread, lo que hará que los nuevos comentarios de Discourse sobre el tema se anuncien en ese hilo, incluyendo enlaces de vuelta al tema/comentario de Discourse

Eso realmente ayudaría a socializar el concepto de “consultar primero Discourse antes de preguntar”.

5 Me gusta

¡Todo eso me suena bien!

:100:

3 Me gusta

Como ayuda visual, ¿esto se parece a la UX de Slack que quieres promover?

… oh my, el año se ha omitido en el inicio del hilo. ¿alguna idea?

@riking Un poco, pero con algunas diferencias.

El anuncio no se vería exactamente así; sería publicado por el lado watch de la integración. No diría que se movió. Aquí hay un ejemplo de la interfaz actual (sin hilos), de la integración de Slack tal como la implementé para makerforums:

En el modelo con hilos, el primero de esos mensajes iniciaría un hilo en Slack, y el comentario de Nedman estaría en su lugar en una respuesta de Slack en hilo. Cuando se usa post thread :thread_url, el :thread_url se guardaría junto con el nuevo tema y el lado watch de la integración de chat publicaría el mensaje inicial del tema y todos los comentarios posteriores en ese hilo de Slack, pero el contenido sería el mismo.

La integración watch thread te lleva a Discourse, donde debes escribir el título y tienes la oportunidad de editar el mensaje del nuevo tema antes de publicarlo. Así que el anuncio que se publica en Slack ya acredita a la persona que ejecuta post thread como autor, luego tiene una línea con el título del tema como texto del enlace que apunta a Discourse, y finalmente una cita destacada del principio del mensaje. El cambio que propongo aquí es que, con una configuración no predeterminada y por canal (por lo tanto, una opción watch, no una configuración global del plugin de integración de chat), se publicaría ese contenido en el hilo en lugar de en el canal. (No “también enviar al canal”, lo que anularía el propósito del cambio para nosotros.) Los comentarios adicionales sobre ese nuevo tema en Discourse también irían al mismo hilo de Slack.

Y, ya que pides suposiciones, 2017, el año en que Slack lanzó los hilos?

2 Me gusta

He estado pensando en esto y leyendo la documentación de la API de chat.postMessage de Slack, y creo que puedo resumir mi muro de palabras en algo mucho más sencillo.

Solo watch y no follow tiene la capacidad de elegir respuestas en hilos, mediante un mecanismo que aún estoy tratando de determinar. Alternativamente, @david, ¿qué te parecería un nuevo filtro de regla thread con la precedencia mute thread watch follow, y conectar la regla a trigger_notification para habilitar un comportamiento sensible a las reglas?

  1. Si watch está configurado para usar hilos (o, alternativamente, se define una regla thread), al enviar una notificación de nueva publicación a un canal de Slack, si el tema de la publicación tiene un ts de Slack asociado, publica en ese hilo de Slack estableciendo thread_ts con el valor ts proporcionado por Slack.

  2. Al enviar una notificación de nueva publicación a un canal de Slack, y el tema de la publicación no tiene un ts asociado, guarda el ts de la respuesta devuelta para el tema (para que las publicaciones futuras sobre el tema puedan organizarse en hilos si watch está configurado para usar hilos).

  3. Al usar el comando post thread :thread_url, guarda el ts del hilo en el tema que se crea, el cual será utilizado únicamente por las reglas de watch en hilos.

Estas son mis reflexiones y preocupaciones actuales:

  1. Cómo determinar si se debe publicar en hilos en función de cada regla. Por ahora, un nuevo filtro me parece la opción más sencilla, pero quizás me esté perdiendo algo.

  2. Transmitir la URL original de la publicación en Slack y el ID del hilo a través del flujo de transcripción es lo que más me resulta opaco en este momento. Esto parece requerir que agregue un ID de hilo específico por proveedor en algún lugar y lo preserve hasta guardar la publicación. Lo implementaría solo para el ts de Slack, pero presumiblemente no será la única integración de chat con hilos.

  3. Para la publicación, creo que necesito guardar el ts de Slack en un campo personalizado específico de Slack en Topic, no en un campo de hilo general de DiscourseChat.

1 me gusta

¿Realmente es necesario que el booleano ‘threading’ sea por regla? ¿Por qué no crear una nueva configuración del sitio

chat_integration_slack_thread_responses

Si está habilitada y tenemos un registro del ID del hilo del tema, entonces enviamos las notificaciones subsiguientes al hilo de Slack.

Sí, creo que está perfecto. Solo usa un campo personalizado específico de Slack para el tema. Si en el futuro sentimos la necesidad de implementar esto para otros proveedores, podemos hacer la solución más genérica.

Sí, esto es muy complicado. Como versión 1, me inclinaría a incluir algo como

<!--SLACK_THREAD_ID=abcdefg-->

en la parte superior del mensaje. Luego, el plugin puede buscar mensajes que comiencen con esta cadena y asignar el campo personalizado. No es perfecto, pero ¿quizás un buen punto de partida?

2 Me gusta

¡Muchas gracias!

Anoche implementé y tengo pruebas exitosas en toda la pila (aunque aún no he probado en vivo) mis primeros dos CAs, pero aún no el flujo de transcripción, utilizando un campo personalizado en Topic y una regla thread. Así que estoy avanzando bien hacia la capacidad de mostrar código en al menos un PR de borrador.

También tengo un commit separado para eliminar el pstore_get sin uso del proveedor de Slack. Dado que ese es el único uso de pstore en toda la pila, ¿te gustaría que también elimine todos los pstore_* de app/initializers/discourse_chat.rb en ese commit de limpieza?

Ese fue exactamente mi punto de partida, y sin duda habría sido más fácil.

Sin embargo, al menos para mi caso de uso (y he escuchado esto de personas en otras empresas, no somos únicos), diferentes canales tienen diferentes preferencias sobre si se deben usar hilos. Hay canales que están destinados a usarse con hilos (porque la mayoría de las personas solo se preocupan por algunos temas) y canales que son muy anticlínicos (porque los hilos ocultan información importante).

He visto dos aspectos esencialmente no relacionados que impulsan esta preferencia:

  • Membresía: Los canales donde la mayoría de los miembros han usado IRC activamente durante décadas están acostumbrados a desambiguar mentalmente hilos conversacionales entremezclados en un solo canal y no quieren hacer clic en los hilos para ver contenido importante, mientras que los canales donde la mayoría de los miembros han vivido en correo electrónico esperan que las conversaciones estén en hilos y hacer clic en las conversaciones que les importan.
  • Propósito: Los canales con un propósito comercial de anuncios tienden a estar fuertemente hilados, pero los canales con propósitos de investigación o colaboración a menudo intencionalmente no están hilados porque los hilos ocultan información a menos que te des cuenta y hagas clic en ellos.

Si deseas tener alguna sintaxis común para las opciones de regla, creo que Rule podría expandirse en general para que tenga un valor :options que, como :tags, sea un array. Supongo que podría tener sentido tomar una página de las shells de línea de comandos, de modo que /discourse [watch|follow|mute] -something -here establezca :options en ['something', 'here'] — reservando un - inicial para introducir una opción. Entonces sería /discourse watch my-category-slug #tagged-foo -threaded. No sé cuánto más trabajo sería eso sobre lo que ya hice. ¿Tienes sentimientos fuertes en un sentido u otro aquí? Puedo ver argumentos para ambos lados: agregar otro valor a Rule lo hace más complicado de escribir para un proveedor de chat; agregar otro valor de filtro hace que otra característica específica de Slack (como publicar una transcripción) que hace que la interfaz sea más complicada para usuarios que no son de Slack. Por supuesto, podría estar pasando por alto algo que lo haría más difícil de lo que creo; por ejemplo, si un slug de categoría podría comenzar con - y de repente se vuelve ambiguo; la shell usa -- para significar “todo lo que sigue no es un argumento” pero quizás podríamos invertirlo para que -- signifique “todo lo que sigue es una opción.” Si deseas que investigue esto, por favor dame alguna dirección sobre la sintaxis que considerarías apropiada para especificar las opciones de regla. Pero simplemente agregar thread me parece más simple, así que, sin una dirección específica para agregar una característica general de “opciones”, esperaré para hacer cualquier cambio en esa dirección.

[Edición: Cambiar de un filtro de regla a una opción definitivamente complicaría la interfaz de usuario, que tendría que crecer para admitir opciones generales en general, y eso no me parece una gran elección. Así que ahora, habiendo visto la interfaz de usuario, preferiría mantenerme con el filtro; creo que es más limpio.]

Para el flujo de transcripción de publicaciones, gracias por la idea del comentario HTML. Para mi caso de uso no me va a hacer daño; honestamente espero ser el usuario principal de todos modos, al menos inicialmente. Ese es un buen truco simple.

Tengo una idea separada, no para incrustar en este PR, de que sería bueno tener una mapeo desde el canal para el mensaje que se está publicando hacia la categoría en la que se debe hacer la publicación resultante en Discourse. Para que eso suceda, creo que la transcripción cambiaría mejor para tener un sobre o un sidecar, momento en el cual el sobre o el sidecar podrían tener tanto la categoría como el ID de Slack. Eso parece una cantidad sustancial de aprendizaje para mí, ya que todavía estoy en la etapa de “búsqueda avanzada del problema” aprendiendo Ruby on Rails. :wink:

2 Me gusta

Otra idea más para perfeccionar esta función:

¿Y si hubiera otra configuración, cross_post_to_channel_after_hours (¿48 por defecto?) o algo así, donde si el tiempo desde la última respuesta es mayor que x horas, la publicación se envíe al hilo con la bandera “también enviar al canal”.

No tomes mi sugerencia demasiado en serio por ahora si solo quieres hacer que las cosas funcionen sin ella primero (¡probablemente sea una estrategia mejor!). Solo para tener en cuenta…

Para nada una idea loca, pero no planeo implementarla, ya que rompería mi caso de uso principal y no la necesito en ningún otro lugar. :smiling_face: ¡Sin embargo, entiendo perfectamente que a otras personas les gustaría tenerla!

Si fuera una configuración normal en lugar de una opción por canal, se llamaría chat_integration_slack_copy_threads_to_channel_after_hours, que por defecto sería 0 (no enviar), pero podrías establecerla en cualquier valor. Conceptualmente es bastante simple, pero requiere más trabajo porque tienes que obtener el hilo (usando el código escrito inicialmente para las transcripciones, y no recuerdo de inmediato si requeriría refactorización) para tomar una decisión sobre establecer una marca simple.

Pero si quieres trabajar en ello, espero que lo que estoy haciendo proporcione un buen marco de trabajo. Solo te pediría que no lo actives por defecto, porque si eso se activara en una actualización y mis usuarios fueran “spam” por mi parte al curar contenido para Discourse, tendría usuarios insatisfechos.

1 me gusta

Para simplificar las cosas, creo que podrías simplemente verificar la fecha de la publicación anterior en el tema de Discourse.

(Se comportaría de manera ligeramente diferente en algunos casos, pero podría ser un buen punto de partida).

@david He subido un borrador de PR que pasa las pruebas unitarias tal como las he escrito. Aún no lo he probado en vivo contra Slack, por lo que no quisiera fusionarlo hasta que eso esté hecho. Pero al menos todas las pruebas unitarias pasan en mi entorno, y traté de agregar pruebas significativas para ellas.

También coloqué el comentario del ID al final en lugar del principio del mensaje porque me pareció que era más probable que sobreviviera y menos probable que se viera alterado allí, y traté de ser conservador al extraerlo.

¡Gracias por tu trabajo en este complemento!

Arreglé mis fallos iniciales de linting, pero ahora las pruebas que no toqué están fallando. Estoy basado en la última versión de master y las pruebas pasan localmente. ¿Tienes alguna idea sobre las pruebas que están fallando?

4 Me gusta

He limpiado bastante la PR, pero aún no está lista para ser fusionada. Tengo dos o tres cosas que me están causando problemas y aún no sé cómo solucionarlos.

  1. Estaba intentando usar fa-arrow-circle-o-right como icono del hilo, pero aparece vacío en la interfaz de mi sitio en vivo. (He estado ejecutando su discourse -c 'bundle exec rake assets:precompile' && sv restart unicorn después de cambiar a mi rama en el sitio en vivo para probar en el servidor.) También lo agregué a plugin.rb y lo referencié, así que no sé cuáles son los siguientes pasos. ¿Existe una lista de iconos de FontAwesome aprobados para usar en Discourse? Encontré lib/svg_sprite/svg_sprite.rb y chevron-right se ve genial para este caso de uso.

  2. Las pruebas me pasan todas localmente, pero en Travis estoy recibiendo errores consistentes que parecen no estar relacionados con mis cambios, y naturalmente me resulta difícil investigar o razonar sobre ellos. 13 fallos con un error 404 en lugar de algún otro esperado (por ejemplo, 200) en spec/lib/discourse_chat/provider/slack/slack_command_controller_spec.rb Solucionado al no hacer “cargo-coding” de isolate_namespace y ahora conozco rake routes.

He publicado con éxito:

Puede que haya más cosas por limpiar, pero creo que esto funciona.

Después de que esto se fusione, actualizaré adecuadamente Discourse Chat Integration.

2 Me gusta

Sigo encontrando nuevas oportunidades para aprender aquí. Ahora sé cómo ejecutar yarn prettier, ahora toca aprender a actualizar las pruebas del front end…

Error: Assertion Failed: You must use set() to set the `channel` property (of <(unknown):ember3806>) to `<(unknown):ember3799>`.

¡Muchas gracias por todo tu trabajo aquí @mcdanlj! Esto ya ha sido fusionado:

4 Me gusta

¡Aprecio mucho sus reseñas, que han sido de gran ayuda! Como prometí, actualicé la publicación oficial del wiki de integración. Si prefiere destacar los cambios de otras formas, me parece bien; no tengo orgullo de autoría ni nada parecido. :smiling_face:

3 Me gusta

¿Podrían habilitar los hilos en la configuración de integración de chat para Slack, como en:

Habilitar hilos en las publicaciones a Slack?

¿Quieres decir que deseas poder configurar el complemento para que se niegue a respetar la opción thread en la integración?

Actualizamos a la versión actual 2.6 beta1a y los pruebas se aprobaron hace unos días, pero, hasta donde puedo decir, las publicaciones de Slack x no están hiladas desde la actualización. Todavía vemos las publicaciones de tema y las respuestas mostradas individualmente en los canales de Slack.