2023-06-08 04:59:15 +00:00
|
|
|
package worker
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/config"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ChatStatistics is the json result of the BareRTC /api/statistics endpoint.
|
|
|
|
type ChatStatistics struct {
|
|
|
|
UserCount int
|
|
|
|
Usernames []string
|
2023-06-10 20:25:06 +00:00
|
|
|
Cameras struct {
|
|
|
|
Blue int
|
|
|
|
Red int
|
|
|
|
}
|
2023-06-08 04:59:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetChatStatistics returns the latest (cached) chat statistics.
|
|
|
|
func GetChatStatistics() ChatStatistics {
|
|
|
|
chatStatisticsMu.RLock()
|
|
|
|
defer chatStatisticsMu.RUnlock()
|
|
|
|
|
|
|
|
if cachedChatStatistics != nil {
|
|
|
|
return *cachedChatStatistics
|
|
|
|
}
|
|
|
|
return ChatStatistics{
|
|
|
|
Usernames: []string{},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-08 00:31:46 +00:00
|
|
|
// SetChatStatistics updates the cached chat statistics, holding a write lock briefly.
|
|
|
|
func SetChatStatistics(stats *ChatStatistics) {
|
|
|
|
chatStatisticsMu.Lock()
|
|
|
|
defer chatStatisticsMu.Unlock()
|
|
|
|
cachedChatStatistics = stats
|
|
|
|
}
|
|
|
|
|
2023-06-08 04:59:15 +00:00
|
|
|
var (
|
|
|
|
cachedChatStatistics *ChatStatistics
|
|
|
|
chatStatisticsMu sync.RWMutex
|
|
|
|
)
|
|
|
|
|
|
|
|
// WatchBareRTC is a worker goroutine that caches the current online chatters in the chat room.
|
|
|
|
func WatchBareRTC() {
|
|
|
|
if config.Current.BareRTC.JWTSecret == "" || config.Current.BareRTC.URL == "" {
|
|
|
|
log.Error("Worker (WatchBareRTC): chat room is not configured, will not watch chat room status")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check it immediately.
|
|
|
|
DoCheckBareRTC()
|
|
|
|
|
|
|
|
// And on an interval forever.
|
2023-06-10 18:51:50 +00:00
|
|
|
for {
|
|
|
|
time.Sleep(config.ChatStatusRefreshInterval)
|
2023-06-08 04:59:15 +00:00
|
|
|
DoCheckBareRTC()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DoCheckBareRTC invokes the attempt to refresh data from the chat server about who's online.
|
|
|
|
func DoCheckBareRTC() {
|
|
|
|
log.Info("Refresh BareRTC")
|
|
|
|
req, err := http.NewRequest(http.MethodGet, config.Current.BareRTC.URL+"/api/statistics", nil)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
log.Error("WatchBareRTC: couldn't make request: %s", err)
|
2023-07-08 00:31:46 +00:00
|
|
|
SetChatStatistics(nil)
|
2023-06-08 04:59:15 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
client := http.Client{
|
2023-06-10 18:51:50 +00:00
|
|
|
Timeout: 10 * time.Second,
|
2023-06-08 04:59:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
res, err := client.Do(req)
|
|
|
|
if err != nil {
|
|
|
|
log.Error("WatchBareRTC: request error: %s", err)
|
2023-07-08 00:31:46 +00:00
|
|
|
SetChatStatistics(nil)
|
2023-06-08 04:59:15 +00:00
|
|
|
return
|
2023-06-10 18:51:50 +00:00
|
|
|
} else if res.StatusCode != http.StatusOK {
|
|
|
|
log.Error("WatchBareRTC: didn't get expected 200 OK from statistics endpoint, instead got: %s", res.Status)
|
2023-07-08 00:31:46 +00:00
|
|
|
SetChatStatistics(nil)
|
2023-06-10 18:51:50 +00:00
|
|
|
return
|
2023-06-08 04:59:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if res.StatusCode == http.StatusOK {
|
|
|
|
var cs ChatStatistics
|
|
|
|
body, _ := ioutil.ReadAll(res.Body)
|
|
|
|
res.Body.Close()
|
|
|
|
if err = json.Unmarshal(body, &cs); err != nil {
|
|
|
|
log.Error("WatchBareRTC: json decode error: %s", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-07-08 00:31:46 +00:00
|
|
|
SetChatStatistics(&cs)
|
2023-06-08 04:59:15 +00:00
|
|
|
}
|
|
|
|
}
|