Skip to content

Commit 3b13746

Browse files
authored
enhance(slack): utilize app_mention (#529)
1 parent 8d7a048 commit 3b13746

File tree

1 file changed

+61
-104
lines changed

1 file changed

+61
-104
lines changed

remote/slack/helper.go

Lines changed: 61 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -77,61 +77,18 @@ func handleCallBack(api *slack.Client, event slackevents.EventsAPIInnerEvent, bo
7777
// process the event
7878
log.Info().Msgf("received event: %s", event.Type)
7979

80+
// see https://api.slack.com/events for reference
8081
switch ev := event.Data.(type) {
81-
// Ignoring app_mention events
82+
// handle https://api.slack.com/events/app_mention events
8283
case *slackevents.AppMentionEvent:
83-
// There are Events API specific MessageEvents
84-
// https://api.slack.com/events/message.channels
84+
text, mentioned := removeBotMention(ev.Text, bot.ID)
85+
handleMessageEvent(api, bot, ev.Channel, text, ev.User, ev.BotID, ev.TimeStamp, ev.ThreadTimeStamp, mentioned, inputMsgs)
86+
// handle message.channels, message.groups, message.im, and message.mpim events (https://api.slack.com/events?query=message)
87+
// note: an event that triggers app_mention will also trigger this event, potentially causing double responses
8588
case *slackevents.MessageEvent:
86-
senderID := ev.User
87-
88-
// check if message originated from a bot
89-
// and whether we should respond to other bot messages
90-
if ev.BotID != "" && bot.RespondToBots {
91-
// get bot information to get
92-
// the associated user id
93-
opts := slack.GetBotInfoParameters{
94-
Bot: ev.BotID,
95-
}
96-
97-
user, err := api.GetBotInfo(opts)
98-
if err != nil {
99-
log.Error().Msgf("unable to retrieve bot info for %#q", ev.BotID)
100-
101-
return
102-
}
103-
104-
// use the bot's user id as the senderID
105-
senderID = user.UserID
106-
}
107-
108-
// only process messages that aren't from our bot
109-
if senderID != "" && bot.ID != senderID {
110-
channel := ev.Channel
111-
112-
msgType, err := getMessageType(channel)
113-
if err != nil {
114-
log.Error().Msg(err.Error())
115-
}
116-
117-
text, mentioned := removeBotMention(ev.Text, bot.ID)
118-
119-
// get the full user object for the given ID
120-
user, err := api.GetUserInfo(senderID)
121-
if err != nil {
122-
log.Error().Msgf("error getting slack user info: %v", err)
123-
}
124-
125-
timestamp := ev.TimeStamp
126-
threadTimestamp := ev.ThreadTimeStamp
127-
128-
// get the link to the message, will be empty string if there's an error
129-
link, err := api.GetPermalink(&slack.PermalinkParameters{Channel: channel, Ts: timestamp})
130-
if err != nil {
131-
log.Error().Msgf("unable to retrieve link to message: %#q", err.Error())
132-
}
133-
134-
inputMsgs <- populateMessage(models.NewMessage(), msgType, channel, text, timestamp, threadTimestamp, link, mentioned, user, bot)
89+
text, mentioned := removeBotMention(ev.Text, bot.ID)
90+
if !mentioned {
91+
handleMessageEvent(api, bot, ev.Channel, text, ev.User, ev.BotID, ev.TimeStamp, ev.ThreadTimeStamp, mentioned, inputMsgs)
13592
}
13693
case *slackevents.MemberJoinedChannelEvent:
13794
// limit to our bot
@@ -530,61 +487,18 @@ func readFromSocketMode(sm *slack.Client, inputMsgs chan<- models.Message, bot *
530487
case slackevents.CallbackEvent:
531488
innerEvent := eventsAPIEvent.InnerEvent
532489

490+
// see https://api.slack.com/events for reference
533491
switch ev := innerEvent.Data.(type) {
492+
// handle https://api.slack.com/events/app_mention events
534493
case *slackevents.AppMentionEvent:
535-
continue
494+
text, mentioned := removeBotMention(ev.Text, bot.ID)
495+
handleMessageEvent(sm, bot, ev.Channel, text, ev.User, ev.BotID, ev.TimeStamp, ev.ThreadTimeStamp, mentioned, inputMsgs)
496+
// handle message.channels, message.groups, message.im, and message.mpim events (https://api.slack.com/events?query=message)
497+
// note: an event that triggers app_mention will also trigger this event, potentially causing double responses
536498
case *slackevents.MessageEvent:
537-
senderID := ev.User
538-
539-
// check if message originated from a bot
540-
// and whether we should respond to other bot messages
541-
if ev.BotID != "" && bot.RespondToBots {
542-
// get bot information to get
543-
// the associated user id
544-
opts := slack.GetBotInfoParameters{
545-
Bot: ev.BotID,
546-
}
547-
548-
user, err := sm.GetBotInfo(opts)
549-
if err != nil {
550-
log.Error().Msgf("unable to retrieve bot info for %#q", ev.BotID)
551-
552-
return
553-
}
554-
555-
// use the bot's user id as the senderID
556-
senderID = user.UserID
557-
}
558-
559-
// only process message that are not from our bot
560-
if senderID != "" && bot.ID != senderID {
561-
channel := ev.Channel
562-
563-
// determine the message type
564-
msgType, err := getMessageType(channel)
565-
if err != nil {
566-
log.Error().Msg(err.Error())
567-
}
568-
569-
// remove the bot mention from the user input
570-
text, mentioned := removeBotMention(ev.Text, bot.ID)
571-
572-
// get information on the user
573-
user, err := sm.GetUserInfo(senderID)
574-
if err != nil {
575-
log.Error().Msgf("did not get slack user info: %s", err.Error())
576-
}
577-
578-
timestamp := ev.TimeStamp
579-
threadTimestamp := ev.ThreadTimeStamp
580-
581-
// get the link to the message, will be empty string if there's an error
582-
link, err := sm.GetPermalink(&slack.PermalinkParameters{Channel: channel, Ts: timestamp})
583-
if err != nil {
584-
log.Error().Msgf("unable to retrieve link to message: %s", err.Error())
585-
}
586-
587-
inputMsgs <- populateMessage(models.NewMessage(), msgType, channel, text, timestamp, threadTimestamp, link, mentioned, user, bot)
499+
text, mentioned := removeBotMention(ev.Text, bot.ID)
500+
if !mentioned {
501+
handleMessageEvent(sm, bot, ev.Channel, text, ev.User, ev.BotID, ev.TimeStamp, ev.ThreadTimeStamp, mentioned, inputMsgs)
588502
}
589503
case *slackevents.ReactionAddedEvent:
590504
senderID := ev.User
@@ -691,6 +605,49 @@ func readFromSocketMode(sm *slack.Client, inputMsgs chan<- models.Message, bot *
691605
}
692606
}
693607

608+
// handleMessageEvent is a helper function to process app mention and regular message events.
609+
func handleMessageEvent(sm *slack.Client, bot *models.Bot, channel, text, senderID, botID, timestamp, threadTimestamp string, mentioned bool, inputMsgs chan<- models.Message) {
610+
// check if message originated from a bot and whether we should respond to other bot messages
611+
if botID != "" && bot.RespondToBots {
612+
// get bot information to get the associated user id
613+
opts := slack.GetBotInfoParameters{
614+
Bot: botID,
615+
}
616+
617+
user, err := sm.GetBotInfo(opts)
618+
if err != nil {
619+
log.Error().Msgf("unable to retrieve bot info for %#q", botID)
620+
return
621+
}
622+
623+
// use the bot's user id as the senderID
624+
senderID = user.UserID
625+
}
626+
627+
// only process message that are not from our bot
628+
if senderID != "" && bot.ID != senderID {
629+
// determine the message type
630+
msgType, err := getMessageType(channel)
631+
if err != nil {
632+
log.Error().Msg(err.Error())
633+
}
634+
635+
// get information on the user
636+
user, err := sm.GetUserInfo(senderID)
637+
if err != nil {
638+
log.Error().Msgf("did not get slack user info: %s", err.Error())
639+
}
640+
641+
// get the link to the message, will be empty string if there's an error
642+
link, err := sm.GetPermalink(&slack.PermalinkParameters{Channel: channel, Ts: timestamp})
643+
if err != nil {
644+
log.Error().Msgf("unable to retrieve link to message: %s", err.Error())
645+
}
646+
647+
inputMsgs <- populateMessage(models.NewMessage(), msgType, channel, text, timestamp, threadTimestamp, link, mentioned, user, bot)
648+
}
649+
}
650+
694651
// send - handles the sending logic of a message going to Slack.
695652
func send(api *slack.Client, message models.Message) {
696653
// TODO: potentially long running call depending on workspace size

0 commit comments

Comments
 (0)