From a159096c89614e9ca7498606d19470801f820841 Mon Sep 17 00:00:00 2001 From: Captain ALM Date: Sat, 9 Sep 2023 15:57:11 +0100 Subject: [PATCH] Make server more page versatile. Update page layout. --- conf/page.go | 19 +++++++++++++ conf/serve.go | 20 ++++++++++++++ index.go.html | 22 +++++++-------- pageHandler/page-handler.go | 4 +-- pageHandler/pages.go | 16 ++++++++--- pageHandler/pages/index/index-page.go | 40 ++++++++++++++++----------- 6 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 conf/page.go diff --git a/conf/page.go b/conf/page.go new file mode 100644 index 0000000..1e0e001 --- /dev/null +++ b/conf/page.go @@ -0,0 +1,19 @@ +package conf + +import "strings" + +type PageYaml struct { + PageName string `yaml:"pageName"` + PagePath string `yaml:"pagePath"` +} + +func (py PageYaml) GetPagePath() string { + toReturn := py.PagePath + if !strings.HasSuffix(toReturn, ".go") { + toReturn += ".go" + } + if !strings.HasPrefix(toReturn, "/") { + toReturn = "/" + toReturn + } + return toReturn +} diff --git a/conf/serve.go b/conf/serve.go index a034205..1d9c941 100644 --- a/conf/serve.go +++ b/conf/serve.go @@ -9,10 +9,13 @@ import ( type ServeYaml struct { DataStorage string `yaml:"dataStorage"` + TemplateStorage string `yaml:"templateStorage"` Domains []string `yaml:"domains"` RangeSupported bool `yaml:"rangeSupported"` EnableGoInfoPage bool `yaml:"enableGoInfoPage"` CacheSettings CacheSettingsYaml `yaml:"cacheSettings"` + PageSettings []PageYaml `yaml:"pageSettings"` + YmlDataFallback bool `yaml:"ymlDataFallback"` } func (sy ServeYaml) GetDomainString() string { @@ -39,3 +42,20 @@ func (sy ServeYaml) GetDataStoragePath() string { return sy.DataStorage } } + +func (sy ServeYaml) GetTemplateStoragePath() string { + if sy.TemplateStorage == "" || !filepath.IsAbs(sy.TemplateStorage) { + wd, err := os.Getwd() + if err != nil { + return "" + } else { + if sy.TemplateStorage == "" { + return wd + } else { + return path.Join(wd, sy.TemplateStorage) + } + } + } else { + return sy.TemplateStorage + } +} diff --git a/index.go.html b/index.go.html index 451a906..f4c5d07 100644 --- a/index.go.html +++ b/index.go.html @@ -108,6 +108,10 @@ {{ end }} {{ end }} + +

+

+ {{ if .Data.AllowDisplayState }} @@ -145,6 +149,10 @@ {{ end }} {{ end }} +
Server State
+

+

+ {{ if and .Data.AllowPlayerCountDisplay (and .Queried.PlayerCount .Queried.MaxPlayers) }} @@ -206,28 +214,18 @@

Player Count
- + {{ if gt (len (.Queried.GetPlayers .Data.ShowAnonymousPlayers)) 0 }} - {{ if .Data.ShowAnonymousPlayers }} - {{ range .Queried.Players }} + {{ range .Queried.GetPlayers .Data.ShowAnonymousPlayers }} {{ end }} {{ else }} - {{ range .Queried.Players }} - {{ if ne . "Anonymous Player" }} - - - - {{ end }} - {{ end }} - {{ end }} - {{ else }} diff --git a/pageHandler/page-handler.go b/pageHandler/page-handler.go index e93ad4a..2467cd0 100644 --- a/pageHandler/page-handler.go +++ b/pageHandler/page-handler.go @@ -44,9 +44,9 @@ func NewPageHandler(config conf.ServeYaml) *PageHandler { CacheSettings: config.CacheSettings, } if config.EnableGoInfoPage { - toReturn.PageProviders = GetProviders(config.CacheSettings.EnableTemplateCaching, config.DataStorage, toReturn) + toReturn.PageProviders = GetProviders(config.CacheSettings.EnableTemplateCaching, config.GetDataStoragePath(), toReturn, config.GetTemplateStoragePath(), config.PageSettings, config.YmlDataFallback) } else { - toReturn.PageProviders = GetProviders(config.CacheSettings.EnableTemplateCaching, config.DataStorage, nil) + toReturn.PageProviders = GetProviders(config.CacheSettings.EnableTemplateCaching, config.GetDataStoragePath(), nil, config.GetTemplateStoragePath(), config.PageSettings, config.YmlDataFallback) } return toReturn } diff --git a/pageHandler/pages.go b/pageHandler/pages.go index 24a9e8b..9f6461e 100644 --- a/pageHandler/pages.go +++ b/pageHandler/pages.go @@ -1,18 +1,26 @@ package pageHandler -import "golang.captainalm.com/mc-webserver/pageHandler/pages/index" +import ( + "golang.captainalm.com/mc-webserver/conf" + "golang.captainalm.com/mc-webserver/pageHandler/pages/index" + "strings" +) var providers map[string]PageProvider -func GetProviders(cacheTemplates bool, dataStorage string, pageHandler *PageHandler) map[string]PageProvider { +func GetProviders(cacheTemplates bool, dataStorage string, pageHandler *PageHandler, templateStorage string, pageSettings []conf.PageYaml, ymlDataFallback bool) map[string]PageProvider { if providers == nil { providers = make(map[string]PageProvider) if pageHandler != nil { infoPage := newGoInfoPage(pageHandler, dataStorage, cacheTemplates) providers[infoPage.GetPath()] = infoPage //Go Information Page } - indexPage := index.NewPage(dataStorage, cacheTemplates) - providers[indexPage.GetPath()] = indexPage + for _, cpg := range pageSettings { //Register pages + if strings.EqualFold(cpg.PageName, index.PageName) { + indexPage := index.NewPage(dataStorage, cacheTemplates, templateStorage, cpg.GetPagePath(), ymlDataFallback) + providers[indexPage.GetPath()] = indexPage + } + } } return providers } diff --git a/pageHandler/pages/index/index-page.go b/pageHandler/pages/index/index-page.go index 2c365cd..a73952b 100644 --- a/pageHandler/pages/index/index-page.go +++ b/pageHandler/pages/index/index-page.go @@ -1,6 +1,7 @@ package index import ( + "errors" "html/template" "net/url" "os" @@ -13,10 +14,10 @@ import ( "gopkg.in/yaml.v3" ) +const PageName = "index" const templateName = "index.go.html" -const yamlName = "index.go.yml" -func NewPage(dataStore string, cacheTemplates bool) *Page { +func NewPage(dataStore string, cacheTemplates bool, templateStore string, pagePath string, ymlDataFallback bool) *Page { var ptm *sync.Mutex var sdm *sync.Mutex if cacheTemplates { @@ -24,7 +25,10 @@ func NewPage(dataStore string, cacheTemplates bool) *Page { sdm = &sync.Mutex{} } pageToReturn := &Page{ - DataStore: dataStore, + YMLDataFallback: ymlDataFallback, + PagePath: pagePath, + DataPath: path.Join(dataStore, pagePath), + TemplatePath: path.Join(templateStore, templateName), StoredDataMutex: sdm, PageTemplateMutex: ptm, CacheMCMutex: &sync.Mutex{}, @@ -33,7 +37,10 @@ func NewPage(dataStore string, cacheTemplates bool) *Page { } type Page struct { - DataStore string + YMLDataFallback bool + PagePath string + DataPath string + TemplatePath string StoredDataMutex *sync.Mutex StoredData *DataYaml LastModifiedData time.Time @@ -47,7 +54,7 @@ type Page struct { } func (p *Page) GetPath() string { - return "/index.go" + return p.PagePath } func (p *Page) GetLastModified() time.Time { @@ -153,16 +160,12 @@ func (p *Page) getPageTemplate() (*template.Template, error) { defer p.PageTemplateMutex.Unlock() } if p.PageTemplate == nil { - thePath := templateName - if p.DataStore != "" { - thePath = path.Join(p.DataStore, thePath) - } - stat, err := os.Stat(thePath) + stat, err := os.Stat(p.TemplatePath) if err != nil { return nil, err } p.LastModifiedTemplate = stat.ModTime() - loadedData, err := os.ReadFile(thePath) + loadedData, err := os.ReadFile(p.TemplatePath) if err != nil { return nil, err } @@ -185,13 +188,18 @@ func (p *Page) getPageData() (*DataYaml, error) { defer p.StoredDataMutex.Unlock() } if p.StoredData == nil { - thePath := yamlName - if p.DataStore != "" { - thePath = path.Join(p.DataStore, thePath) - } + thePath := p.DataPath stat, err := os.Stat(thePath) if err != nil { - return nil, err + if p.YMLDataFallback && errors.Is(err, os.ErrNotExist) { + thePath += ".yml" + stat, err = os.Stat(thePath) + if err != nil { + return nil, err + } + } else { + return nil, err + } } p.LastModifiedData = stat.ModTime() fileHandle, err := os.Open(thePath)
Player List{{ if .Queried.PlayerCount }} ({{ .Queried.PlayerCount }}) {{ end }}Player List{{ if .Queried.PlayerCount }} ({{ len (.Queried.GetPlayers .Data.ShowAnonymousPlayers) }}) {{ end }}
Collapse Player List
{{ . }}
{{ . }}
No Detectable Players.