/
channelscreate.go
105 lines (90 loc) · 2.17 KB
/
channelscreate.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
package mockslack
import (
"context"
"net/http"
"strings"
)
// ConversationCreateOpts is used to configure a new
// channel or group.
type ConversationCreateOpts struct {
Name string
Validate bool
}
// cleanChannelName will replace invalid characters with `_` and
// truncate the name if it is longer than 21 characters.
func cleanChannelName(name string) string {
name = strings.Map(func(r rune) rune {
if r >= 'a' && r <= 'z' {
return r
}
if r >= 'A' && r <= 'Z' {
// make lower-case
return r + ('a' - 'A')
}
if r >= '0' && r <= '9' {
return r
}
if r == '-' || r == '_' {
return r
}
return '_'
}, name)
if len(name) > 21 {
name = name[:21]
}
return name
}
func validateChannelName(name string) error {
if name == "" {
return &response{Err: "invalid_name_required"}
}
if len(name) > 21 {
return &response{Err: "invalid_name_maxlength"}
}
if name != cleanChannelName(name) {
return &response{Err: "invalid_name"}
}
if !strings.ContainsAny(name, "abcdefghijklmnopqrstuvwxyz0123456789") {
return &response{Err: "invalid_name_punctuation"}
}
return nil
}
// ChannelsCreate is used to create a channel.
func (st *API) ChannelsCreate(ctx context.Context, opts ConversationCreateOpts) (*Channel, error) {
err := checkPermission(ctx, "channels:write")
if err != nil {
return nil, err
}
if !opts.Validate {
opts.Name = cleanChannelName(opts.Name)
}
err = validateChannelName(opts.Name)
if err != nil {
return nil, err
}
ch := Channel{
ID: st.gen.ChannelID(),
Name: opts.Name,
IsChannel: true,
}
st.mx.Lock()
st.channels[ch.ID] = &channelState{Channel: ch}
st.mx.Unlock()
return &ch, nil
}
// ServeChannelsCreate serves a request to the `channels.create` API call.
//
// https://api.slack.com/methods/channels.create
func (s *Server) ServeChannelsCreate(w http.ResponseWriter, req *http.Request) {
ch, err := s.API().ChannelsCreate(req.Context(), ConversationCreateOpts{Name: req.FormValue("name"), Validate: req.FormValue("validate") == "true"})
if respondErr(w, err) {
return
}
var resp struct {
response
Channel *Channel `json:"channel"`
}
resp.OK = true
resp.Channel = ch
respondWith(w, resp)
}