]> git.r.bdr.sh - rbdr/mobius/blob - client/main.go
Initial squashed commit
[rbdr/mobius] / client / main.go
1 package main
2
3 import (
4 "context"
5 "flag"
6 "fmt"
7 hotline "github.com/jhalter/mobius"
8 "github.com/rivo/tview"
9 "go.uber.org/zap"
10 "go.uber.org/zap/zapcore"
11 "os"
12 "os/signal"
13 "syscall"
14 "time"
15 )
16
17 //var defaultTrackerList = []string{
18 // "hltracker.com:5498",
19 //}
20
21 const connectTimeout = 3 * time.Second
22
23 func main() {
24 _, cancelRoot := context.WithCancel(context.Background())
25
26 sigChan := make(chan os.Signal, 1)
27 signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT, os.Interrupt)
28
29 version := flag.Bool("version", false, "print version and exit")
30 logLevel := flag.String("log-level", "info", "Log level")
31 userName := flag.String("name", "unnamed", "User name")
32 //srvAddr := flag.String("server", "localhost:5500", "Hostname/Port of server")
33 //login := flag.String("login", "guest", "Login Name")
34 //pass := flag.String("password", "", "Login Password")
35 flag.Parse()
36
37 if *version {
38 fmt.Printf("v%s\n", hotline.VERSION)
39 os.Exit(0)
40 }
41
42 zapLvl, ok := zapLogLevel[*logLevel]
43 if !ok {
44 fmt.Printf("Invalid log level %s. Must be debug, info, warn, or error.\n", *logLevel)
45 os.Exit(0)
46 }
47
48 // init DebugBuffer
49 db := &hotline.DebugBuffer{
50 TextView: tview.NewTextView(),
51 }
52
53 cores := []zapcore.Core{
54 newDebugCore(zapLvl, db),
55 //newStderrCore(zapLvl),
56 }
57 l := zap.New(zapcore.NewTee(cores...))
58 defer func() { _ = l.Sync() }()
59 logger := l.Sugar()
60 logger.Infow("Started Mobius client", "Version", hotline.VERSION)
61
62 go func() {
63 sig := <-sigChan
64 logger.Infow("Stopping client", "signal", sig.String())
65 cancelRoot()
66 }()
67
68 client := hotline.NewClient(*userName, logger)
69 client.DebugBuf = db
70 client.UI.Start()
71
72 }
73
74 func newDebugCore(level zapcore.Level, db *hotline.DebugBuffer) zapcore.Core {
75 encoderCfg := zap.NewProductionEncoderConfig()
76 encoderCfg.TimeKey = "timestamp"
77 encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
78
79 return zapcore.NewCore(
80 zapcore.NewConsoleEncoder(encoderCfg),
81 zapcore.Lock(db),
82 level,
83 )
84 }
85
86 func newStderrCore(level zapcore.Level) zapcore.Core {
87 encoderCfg := zap.NewProductionEncoderConfig()
88 encoderCfg.TimeKey = "timestamp"
89 encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
90
91 return zapcore.NewCore(
92 zapcore.NewConsoleEncoder(encoderCfg),
93 zapcore.Lock(os.Stderr),
94 level,
95 )
96 }
97
98 var zapLogLevel = map[string]zapcore.Level{
99 "debug": zap.DebugLevel,
100 "info": zap.InfoLevel,
101 "warn": zap.WarnLevel,
102 "error": zap.ErrorLevel,
103 }