forked from etcinit/phabulous
/
bot_summon.go
98 lines (82 loc) · 1.61 KB
/
bot_summon.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
package bot
import (
"fmt"
"strconv"
"strings"
"github.com/etcinit/gonduit/requests"
"github.com/etcinit/phabulous/app/messages"
"github.com/nlopes/slack"
)
// HandleSummon shows usage tip.
func (b *Bot) HandleSummon(ev *slack.MessageEvent, matches []string) {
if len(matches) < 2 {
b.Slacker.SimplePost(
ev.Channel,
"Usage: `summon <REVISION>`. Example: `summon D456`.",
messages.IconDefault,
true,
)
return
}
conn, err := b.Slacker.Factory.Make()
if err != nil {
b.Excuse(ev, err)
return
}
id, err := strconv.Atoi(matches[1])
if err != nil {
b.Excuse(ev, err)
return
}
res, err := conn.DifferentialQuery(requests.DifferentialQueryRequest{
IDs: []uint64{uint64(id)},
})
if err != nil {
b.Excuse(ev, err)
return
}
if len(*res) == 0 {
b.Slacker.SimplePost(
ev.Channel,
"Revision not found.",
messages.IconDefault,
true,
)
return
}
if len((*res)[0].Reviewers) == 0 {
b.Slacker.SimplePost(
ev.Channel,
"Revision has no reviewers.",
messages.IconDefault,
true,
)
return
}
reviewerNames := []string{}
for _, reviewerPHID := range (*res)[0].Reviewers {
nameRes, err := conn.PHIDQuerySingle(reviewerPHID)
if err != nil {
b.Excuse(ev, err)
return
}
reviewerNames = append(reviewerNames, "@"+(*nameRes).Name)
}
userInfo, err := b.slackRTM.GetUserInfo(ev.User)
if err != nil {
b.Excuse(ev, err)
return
}
b.Slacker.SimplePost(
ev.Channel,
fmt.Sprintf(
"*@%s summons %s to review D%s:* %s",
userInfo.Name,
strings.Join(reviewerNames, ", "),
matches[1],
(*res)[0].URI,
),
messages.IconDefault,
true,
)
}