From 6d642f6139c05debba014f581a15fbeed8ffbd9b Mon Sep 17 00:00:00 2001 From: "A. Svensson" Date: Sun, 10 Sep 2017 14:15:50 +0200 Subject: [PATCH] Makes the barcharts sortable and indicate "current active bar" for the day/hour --- charts.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++++---- handlers.go | 22 ++---------------- 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/charts.go b/charts.go index 48ef52e..27b3ede 100644 --- a/charts.go +++ b/charts.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net/http" + "sort" "time" chart "github.com/wcharczuk/go-chart" @@ -106,7 +107,8 @@ func makeHistoryChart(points []ServerPoint, showLegend bool) chart.Chart { } // NOTE: The chart won't be renderable unless we've got at least two days/hours of history -func makeAverageChart(values map[int][]int, fnFormat func(int, float64) string) chart.BarChart { +func makeAverageChart(values map[int][]int, fnFormat func(int, float64) string, fnSort func([]int) []int) chart.BarChart { + var keys []int avg := make(map[int]float64) for i, vl := range values { sum := 0 @@ -114,13 +116,14 @@ func makeAverageChart(values map[int][]int, fnFormat func(int, float64) string) sum += v } avg[i] = float64(sum / len(vl)) + keys = append(keys, i) } var bars []chart.Value - for i := 0; i < len(avg); i++ { + for _, k := range fnSort(keys) { bars = append(bars, chart.Value{ - Label: fnFormat(i, avg[i]), - Value: avg[i], + Label: fnFormat(k, avg[k]), + Value: avg[k], Style: chart.Style{ StrokeColor: chart.ColorBlue, FillColor: chart.ColorBlue, @@ -149,3 +152,56 @@ func makeAverageChart(values map[int][]int, fnFormat func(int, float64) string) Bars: bars, } } + +// Shortcut/helper func for the calling handler +func avgDailyChart(points []ServerPoint) chart.BarChart { + days := make(map[int][]int) + for _, p := range points { + d := int(p.Time.Weekday()) + days[d] = append(days[d], p.Players) + } + now := time.Now() + formatter := func(i int, f float64) string { + d := time.Weekday(i) + extra := "" + if d == now.Weekday() { + extra = "*" + } + return fmt.Sprintf("%s%s", d, extra) + } + sorter := func(keys []int) []int { + sort.Slice(keys, func(i, j int) bool { + return keys[i] < keys[j] + }) + // Fucking wankers and their fucking sundays + if keys[0] == int(time.Sunday) { + keys = append(keys[1:], int(time.Sunday)) + } + return keys + } + return makeAverageChart(days, formatter, sorter) +} + +// Shortcut/helper func for the calling handler +func avgHourlyChart(points []ServerPoint) chart.BarChart { + hours := make(map[int][]int) + for _, p := range points { + h := p.Time.Hour() + hours[h] = append(hours[h], p.Players) + } + now := time.Now() + formatter := func(i int, f float64) string { + extra := "" + if i == now.Hour() { + extra = "*" + } + return fmt.Sprintf("%02d%s", i, extra) + } + sorter := func(keys []int) []int { + sort.Slice(keys, func(i, j int) bool { + return keys[i] < keys[j] + }) + return keys + } + return makeAverageChart(hours, formatter, sorter) +} diff --git a/handlers.go b/handlers.go index 1b3df66..6477f60 100644 --- a/handlers.go +++ b/handlers.go @@ -3,7 +3,6 @@ package ss13_se import ( "fmt" "net/http" - "time" ) func (a *App) pageIndex(w http.ResponseWriter, r *http.Request, vars handlerVars) error { @@ -105,16 +104,7 @@ func (a *App) pageAverageDailyChart(w http.ResponseWriter, r *http.Request, vars } } - days := make(map[int][]int) - for _, p := range points { - d := int(p.Time.Weekday()) - days[d] = append(days[d], p.Players) - } - formatter := func(i int, f float64) string { - d := time.Weekday(i) - return fmt.Sprintf("%s", d) - } - c := makeAverageChart(days, formatter) + c := avgDailyChart(points) return a.renderChart(w, c) } @@ -131,14 +121,6 @@ func (a *App) pageAverageHourlyChart(w http.ResponseWriter, r *http.Request, var } } - hours := make(map[int][]int) - for _, p := range points { - h := p.Time.Hour() - hours[h] = append(hours[h], p.Players) - } - formatter := func(i int, f float64) string { - return fmt.Sprintf("%02d:00", i) - } - c := makeAverageChart(hours, formatter) + c := avgHourlyChart(points) return a.renderChart(w, c) }