/
main.go
126 lines (103 loc) · 2.6 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
"github.com/slack-go/slack"
yaml "gopkg.in/yaml.v2"
)
const (
EnvSlackToken = "SLACK_TOKEN"
EnvFilepath = "INPUT_FILEPATH"
)
var userCache map[string]string
type UserGroups struct {
Groups []struct {
Name string `yaml:"name"`
Members []string `yaml:"members"`
}
}
func main() {
var filepath string
userCache = map[string]string{}
if len(os.Args) > 1 {
filepath = os.Args[1]
} else {
filepath = os.Getenv(EnvFilepath)
}
if filepath == "" {
fmt.Fprintln(os.Stderr, "File path is required")
os.Exit(1)
}
slackToken := os.Getenv(EnvSlackToken)
if slackToken == "" {
fmt.Fprintln(os.Stderr, "Slack Token is required")
os.Exit(1)
}
yamlFile, err := ioutil.ReadFile(filepath)
if err != nil {
fmt.Printf("Error opening the file: #%v ", err)
}
ug := UserGroups{}
err = yaml.Unmarshal(yamlFile, &ug)
if err != nil {
fmt.Printf("Error unmarshalling the file: %v", err)
}
api := slack.New(slackToken)
slackGroups, err := api.GetUserGroups(slack.GetUserGroupsOptionIncludeUsers(true))
if err != nil {
fmt.Printf("Error getting Slack UserGroups: %v\n", err)
return
}
for _, group := range ug.Groups {
memberIDs := getListUserIDs(api, group.Members)
// 1. Check if groups exist otherwise create it
slackGroupId := ""
for _, sg := range slackGroups {
if sg.Handle == group.Name {
slackGroupId = sg.ID
}
}
if slackGroupId == "" {
ug := slack.UserGroup{
Name: "Team " + strings.Title(strings.ToLower(group.Name)),
Handle: strings.ToLower(group.Name),
}
ugr, err := api.CreateUserGroup(ug)
if err != nil {
fmt.Printf("Error creating the Slack UserGroup: %v\n", err)
return
}
slackGroupId = ugr.ID
}
// 2. Update the members
if len(memberIDs) > 0 {
mlist := strings.Join(memberIDs, ",")
fmt.Printf("Updating Slack UserGroup %v with members: %s\n", group.Name, mlist)
_, err = api.UpdateUserGroupMembers(slackGroupId, mlist)
if err != nil {
fmt.Printf("Error updating members for the Slack group %s: %v\n", group.Name, err)
return
}
}
}
fmt.Println("Slack has been updated successfully")
}
func getListUserIDs(api *slack.Client, userList []string) []string {
userIDs := []string{}
for _, user := range userList {
if cachedID, ok := userCache[user]; ok {
userIDs = append(userIDs, cachedID)
continue
}
userInfo, err := api.GetUserByEmail(user)
if err != nil {
fmt.Printf("Error getting user %s from Slack API: %v\n", user, err)
continue
}
userIDs = append(userIDs, userInfo.ID)
userCache[user] = userInfo.ID
}
return userIDs
}