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  }