Después de investigar con expertos en esta materia, programadores de varias áreas y profesores dimos con la solución al dilema y la plasmamos en este post.
Solución:
Hablé con James en Slack y me dio una forma sencilla de determinar si un mensaje es un DM o no; si un ID de canal comienza con un:
- C, es un canal público
- D, es un DM con el usuario
- G, es un canal privado o un DM de varias personas
Sin embargo, estos valores no están escritos en piedra y podrían cambiar en algún momento o agregarse.
Entonces, si esa sintaxis desaparece, otra forma de detectar un DM es usar canales.info y grupos.info. Si ambos regresan”false” para el campo “ok”, entonces sabes que es un DM.
Nota:
- channels.info es solo para canales públicos
- groups.info es solo para canales privados y DM de varias personas
Información adicional: una vez que detecte que un mensaje es un DM, use la identificación de usuario o la identificación del canal y búsquelo en los resultados de im.list; si lo encuentra, entonces sabrá que es un DM para el bot.
- “id” de im.list es el ID del canal
- “usuario” de im.list es la ID de usuario de la persona que está enviando un DM con el bot
- No pasa la ID de usuario del bot, porque se extrae del token
FYI a partir de julio de 2017, para los eventos “message.im” (a través de las suscripciones de eventos de su aplicación), la carga útil del evento ahora parece devolver campos adicionales para detectar si el mensaje proviene de su propio bot (pegado aquí desde mis registros):
INFO[0012] got Slack message: (bot.SlackMessage)
SlackEvent: (bot.SlackEvent)
Type: (string) (len=7) "message",
EventTs: (string) (len=17) "1501076832.063834",
User: (string) ""
,
SubType: (string) (len=11) "bot_message",
Channel: (string) (len=9) "D6CJWD132",
Text: (string) (len=20) "this is my bot reply",
Username: (string) (len=15) "Myapp Local",
BotID: (string) (len=9) "B6DAZKTGG",
Ts: (string) (len=17) "1501076832.063834"
Slack agregó la API de conversaciones hace algún tiempo. Debe usarlo para diferenciar entre PM/canal en lugar de confiar en prefix.
De la documentación de la API de conversaciones:
Cada canal tiene una identificación única para el equipo que comienza con una sola letra prefixya sea C, G o D. Cuando un canal se comparte entre equipos (consulte Desarrollo para canales compartidos), el prefix del ID del canal puede cambiarse, por ejemplo, un canal privado con ID G0987654321 puede convertirse en ID C0987654321.
¡Esta es una de las razones por las que debe usar los métodos de conversaciones en lugar de los métodos API anteriores! No puede confiar en que la ID única de un canal privado compartido permanezca constante durante toda su vida útil.
Obtén información de la conversación usando el método conversaciones.info y verifica is_im
bandera. is_im == true
significa que la conversación es un mensaje directo entre dos personas distinguidas o un usuario y un bot.