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 }}
Server State |
@@ -145,6 +149,10 @@
{{ end }}
{{ end }}
+
+
+
+
{{ if and .Data.AllowPlayerCountDisplay (and .Queried.PlayerCount .Queried.MaxPlayers) }}
Player Count |
@@ -206,28 +214,18 @@
- Player List{{ if .Queried.PlayerCount }} ({{ .Queried.PlayerCount }}) {{ end }} |
+ Player List{{ if .Queried.PlayerCount }} ({{ len (.Queried.GetPlayers .Data.ShowAnonymousPlayers) }}) {{ end }} |
Collapse Player List |
{{ 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 }}
No Detectable Players. |
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)