diff --git a/socketserver/server/handlecore.go b/socketserver/server/handlecore.go index 43c50d0b..b78f76a6 100644 --- a/socketserver/server/handlecore.go +++ b/socketserver/server/handlecore.go @@ -103,6 +103,7 @@ func SetupServerAndHandle(config *ConfigFile, serveMux *http.ServeMux) { serveMux.HandleFunc("/uncached_pub", HTTPBackendUncachedPublish) serveMux.HandleFunc("/cached_pub", HTTPBackendCachedPublish) serveMux.HandleFunc("/get_sub_count", HTTPGetSubscriberCount) + serveMux.HandleFunc("/all_topics", HTTPListAllTopics) announceForm, err := Backend.secureForm.Seal(url.Values{ "startup": []string{"1"}, diff --git a/socketserver/server/publisher.go b/socketserver/server/publisher.go index 669aa727..ffde2727 100644 --- a/socketserver/server/publisher.go +++ b/socketserver/server/publisher.go @@ -1,6 +1,7 @@ package server import ( + "encoding/json" "fmt" "net/http" "strconv" @@ -10,6 +11,7 @@ import ( "github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server/rate" "github.com/pkg/errors" + "golang.org/x/sync/singleflight" ) // LastSavedMessage contains a reply to a command along with an expiration time. @@ -25,6 +27,8 @@ type LastSavedMessage struct { var CachedLastMessages = make(map[Command]map[string]LastSavedMessage) var CachedLSMLock sync.RWMutex +var singleFlighter singleflight.Group + func cachedMessageJanitor() { for { time.Sleep(1 * time.Hour) @@ -303,3 +307,19 @@ func HTTPGetSubscriberCount(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, CountSubscriptions(strings.Split(channel, ","))) } + +func HTTPListAllTopics(w http.ResponseWriter, r *http.Request) { + r.ParseForm() + _, err := Backend.secureForm.Unseal(r.Form) + if err != nil { + //w.WriteHeader(403) + //fmt.Fprintf(w, "Error: %v", err) + //return + } + + topicList, _, _ := singleFlighter.Do("/all_topics", func() (interface{}, error) { + return GetAllTopics(), nil + }) + w.WriteHeader(200) + json.NewEncoder(w).Encode(topicList) +} diff --git a/socketserver/server/subscriptions.go b/socketserver/server/subscriptions.go index 392e08aa..007aea03 100644 --- a/socketserver/server/subscriptions.go +++ b/socketserver/server/subscriptions.go @@ -47,6 +47,20 @@ func CountSubscriptions(channels []string) int { return count } +func GetAllTopics() []string { + ChatSubscriptionLock.RLock() + defer ChatSubscriptionLock.RUnlock() + + count := len(ChatSubscriptionInfo) + list := make([]string, count) + i := 0 + for topicName := range ChatSubscriptionInfo { + list[i] = topicName + i++ + } + return list +} + func SubscribeChannel(client *ClientInfo, channelName string) { ChatSubscriptionLock.RLock() _subscribeWhileRlocked(channelName, client)