Opzionalmente threadare i post al topic genitore nell'integrazione Slack

Al lavoro usiamo molto Slack. C’è del contenuto che deve essere accessibile su Slack ma allo stesso tempo organizzato e ricercabile, due aspetti in cui ho visto Discourse eccellere. Abbiamo provato alcune opzioni simili a un wiki, ma tutte sono finite inattive, in parte a causa della mancanza di integrazione con Slack. Sto quindi guidando una valutazione di Discourse per farlo funzionare in parallelo e connesso al nostro Slack esistente, dato che già gestisco un forum Discourse per la community. :smiling_face:

Tuttavia, abbiamo molti canali che utilizzano i thread in modo aggressivo. Questo include il canale Slack più importante per un’integrazione bidirezionale (watch e post) tra Discourse e Slack.

Sarebbe forzare il plugin chat-integrations avere una modalità non predefinita che pubblica nuovi argomenti come messaggi su Slack, memorizza l’associazione tra l’ID del messaggio Slack e l’argomento, e poi invia i nuovi commenti su quell’argomento a Slack come messaggi in thread? Per il mio caso d’uso, questo potrebbe essere il principale fattore che distingue il successo dal fallimento.

Aggiornamento: Per il mio caso d’uso, questa sarebbe un’opzione per watch, non una configurazione Slack globale del sito, perché “preferisci i thread” o “non preferisci i thread” è una preferenza per canale, basata sullo scopo (e sui partecipanti tipici) di un canale Slack.

4 Mi Piace

Sembra un’idea fantastica! Aggiungerlo al plugin sarebbe sicuramente pr-welcome

Solo per chiarire… con “post” intendi la funzionalità esistente di pubblicazione del trascritto? O stai cercando di far “sincronizzare” un thread di Slack con un argomento di Discourse? Penso che quest’ultima opzione sia piuttosto complessa da implementare correttamente e probabilmente non rientra nel plugin chat-integration.

1 Mi Piace

No, non sto cercando di sincronizzare bidirezionalmente un singolo thread in modo che tu possa pubblicare da entrambe le parti e vederlo riflesso sull’altra. Ho avuto la responsabilità di implementare una sincronizzazione completamente bidirezionale per la sincronizzazione active-active tra due domini molto attivi e sono pienamente consapevole delle opportunità di sbagliare in quel contesto. :smiling_face:

Il nostro scenario è un canale in cui:

  • Le risposte threadate sono la norma perché il canale tende a raccogliere conversazioni simultanee su argomenti non correlati (il canale è dedicato a uno scopo aziendale, non a un argomento; l’alternativa impraticabile sarebbe invitare metà dell’ingegneria in nuovi canali temporanei creati una dozzina di volte al giorno)
  • Molte, ma non tutte, di queste conversazioni threadate dovrebbero essere identificate come risposte a domande che qualcuno in seguito vorrà consultare, e l’integrazione viene utilizzata per promuoverle come affidabili nella categoria associata in Discourse (qualcuno come me che cura attivamente risposte utili)
  • I nuovi argomenti in quella categoria associata in Discourse dovrebbero generare post su Slack in quel canale Slack
    • I commenti aggiuntivi su quei nuovi argomenti dovrebbero essere pubblicati su Slack in un thread che segue il primo nuovo post su Slack
  • I nostri utenti sono indirizzati a cercare prima su Discourse prima di chiedere su Slack

Inoltre, il fatto che tu faccia questa domanda mi fa pensare che, come funzione correlata, sarebbe ottimo avere la possibilità, quando si riassume un thread di Slack in un post su Discourse, per l’integrazione di pubblicare un puntatore al nuovo argomento di Discourse alla fine del thread Slack originale appena riassunto. Questo ci aiuterebbe a mantenere la conversazione in un unico posto.

