Added a game-link page

Also tweaked a few other things
Kinda worked more on the client authentication stuff
This commit is contained in:
Brian Buller 2017-07-19 10:16:18 -05:00
parent c2959b3974
commit f2dde0c709
12 changed files with 228 additions and 165 deletions

View File

@ -45,6 +45,8 @@ func handleAdmin(w http.ResponseWriter, req *http.Request) {
handleAdminVotes(w, req, page) handleAdminVotes(w, req, page)
case "mode": case "mode":
handleAdminSetMode(w, req, page) handleAdminSetMode(w, req, page)
case "authmode":
handleAdminSetAuthMode(w, req, page)
default: default:
page.TemplateData = getCondorcetResult() page.TemplateData = getCondorcetResult()
page.show("admin-main.html", w) page.show("admin-main.html", w)
@ -63,3 +65,15 @@ func handleAdminSetMode(w http.ResponseWriter, req *http.Request, page *pageData
} }
redirect("/admin", w, req) redirect("/admin", w, req)
} }
func handleAdminSetAuthMode(w http.ResponseWriter, req *http.Request, page *pageData) {
vars := mux.Vars(req)
newMode, err := strconv.Atoi(vars["id"])
if err != nil {
page.session.setFlashMessage("Invalid Authentication Mode: "+vars["id"], "error")
}
if dbSetAuthMode(newMode) != nil {
page.session.setFlashMessage("Invalid Authentication Mode: "+vars["id"], "error")
}
redirect("/admin", w, req)
}

View File

