1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-27 21:05:53 +00:00

Add /all_topics endpoint

Temporarily not protected with sealing, we'll see how the performance is
first.
This commit is contained in:
Kane York 2017-09-21 10:33:06 -07:00
parent b4f4a65a68
commit b108177942
3 changed files with 35 additions and 0 deletions

View file

@ -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"},

View file

@ -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)
}

View file

@ -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)