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