Questo è effettivamente legato all’idea originale della funzionalità perché, se avessimo entrambe le cose, avrebbe senso che invece di pubblicare un nuovo messaggio Slack quando si riassume, si pubblicasse il messaggio nel thread riassunto, e si indicasse quel thread come il luogo dove pubblicare ulteriori commenti di Discourse. Non si riassumono i commenti Slack aggiuntivi in quel thread su Discourse; l’obiettivo è reindirizzare la conversazione su Discourse su quell’argomento. Questo mi sembra logico:

  • DATA: c’è un luogo dove memorizzare l’ID del messaggio Slack associato a un argomento
  • E: i nuovi commenti su un argomento vengono pubblicati come commenti al messaggio Slack memorizzato
  • ALLORA: imposta l’ID del messaggio Slack per un argomento quando si utilizza la funzionalità di integrazione slackbot post thread, facendo sì che i nuovi commenti di Discourse sull’argomento vengano annunciati in quel thread, inclusi i collegamenti di ritorno all’argomento/commento di Discourse

Questo aiuterebbe davvero a diffondere il concetto di “controlla prima Discourse prima di chiedere”.

5 Mi Piace

Tutto questo mi sembra ottimo!

:100:

3 Mi Piace

Come supporto visivo, questo assomiglia all’esperienza utente di Slack che vuoi promuovere?

… oh mio, l’anno è stato rimosso dall’inizio del thread. qualche ipotesi?

@riking Un po’, ma con alcune differenze.

L’annuncio non apparirebbe esattamente così; verrebbe pubblicato dal lato watch dell’integrazione. Non indicherebbe che è stato spostato. Ecco un esempio dell’interfaccia attuale (senza thread), presa dall’integrazione con Slack così come l’ho implementata per makerforums:

Nel modello con thread, il primo di quei post darebbe avvio a un thread su Slack, e il commento di Nedman sarebbe invece una risposta in quel thread. Quando viene utilizzato post thread :thread_url, l’:thread_url verrebbe salvato insieme al nuovo argomento e il lato watch dell’integrazione di chat pubblicherebbe il post iniziale dell’argomento e tutti i commenti successivi in quel thread di Slack, ma il contenuto rimarrebbe lo stesso.

L’integrazione watch thread ti reindirizza a Discourse, dove devi scrivere il titolo e hai la possibilità di modificare il post iniziale dell’argomento prima di pubblicarlo. Quindi l’annuncio pubblicato su Slack accredita già la persona che ha eseguito post thread come autore, seguito da una riga con il titolo dell’argomento come testo del link che rimanda a Discourse, e infine da una citazione estratta dall’inizio del post. La modifica che propongo qui è che, con una configurazione non predefinita e specifica per canale (quindi un’opzione watch, non una configurazione del plugin di integrazione chat a livello di sito), quel contenuto verrebbe pubblicato nel thread invece che nel canale. (Non “inviare anche al canale” — il che vanificherebbe lo scopo della modifica per noi.) Anche i commenti successivi a quel nuovo argomento su Discourse andrebbero nello stesso thread di Slack.

E, dato che chiedi delle ipotesi, il 2017, l’anno in cui Slack ha introdotto i thread?

2 Mi Piace

Ho riflettuto su questo argomento e ho letto la documentazione dell’API Slack chat.postMessage, e credo di poter ridurre il mio muro di parole a qualcosa di molto più semplice.

Solo watch e non follow ha la possibilità di scegliere le risposte in thread, attraverso un meccanismo che sto ancora cercando di determinare. In alternativa, @david, cosa ne penseresti di un nuovo filtro regola thread con priorità mute thread watch follow, e di integrare la regola in trigger_notification per abilitare comportamenti sensibili alla regola?

  1. Se watch è configurato per i thread (in alternativa, se è definita una regola thread), nell’invio di una notifica per un nuovo post a un canale Slack, se l’argomento del post ha un ts di Slack associato, pubblica in quel thread Slack impostando thread_ts al valore ts fornito da Slack.

  2. Nell’invio di una notifica per un nuovo post a un canale Slack, se l’argomento del post non ha un ts associato, memorizza il valore ts restituito nella risposta per l’argomento (in modo che i post futuri sull’argomento possano essere inseriti in thread se watch è configurato per i thread).

  3. Quando si utilizza il comando post thread :thread_url, memorizza il ts del thread nell’argomento creato, che sarà utilizzato solo dalle regole watch in thread.

