91 lines
2.6 KiB
Go
91 lines
2.6 KiB
Go
package slackbot
|
|
|
|
import (
|
|
"github.com/slack-go/slack"
|
|
"github.com/thoas/go-funk"
|
|
"go.uber.org/zap"
|
|
"houston/logger"
|
|
)
|
|
|
|
func (c *Client) GetUsersInfo(users ...string) (*[]slack.User, error) {
|
|
if len(users) == 0 {
|
|
return &[]slack.User{}, nil
|
|
}
|
|
var usersInfo []slack.User
|
|
splittedUsersList := splitUsers(users, 30)
|
|
for usersList := range splittedUsersList {
|
|
usersInfoResponse, err := c.socketModeClient.GetUsersInfo(splittedUsersList[usersList]...)
|
|
if err != nil {
|
|
logger.Error("get users info failed", zap.Any("users", splittedUsersList[usersList]), zap.Error(err))
|
|
emptyArray := make([]slack.User, len(splittedUsersList))
|
|
return &emptyArray, nil
|
|
}
|
|
usersInfo = append(usersInfo, *usersInfoResponse...)
|
|
}
|
|
|
|
return &usersInfo, nil
|
|
}
|
|
|
|
func (c *Client) GetUsersInConversation(channelId string) ([]string, error) {
|
|
users, _, err := c.socketModeClient.GetUsersInConversation(&slack.GetUsersInConversationParameters{
|
|
Limit: 100,
|
|
ChannelID: channelId,
|
|
})
|
|
if err != nil {
|
|
logger.Error("error in getting users from conversations",
|
|
zap.String("channelId", channelId), zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
func (c *Client) GetUserByEmail(userEmail string) (*slack.User, error) {
|
|
user, err := c.socketModeClient.GetUserByEmail(userEmail)
|
|
if err != nil {
|
|
logger.Error("error in getting user by email", zap.String("email", userEmail), zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return user, err
|
|
}
|
|
|
|
func (c *Client) GetUserEmailById(userId string) (string, error) {
|
|
users, err := c.GetUsersInfo(userId)
|
|
if err != nil {
|
|
logger.Error("error in getting user info by id", zap.String("id", userId), zap.Error(err))
|
|
return "Anonymous-" + userId, err
|
|
}
|
|
usersInfo := *users
|
|
return usersInfo[0].Profile.Email, nil
|
|
}
|
|
|
|
func (c *Client) GetUserEmailsOrNameByIds(userIds ...string) (map[string]string, error) {
|
|
userIdAndIdentityMapping := make(map[string]string)
|
|
|
|
users, err := c.GetUsersInfo(userIds...)
|
|
if err != nil {
|
|
logger.Error("error in getting user info by id", zap.Any("id", userIds), zap.Error(err))
|
|
return userIdAndIdentityMapping, err
|
|
}
|
|
usersInfo := *users
|
|
funk.ForEach(usersInfo, func(userInfo *slack.User) {
|
|
if userInfo.Profile.Email != "" {
|
|
userIdAndIdentityMapping[userInfo.ID] = userInfo.Profile.Email
|
|
} else {
|
|
userIdAndIdentityMapping[userInfo.ID] = userInfo.Profile.RealName
|
|
}
|
|
})
|
|
return userIdAndIdentityMapping, nil
|
|
}
|
|
|
|
func splitUsers(users []string, chunkSize int) [][]string {
|
|
var result [][]string
|
|
for i := 0; i < len(users); i += chunkSize {
|
|
end := i + chunkSize
|
|
if end > len(users) {
|
|
end = len(users)
|
|
}
|
|
result = append(result, users[i:end])
|
|
}
|
|
return result
|
|
}
|