240 lines
6.9 KiB
Go
240 lines
6.9 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"math/rand"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
func initPublicPage(w http.ResponseWriter, req *http.Request) *pageData {
|
|
p := InitPageData(w, req)
|
|
return p
|
|
}
|
|
|
|
func handleMain(w http.ResponseWriter, req *http.Request) {
|
|
page := initPublicPage(w, req)
|
|
if m.site.GetPublicMode() == SiteModeWaiting {
|
|
page.SubTitle = ""
|
|
page.show("public-waiting.html", w)
|
|
} else {
|
|
loadVotingPage(w, req)
|
|
}
|
|
}
|
|
|
|
func loadVotingPage(w http.ResponseWriter, req *http.Request) {
|
|
page := initPublicPage(w, req)
|
|
// Client authentication required
|
|
if (m.site.GetAuthMode() == AuthModeAuthentication) && !page.ClientIsAuth {
|
|
page.show("unauthorized.html", w)
|
|
return
|
|
}
|
|
type votingPageData struct {
|
|
Teams []Team
|
|
Timestamp string
|
|
}
|
|
vpd := new(votingPageData)
|
|
tms := make([]Team, len(m.jam.Teams))
|
|
copy(tms, m.jam.Teams)
|
|
|
|
// Randomize the team list
|
|
rand.Seed(time.Now().Unix())
|
|
for len(tms) > 0 {
|
|
i := rand.Intn(len(tms))
|
|
vpd.Teams = append(vpd.Teams, tms[i])
|
|
tms = append(tms[:i], tms[i+1:]...)
|
|
}
|
|
|
|
vpd.Timestamp = time.Now().Format(time.RFC3339)
|
|
page.TemplateData = vpd
|
|
page.show("public-voting.html", w)
|
|
}
|
|
|
|
func handlePublicSaveVote(w http.ResponseWriter, req *http.Request) {
|
|
page := initPublicPage(w, req)
|
|
// Client authentication required
|
|
if (m.site.GetAuthMode() == AuthModeAuthentication) && !page.ClientIsAuth {
|
|
page.show("unauthorized.html", w)
|
|
return
|
|
}
|
|
|
|
page.SubTitle = ""
|
|
|
|
// Check if we already have a vote for this client id/timestamp
|
|
ts := req.FormValue("timestamp")
|
|
timestamp, err := time.Parse(time.RFC3339, ts)
|
|
if err != nil {
|
|
page.session.setFlashMessage("Error creating vote", "error")
|
|
fmt.Println("Error parsing timestamp: " + ts)
|
|
redirect("/", w, req)
|
|
}
|
|
client, err := m.GetClient(page.ClientId)
|
|
if err != nil {
|
|
client = NewClient(page.ClientId)
|
|
}
|
|
|
|
// voteSlice is an ordered string slice of the voters preferences
|
|
voteCSV := req.FormValue("uservote")
|
|
voteSlice := strings.Split(voteCSV, ",")
|
|
|
|
if _, err = m.jam.GetVote(client.UUID, timestamp); err == nil {
|
|
// Duplicate vote... Cancel it.
|
|
page.session.setFlashMessage("Duplicate vote!", "error")
|
|
redirect("/", w, req)
|
|
}
|
|
|
|
var vt *Vote
|
|
if vt, err = NewVote(client.UUID, timestamp); err != nil {
|
|
fmt.Println("Error creating vote: " + err.Error())
|
|
page.session.setFlashMessage("Error creating vote", "error")
|
|
redirect("/", w, req)
|
|
}
|
|
if err = vt.SetChoices(voteSlice); err != nil {
|
|
fmt.Println("Error creating vote: " + err.Error())
|
|
page.session.setFlashMessage("Error creating vote", "error")
|
|
redirect("/", w, req)
|
|
}
|
|
if err := m.jam.AddVote(vt); err != nil {
|
|
fmt.Println("Error adding vote: " + err.Error())
|
|
page.session.setFlashMessage("Error creating vote", "error")
|
|
redirect("/", w, req)
|
|
}
|
|
page.session.setFlashMessage("Vote Saved!", "success large fading")
|
|
redirect("/", w, req)
|
|
}
|
|
|
|
func handleThumbnailRequest(w http.ResponseWriter, req *http.Request) {
|
|
// Thumbnail requests are open even without client authentication
|
|
vars := mux.Vars(req)
|
|
tm, err := m.jam.GetTeamById(vars["teamid"])
|
|
if err != nil {
|
|
fmt.Println("handleThumbnailRequest: " + err.Error())
|
|
http.Error(w, "Couldn't find image", 404)
|
|
return
|
|
}
|
|
ss, err := tm.Game.GetScreenshot(vars["imageid"])
|
|
if err != nil {
|
|
fmt.Println("handleThumbnailRequest: " + err.Error())
|
|
http.Error(w, "Couldn't find image", 404)
|
|
return
|
|
}
|
|
w.Header().Set("Content-Type", "image/"+ss.Filetype)
|
|
dat, err := base64.StdEncoding.DecodeString(ss.Thumbnail)
|
|
if err != nil {
|
|
fmt.Println("handleThumbnailRequest: " + err.Error())
|
|
http.Error(w, "Couldn't find image", 404)
|
|
return
|
|
}
|
|
w.Write(dat)
|
|
}
|
|
|
|
func handleImageRequest(w http.ResponseWriter, req *http.Request) {
|
|
// Image requests are open even without client authentication
|
|
vars := mux.Vars(req)
|
|
tm, err := m.jam.GetTeamById(vars["teamid"])
|
|
if err != nil {
|
|
fmt.Println("handleImageRequest: " + err.Error())
|
|
http.Error(w, "Couldn't find image", 404)
|
|
return
|
|
}
|
|
ss, err := tm.Game.GetScreenshot(vars["imageid"])
|
|
if err != nil {
|
|
fmt.Println("handleImageRequest: " + err.Error())
|
|
http.Error(w, "Couldn't find image", 404)
|
|
return
|
|
}
|
|
w.Header().Set("Content-Type", "image/"+ss.Filetype)
|
|
dat, err := base64.StdEncoding.DecodeString(ss.Image)
|
|
if err != nil {
|
|
fmt.Println("handleImageRequest: " + err.Error())
|
|
http.Error(w, "Couldn't find image", 404)
|
|
return
|
|
}
|
|
w.Write(dat)
|
|
}
|
|
|
|
func handleTeamMgmtRequest(w http.ResponseWriter, req *http.Request) {
|
|
// Team Management pages are open even without client authentication
|
|
if m.site.GetPublicMode() == SiteModeVoting {
|
|
redirect("/", w, req)
|
|
}
|
|
page := initPublicPage(w, req)
|
|
vars := mux.Vars(req)
|
|
page.SubTitle = "Team Details"
|
|
teamId := vars["id"]
|
|
tm, err := m.jam.GetTeamById(teamId)
|
|
if err == nil {
|
|
// Team self-management functions
|
|
switch vars["function"] {
|
|
case "":
|
|
page.SubTitle = "Team Management"
|
|
page.TemplateData = tm
|
|
page.show("public-teammgmt.html", w)
|
|
|
|
case "savemember":
|
|
m, err := NewTeamMember(tm.UUID, "")
|
|
if err != nil {
|
|
page.session.setFlashMessage("Error adding team member: "+err.Error(), "error")
|
|
redirect("/team/"+tm.UUID+"#members", w, req)
|
|
}
|
|
m.Name = req.FormValue("newmembername")
|
|
m.SlackId = req.FormValue("newmemberslackid")
|
|
m.Twitter = req.FormValue("newmembertwitter")
|
|
m.Email = req.FormValue("newmemberemail")
|
|
if err := tm.AddTeamMember(m); err != nil {
|
|
page.session.setFlashMessage("Error adding team member: "+err.Error(), "error")
|
|
} else {
|
|
page.session.setFlashMessage(m.Name+" added to team!", "success")
|
|
}
|
|
redirect("/team/"+tm.UUID+"#members", w, req)
|
|
|
|
case "deletemember":
|
|
mbrId := req.FormValue("memberid")
|
|
err := tm.RemoveTeamMemberById(mbrId)
|
|
if err != nil {
|
|
page.session.setFlashMessage("Error deleting team member: "+err.Error(), "error")
|
|
} else {
|
|
page.session.setFlashMessage("Team member removed", "success")
|
|
}
|
|
redirect("/team/"+tm.UUID, w, req)
|
|
|
|
case "savegame":
|
|
tm.Game.Name = req.FormValue("gamename")
|
|
tm.Game.Link = req.FormValue("gamelink")
|
|
tm.Game.Description = req.FormValue("gamedesc")
|
|
page.session.setFlashMessage("Team game updated", "success")
|
|
redirect("/team/"+tm.UUID, w, req)
|
|
|
|
case "screenshotupload":
|
|
ss, err := ssFromRequest(tm, req)
|
|
if err != nil {
|
|
page.session.setFlashMessage("Error updating game: "+err.Error(), "error")
|
|
redirect("/team/"+tm.UUID, w, req)
|
|
}
|
|
gm := tm.Game
|
|
gm.Screenshots = append(gm.Screenshots, *ss)
|
|
if err = m.jam.UpdateGame(tm.UUID, gm); err != nil {
|
|
page.session.setFlashMessage("Error updating game: "+err.Error(), "error")
|
|
} else {
|
|
page.session.setFlashMessage("Screenshot Uploaded", "success")
|
|
}
|
|
redirect("/team/"+tm.UUID, w, req)
|
|
|
|
case "screenshotdelete":
|
|
ssid := vars["subid"]
|
|
if err := tm.Game.RemoveScreenshot(ssid); err != nil {
|
|
page.session.setFlashMessage("Error deleting screenshot: "+err.Error(), "error")
|
|
}
|
|
redirect("/team/"+tm.UUID, w, req)
|
|
|
|
}
|
|
} else {
|
|
http.Error(w, "Page Not Found", 404)
|
|
return
|
|
}
|
|
}
|