Skip to content
Snippets Groups Projects
Verified Commit 15a4d500 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

More statistics

parent 2b6772a2
Branches
No related tags found
No related merge requests found
...@@ -50,24 +50,23 @@ type ChannelData struct { ...@@ -50,24 +50,23 @@ type ChannelData struct {
TotalWords int TotalWords int
TotalCharacters int TotalCharacters int
Users []UserData Users []UserData
Questions []PercentageEntry Questions []FloatEntry
Exclamations []PercentageEntry Exclamations []FloatEntry
Caps []PercentageEntry Caps []FloatEntry
EmojiHappy []PercentageEntry EmojiHappy []FloatEntry
EmojiSad []PercentageEntry EmojiSad []FloatEntry
LongestLines []TotalEntry LongestLines []FloatEntry
ShortestLines []TotalEntry ShortestLines []FloatEntry
Total []TotalEntry Total []IntEntry
Average TotalEntry Average float64
ChannelAverage TotalEntry }
}
type FloatEntry struct {
type PercentageEntry struct {
Name string Name string
Value float64 Value float64
} }
type TotalEntry struct { type IntEntry struct {
Name string Name string
Value int Value int
} }
...@@ -134,6 +133,30 @@ func main() { ...@@ -134,6 +133,30 @@ func main() {
return 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) err = formatTemplate(w, "statistics", channelData)
if err != nil { if err != nil {
println(err.Error()) println(err.Error())
...@@ -156,14 +179,48 @@ func main() { ...@@ -156,14 +179,48 @@ func main() {
} }
} }
func retrievePercentageStats(db *sql.DB, stats string) ([]PercentageEntry, error) { func retrievePercentageStats(db *sql.DB, stats string) ([]FloatEntry, error) {
var data []PercentageEntry 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;") 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 { if err != nil {
return nil, err return nil, err
} }
for result.Next() { 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) err := result.Scan(&info.Name, &info.Value)
if err != nil { if err != nil {
panic(err) panic(err)
......
...@@ -90,4 +90,47 @@ ...@@ -90,4 +90,47 @@
</tr> </tr>
{{end}} {{end}}
</tbody> </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> </table>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment