github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/chats/slack.go (about) 1 package chats 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/jenkins-x/jx-logging/pkg/log" 8 "github.com/olli-ai/jx/v2/pkg/auth" 9 "github.com/olli-ai/jx/v2/pkg/util" 10 "github.com/nlopes/slack" 11 ) 12 13 type SlackChatProvider struct { 14 SlackClient *slack.Client 15 Server *auth.AuthServer 16 UserAuth *auth.UserAuth 17 } 18 19 func CreateSlackChatProvider(server *auth.AuthServer, userAuth *auth.UserAuth, batchMode bool) (ChatProvider, error) { 20 u := server.URL 21 if u == "" { 22 return nil, fmt.Errorf("No base URL for server!") 23 } 24 if userAuth == nil || userAuth.IsInvalid() || userAuth.ApiToken == "" { 25 return nil, fmt.Errorf("No authentication found for Slack server %s", u) 26 } 27 slackClient := slack.New(userAuth.ApiToken) 28 29 return &SlackChatProvider{ 30 SlackClient: slackClient, 31 Server: server, 32 UserAuth: userAuth, 33 }, nil 34 } 35 36 func (c *SlackChatProvider) GetChannelMetrics(name string) (*ChannelMetrics, error) { 37 metrics := &ChannelMetrics{ 38 Name: name, 39 } 40 name = strings.TrimPrefix(name, "#") 41 id := name 42 43 channels, err := c.SlackClient.GetChannels(true) 44 if err != nil { 45 return metrics, err 46 } 47 for _, ch := range channels { 48 log.Logger().Infof("Found channel %s with id %s", ch.Name, ch.ID) 49 if ch.Name == name { 50 id = ch.ID 51 break 52 } 53 } 54 info, err := c.SlackClient.GetChannelInfo(id) 55 if err != nil { 56 return metrics, err 57 } 58 metrics.MemberCount = info.NumMembers 59 metrics.ID = info.ID 60 metrics.Name = info.Name 61 metrics.Members = info.Members 62 metrics.URL = util.UrlJoin(c.Server.URL, "messages", info.ID) 63 return metrics, nil 64 }