Do not hardcode connection parameters anymore
parent
0f51bfba4f
commit
1d2e1bdb29
22
at.go
22
at.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
@ -11,6 +12,8 @@ import (
|
||||||
|
|
||||||
type atMonitor struct {
|
type atMonitor struct {
|
||||||
previousUserList []string
|
previousUserList []string
|
||||||
|
channel string
|
||||||
|
apiAddress string
|
||||||
}
|
}
|
||||||
|
|
||||||
type atUsers struct {
|
type atUsers struct {
|
||||||
|
@ -53,7 +56,7 @@ func (a *atMonitor) Run(c *irc.Client, done chan bool) {
|
||||||
return
|
return
|
||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
var diffText string
|
var diffText string
|
||||||
atHS, err := at()
|
atHS, err := a.at()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
@ -74,7 +77,7 @@ func (a *atMonitor) Run(c *irc.Client, done chan bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(diffText) > 0 {
|
if len(diffText) > 0 {
|
||||||
msg := fmt.Sprintf("NOTICE #hswaw-members :%s\n", diffText)
|
msg := fmt.Sprintf("NOTICE %s :%s\n", a.channel, diffText)
|
||||||
log.Println(diffText)
|
log.Println(diffText)
|
||||||
c.Write(msg)
|
c.Write(msg)
|
||||||
a.previousUserList = current
|
a.previousUserList = current
|
||||||
|
@ -83,10 +86,10 @@ func (a *atMonitor) Run(c *irc.Client, done chan bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func at() (at atResponse, err error) {
|
func (a *atMonitor) at() (at atResponse, err error) {
|
||||||
var values atResponse = atResponse{}
|
var values atResponse = atResponse{}
|
||||||
|
|
||||||
data, err := httpGet("https://at.hackerspace.pl/api")
|
data, err := httpGet(a.apiAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return values, fmt.Errorf("Unable to access checkinator api:", err)
|
return values, fmt.Errorf("Unable to access checkinator api:", err)
|
||||||
}
|
}
|
||||||
|
@ -98,3 +101,14 @@ func at() (at atResponse, err error) {
|
||||||
|
|
||||||
return values, nil
|
return values, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
atMonitorInstance atMonitor
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
flag.StringVar(&atMonitorInstance.channel, "at.channel", "#hswaw-members", "Channel to send entrance/exit notices")
|
||||||
|
flag.StringVar(&atMonitorInstance.apiAddress, "at.api", "https://at.hackerspace.pl/api", "Checkinator API address")
|
||||||
|
|
||||||
|
Runners.Add(atMonitorInstance.Run)
|
||||||
|
}
|
||||||
|
|
12
helpers.go
12
helpers.go
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -56,3 +57,14 @@ func httpGet(link string) ([]byte, error) {
|
||||||
|
|
||||||
return buf, nil
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type arrayFlags []string
|
||||||
|
|
||||||
|
func (i *arrayFlags) String() string {
|
||||||
|
return strings.Join(*i, ",")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *arrayFlags) Set(value string) error {
|
||||||
|
*i = append(*i, value)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
67
notifier.go
67
notifier.go
|
@ -1,63 +1,60 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"flag"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"gopkg.in/irc.v3"
|
"gopkg.in/irc.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
type dispatchFunc func(*irc.Client, *irc.Message)
|
var (
|
||||||
|
channels arrayFlags
|
||||||
|
server string
|
||||||
|
nickname string
|
||||||
|
password string
|
||||||
|
user string
|
||||||
|
name string
|
||||||
|
)
|
||||||
|
|
||||||
func handlerFactory(dispatchers []dispatchFunc) func(*irc.Client, *irc.Message) {
|
func init() {
|
||||||
return func(c *irc.Client, m *irc.Message) {
|
flag.StringVar(&server, "server", "irc.libera.chat:6667", "Server to connect to")
|
||||||
for _, f := range dispatchers {
|
flag.StringVar(&nickname, "nickname", "notbot", "Bot nickname")
|
||||||
go f(c, m.Copy())
|
flag.StringVar(&password, "password", "", "Bot nickserv password")
|
||||||
}
|
flag.StringVar(&user, "user", "bot", "Bot user parameter")
|
||||||
}
|
flag.StringVar(&name, "name", "bot notbot", "Bot real name parameter")
|
||||||
}
|
flag.Var(&channels, "channels", "Channel to join; may be specified multiple times")
|
||||||
|
|
||||||
func logger(_ *irc.Client, m *irc.Message) {
|
|
||||||
log.Println(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func joinerFactory(channels []string) func(*irc.Client, *irc.Message) {
|
|
||||||
return func(c *irc.Client, m *irc.Message) {
|
|
||||||
if m.Command == "001" {
|
|
||||||
for _, ch := range channels {
|
|
||||||
c.Write("JOIN " + ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
done := make(chan bool)
|
done := make([]chan bool, len(Runners.list))
|
||||||
var a atMonitor
|
|
||||||
var dispatchers = []dispatchFunc{
|
|
||||||
logger,
|
|
||||||
joinerFactory([]string{"#hswaw-members"}),
|
|
||||||
}
|
|
||||||
|
|
||||||
conn, err := net.Dial("tcp", "irc.libera.chat:6667")
|
flag.Parse()
|
||||||
|
|
||||||
|
conn, err := net.Dial("tcp", server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := irc.ClientConfig{
|
config := irc.ClientConfig{
|
||||||
Nick: "notbot",
|
Nick: nickname,
|
||||||
Pass: "***",
|
Pass: password,
|
||||||
User: "bot",
|
User: user,
|
||||||
Name: "notbot",
|
Name: name,
|
||||||
Handler: irc.HandlerFunc(handlerFactory(dispatchers)),
|
Handler: irc.HandlerFunc(handlerFactory(Dispatchers.list)),
|
||||||
}
|
}
|
||||||
|
|
||||||
client := irc.NewClient(conn, config)
|
client := irc.NewClient(conn, config)
|
||||||
go a.Run(client, done)
|
|
||||||
|
for i, runner := range Runners.list {
|
||||||
|
go runner(client, done[i])
|
||||||
|
}
|
||||||
|
|
||||||
err = client.Run()
|
err = client.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
done <- true
|
for _, ch := range done {
|
||||||
|
ch <- true
|
||||||
|
}
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"gopkg.in/irc.v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type dispatchFunc func(*irc.Client, *irc.Message)
|
||||||
|
type dispatchers struct {
|
||||||
|
lock sync.Mutex
|
||||||
|
list []dispatchFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dispatchers) Add(f dispatchFunc) {
|
||||||
|
d.lock.Lock()
|
||||||
|
defer d.lock.Unlock()
|
||||||
|
|
||||||
|
d.list = append(d.list, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
type runFunc func(c *irc.Client, done chan bool)
|
||||||
|
type runners struct {
|
||||||
|
lock sync.Mutex
|
||||||
|
list []runFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *runners) Add(f runFunc) {
|
||||||
|
r.lock.Lock()
|
||||||
|
defer r.lock.Unlock()
|
||||||
|
|
||||||
|
r.list = append(r.list, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
Dispatchers dispatchers
|
||||||
|
Runners runners
|
||||||
|
)
|
||||||
|
|
||||||
|
func handlerFactory(dispatchers []dispatchFunc) func(*irc.Client, *irc.Message) {
|
||||||
|
return func(c *irc.Client, m *irc.Message) {
|
||||||
|
for _, f := range dispatchers {
|
||||||
|
go f(c, m.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func logger(_ *irc.Client, m *irc.Message) {
|
||||||
|
log.Println(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func joiner(c *irc.Client, m *irc.Message) {
|
||||||
|
if m.Command == "001" {
|
||||||
|
for _, ch := range channels {
|
||||||
|
c.Write("JOIN " + ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
Dispatchers.Add(logger)
|
||||||
|
Dispatchers.Add(joiner)
|
||||||
|
}
|
Loading…
Reference in New Issue