/
command.go
125 lines (108 loc) · 3.74 KB
/
command.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
package command
import (
"strings"
"github.com/limejuny/mattermost-chatbot/config"
"github.com/mattermost/mattermost-server/v5/model"
)
type PluginAPI interface {
GetBundlePath() (string, error)
}
type HandlerFunc func(context *model.CommandArgs, args ...string) *model.CommandResponse
type Handler struct {
handlers map[string]HandlerFunc
defaultHandler HandlerFunc
}
const (
commonHelpText = "###### Mattermost Plugin - Slash Command Help\n\n"
botHelpText = commonHelpText +
"* `/bot list` - .\n" +
"* `/bot app` - 애플리케이션 목록을 가져옵니다.\n" +
"* `/bot env` - 배포 환경 목록을 가져옵니다.\n" +
"* `/bot help` - 도움말.\n"
invalidCommand = "유효하지 않은 명령어입니다."
)
var CommandHandler = Handler{
handlers: mergeMaps(map[string]HandlerFunc{
"/bot/list": listCommand,
"/bot/app": appCommand,
"/bot/env": envCommand,
"/bot/help": helpCommand,
"/swagger": SwaggerHandler.defaultHandler,
"/app": AppHandler.defaultHandler,
}, SwaggerHandler.handlers, AppHandler.handlers),
defaultHandler: executeDefault,
}
func mergeMaps(maps ...map[string]HandlerFunc) map[string]HandlerFunc {
result := make(map[string]HandlerFunc)
for _, m := range maps {
for k, v := range m {
result[k] = v
}
}
return result
}
func GetCommands(pAPI PluginAPI) []*model.Command {
return []*model.Command{&model.Command{
Trigger: "bot",
DisplayName: "Bot",
Description: "명령어 목록: list, app, env, help",
AutoComplete: true,
AutoCompleteDesc: "명령어 목록: list, app, env, help",
AutoCompleteHint: "[command]",
}, &model.Command{
Trigger: "swagger",
DisplayName: "Swagger",
Description: "명령어 목록: list, \"<서비스코드>|<배포환경>\", help",
AutoComplete: true,
AutoCompleteDesc: "명령어 목록: list, \"<서비스코드>|<배포환경>\", help",
AutoCompleteHint: "[command]",
}, &model.Command{
Trigger: "app",
DisplayName: "App",
Description: "명령어 목록: list, \"<서비스코드>|<배포환경>\", help",
AutoComplete: true,
AutoCompleteDesc: "명령어 목록: list, \"<서비스코드>|<배포환경>\", help",
AutoCompleteHint: "[command]",
}}
}
func executeDefault(context *model.CommandArgs, args ...string) *model.CommandResponse {
out := invalidCommand + "\n\n"
out += botHelpText
return &model.CommandResponse{
ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
Text: out,
}
}
func postCommandResponse(context *model.CommandArgs, text string) {
post := &model.Post{
UserId: config.BotUserID,
ChannelId: context.ChannelId,
Message: text,
}
_ = config.Mattermost.SendEphemeralPost(context.UserId, post)
}
func (ch Handler) Handle(context *model.CommandArgs, args ...string) *model.CommandResponse {
for n := len(args); n > 0; n-- {
h := ch.handlers[strings.Join(args[:n], "/")]
if h != nil {
return h(context, args[n:]...)
}
}
return ch.defaultHandler(context, args...)
}
func listCommand(context *model.CommandArgs, args ...string) *model.CommandResponse {
// TODO: 명령어 목록을 가져오는 메서드를 추가해야 함.
return &model.CommandResponse{}
}
func appCommand(context *model.CommandArgs, args ...string) *model.CommandResponse {
// TODO: 어플리케이션 목록을 가져오는 메서드를 추가해야 함.
return &model.CommandResponse{}
}
func envCommand(context *model.CommandArgs, args ...string) *model.CommandResponse {
// TODO: 배포 환경 목록을 가져오는 메서드를 추가해야 함.
return &model.CommandResponse{}
}
func helpCommand(context *model.CommandArgs, args ...string) *model.CommandResponse {
postCommandResponse(context, botHelpText)
return &model.CommandResponse{}
}