From 15a4d5007e9980860a226197b07cea808f06a9e7 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Thu, 24 May 2018 14:52:11 +0200 Subject: [PATCH] More statistics --- main.go | 87 ++++++++++++++++++++++++++++++++------- templates/statistics.html | 43 +++++++++++++++++++ 2 files changed, 115 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index ba20c7b..524571e 100644 --- a/main.go +++ b/main.go @@ -50,24 +50,23 @@ type ChannelData struct { TotalWords int TotalCharacters int Users []UserData - Questions []PercentageEntry - Exclamations []PercentageEntry - Caps []PercentageEntry - EmojiHappy []PercentageEntry - EmojiSad []PercentageEntry - LongestLines []TotalEntry - ShortestLines []TotalEntry - Total []TotalEntry - Average TotalEntry - ChannelAverage TotalEntry + Questions []FloatEntry + Exclamations []FloatEntry + Caps []FloatEntry + EmojiHappy []FloatEntry + EmojiSad []FloatEntry + LongestLines []FloatEntry + ShortestLines []FloatEntry + Total []IntEntry + Average float64 } -type PercentageEntry struct { +type FloatEntry struct { Name string Value float64 } -type TotalEntry struct { +type IntEntry struct { Name string Value int } @@ -134,6 +133,30 @@ func main() { return } + channelData.EmojiHappy, err = retrievePercentageStats(db, "emoji_happy") + if err != nil { + println(err.Error()) + return + } + + channelData.EmojiSad, err = retrievePercentageStats(db, "emoji_sad") + if err != nil { + println(err.Error()) + return + } + + channelData.LongestLines, err = retrieveLongestLines(db) + if err != nil { + println(err.Error()) + return + } + + channelData.ShortestLines, err = retrieveShortestLines(db) + if err != nil { + println(err.Error()) + return + } + err = formatTemplate(w, "statistics", channelData) if err != nil { println(err.Error()) @@ -156,14 +179,48 @@ func main() { } } -func retrievePercentageStats(db *sql.DB, stats string) ([]PercentageEntry, error) { - var data []PercentageEntry +func retrievePercentageStats(db *sql.DB, stats string) ([]FloatEntry, error) { + var data []FloatEntry result, err := db.Query("SELECT coalesce(users.nick, '[Unknown]'), t." + stats + " FROM (SELECT coalesce(groups.\"group\", messages.sender) AS hash, round((count(nullif(messages." + stats + ", false)) * 100) :: numeric / count(*)) as " + stats + " FROM messages LEFT JOIN groups ON messages.sender = groups.nick AND groups.channel = 1 WHERE messages.channel = 1 GROUP BY hash ORDER BY " + stats + " DESC) t LEFT JOIN users ON t.hash = users.hash LIMIT 2;") if err != nil { return nil, err } for result.Next() { - var info PercentageEntry + var info FloatEntry + err := result.Scan(&info.Name, &info.Value) + if err != nil { + panic(err) + } + data = append(data, info) + } + return data, nil +} + +func retrieveLongestLines(db *sql.DB) ([]FloatEntry, error) { + var data []FloatEntry + result, err := db.Query("SELECT coalesce(users.nick, '[Unknown]'), t.average FROM (SELECT coalesce(groups.\"group\", messages.sender) AS hash, avg(messages.characters) as average FROM messages LEFT JOIN groups ON messages.sender = groups.nick AND groups.channel = 1 WHERE messages.channel = 1 GROUP BY hash ORDER BY average DESC) t LEFT JOIN users ON t.hash = users.hash LIMIT 2;") + if err != nil { + return nil, err + } + for result.Next() { + var info FloatEntry + err := result.Scan(&info.Name, &info.Value) + if err != nil { + panic(err) + } + data = append(data, info) + } + return data, nil +} + +func retrieveShortestLines(db *sql.DB) ([]FloatEntry, error) { + var data []FloatEntry + result, err := db.Query("SELECT coalesce(users.nick, '[Unknown]'), t.average FROM (SELECT coalesce(groups.\"group\", messages.sender) AS hash, avg(messages.characters) as average FROM messages LEFT JOIN groups ON messages.sender = groups.nick AND groups.channel = 1 WHERE messages.channel = 1 GROUP BY hash ORDER BY average DESC) t LEFT JOIN users ON t.hash = users.hash LIMIT 2;") + if err != nil { + return nil, err + } + for result.Next() { + var info FloatEntry err := result.Scan(&info.Name, &info.Value) if err != nil { panic(err) diff --git a/templates/statistics.html b/templates/statistics.html index a032c59..403bdde 100644 --- a/templates/statistics.html +++ b/templates/statistics.html @@ -90,4 +90,47 @@ </tr> {{end}} </tbody> + <tbody> + {{with index .EmojiHappy 0}} + <tr> + <td><b>{{.Name}}</b> brings happiness to the world. {{.Value}}% lines contained smiling faces. :)</td> + </tr> + {{end}} + {{with index .EmojiHappy 1}} + <tr> + <td><b>{{.Name}}</b> isn't a sad person either, smiling {{.Value}}% of the time.</td> + </tr> + {{end}} + </tbody> + <tbody> + {{with index .EmojiSad 0}} + <tr> + <td><b>{{.Name}}</b> seems to be sad at the moment: {{.Value}}% lines contained sad faces. :(</td> + </tr> + {{end}} + {{with index .EmojiSad 1}} + <tr> + <td><b>{{.Name}}</b> is also a sad person, crying {{.Value}}% of the time.</td> + </tr> + {{end}} + </tbody> + <tbody> + {{with index .LongestLines 0}} + <tr> + <td><b>{{.Name}}</b> wrote the longest lines, averaging {{printf "%.1f" .Value}} letters per line.</td> + </tr> + {{end}} + </tbody> + <tbody> + {{with index .ShortestLines 0}} + <tr> + <td><b>{{.Name}}</b> wrote the shortest lines, averaging {{printf "%.1f" .Value}} characters per line.</td> + </tr> + {{end}} + {{with index .ShortestLines 1}} + <tr> + <td><b>{{.Name}}</b> was tight-lipped, too, averaging {{printf "%.1f" .Value}} characters.</td> + </tr> + {{end}} + </tbody> </table> \ No newline at end of file -- GitLab