2020-04-12 16:37:58 -06:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2022-05-15 17:38:57 -06:00
|
|
|
"time"
|
2020-04-12 16:37:58 -06:00
|
|
|
)
|
|
|
|
|
2022-05-15 21:12:36 -06:00
|
|
|
// A Repeater is just a list of senders.
|
2020-04-12 16:37:58 -06:00
|
|
|
type Repeater struct {
|
2022-05-15 17:38:57 -06:00
|
|
|
clock Clock
|
2022-05-15 21:12:36 -06:00
|
|
|
senders []MessageSender
|
2020-04-12 16:37:58 -06:00
|
|
|
}
|
|
|
|
|
2022-05-15 17:38:57 -06:00
|
|
|
// NewRepeater returns a newly-created repeater
|
2020-04-12 16:37:58 -06:00
|
|
|
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),
|
2020-04-12 16:37:58 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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()
|
2020-04-12 17:30:00 -06:00
|
|
|
}
|
|
|
|
|
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()
|
2020-04-12 17:30:00 -06:00
|
|
|
}
|
|
|
|
|
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 16:37:58 -06:00
|
|
|
}
|
|
|
|
}
|
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
|
|
|
}
|