Переглянути джерело

Config reloading

tags/v0.1.0
Russ Garrett 7 роки тому
джерело
коміт
c4f2aab120
Аккаунт користувача з таким Email не знайдено
3 змінених файлів з 43 додано та 6 видалено
  1. 3
    4
      auth.go
  2. 1
    0
      irccat.json
  3. 39
    2
      main.go

+ 3
- 4
auth.go Переглянути файл

1
 package main
1
 package main
2
 
2
 
3
 import (
3
 import (
4
-	"github.com/spf13/viper"
5
 	"github.com/thoj/go-ircevent"
4
 	"github.com/thoj/go-ircevent"
6
 	"strings"
5
 	"strings"
7
 )
6
 )
12
 }
11
 }
13
 
12
 
14
 func (i *IRCCat) handleJoin(e *irc.Event) {
13
 func (i *IRCCat) handleJoin(e *irc.Event) {
15
-	if e.Arguments[0] == viper.GetString("commands.auth_channel") {
14
+	if e.Arguments[0] == i.auth_channel {
16
 		i.auth_users[e.Nick] = true
15
 		i.auth_users[e.Nick] = true
17
 	}
16
 	}
18
 }
17
 }
19
 
18
 
20
 func (i *IRCCat) handlePart(e *irc.Event) {
19
 func (i *IRCCat) handlePart(e *irc.Event) {
21
-	if e.Arguments[0] == viper.GetString("commands.auth_channel") {
20
+	if e.Arguments[0] == i.auth_channel {
22
 		delete(i.auth_users, e.Nick)
21
 		delete(i.auth_users, e.Nick)
23
 	}
22
 	}
24
 }
23
 }
25
 
24
 
26
 func (i *IRCCat) handleNames(e *irc.Event) {
25
 func (i *IRCCat) handleNames(e *irc.Event) {
27
-	if e.Arguments[2] == viper.GetString("commands.auth_channel") {
26
+	if e.Arguments[2] == i.auth_channel {
28
 		nicks := strings.Split(e.Arguments[3], " ")
27
 		nicks := strings.Split(e.Arguments[3], " ")
29
 		for _, nick := range nicks {
28
 		for _, nick := range nicks {
30
 			i.auth_users[nick] = true
29
 			i.auth_users[nick] = true

+ 1
- 0
irccat.json Переглянути файл

15
     "tls_skip_verify": true,
15
     "tls_skip_verify": true,
16
     "nick": "irccat2",
16
     "nick": "irccat2",
17
     "realname": "IRCCat",
17
     "realname": "IRCCat",
18
+    "identify_pass": "",
18
     "channels": ["#russtest"]
19
     "channels": ["#russtest"]
19
   },
20
   },
20
   "commands": {
21
   "commands": {

+ 39
- 2
main.go Переглянути файл

3
 import (
3
 import (
4
 	"crypto/tls"
4
 	"crypto/tls"
5
 	"fmt"
5
 	"fmt"
6
+	"github.com/deckarep/golang-set"
7
+	"github.com/fsnotify/fsnotify"
6
 	"github.com/irccloud/irccat/httplistener"
8
 	"github.com/irccloud/irccat/httplistener"
7
 	"github.com/irccloud/irccat/tcplistener"
9
 	"github.com/irccloud/irccat/tcplistener"
8
 	"github.com/juju/loggo"
10
 	"github.com/juju/loggo"
16
 var log = loggo.GetLogger("main")
18
 var log = loggo.GetLogger("main")
17
 
19
 
18
 type IRCCat struct {
20
 type IRCCat struct {
19
-	control_chan string
21
+	auth_channel string
22
+	channels     mapset.Set
20
 	auth_users   map[string]bool
23
 	auth_users   map[string]bool
21
 	irc          *irc.Connection
24
 	irc          *irc.Connection
22
 	tcp          *tcplistener.TCPListener
25
 	tcp          *tcplistener.TCPListener
36
 		log.Errorf("Error reading config file - exiting. I'm looking for irccat.[json|yaml|toml|hcl] in . or /etc")
39
 		log.Errorf("Error reading config file - exiting. I'm looking for irccat.[json|yaml|toml|hcl] in . or /etc")
37
 		return
40
 		return
38
 	}
41
 	}
39
-	irccat := IRCCat{auth_users: map[string]bool{}, signals: make(chan os.Signal, 1)}
42
+
43
+	irccat := IRCCat{auth_users: map[string]bool{},
44
+		signals:      make(chan os.Signal, 1),
45
+		channels:     mapset.NewSet(),
46
+		auth_channel: viper.GetString("commands.auth_channel")}
47
+
48
+	viper.WatchConfig()
49
+	viper.OnConfigChange(irccat.handleConfigChange)
40
 
50
 
41
 	signal.Notify(irccat.signals, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
51
 	signal.Notify(irccat.signals, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
42
 	go irccat.signalHandler()
52
 	go irccat.signalHandler()
97
 }
107
 }
98
 
108
 
99
 func (i *IRCCat) handleWelcome(e *irc.Event) {
109
 func (i *IRCCat) handleWelcome(e *irc.Event) {
110
+	if viper.IsSet("irc.identify_pass") && viper.GetString("irc.identify_pass") != "" {
111
+		i.irc.SendRawf("NICKSERV IDENTIFY %s", viper.GetString("irc.identify_pass"))
112
+	}
113
+
100
 	log.Infof("Connected, joining channels...")
114
 	log.Infof("Connected, joining channels...")
101
 	for _, channel := range viper.GetStringSlice("irc.channels") {
115
 	for _, channel := range viper.GetStringSlice("irc.channels") {
102
 		i.irc.Join(channel)
116
 		i.irc.Join(channel)
117
+		i.channels.Add(channel)
118
+	}
119
+}
120
+
121
+func (i *IRCCat) handleConfigChange(e fsnotify.Event) {
122
+	log.Infof("Reloaded config")
123
+
124
+	new_channels := mapset.NewSet()
125
+
126
+	for _, channel := range viper.GetStringSlice("irc.channels") {
127
+		new_channels.Add(channel)
128
+		if !i.channels.Contains(channel) {
129
+			log.Infof("Joining new channel %s", channel)
130
+			i.irc.Join(channel)
131
+			i.channels.Add(channel)
132
+		}
133
+	}
134
+
135
+	it := i.channels.Difference(new_channels).Iterator()
136
+	for channel := range it.C {
137
+		log.Infof("Leaving channel %s", channel)
138
+		i.irc.Part(channel.(string))
139
+		i.channels.Remove(channel)
103
 	}
140
 	}
104
 }
141
 }

Завантаження…
Відмінити
Зберегти