Initial commit
This commit is contained in:
commit
5f3ae55e51
73
display.html
Normal file
73
display.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="cs">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Makerfaire Pátek</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-image: linear-gradient(to left, #ff1546 90%, transparent 100%);
|
||||||
|
height: 100vh;
|
||||||
|
margin: 0;
|
||||||
|
padding: 1rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bar {
|
||||||
|
z-index: -1;
|
||||||
|
position: absolute;
|
||||||
|
left:0;
|
||||||
|
min-width: 50%;
|
||||||
|
top:0;
|
||||||
|
bottom: 0;
|
||||||
|
background-image: linear-gradient(to right, #1aff45 90%, transparent 100%);
|
||||||
|
transition: min-width 2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.perc {
|
||||||
|
font-size: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.perc::after {
|
||||||
|
content: '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
.val {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
setInterval(() => {
|
||||||
|
fetch("/stats").then((response) => {
|
||||||
|
response.json().then((json) => {
|
||||||
|
let n1 = Number(json[0]);
|
||||||
|
let n2 = Number(json[1]);
|
||||||
|
let v1 = document.getElementById("1");
|
||||||
|
let v1f = n1 / (n1 + n2);
|
||||||
|
v1.getElementsByClassName("val")[0].innerText = n1.toString();
|
||||||
|
v1.getElementsByClassName("perc")[0].innerText = (n1 === 0 && n2 === 0) ? "50" : (n1 === 0 ? "0" : Number(v1f * 100).toFixed(0));
|
||||||
|
let v2 = document.getElementById("2");
|
||||||
|
let v2f = n2 / (n1 + n2);
|
||||||
|
v2.getElementsByClassName("val")[0].innerText = n2.toString();
|
||||||
|
v2.getElementsByClassName("perc")[0].innerText = (n1 === 0 && n2 === 0) ? "50" : (n2 === 0 ? "0" : Number(v2f * 100).toFixed(0));
|
||||||
|
document.getElementById("bar").style.minWidth = v1f*100 + "%";
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 500)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="1" class="votes">
|
||||||
|
<div class="perc"></div>
|
||||||
|
<div class="val"></div>
|
||||||
|
</div>
|
||||||
|
<div id="2" class="votes">
|
||||||
|
<div class="perc"></div>
|
||||||
|
<div class="val"></div>
|
||||||
|
</div>
|
||||||
|
<div id="bar"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
29
index.html
Normal file
29
index.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="cs">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Makerfaire Pátek</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: blueviolet;
|
||||||
|
}
|
||||||
|
#buttons {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
|
||||||
|
#buttons button {
|
||||||
|
min-width: 25vw;
|
||||||
|
min-height: 35vh;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Makerfaire</h1>
|
||||||
|
<div id="buttons">
|
||||||
|
<a href="/vote?key=0"><button style="background-color: green"></button></a>
|
||||||
|
<a href="/vote?key=1"><button style="background-color: red"></button></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
74
main.go
Normal file
74
main.go
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type vote struct {
|
||||||
|
item byte
|
||||||
|
weight int
|
||||||
|
}
|
||||||
|
|
||||||
|
var homeHtml []byte
|
||||||
|
var displayHtml []byte
|
||||||
|
|
||||||
|
var stats = make([]int, 2)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var err error
|
||||||
|
homeHtml, err = ioutil.ReadFile("index.html")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
displayHtml, err = ioutil.ReadFile("display.html")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var manager = make(chan vote)
|
||||||
|
go manage(manager)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
w.Write(displayHtml)
|
||||||
|
})
|
||||||
|
mux.HandleFunc("/stats", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
json.NewEncoder(w).Encode(stats)
|
||||||
|
})
|
||||||
|
http.ListenAndServe("127.0.0.1:8081", mux)
|
||||||
|
}()
|
||||||
|
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
w.Write(homeHtml)
|
||||||
|
})
|
||||||
|
mux.HandleFunc("/vote", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var key = r.URL.Query().Get("key")
|
||||||
|
switch key {
|
||||||
|
case "0":
|
||||||
|
manager <- vote{item: 0, weight: 1}
|
||||||
|
case "1":
|
||||||
|
manager <- vote{item: 1, weight: 1}
|
||||||
|
default:
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
http.ListenAndServe(":8080", mux)
|
||||||
|
}
|
||||||
|
|
||||||
|
func manage(ch chan vote) {
|
||||||
|
for v := range ch {
|
||||||
|
if int(v.item) < len(stats) {
|
||||||
|
stats[v.item] += v.weight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user