vail/cmd/vail/repeater.go

57 lines
1.1 KiB
Go
Raw Permalink Normal View History

package main
import (
2022-05-15 17:38:57 -06:00
"time"
)
2022-05-15 21:12:36 -06:00
// A Repeater is just a list of senders.
type Repeater struct {
2022-05-15 17:38:57 -06:00
clock Clock
2022-05-15 21:12:36 -06:00
senders []MessageSender
}
2022-05-15 17:38:57 -06:00
// NewRepeater returns a newly-created repeater
func NewRepeater() *Repeater {
return &Repeater{
2022-05-15 17:38:57 -06:00
clock: WallClock{},
2022-05-15 21:12:36 -06:00
senders: make([]MessageSender, 0, 20),
}
}
2022-05-15 17:38:57 -06:00
// Join joins a writer to this repeater
2022-05-15 21:12:36 -06:00
func (r *Repeater) Join(sender MessageSender) {
r.senders = append(r.senders, sender)
2022-05-15 17:38:57 -06:00
r.SendMessage()
}
2022-05-15 17:38:57 -06:00
// Part removes a writer from this repeater
2022-05-15 21:12:36 -06:00
func (r *Repeater) Part(sender MessageSender) {
for i, s := range r.senders {
if s == sender {
nsubs := len(r.senders)
r.senders[i] = r.senders[nsubs-1]
r.senders = r.senders[:nsubs-1]
2020-04-12 20:40:52 -06:00
}
}
2022-05-15 17:38:57 -06:00
r.SendMessage()
}
2022-05-15 17:38:57 -06:00
// Send send a message to all connected clients
2022-05-15 15:57:12 -06:00
func (r *Repeater) Send(m Message) {
m.Clients = uint16(r.Listeners())
2022-05-15 21:12:36 -06:00
for _, s := range r.senders {
s.Send(m)
}
}
2020-04-12 20:46:51 -06:00
2022-05-15 17:38:57 -06:00
// SendMessage constructs and sends a message
func (r *Repeater) SendMessage(durations ...time.Duration) {
m := NewMessage(r.clock.Now(), durations...)
r.Send(m)
}
// Listeners returns the number of connected clients
2020-04-12 20:46:51 -06:00
func (r *Repeater) Listeners() int {
2022-05-15 21:12:36 -06:00
return len(r.senders)
2020-04-12 20:46:51 -06:00
}