slack api - crear - ¿Cómo puede un robot Slack detectar un mensaje directo frente a un mensaje en un canal?
slack apps (3)
Hablé con James en Slack y él me dio una manera 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 multi-persona
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 para usar los dos canales.info y groups.info. Si ambos devuelven "falso" para el campo "ok", entonces saben 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 ID de usuario o la ID de canal y búsquelo en los resultados de im.list; Si lo encuentras, entonces sabrás que es un DM para el bot.
- "Id" de im.list es el ID del canal
- "Usuario" de im.list es el ID de usuario de la persona que está haciendo DM con el bot
- No se pasa el ID de usuario del bot, porque se extrae del token
TL; DR: A través de las API de Slack, ¿cómo puedo diferenciar entre un mensaje en un canal y un mensaje directo?
Tengo un Slack bot en funcionamiento usando la API RTM, llamémoslo Edi. Y funciona bien siempre que todos los comandos comiencen con "@edi"; por ejemplo, "@edi help". Actualmente responde a cualquier canal del que sea miembro y mensajes directos. Sin embargo, me gustaría actualizar el bot para que cuando sea un mensaje directo, no haya necesidad de iniciar un comando con "@edi"; por ejemplo, "@edi help" en un canal, pero "ayuda" en un mensaje directo. No veo nada específico para diferenciar entre los dos, pero sí intenté usar el punto final de channel.info y contar el número de personas en "miembros"; Sin embargo, este método solo funciona en el canal público. Para canales privados y mensajes directos, el punto final devuelve un error de "channel_not_found".
Gracias por adelantado.
La función de información también está disponible para canales privados con el método API de Slack groups.info . Esto funciona también para canales de mensajes directos con múltiples participantes, ya que son una forma especial de canales privados.
Puede usar groups.list para obtener los ID de todos los canales privados, incl. Canales de mensajes directos con múltiples participantes.
Tenga en cuenta que groups.list solo devolverá canales privados, que el usuario o el bot al que pertenece el token de acceso ha sido invitado.
Para su información, a partir de julio de 2017, para los eventos "message.im" (a través de las Suscripciones de eventos de la aplicación), la carga útil del evento 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"
}