94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
package radio
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"math"
|
|
"sync"
|
|
)
|
|
|
|
// ListenerCounter stores the current, overall and peak numbers of listeners.
|
|
type ListenerCounter struct {
|
|
sync.RWMutex
|
|
current, peak int64
|
|
overall, cur_peak int64
|
|
}
|
|
|
|
// NewListenerCounter returns a new ListenerCounter struct instance.
|
|
func NewListenerCounter() *ListenerCounter {
|
|
return &ListenerCounter{}
|
|
}
|
|
|
|
// Current returns a number of current listeners.
|
|
func (l *ListenerCounter) Current() int64 {
|
|
return l.current
|
|
}
|
|
|
|
// Peak returns a peak number of listeners.
|
|
func (l *ListenerCounter) Peak() int64 {
|
|
return l.peak
|
|
}
|
|
|
|
// CurrentPeak returns a peak number of listeners for a currently playing song.
|
|
func (l *ListenerCounter) CurrentPeak() int64 {
|
|
return l.cur_peak
|
|
}
|
|
|
|
// Overall returns an overall number of listeners for a currently playing song.
|
|
func (l *ListenerCounter) Overall() int64 {
|
|
return l.overall
|
|
}
|
|
|
|
// Inc increments by 1 a current number of listeners and updates a peak number.
|
|
func (l *ListenerCounter) Inc() int64 {
|
|
if l.current == math.MaxInt64 {
|
|
// We panic here because if this will ever happen, then something's going certainly wrong.
|
|
panic("a current number of listeners exceeded MaxInt64")
|
|
}
|
|
l.current++
|
|
if l.current > l.peak {
|
|
l.peak = l.current
|
|
}
|
|
if l.current > l.cur_peak {
|
|
l.cur_peak = l.current
|
|
}
|
|
if l.overall == math.MaxInt64 {
|
|
panic("an overall number of listeners exceeded MaxInt64")
|
|
}
|
|
l.overall++
|
|
return l.current
|
|
}
|
|
|
|
// Dec decrements by 1 a current number of listeners. An error will occur if
|
|
// a resulting number is less than 0.
|
|
func (l *ListenerCounter) Dec() (int64, error) {
|
|
if l.current == 0 {
|
|
return l.current, errors.New("an attempt to decrement a number of current listeners down to less than 0")
|
|
}
|
|
l.current--
|
|
return l.current, nil
|
|
}
|
|
|
|
// Reset current peak and overall listeners for a song that is playing.
|
|
// And return its values.
|
|
func (l *ListenerCounter) Reset() (overall, peak int64) {
|
|
peak = l.cur_peak
|
|
l.cur_peak = l.current
|
|
overall = l.overall
|
|
l.overall = l.current
|
|
return
|
|
}
|
|
|
|
func (l *ListenerCounter) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(&struct {
|
|
Current int64 `json:"current"`
|
|
Peak int64 `json:"peak"`
|
|
Overall int64 `json:"overall"`
|
|
CurPeak int64 `json:"current_peak"`
|
|
}{
|
|
Current: l.current,
|
|
Peak: l.peak,
|
|
Overall: l.overall,
|
|
CurPeak: l.cur_peak})
|
|
}
|