/
client.go
93 lines (79 loc) 路 2.06 KB
/
client.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
package wrc
import (
"net"
"os"
"github.com/charmbracelet/log"
)
var clogger = log.New(os.Stderr).WithPrefix("CLIENT")
// Client is used to manage incoming UDP data.
type Client struct {
*DataStore
ch chan Packet
Debug bool
}
// New returns a new client.
func New() *Client {
clogger.Info("WRC Client initialized! 馃弫")
return &Client{
NewWrcDataStore(make([]*Packet, 0, 600)),
make(chan Packet, 600),
false,
}
}
// NewDebug returns a new client with some extra debug info.
func NewDebug() *Client {
clogger.Info("WRC Client initialized! 馃弫")
return &Client{
NewWrcDataStore(make([]*Packet, 0, 600)),
make(chan Packet, 600),
true,
}
}
// AverageFrameTime returns your average frame time based on all 'GameDeltaTime' values in the store.
func (c *Client) AverageFrameTime() (float32, error) {
var delta float32
c.mu.RLock()
defer c.mu.RUnlock()
for _, s := range c.store {
delta += s.GameDeltaTime
}
length := c.Size()
return float32(delta / float32(length)), nil
}
// AverageSpeedKmph returns your average speed based on all 'VehicleSpeed' values in the store.
func (c *Client) AverageSpeedKmph() (float32, error) {
var speed float32
c.mu.RLock()
defer c.mu.RUnlock()
for _, s := range c.store {
speed += s.VehicleSpeed
}
length := c.Size()
return float32(speed/float32(length)) * MpsToKmph, nil
}
// AverageSpeedMph returns your average speed based on all 'VehicleSpeed' values in the store.
func (c *Client) AverageSpeedMph() (float32, error) {
var speed float32
c.mu.RLock()
defer c.mu.RUnlock()
for _, s := range c.store {
speed += s.VehicleSpeed
}
length := len(c.store)
return float32(speed/float32(length)) * MpsToMph, nil
}
// Run starts the UDP client and begins to listen for incoming packets,
// decoding them, and pushing them to the datastore.
func (c *Client) Run(conn net.PacketConn) error {
clogger.Info("Started listening for packets.", "address",
conn.LocalAddr().String())
go Listen(conn, c.ch)
for p := range c.ch {
err := c.Push(&p)
if err != nil {
return err
}
}
clogger.Info("Bye! 馃憢")
return nil
}