Skip to content

Commit 2290d15

Browse files
committed
init
1 parent 4f56d27 commit 2290d15

File tree

5 files changed

+229
-1
lines changed

5 files changed

+229
-1
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@ _testmain.go
2222
*.exe
2323
*.test
2424
*.prof
25+
26+
.idea
27+
*.iml

README.md

+26-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,27 @@
11
# slack-cli
2-
Command line client for slack post
2+
Simple command-line client for slack by golang
3+
4+
## Features
5+
* Post message only
6+
* Use Incoming Web hook service on slack
7+
8+
## Install
9+
```shell
10+
$ go get github.com/takecy/slack-cli
11+
```
12+
13+
## Usage
14+
```shell
15+
$ slack-cli config <incoming web hook URL>
16+
$ slack-cli post <message>
17+
```
18+
post to specific channel (not prefix [#])
19+
```shell
20+
$ slack-cli post -c general <message>
21+
```
22+
23+
## Remove
24+
```shell
25+
$ rm $GOPATH/bin/slack-cli
26+
$ rm -r $HOME/.slack_cli
27+
```

main.go

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
8+
"github.com/takecy/slack-cli/slacker"
9+
)
10+
11+
const usage = `
12+
Usage:
13+
$ slack-cli config <incoming web hook URL>
14+
$ slack-cli post [-c <other channel>] <message>
15+
16+
Commands:
17+
config Set configuration
18+
post Post massage to slack
19+
`
20+
21+
func main() {
22+
flag.Usage = func() { usageAndExit() }
23+
flag.Parse()
24+
25+
if flag.NArg() == 0 {
26+
flag.Usage()
27+
return
28+
}
29+
30+
if flag.Args()[0] == "config" {
31+
if len(flag.Args()) < 2 {
32+
fmt.Fprint(os.Stderr, "Error: URL required. \n")
33+
flag.Usage()
34+
return
35+
}
36+
37+
slacker.CreateConfig()
38+
c := &slacker.Config{
39+
URL: flag.Args()[1],
40+
}
41+
slacker.WriteConfig(c)
42+
fmt.Fprint(os.Stdout, "Success: register config \n")
43+
return
44+
}
45+
46+
if flag.Args()[0] == "post" {
47+
if flag.NArg() < 2 {
48+
flag.Usage()
49+
return
50+
}
51+
52+
c, err := slacker.ReadConfig()
53+
if err != nil {
54+
fmt.Fprint(os.Stderr, "Error: Failed read config. \n Require [config] command first. \n")
55+
flag.Usage()
56+
return
57+
}
58+
59+
fs := flag.NewFlagSet(flag.Args()[0], flag.ExitOnError)
60+
ch := fs.String("c", "", "Other Channel")
61+
fs.Parse(flag.Args()[1:])
62+
63+
slack := &slacker.Slack{C: c}
64+
err = slack.Post(slacker.Message{
65+
Text: flag.Args()[flag.NArg()-1],
66+
Channel: "#" + *ch,
67+
})
68+
69+
if err != nil {
70+
fmt.Fprintf(os.Stderr, "Error: Failed Post. \n %+v \n", err)
71+
return
72+
}
73+
return
74+
}
75+
76+
fmt.Fprint(os.Stderr, "Error: Bad command \n")
77+
flag.Usage()
78+
}
79+
80+
func usageAndExit() {
81+
fmt.Fprintf(os.Stdout, "%s \n", usage)
82+
os.Exit(1)
83+
}

slacker/config.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package slacker
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"os"
8+
)
9+
10+
// Config is config for slack
11+
type Config struct {
12+
// URL is incoming url by slack
13+
URL string `json:"url"`
14+
}
15+
16+
var (
17+
h = os.Getenv("HOME")
18+
confDirName = ".slack_cli"
19+
confFileName = "conf.json"
20+
confDir = fmt.Sprintf("%s/%s", h, confDirName)
21+
confPath = fmt.Sprintf("%s/%s", confDir, confFileName)
22+
)
23+
24+
// ExistConfig is check conf finle exists
25+
func ExistConfig() bool {
26+
_, err := os.Stat(confPath)
27+
return err == nil
28+
}
29+
30+
// CreateConfig is initialize conf file
31+
func CreateConfig() (err error) {
32+
err = os.MkdirAll(confDir, 0755)
33+
if err != nil {
34+
return
35+
}
36+
37+
_, err = os.Create(confPath)
38+
return
39+
}
40+
41+
// ReadConfig is read conf file
42+
func ReadConfig() (c *Config, err error) {
43+
b, err := ioutil.ReadFile(confPath)
44+
if err != nil {
45+
return
46+
}
47+
48+
c = new(Config)
49+
err = json.Unmarshal(b, c)
50+
return
51+
}
52+
53+
// WriteConfig is write to conf file
54+
func WriteConfig(c *Config) (err error) {
55+
b, err := json.Marshal(c)
56+
if err != nil {
57+
return
58+
}
59+
60+
err = ioutil.WriteFile(confPath, b, 0755)
61+
return
62+
}
63+
64+
// RemoveConfig is remove conf file
65+
func RemoveConfig() (err error) {
66+
err = os.RemoveAll(confPath)
67+
return
68+
}

slacker/slack.go

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package slacker
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"errors"
7+
"net/http"
8+
"time"
9+
)
10+
11+
// Slack is struct
12+
type Slack struct {
13+
C *Config
14+
}
15+
16+
// Message is post payload
17+
type Message struct {
18+
Text string `json:"text"`
19+
Channel string `json:"channel"`
20+
}
21+
22+
var cli = &http.Client{Timeout: time.Duration(5) * time.Second}
23+
24+
// Post is post message to slack
25+
func (s *Slack) Post(msg Message) (err error) {
26+
b, err := json.Marshal(msg)
27+
if err != nil {
28+
return
29+
}
30+
31+
buf := bytes.NewBuffer(b)
32+
33+
url := s.C.URL
34+
req, err := http.NewRequest("POST", url, buf)
35+
if err != nil {
36+
return
37+
}
38+
39+
res, err := cli.Do(req)
40+
if err != nil {
41+
return
42+
}
43+
44+
if res.StatusCode != 200 {
45+
return errors.New("post.Failed")
46+
}
47+
48+
return
49+
}

0 commit comments

Comments
 (0)