Ecco i miei pensieri e preoccupazioni attuali:

  1. Come determinare se pubblicare nei thread su base per regola. Al momento mi sembra più semplice un nuovo filtro, ma forse sto tralasciando qualcosa.

  2. Far passare l’URL originale del post Slack e l’ID del thread attraverso il flusso del transcript è ciò che mi risulta più opaco in questo momento. Sembra che debba davvero aggiungere un ID di thread specifico per provider da qualche parte e preservarlo fino al salvataggio del post. Lo implementerei solo per il ts di Slack, ma presumibilmente non sarà l’unica integrazione di chat con thread.

  3. Per la pubblicazione, credo di dover memorizzare il ts di Slack in un campo personalizzato specifico per Slack su Topic, non in un campo thread generico DiscourseChat.

1 Mi Piace

La booleana ‘threading’ ha davvero bisogno di essere per regola? Perché non creare una nuova impostazione del sito

chat_integration_slack_thread_responses

Se questa è abilitata e abbiamo un record dell’ID del thread del topic, allora inviamo le notifiche successive al thread di Slack.

Sì, penso che vada benissimo. Usa semplicemente un campo personalizzato specifico per Slack sul topic. Se in futuro sentiremo la necessità di implementare questa funzionalità per altri provider, potremo rendere la soluzione più generica.

Sì, è molto complicato. Come versione 1, sarei tentato di includere qualcosa come

<!--SLACK_THREAD_ID=abcdefg-->

all’inizio del post. In questo modo, il plugin può controllare i post che iniziano con questa stringa e assegnare il campo personalizzato. Non è perfetto, ma forse un buon punto di partenza?

2 Mi Piace

Grazie mille!

Ieri sera ho implementato e ho testato con successo l’intera stack (anche se non ho ancora testato in produzione) i miei primi due AC, ma non ancora il flusso dei trascritti, utilizzando un campo personalizzato su Topic e una regola thread. Quindi sto facendo buoni progressi verso la possibilità di mostrare il codice in almeno una PR di bozza.

Ho anche un commit separato per rimuovere l’uso non necessario di pstore_get dal provider Slack. Dato che questo è l’unico utilizzo di pstore in tutta la stack, vorresti che rimuovessi anche tutti i pstore_* da app/initializers/discourse_chat.rb in quel commit di pulizia?

È esattamente da dove sono partito, e sarebbe stato sicuramente più semplice!

Tuttavia, almeno per il mio caso d’uso (e ho sentito lo stesso da persone in altre aziende, non siamo unici), canali diversi hanno preferenze diverse sull’uso dei thread. Ci sono canali pensati per essere utilizzati con i thread (perché la maggior parte delle persone si interessa solo ad alcuni argomenti) e canali che sono fortemente contrari ai thread (perché i thread seppelliscono informazioni importanti).

Ho visto due aspetti essenzialmente non correlati che guidano questa preferenza:

  • Membri: i canali con la maggior parte dei membri che usano IRC attivamente da decenni sono abituati a disambiguare mentalmente i thread conversazionali intrecciati in un singolo canale e non vogliono cliccare sui thread per vedere contenuti importanti, mentre i canali con la maggior parte dei membri cresciuti nell’email si aspettano che le conversazioni siano thread e di cliccare sulle conversazioni che li interessano.
  • Scopo: i canali con uno scopo aziendale di annunci tendono ad essere fortemente threadati, ma i canali con scopi di ricerca o collaborazione sono spesso intenzionalmente non threadati perché i thread nascondono le informazioni a meno che non le si noti e non si clicchi su di essi.