@ -34,8 +34,9 @@ func handleAdminGames(w http.ResponseWriter, req *http.Request, page *pageData)
case "save": case "save":
name := req.FormValue("gamename") name := req.FormValue("gamename")
desc := req.FormValue("gamedesc") desc := req.FormValue("gamedesc")
link := req.FormValue("gamelink")
if dbIsValidTeam(teamId) { if dbIsValidTeam(teamId) {
if err := dbUpdateTeamGame(teamId, name, desc); err != nil { if err := dbUpdateTeamGame(teamId, name, link, desc); err != nil {
page.session.setFlashMessage("Error updating game: "+err.Error(), "error") page.session.setFlashMessage("Error updating game: "+err.Error(), "error")
} else { } else {
page.session.setFlashMessage("Team game updated", "success") page.session.setFlashMessage("Team game updated", "success")

306
assets.go
View File

@ -201,28 +201,28 @@ SExORVYLEQephirOzE3XK8kozU3KS8zMAatMLi0qzi+yUijIzwRaVQRSBQgAAP//D/6XxHkAAAA=
"/assets/css/gjvote.css": { "/assets/css/gjvote.css": {
local: "assets/css/gjvote.css", local: "assets/css/gjvote.css",
size: 4090, size: 4090,
modtime: 1500039735, modtime: 1500473492,
compressed: ` compressed: `
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
`, `,
}, },
@ -11952,41 +11952,42 @@ gXNZg01WlzwTO4QO8+DQa0kXLC/+GGcx3uzdZBOZuF7yMjkoIN5n+kVS9TMAAP//58Xge8kCAAA=
"/templates/admin-editteam.html": { "/templates/admin-editteam.html": {
local: "templates/admin-editteam.html", local: "templates/admin-editteam.html",
size: 7565, size: 7798,
modtime: 1500052762, modtime: 1500467841,
compressed: ` compressed: `
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
LoO6ef83AAD//5ZGKNl2HgAA
`, `,
}, },
@ -12038,15 +12039,17 @@ Xo6z3V9nVvnKh0MZ+h0AAP//kX1qvCYDAAA=
"/templates/admin-main.html": { "/templates/admin-main.html": {
local: "templates/admin-main.html", local: "templates/admin-main.html",
size: 1024, size: 1476,
modtime: 1500039735, modtime: 1500477139,
compressed: ` compressed: `
H4sIAAAJbogA/6yST0/CQBDF736KSUPCRboQb6ZtYjTxpDGKel7aoWzc7uL+KTGE7+4sC6YKKiGcZrtv H4sIAAAJbogA/6xTTQ/aMAy971d4FRKXtQHtNrWVEJN22oc2tp1Da0q0NGFJWoQQ/30OAVTxMVDhgpPY
5teXN5tVooVScmvzpNTKoXJJcQYQ7kOl0+yiePATKUq40xVmjL6jMPHOaQValSS+5clCqEovUqlL7oRW fjy/56alaKGQ3NosKrRyqFyUvwHw7z7Safk+/9bMpSjgsy4xZXQPiXnjnFagVUHJP1m0FqrU60Tqgjuh
6czgNO8zXjVCsYZm2bCfbH829wYHkTBwuq4lDqbCWAcdAZZLEFPAd0ijg2AAhrBadafnRjTcfFAvqoq0 VbI0uMiGjJe1UKymXjYaRsc/WzUG44AQO11VEuOFMNZBJwHbLYgF4F9IAgNPAEaw23W7V0bU3GyoFlVJ
pHjlwglVZyx2HG139KddEg5wO/rX7Yv+aTZjm/R/Je5s6NobQ7uDR7ReOtvZkpbxQCzDVY3QE+fQa+Ey uSj/zYUTqkpZqOhNd/xfupR4gO34Lttf+pxsyg7qp2/j+MKMiZR6jSWEPpihIcJc2r7O8MYtn3RnQhAP
h3SMzVxyhzfc8Uhdj0hRUHevTe95g3SfMbrZQqLtyGYR3vX7JX/3dxVShScsQ9R29xHtxpwcuKlWO7T9 evNVyQ34eto0QXRokKkUdLHP2HWaobdlpxHuGzZRmwNnmHLlfcCr7sWx/725FRfGThtjPOh3tI10XT+1
dYxo96/8eLhD3gT4ONRTw2tKN8BvQz013Fs0Af4c6p7HtSmfAQAA//8bOYdyAAQAAA== DAfCMlxVCAPxDgYtfMggmWG9kqTjR+54QN23SJFT9aBNvvAa6T1l9HIECZMEbBbAT6y76bPF81LDDyy8
/lfW7VL36EH7WpLQDvefAt7Yg/7gDnntwWc+vhq8InU9+CcfXw3eWDQe/KePV1bsEP4FAAD//8Y0rK/E
BQAA
`, `,
}, },
@ -12160,101 +12163,102 @@ AAAA//9ablv2IQMAAA==
"/templates/public-teammgmt.html": { "/templates/public-teammgmt.html": {
local: "templates/public-teammgmt.html", local: "templates/public-teammgmt.html",
size: 6160, size: 6401,
modtime: 1500052768, modtime: 1500470615,
compressed: ` compressed: `
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
z69eFl9HLqrLed2b/w0AAP//tiDe3hAYAAA= m9xCj6+ZxoNfGKsPukkAgK21ndC15GOhO+hdaqyfGi2jSTeqo/++ell8HbmoLud1b/4nAAD//zTsr1wB
GQAA
`, `,
}, },
"/templates/public-voting.html": { "/templates/public-voting.html": {
local: "templates/public-voting.html", local: "templates/public-voting.html",
size: 12041, size: 12039,
modtime: 1500050367, modtime: 1500477012,
compressed: ` compressed: `
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
`, `,
}, },

View File

@ -189,7 +189,7 @@ table tfoot {
.pure-button-toggle-last { .pure-button-toggle-last {
border-top-left-radius: 0px; border-top-left-radius: 0px;
border-bottom-left-radius: 0px; border-bottom-left-radius: 0px;
margin-left: -1px; margin-left: -5px;
border-left: 1px solid #CCC; border-left: 1px solid #CCC;
} }

View File

@ -66,7 +66,7 @@ type pageData struct {
ClientId string ClientId string
ClientIsAuth bool ClientIsAuth bool
ClientIsServer bool ClientIsServer bool
TeamID string AuthMode int
PublicMode int PublicMode int
TemplateData interface{} TemplateData interface{}
@ -290,11 +290,11 @@ func InitPageData(w http.ResponseWriter, req *http.Request) *pageData {
p.ClientId = p.session.getClientId() p.ClientId = p.session.getClientId()
p.ClientIsAuth = clientIsAuthenticated(p.ClientId, req) p.ClientIsAuth = clientIsAuthenticated(p.ClientId, req)
p.ClientIsServer = clientIsServer(req) p.ClientIsServer = clientIsServer(req)
// TeamID is for team self-administration
p.TeamID, _ = p.session.getStringValue("teamid")
// Public Mode // Public Mode
p.PublicMode = dbGetPublicSiteMode() p.PublicMode = dbGetPublicSiteMode()
// Authentication Mode
p.AuthMode = dbGetAuthMode()
return p return p
} }
@ -318,7 +318,6 @@ func (p *pageData) show(tmplName string, w http.ResponseWriter) error {
// outputTemplate // outputTemplate
// Spit out a template // Spit out a template
func outputTemplate(tmplName string, tmplData interface{}, w http.ResponseWriter) error { func outputTemplate(tmplName string, tmplData interface{}, w http.ResponseWriter) error {
// TODO: Use embedded files for these... Hopefully?
n := "/templates/" + tmplName n := "/templates/" + tmplName
l := template.Must(template.New("layout").Parse(FSMustString(site.DevMode, n))) l := template.Must(template.New("layout").Parse(FSMustString(site.DevMode, n)))
t := template.Must(l.Parse(FSMustString(site.DevMode, n))) t := template.Must(l.Parse(FSMustString(site.DevMode, n)))

View File

@ -16,6 +16,12 @@ const (
SiteModeError SiteModeError
) )
const (
AuthModeAuthentication = iota
AuthModeAll
AuthModeError
)
func GetDefaultSiteConfig() *siteData { func GetDefaultSiteConfig() *siteData {
ret := new(siteData) ret := new(siteData)
ret.Title = "ICT GameJam" ret.Title = "ICT GameJam"
@ -144,6 +150,21 @@ func dbSaveSiteConfig(dat *siteData) error {
return db.SetValue(siteConf, "server-dir", dat.ServerDir) return db.SetValue(siteConf, "server-dir", dat.ServerDir)
} }
func dbGetAuthMode() int {
if ret, err := db.GetInt([]string{"site"}, "auth-mode"); err != nil {
return AuthModeAuthentication
} else {
return ret
}
}
func dbSetAuthMode(mode int) error {
if mode < 0 || mode >= AuthModeError {
return errors.New("Invalid site mode")
}
return db.SetInt([]string{"site"}, "auth-mode", mode)
}
func dbGetPublicSiteMode() int { func dbGetPublicSiteMode() int {
if ret, err := db.GetInt([]string{"site"}, "public-mode"); err != nil { if ret, err := db.GetInt([]string{"site"}, "public-mode"); err != nil {
return SiteModeWaiting return SiteModeWaiting

View File

@ -9,6 +9,7 @@ import (
type Game struct { type Game struct {
Name string Name string
TeamId string TeamId string
Link string
Description string Description string
Screenshots []Screenshot Screenshots []Screenshot
} }
@ -21,7 +22,7 @@ type Screenshot struct {
Filetype string Filetype string
} }
func dbUpdateTeamGame(teamId, name, desc string) error { func dbUpdateTeamGame(teamId, name, link, desc string) error {
var err error var err error
if err = openDatabase(); err != nil { if err = openDatabase(); err != nil {
return err return err
@ -44,6 +45,9 @@ func dbUpdateTeamGame(teamId, name, desc string) error {
if err := db.SetValue(gamePath, "name", name); err != nil { if err := db.SetValue(gamePath, "name", name); err != nil {
return err return err
} }
if err := db.SetValue(gamePath, "link", link); err != nil {
return err
}
if err := db.SetValue(gamePath, "description", desc); err != nil { if err := db.SetValue(gamePath, "description", desc); err != nil {
return err return err
} }
@ -79,6 +83,9 @@ func dbGetTeamGame(teamId string) *Game {
if gm.Description, err = db.GetValue(gamePath, "description"); err != nil { if gm.Description, err = db.GetValue(gamePath, "description"); err != nil {
gm.Description = "" gm.Description = ""
} }
if gm.Link, err = db.GetValue(gamePath, "link"); err != nil {
gm.Link = ""
}
gm.Screenshots = dbGetTeamGameScreenshots(teamId) gm.Screenshots = dbGetTeamGameScreenshots(teamId)
return gm return gm
} }

View File

@ -16,12 +16,13 @@ func initPublicPage(w http.ResponseWriter, req *http.Request) *pageData {
} }
func handleMain(w http.ResponseWriter, req *http.Request) { func handleMain(w http.ResponseWriter, req *http.Request) {
switch dbGetPublicSiteMode() { page := initPublicPage(w, req)
case SiteModeWaiting: showWaiting := (dbGetAuthMode() == AuthModeAuthentication) && !page.ClientIsAuth
page := initPublicPage(w, req) showWaiting = showWaiting && (dbGetPublicSiteMode() == SiteModeWaiting)
if showWaiting {
page.SubTitle = "" page.SubTitle = ""
page.show("public-waiting.html", w) page.show("public-waiting.html", w)
case SiteModeVoting: } else {
loadVotingPage(w, req) loadVotingPage(w, req)
} }
} }
@ -153,9 +154,10 @@ func handleTeamMgmtRequest(w http.ResponseWriter, req *http.Request) {
redirect("/team/"+teamId, w, req) redirect("/team/"+teamId, w, req)
case "savegame": case "savegame":
name := req.FormValue("gamename") name := req.FormValue("gamename")
link := req.FormValue("gamelink")
desc := req.FormValue("gamedesc") desc := req.FormValue("gamedesc")
if dbIsValidTeam(teamId) { if dbIsValidTeam(teamId) {
if err := dbUpdateTeamGame(teamId, name, desc); err != nil { if err := dbUpdateTeamGame(teamId, name, link, desc); err != nil {
page.session.setFlashMessage("Error updating game: "+err.Error(), "error") page.session.setFlashMessage("Error updating game: "+err.Error(), "error")
} else { } else {
page.session.setFlashMessage("Team game updated", "success") page.session.setFlashMessage("Team game updated", "success")

View File

@ -29,6 +29,10 @@
<label class="control-label" for="gamename">Game Name</label> <label class="control-label" for="gamename">Game Name</label>
<input id="gamename" name="gamename" value="{{ .TemplateData.Game.Name }}" placeholder="Game Name"> <input id="gamename" name="gamename" value="{{ .TemplateData.Game.Name }}" placeholder="Game Name">
</div> </div>
<div class="pure-control-group">
<label class="control-label" for="gamelink">Link</label>
<input id="gamelink" name="gamelink" value="{{ .TemplateData.Game.Link }}" placeholder="Game Link">
</div>
<div class="pure-control-group"> <div class="pure-control-group">
<label class="control-label" for="gamedesc">Description</label> <label class="control-label" for="gamedesc">Description</label>
<textarea id="gamedesc" name="gamedesc" placeholder="Description...">{{ .TemplateData.Game.Description }}</textarea> <textarea id="gamedesc" name="gamedesc" placeholder="Description...">{{ .TemplateData.Game.Description }}</textarea>

View File

@ -4,6 +4,13 @@
<button onclick="window.location.href='/admin/mode/0'" class="pure-button-toggle-first pure-button {{ if eq .PublicMode 0 }}pure-button-primary{{ end }}">Waiting</button> <button onclick="window.location.href='/admin/mode/0'" class="pure-button-toggle-first pure-button {{ if eq .PublicMode 0 }}pure-button-primary{{ end }}">Waiting</button>
<button onclick="window.location.href='/admin/mode/1'" class="pure-button-toggle-last pure-button {{ if eq .PublicMode 1 }}pure-button-primary{{ end }}">Voting</button> <button onclick="window.location.href='/admin/mode/1'" class="pure-button-toggle-last pure-button {{ if eq .PublicMode 1 }}pure-button-primary{{ end }}">Voting</button>
</div> </div>
<!--
<div>
<h3>Allowed Voting Terminals</h3>
<button onclick="window.location.href='/admin/authmode/0'" class="pure-button-toggle-first pure-button {{ if eq .AuthMode 0 }}pure-button-primary{{ end }}">Only Authenticated Clients</button>
<button onclick="window.location.href='/admin/authmode/1'" class="pure-button-toggle-last pure-button {{ if eq .AuthMode 1 }}pure-button-primary{{ end }}">Any Client Can Vote</button>
</div>
-->
{{ if eq .PublicMode 1 }} {{ if eq .PublicMode 1 }}
<div> <div>
<h3>Current Results</h3> <h3>Current Results</h3>

View File

@ -14,6 +14,10 @@
<label class="control-label" for="gamename">Game Name</label> <label class="control-label" for="gamename">Game Name</label>
<input id="gamename" name="gamename" value="{{ .TemplateData.Game.Name }}" placeholder="Game Name"> <input id="gamename" name="gamename" value="{{ .TemplateData.Game.Name }}" placeholder="Game Name">
</div> </div>
<div class="pure-control-group">
<label class="control-label" for="gamelink">Game Website</label>
<input id="gamelink" name="gamelink" value="{{ .TemplateData.Game.Link }}" placeholder="Game Link">
</div>
<div class="pure-control-group"> <div class="pure-control-group">
<label class="control-label" for="gamedesc">Description</label> <label class="control-label" for="gamedesc">Description</label>
<textarea id="gamedesc" name="gamedesc" placeholder="Description...">{{ .TemplateData.Game.Description }}</textarea> <textarea id="gamedesc" name="gamedesc" placeholder="Description...">{{ .TemplateData.Game.Description }}</textarea>

View File

@ -1,6 +1,6 @@
{{ if not .TemplateData.Teams }} {{ if not .TemplateData.Teams }}
<div>No games have been created</div> <div>No games have been created</div>
{{ else }} {{ else }}
<div class="content"> <div class="content">
Rank one or more games from your favorite to least favorite. Rank one or more games from your favorite to least favorite.
</div> </div>
@ -70,7 +70,6 @@
</div> </div>
{{ end }} {{ end }}
<div id="embiggenedScreenShot" class="hidden fullscreen" onclick="javascript:document.getElementById('embiggenedScreenShot').classList.add('hidden');"></div> <div id="embiggenedScreenShot" class="hidden fullscreen" onclick="javascript:document.getElementById('embiggenedScreenShot').classList.add('hidden');"></div>
{{ end }}
<script> <script>
var teams = { }; var teams = { };
{{ range $i, $v := .TemplateData.Teams }} {{ range $i, $v := .TemplateData.Teams }}
@ -369,3 +368,4 @@ function createUnrankedActionsTd(tmUUID) {
return td; return td;
} }
</script> </script>
{{ end }}