99 "github.com/42wim/matterbridge/bridge/config"
1010 "github.com/42wim/matterbridge/bridge/helper"
1111 "github.com/slack-go/slack"
12+ "github.com/slack-go/slack/socketmode"
13+ "github.com/slack-go/slack/slackevents"
14+ "encoding/json"
1215)
1316
1417// ErrEventIgnored is for events that should be ignored
@@ -19,6 +22,9 @@ func (b *Bslack) handleSlack() {
1922 if b .GetString (incomingWebhookConfig ) != "" && b .GetString (tokenConfig ) == "" {
2023 b .Log .Debugf ("Choosing webhooks based receiving" )
2124 go b .handleMatterHook (messages )
25+ } else if b .GetString (appTokenConfig ) != "" && b .GetString (tokenConfig ) != "" {
26+ b .Log .Debugf ("Choosing socket mode based receiving" )
27+ go b .handleSlackClientSocketMode (messages )
2228 } else {
2329 b .Log .Debugf ("Choosing token based receiving" )
2430 go b .handleSlackClient (messages )
@@ -47,6 +53,135 @@ func (b *Bslack) handleSlack() {
4753 }
4854}
4955
56+ func (b * Bslack ) handleSlackClientSocketMode (messages chan * config.Message ) {
57+
58+ for evt := range b .smc .Events {
59+ switch evt .Type {
60+ case socketmode .EventTypeConnecting :
61+ b .Log .Debug ("Connecting to Slack with Socket Mode..." )
62+ case socketmode .EventTypeConnectionError :
63+ b .Log .Debug ("Connection failed. Retrying later..." )
64+ case socketmode .EventTypeConnected :
65+ b .Log .Debug ("Connected to Slack with Socket Mode." )
66+ if info , err := b .rtm .AuthTest (); err == nil {
67+ b .si = & slack.Info {
68+ User : & slack.UserDetails {
69+ ID : info .UserID ,
70+ Name : info .User ,
71+ },
72+ Team : & slack.Team {
73+ ID : info .TeamID ,
74+ Name : info .Team ,
75+ },
76+ }
77+ b .channels .populateChannels (true )
78+ b .users .populateUsers (true )
79+ } else {
80+ b .Log .Fatalf ("Get user info error %+v" , err )
81+ }
82+ case socketmode .EventTypeEventsAPI :
83+ eventsAPIEvent , ok := evt .Data .(slackevents.EventsAPIEvent )
84+ if ! ok {
85+ b .Log .Printf ("Ignored %+v\n " , evt )
86+ continue
87+ }
88+
89+ b .smc .Ack (* evt .Request )
90+
91+ switch eventsAPIEvent .Type {
92+ case slackevents .CallbackEvent :
93+ innerEvent := eventsAPIEvent .InnerEvent
94+ // b.Log.Debugf("Event received %+v", innerEvent)
95+ switch ev := innerEvent .Data .(type ) {
96+ case * slackevents.MessageEvent :
97+ // Workaround for handler compability
98+ evString , _ := json .Marshal (ev )
99+ b .Log .Debugf ("Message event: %s" , evString )
100+ slackEvent := & slack.MessageEvent {}
101+ if err := json .Unmarshal (evString , & slackEvent ); err != nil {
102+ b .Log .Errorf ("Skipped message: %#v" , err )
103+ continue
104+ }
105+
106+ if b .skipMessageEvent (slackEvent ) {
107+ b .Log .Debugf ("Skipped message: %#v" , slackEvent )
108+ continue
109+ }
110+ rmsg , err := b .handleMessageEvent (slackEvent )
111+ if err != nil {
112+ b .Log .Errorf ("%#v" , err )
113+ continue
114+ }
115+ messages <- rmsg
116+ case * slackevents.FileDeletedEvent :
117+ slackEvent := & slack.FileDeletedEvent {
118+ Type : ev .Type ,
119+ EventTimestamp : ev .EventTimestamp ,
120+ FileID : ev .FileID ,
121+ }
122+ rmsg , err := b .handleFileDeletedEvent (slackEvent )
123+ if err != nil {
124+ b .Log .Printf ("%#v" , err )
125+ continue
126+ }
127+ messages <- rmsg
128+ case * slackevents.MemberJoinedChannelEvent :
129+ b .users .populateUser (ev .User )
130+ case * slackevents.UserProfileChangedEvent :
131+ b .users .invalidateUser (ev .User .ID )
132+
133+ // TODO not implemented
134+ // case *slack.ChannelJoinedEvent:
135+ // // When we join a channel we update the full list of users as
136+ // // well as the information for the channel that we joined as this
137+ // // should now tell that we are a member of it.
138+ // b.channels.registerChannel(ev.Channel)
139+
140+ case * slackevents.AppMentionEvent :
141+ default :
142+ b .Log .Debugf ("Unhandled incoming event: %T" , ev )
143+ }
144+ default :
145+ b .Log .Printf ("Unsupported Events API event received: %+v" , eventsAPIEvent .Type )
146+ }
147+ case socketmode .EventTypeInteractive :
148+ callback , ok := evt .Data .(slack.InteractionCallback )
149+ if ! ok {
150+ b .Log .Printf ("Ignored %+v\n " , evt )
151+ continue
152+ }
153+
154+ b .Log .Debugf ("Interaction skipped: %+v\n " , callback )
155+
156+ var payload interface {}
157+
158+ switch callback .Type {
159+ case slack .InteractionTypeBlockActions :
160+ case slack .InteractionTypeShortcut :
161+ case slack .InteractionTypeViewSubmission :
162+ case slack .InteractionTypeDialogSubmission :
163+ default :
164+
165+ }
166+
167+ b .smc .Ack (* evt .Request , payload )
168+ case socketmode .EventTypeSlashCommand :
169+ cmd , ok := evt .Data .(slack.SlashCommand )
170+ if ! ok {
171+ b .Log .Printf ("Ignored %+v\n " , evt )
172+ } else {
173+ b .Log .Debugf ("Slash command skipped: %+v" , cmd )
174+ }
175+ var payload interface {}
176+ b .smc .Ack (* evt .Request , payload )
177+ case "hello" :
178+ continue
179+ default :
180+ b .Log .Errorf ("Unexpected event type received: %s\n " , evt .Type )
181+ }
182+ }
183+ }
184+
50185func (b * Bslack ) handleSlackClient (messages chan * config.Message ) {
51186 for msg := range b .rtm .IncomingEvents {
52187 if msg .Type != sUserTyping && msg .Type != sHello && msg .Type != sLatencyReport {
0 commit comments