You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							143 lines
						
					
					
						
							5.0 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							5.0 KiB
						
					
					
				package controllers | 
						|
 | 
						|
import ( | 
						|
	"encoding/json" | 
						|
	"fmt" | 
						|
	"net/http" | 
						|
	"net/url" | 
						|
 | 
						|
	"github.com/owncast/owncast/activitypub" | 
						|
	"github.com/owncast/owncast/config" | 
						|
	"github.com/owncast/owncast/core/data" | 
						|
	"github.com/owncast/owncast/models" | 
						|
	"github.com/owncast/owncast/router/middleware" | 
						|
	"github.com/owncast/owncast/utils" | 
						|
	log "github.com/sirupsen/logrus" | 
						|
) | 
						|
 | 
						|
type webConfigResponse struct { | 
						|
	Name                 string                       `json:"name"` | 
						|
	Summary              string                       `json:"summary"` | 
						|
	Logo                 string                       `json:"logo"` | 
						|
	Tags                 []string                     `json:"tags"` | 
						|
	Version              string                       `json:"version"` | 
						|
	NSFW                 bool                         `json:"nsfw"` | 
						|
	SocketHostOverride   string                       `json:"socketHostOverride,omitempty"` | 
						|
	ExtraPageContent     string                       `json:"extraPageContent"` | 
						|
	StreamTitle          string                       `json:"streamTitle,omitempty"` // What's going on with the current stream | 
						|
	SocialHandles        []models.SocialHandle        `json:"socialHandles"` | 
						|
	ChatDisabled         bool                         `json:"chatDisabled"` | 
						|
	ExternalActions      []models.ExternalAction      `json:"externalActions"` | 
						|
	CustomStyles         string                       `json:"customStyles"` | 
						|
	MaxSocketPayloadSize int                          `json:"maxSocketPayloadSize"` | 
						|
	Federation           federationConfigResponse     `json:"federation"` | 
						|
	Notifications        notificationsConfigResponse  `json:"notifications"` | 
						|
	Authentication       authenticationConfigResponse `json:"authentication"` | 
						|
} | 
						|
 | 
						|
type federationConfigResponse struct { | 
						|
	Enabled       bool   `json:"enabled"` | 
						|
	Account       string `json:"account,omitempty"` | 
						|
	FollowerCount int    `json:"followerCount,omitempty"` | 
						|
} | 
						|
 | 
						|
type browserNotificationsConfigResponse struct { | 
						|
	Enabled   bool   `json:"enabled"` | 
						|
	PublicKey string `json:"publicKey,omitempty"` | 
						|
} | 
						|
 | 
						|
type notificationsConfigResponse struct { | 
						|
	Browser browserNotificationsConfigResponse `json:"browser"` | 
						|
} | 
						|
 | 
						|
type authenticationConfigResponse struct { | 
						|
	IndieAuthEnabled bool `json:"indieAuthEnabled"` | 
						|
} | 
						|
 | 
						|
// GetWebConfig gets the status of the server. | 
						|
func GetWebConfig(w http.ResponseWriter, r *http.Request) { | 
						|
	middleware.EnableCors(w) | 
						|
	middleware.DisableCache(w) | 
						|
	w.Header().Set("Content-Type", "application/json") | 
						|
 | 
						|
	pageContent := utils.RenderPageContentMarkdown(data.GetExtraPageBodyContent()) | 
						|
	socialHandles := data.GetSocialHandles() | 
						|
	for i, handle := range socialHandles { | 
						|
		platform := models.GetSocialHandle(handle.Platform) | 
						|
		if platform != nil { | 
						|
			handle.Icon = platform.Icon | 
						|
			socialHandles[i] = handle | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	serverSummary := data.GetServerSummary() | 
						|
	serverSummary = utils.RenderPageContentMarkdown(serverSummary) | 
						|
 | 
						|
	var federationResponse federationConfigResponse | 
						|
	federationEnabled := data.GetFederationEnabled() | 
						|
 | 
						|
	followerCount, _ := activitypub.GetFollowerCount() | 
						|
	if federationEnabled { | 
						|
		serverURLString := data.GetServerURL() | 
						|
		serverURL, _ := url.Parse(serverURLString) | 
						|
		account := fmt.Sprintf("%s@%s", data.GetDefaultFederationUsername(), serverURL.Host) | 
						|
		federationResponse = federationConfigResponse{ | 
						|
			Enabled:       federationEnabled, | 
						|
			FollowerCount: int(followerCount), | 
						|
			Account:       account, | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	browserPushEnabled := data.GetBrowserPushConfig().Enabled | 
						|
	browserPushPublicKey, err := data.GetBrowserPushPublicKey() | 
						|
	if err != nil { | 
						|
		log.Errorln("unable to fetch browser push notifications public key", err) | 
						|
		browserPushEnabled = false | 
						|
	} | 
						|
 | 
						|
	notificationsResponse := notificationsConfigResponse{ | 
						|
		Browser: browserNotificationsConfigResponse{ | 
						|
			Enabled:   browserPushEnabled, | 
						|
			PublicKey: browserPushPublicKey, | 
						|
		}, | 
						|
	} | 
						|
 | 
						|
	authenticationResponse := authenticationConfigResponse{ | 
						|
		IndieAuthEnabled: data.GetServerURL() != "", | 
						|
	} | 
						|
 | 
						|
	configuration := webConfigResponse{ | 
						|
		Name:                 data.GetServerName(), | 
						|
		Summary:              serverSummary, | 
						|
		Logo:                 "/logo", | 
						|
		Tags:                 data.GetServerMetadataTags(), | 
						|
		Version:              config.GetReleaseString(), | 
						|
		NSFW:                 data.GetNSFW(), | 
						|
		SocketHostOverride:   data.GetWebsocketOverrideHost(), | 
						|
		ExtraPageContent:     pageContent, | 
						|
		StreamTitle:          data.GetStreamTitle(), | 
						|
		SocialHandles:        socialHandles, | 
						|
		ChatDisabled:         data.GetChatDisabled(), | 
						|
		ExternalActions:      data.GetExternalActions(), | 
						|
		CustomStyles:         data.GetCustomStyles(), | 
						|
		MaxSocketPayloadSize: config.MaxSocketPayloadSize, | 
						|
		Federation:           federationResponse, | 
						|
		Notifications:        notificationsResponse, | 
						|
		Authentication:       authenticationResponse, | 
						|
	} | 
						|
 | 
						|
	if err := json.NewEncoder(w).Encode(configuration); err != nil { | 
						|
		BadRequestHandler(w, err) | 
						|
	} | 
						|
} | 
						|
 | 
						|
// GetAllSocialPlatforms will return a list of all social platform types. | 
						|
func GetAllSocialPlatforms(w http.ResponseWriter, r *http.Request) { | 
						|
	middleware.EnableCors(w) | 
						|
	w.Header().Set("Content-Type", "application/json") | 
						|
 | 
						|
	platforms := models.GetAllSocialHandles() | 
						|
	if err := json.NewEncoder(w).Encode(platforms); err != nil { | 
						|
		InternalErrorHandler(w, err) | 
						|
	} | 
						|
}
 | 
						|
 |