Se desideri avere una sintassi comune per le opzioni delle regole, penserei che Rule potrebbe essere generalmente esteso in modo da avere un valore :options che, come :tags, è un array. Immagino che potrebbe avere senso prendere spunto dai shell da riga di comando, in modo che /discourse [watch|follow|mute] -something -here imposti :options su ['something', 'here'] — riservando un - iniziale per introdurre un’opzione. Quindi sarebbe /discourse watch my-category-slug #tagged-foo -threaded. Non so quanto lavoro in più richiederebbe rispetto a quello che ho già fatto. Hai forti opinioni in un senso o nell’altro qui? Posso vedere argomenti per entrambi i lati: aggiungere un altro valore a Rule la rende più complicata da scrivere per un provider di chat; aggiungere un altro valore di filtro rende un’altra funzionalità specifica di Slack (come la pubblicazione di un trascritto) che rende l’interfaccia più complicata per gli utenti non Slack. Ovviamente potrei mancare qualcosa che renderebbe più difficile di quanto penso; ad esempio, se uno slug di categoria potesse iniziare con - e diventasse improvvisamente ambiguo; lo shell usa -- per indicare “tutto ciò che segue non è un argomento”, ma forse potremmo invertirlo in modo che -- significhi “tutto ciò che segue è un’opzione”. Se desideri che mi occupi di questo, per favore dammi indicazioni sulla sintassi che troveresti appropriata per specificare le opzioni delle regole. Ma aggiungere semplicemente thread mi sembra più semplice, quindi in assenza di indicazioni specifiche per aggiungere una funzionalità generale “options”, aspetterò di apportare eventuali modifiche in quella direzione.

[Edit: Passare da un filtro di regola a un’opzione complicherebbe sicuramente l’interfaccia utente, che dovrebbe espandersi per supportare generalmente le opzioni generali, e questo non mi sembra una grande scelta. Quindi ora, dopo aver guardato l’interfaccia utente, preferirei attenermi al filtro; penso sia più pulito.]

Per il flusso del trascritto del post, grazie per l’idea del commento HTML. Per il mio caso d’uso non mi farà alcun male; onestamente mi aspetto di essere il principale utilizzatore, almeno inizialmente. È un bel trucco semplice.

Ho un’altra idea, da non includere in questa PR: sarebbe bello avere una mappatura dal canale per il messaggio in fase di pubblicazione alla categoria in cui dovrebbe essere creato il post Discourse risultante. Perché ciò accada, penso che il trascritto dovrebbe cambiare per avere un involucro o un sidecar, momento in cui l’involucro o il sidecar potrebbero avere sia la categoria che l’ID Slack. Sembra una quantità sostanziale di apprendimento per me, dato che sono ancora nella fase di “ricerca avanzata su Google del problema” dell’apprendimento di Ruby on Rails. :wink:

2 Mi Piace

Un’altra idea per perfezionare questa funzionalità:

E se ci fosse un’altra impostazione, cross_post_to_channel_after_hours (di default 48?) o qualcosa di simile, in cui, se il tempo trascorso dall’ultima risposta è superiore a x ore, il post viene inviato al thread con il flag “invia anche al canale”.

Non prendere troppo sul serio il mio suggerimento al momento se vuoi solo far funzionare le cose senza di esso (probabilmente una strategia migliore!). Solo un’idea da considerare…

Niente affatto un’idea pazza, ma non ho intenzione di implementarla, poiché comprometterebbe il mio caso d’uso principale e non ne ho bisogno in nessun altro contesto. :smiling_face: Capisco perfettamente che ad altre persone potrebbe interessare!

Se fosse un’impostazione normale invece che un’opzione per canale, si chiamerebbe chat_integration_slack_copy_threads_to_channel_after_hours, con valore predefinito 0 (non inviare), ma è possibile impostarlo su qualsiasi valore. Concettualmente è abbastanza semplice, ma richiede più lavoro perché devi recuperare il thread (usando il codice inizialmente scritto per le trascrizioni, e non ricordo subito se richiederebbe una ristrutturazione) per prendere una decisione sull’impostazione di un semplice flag.

