-
Notifications
You must be signed in to change notification settings - Fork 0
/
status.go
83 lines (70 loc) · 1.88 KB
/
status.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
// status.go - status maker.
//
// To the extent possible under law, Ivan Markin waived all copyright
// and related or neighboring rights to this module of urc, using the creative
// commons "cc0" public domain dedication. See LICENSE or
// <http://creativecommons.org/publicdomain/zero/1.0/> for full details.
package main
import (
"strings"
"unicode"
"github.com/nogoegst/urc/battery"
"github.com/nogoegst/urc/clock"
"github.com/nogoegst/urc/message"
"github.com/nogoegst/urc/torstatus"
)
func RemoveSidespaces(s string) string {
return strings.TrimLeft(strings.TrimRight(s, " "), " ")
}
func Sanitize(s string) string {
return strings.Map(func(r rune) rune {
if r == '\n' {
return ' '
} else if unicode.IsGraphic(r) {
return r
}
return -1
}, s)
}
type Status struct {
TorStatus torstatus.TorStatus
Clock clock.Clock
BatteryLifetime battery.Lifetime
Message message.Message
}
func (s Status) Format() string {
msg := s.Message.Format()
cosmoStatus := "Λ > 0"
torStatus := s.TorStatus.Format()
batteryLifetime := s.BatteryLifetime.Format()
clockStatus := s.Clock.Format()
status := Compose(msg, cosmoStatus, torStatus, batteryLifetime, clockStatus)
return " " + status + " "
}
func Compose(statuses ...string) string {
for i, status := range statuses {
statuses[i] = RemoveSidespaces(status)
}
status := strings.Join(statuses, " | ")
return Sanitize(status)
}
func UpdateStatus(statusChan chan<- string) {
var status Status
clockCh := clock.WatchClock()
messageCh := message.WatchMessages()
batteryLifetimeCh := battery.WatchLifetime()
torStatusCh := torstatus.WatchTorStatus()
for {
select {
case v := <-clockCh:
status.Clock = v
case v := <-torStatusCh:
status.TorStatus = v
case v := <-batteryLifetimeCh:
status.BatteryLifetime = v
case v := <-messageCh:
status.Message = v
}
statusChan <- status.Format()
}
}