-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
123 lines (103 loc) · 2.62 KB
/
main.go
File metadata and controls
123 lines (103 loc) · 2.62 KB
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
package main
import (
"bufio"
"encoding/json"
"flag"
"github.com/go-resty/resty/v2"
"gopkg.in/yaml.v2"
"log"
"os"
"os/user"
"strings"
)
type Config struct {
Baseurl string `yaml:"baseurl"`
Userid string `yaml:"userid"`
Token string `yaml:"token"`
}
func GetTargetUser() string {
currentuser, _ := user.Current()
sudouser := os.Getenv("SUDO_USER")
if currentuser.Uid == "0" && len(sudouser) > 0 {
return sudouser
}
username := currentuser.Username
return username
}
func LoadConfig(cfg *Config) {
f, err := os.Open("/etc/rocket-notify/config.yml")
if err != nil {
log.Fatal(err)
}
decoder := yaml.NewDecoder(f)
err = decoder.Decode(&cfg)
if err != nil {
log.Fatal(err)
}
err = f.Close()
if err != nil {
log.Fatal(err)
}
}
func GetRoomId(restyclient *resty.Client, cfg *Config, username string) string {
body := `{ "username": "` + username + `" }`
resp, _ := restyclient.R().
EnableTrace().
SetHeader("Content-Type", "application/json").
SetHeader("X-Auth-Token", cfg.Token).
SetHeader("X-User-Id", cfg.Userid).
SetBody(body).
Post(cfg.Baseurl + "/api/v1/im.create")
var result map[string]interface{}
_ = json.Unmarshal([]byte(resp.String()), &result)
var rid = result["room"].(map[string]interface{})["_id"].(string)
return rid
}
func GetPipeInput() string {
info, err := os.Stdin.Stat()
if err != nil {
// no pipe input
return ""
}
if info.Mode()&os.ModeCharDevice != 0 {
// no pipe input
return ""
}
scanner := bufio.NewScanner(bufio.NewReader(os.Stdin))
var output []string
for scanner.Scan() {
output = append(output, scanner.Text())
}
return strings.Join(output, "\n")
}
func SendMessage(restyclient *resty.Client, cfg *Config, rid string) {
hostname, _ := os.Hostname()
alias := flag.String("sender", hostname, "The name of the sender (if omitted: hostname)")
emoji := flag.String("emoji", ":robot:", "The emoji used as avatar (e.g. :robot:)")
flag.Parse()
msg := strings.Join(flag.Args(), " ")
pipeinput := GetPipeInput()
if len(pipeinput) > 0 {
msg = "```" + pipeinput + "```" + msg
}
msgJson, _ := json.Marshal(msg)
body := `{"message": { "rid": "` + rid +
`", "alias": "` + *alias +
`", "emoji": "` + *emoji +
`", "msg": ` + string(msgJson) + ` }}`
_, _ = restyclient.R().
EnableTrace().
SetHeader("Content-Type", "application/json").
SetHeader("X-Auth-Token", cfg.Token).
SetHeader("X-User-Id", cfg.Userid).
SetBody(body).
Post(cfg.Baseurl + "/api/v1/chat.sendMessage")
}
func main() {
var cfg Config
LoadConfig(&cfg)
client := resty.New()
username := GetTargetUser()
rid := GetRoomId(client, &cfg, username)
SendMessage(client, &cfg, rid)
}