Files
houston-be/pkg/slackbot/users.go
2023-11-02 13:11:52 +05:30

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
}