-
Notifications
You must be signed in to change notification settings - Fork 5
/
slangouts.go
136 lines (118 loc) · 3.13 KB
/
slangouts.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
126
127
128
129
130
131
132
133
134
135
136
package main
import (
"encoding/json"
"io/ioutil"
"log"
"os"
"os/signal"
"path"
"syscall"
)
type SlangoutsApp struct {
configFile string
config SlangoutsConfig
hangoutsClient *HangoutsClient
slackClient *SlackClient
}
type SlangoutsConfig struct {
HangoutsRefreshToken string `json:"hangoutsRefreshToken"`
SlackApiToken string `json:"slackApiToken"`
}
func runSlangouts(hangoutsPollFreq int, configPath string) {
if configPath == "" {
configPath = getConfigPath()
}
app := &SlangoutsApp{configFile: configPath, hangoutsClient: &HangoutsClient{PollFrequency: hangoutsPollFreq}, slackClient: &SlackClient{}}
app.Run()
}
func (app *SlangoutsApp) Run() {
err := app.loadConfig()
if err != nil {
log.Println(err, ". Generating blank config...")
app.saveConfig()
}
// check Slack token
err = app.slackClient.Init(app.config.SlackApiToken)
if err != nil {
log.Fatal(err)
}
// update Slack token if changed
if app.slackClient.Token != app.config.SlackApiToken {
app.config.SlackApiToken = app.slackClient.Token
app.saveConfig()
log.Println("Slack token changed. Saving it.")
}
// check Hangouts token
err = app.hangoutsClient.Init(app.config.HangoutsRefreshToken)
if err != nil {
//re-try without a refresh token
app.config.HangoutsRefreshToken = ""
err = app.hangoutsClient.Init(app.config.HangoutsRefreshToken)
if err != nil {
log.Fatal(err)
}
}
// update Hangouts token if changed
if app.hangoutsClient.Session.RefreshToken != app.config.HangoutsRefreshToken {
app.config.HangoutsRefreshToken = app.hangoutsClient.Session.RefreshToken
app.saveConfig()
log.Println("Hangouts refresh token changed. Saving it.")
}
// start Slack Polling
app.slackClient.StartPolling()
//defer app.slackClient.StopPolling()
// start Hangouts Polling
app.hangoutsClient.StartPolling()
defer app.hangoutsClient.StopPolling()
// catch Ctrl+C
signals := make(chan os.Signal, 1)
signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGABRT)
// event loop
for {
select {
case <-signals:
return
case msg := <-app.hangoutsClient.Messages:
log.Println("Hangouts: ", msg)
err = app.slackClient.SendMessage(msg)
if err != nil {
log.Println("Slack SendMessage", msg, "failed", err)
}
case msg := <-app.slackClient.Messages:
log.Println("Slack: ", msg)
err = app.hangoutsClient.SendMessage(msg)
if err != nil {
log.Println("Hangout SendMessage", msg, "failed", err)
}
}
}
}
func (app *SlangoutsApp) loadConfig() error {
b, err := ioutil.ReadFile(app.configFile)
if err == nil {
return json.Unmarshal(b, &app.config)
}
return err
}
func (app *SlangoutsApp) saveConfig() error {
j, err := json.MarshalIndent(&app.config, "", "\t")
if err == nil {
os.MkdirAll(path.Dir(app.configFile), os.ModePerm)
return ioutil.WriteFile(app.configFile, j, 0600)
}
return err
}
func getConfigPath() string {
workingDir := "."
for _, name := range []string{"HOME", "USERPROFILE"} { // *nix, windows
if dir := os.Getenv(name); dir != "" {
workingDir = dir
}
}
return path.Join(workingDir, ".slangouts", "config.json")
}
func OrDie(e error) {
if e != nil {
log.Fatal(e)
}
}