Ma se vuoi lavorarci sopra, spero che quanto sto facendo possa fornire un buon quadro di riferimento. Ti chiederei solo di non attivarlo di default, perché se questo avvenisse durante un aggiornamento e i miei utenti venissero “spammati” da me mentre curavo contenuti per Discourse, avrei utenti insoddisfatti.

1 Mi Piace

Per semplificare le cose, penso che potresti semplicemente controllare la data del post precedente nel topic di Discourse.

(Comporterebbe un po’ diversamente in alcuni casi, ma potrebbe essere un buon punto di partenza)

@david Ho un draft PR che supera i test unitari così come li ho scritti. Non ho ancora provato a eseguirlo in live contro Slack, quindi non vorrei unirvi finché non sarà fatto. Ma almeno tutti i test unitari passano per me, e ho cercato di aggiungere test significativi per essi.

Ho anche spostato il commento sull’ID alla fine invece che all’inizio del post perché mi sembrava più probabile che sopravvivesse e meno probabile che venisse alterato lì, e ho cercato di essere conservativo nel suo parsing.

Grazie per il tuo lavoro su questo plugin!

Ho corretto i miei errori iniziali di linting, ma ora falliscono dei test che non ho toccato. Sono basato sull’ultima master e i test passano in locale. Hai qualche informazione sui test che falliscono?

4 Mi Piace

Ho ripulito molto la PR, ma non è ancora pronta per essere inviata. Al momento ho due o tre problemi che mi stanno creando difficoltà e non so ancora come risolverli.

  1. Sto cercando di usare fa-arrow-circle-o-right come icona del thread, ma sul mio sito live appare vuota nell’interfaccia. (Dopo aver effettuato il checkout del mio branch sul sito live, eseguo su discourse -c 'bundle exec rake assets:precompile' && sv restart unicorn per testare sul server live.) L’ho aggiunta anche a plugin.rb e l’ho richiamata, quindi non so quali siano i prossimi passi. Esiste un elenco di icone FontAwesome approvate per l’uso in Discourse? Ho trovato lib/svg_sprite/svg_sprite.rb e chevron-right sembra perfetto per questo caso d’uso.

  2. I test passano tutti localmente, ma su Travis ricevo errori costanti che sembrano non correlati alle mie modifiche, il che rende naturalmente difficile per me investigare o ragionare. 13 fallimenti con un 404 invece di un altro codice atteso (ad esempio 200) in spec/lib/discourse_chat/provider/slack/slack_command_controller_spec.rb Risolto evitando di fare “cargo-coding” con isolate_namespace e ora conosco anche rake routes.

Ho pubblicato con successo:

Potrebbero esserci altre cose da ripulire, ma penso che funzioni.

Dopo il merge, aggiornerò adeguatamente Discourse Chat Integration.

2 Mi Piace

Continuo a trovare nuove opportunità di apprendimento qui. Ora so come eseguire yarn prettier, ora toccherà a me imparare come aggiornare i test del frontend…

Errore: Assertazione fallita: Devi usare set() per impostare la proprietà `channel` (di <(unknown):ember3806>) su `< (unknown):ember3799`.

Grazie mille per tutto il tuo lavoro qui @mcdanlj - ora è stato unito:

4 Mi Piace

Apprezzo molto le vostre recensioni, davvero utili! Ho aggiornato il post ufficiale della wiki sull’integrazione, come promesso. Se preferite evidenziare le modifiche in altri modi, non ho problemi: non ho alcun orgoglio d’autore o cose del genere. :smiling_face:

3 Mi Piace

Potreste abilitare l’uso dei thread nelle impostazioni di integrazione chat per Slack, come:

Abilita i thread dei post su Slack

Intendi che vuoi poter configurare il plug-in in modo che si rifiuti di rispettare l’opzione thread nell’integrazione?

Aggiornato alla beta1a 2.6 corrente pochi giorni fa e i test sono passati, ma per quanto riesco a vedere, da allora i post di Slack non sono più raggruppati in thread. I post e le risposte relativi a un argomento vengono ancora visualizzati singolarmente nei canali Slack.