-
Notifications
You must be signed in to change notification settings - Fork 0
/
zkillboard-redisq-cli.go
137 lines (113 loc) · 2.98 KB
/
zkillboard-redisq-cli.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
137
package main
import (
"fmt"
"github.com/purplebooth/go-zkillboard-redisq/zkillboard-redisq"
"github.com/urfave/cli"
"go.uber.org/zap"
"os"
"os/signal"
"time"
)
func main() {
app := cli.NewApp()
app.Name = "zkillboard-redisq-cli"
app.Usage = "Print every time a kill comes in. Kills are usually delayed by about 90min"
app.Version = "0.1.0"
app.Flags = []cli.Flag{
cli.BoolFlag{
Name: "developmentLogging, d",
Usage: "Enable more verbose, and more human readable logging",
EnvVar: "VERBOSE",
},
cli.StringSliceFlag{
Name: "solarSystem, s",
Usage: "Solar Systems to watch for kills in",
EnvVar: "SOLAR_SYSTEMS",
},
cli.StringSliceFlag{
Name: "character, c",
Usage: "Characters to watch for kills in",
EnvVar: "CHARACTERS",
},
cli.StringSliceFlag{
Name: "corporation, o",
Usage: "Corporations to watch for kills in",
EnvVar: "CORPORATIONS",
},
}
cli.VersionFlag = cli.BoolFlag{
Name: "version, V",
Usage: "print only the version",
}
cli.BashCompletionFlag = cli.BoolFlag{
Name: "auto-complete",
Hidden: false,
}
app.EnableBashCompletion = true
app.Action = func(c *cli.Context) error {
var zapLogger *zap.Logger
if c.Bool("developmentLogging") == true {
zapLogger, _ = zap.NewDevelopment()
} else {
zapLogger, _ = zap.NewProduction()
}
corporations := c.StringSlice("corporation")
characters := c.StringSlice("character")
solarSystems := c.StringSlice("solarSystem")
defer zapLogger.Sync() // flushes buffer, if any
logger := zapLogger.Sugar()
exitCmd := make(chan *cli.ExitError)
defer close(exitCmd)
errs := make(chan error)
defer close(errs)
kills := make(chan *zkillboard_redisq.Package)
defer close(kills)
go zkillboard_redisq.NewZKillboardRedisQClient().Listen(kills, errs)
go func(logger *zap.SugaredLogger) {
for killmail := range kills {
if len(corporations) > 0 && !stringInSlice(killmail.Killmail.Victim.Corporation.Name, corporations) {
continue
}
if len(characters) > 0 && !stringInSlice(killmail.Killmail.Victim.Character.Name, characters) {
continue
}
if len(solarSystems) > 0 && !stringInSlice(killmail.Killmail.SolarSystem.Name, solarSystems) {
continue
}
kTime, _ := time.Parse("2006.01.02 15:04:05", killmail.Killmail.KillTime)
logger.Infow("RECEIVED KILL",
"killTime", kTime,
"killPackage", killmail,
)
}
return
}(logger)
go func() {
err := <-errs
logger.Fatalw(
"Caught error, exiting",
"error", err,
)
cli.HandleExitCoder(err)
return
}()
interrupts := make(chan os.Signal, 1)
defer close(interrupts)
signal.Notify(interrupts, os.Interrupt)
go func() {
for interrupt := range interrupts {
exitCmd <- cli.NewExitError(fmt.Sprintf("Caught %s, Exiting", interrupt.String()), 0)
}
}()
return <-exitCmd
}
app.Run(os.Args)
}
func stringInSlice(a string, list []string) bool {
for _, b := range list {
if b == a {
return true
}
}
return false
}