/
main.go
102 lines (81 loc) · 1.93 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
package main
import "github.com/cod3hulk/alfred"
import "fmt"
import "github.com/nlopes/slack"
import "github.com/renstrom/fuzzysearch/fuzzy"
import "os"
import "strings"
import "sync"
func users(apiToken string, items chan alfred.Item, wg *sync.WaitGroup) {
defer wg.Done()
api := slack.New(apiToken)
users, err := api.GetUsers()
if err != nil {
fmt.Printf("%s\n", err)
return
}
for _, user := range users {
items <- alfred.Item{
Title: user.Name,
Subtitle: user.RealName,
Arg: user.Name,
}
}
}
func channels(apiToken string, items chan alfred.Item, wg *sync.WaitGroup) {
defer wg.Done()
api := slack.New(apiToken)
channels, err := api.GetChannels(true)
if err != nil {
fmt.Printf("%s\n", err)
return
}
for _, channel := range channels {
items <- alfred.Item{
Title: channel.Name,
Subtitle: "Channel",
Arg: channel.Name,
}
}
}
func groups(apiToken string, items chan alfred.Item, wg *sync.WaitGroup) {
defer wg.Done()
api := slack.New(apiToken)
groups, err := api.GetGroups(true)
if err != nil {
fmt.Printf("%s\n", err)
return
}
for _, group := range groups {
if !strings.HasPrefix(group.Name, "mpdm") {
items <- alfred.Item{
Title: group.Name,
Subtitle: "Group",
Arg: group.Name,
}
}
}
}
func filterItem(item alfred.Item, query string) bool {
query = strings.ToLower(query)
arg := strings.ToLower(item.Arg)
subtitle := strings.ToLower(item.Subtitle)
return fuzzy.Match(query, arg) || fuzzy.Match(query, subtitle)
}
func main() {
items := make(chan alfred.Item)
var wg sync.WaitGroup
result := new(alfred.Result)
go func(items chan alfred.Item, result *alfred.Result) {
for item := range items {
result.Add(&item)
}
}(items, result)
wg.Add(3)
go users(os.Args[1], items, &wg)
go groups(os.Args[1], items, &wg)
go channels(os.Args[1], items, &wg)
wg.Wait()
close(items)
fmt.Print(result.Filter(os.Args[2], filterItem).Output())
}