@@ -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.
695652func send (api * slack.Client , message models.Message ) {
696653 // TODO: potentially long running call depending on workspace size
0 commit comments