1
0
Эх сурвалжийг харах

стата по символам

kpmy 9 жил өмнө
parent
commit
25dfb1ade6
4 өөрчлөгдсөн 84 нэмэгдсэн , 36 устгасан
  1. 4 14
      main.go
  2. 41 12
      neo.go
  3. 21 6
      stat.go
  4. 18 4
      tpl/stat.tpl

+ 4 - 14
main.go

@@ -3,9 +3,9 @@ package main
 import (
 	"flag"
 	"github.com/ivpusic/golog"
-	"reflect"
-	//	"github.com/skratchdot/open-golang/open"
 	"github.com/kpmy/xep/hookexecutor"
+	"github.com/skratchdot/open-golang/open"
+	"reflect"
 	//	"github.com/kpmy/xep/jsexecutor"
 	//	"github.com/kpmy/xep/luaexecutor"
 	"github.com/kpmy/xep/muc"
@@ -40,17 +40,6 @@ var (
 )
 
 type (
-	StatData struct {
-		Total int
-		Stat  []Stat
-	}
-
-	Stat struct {
-		User  string
-		Count int64
-		Perc  float64
-	}
-
 	Post struct {
 		User string
 		Nick string
@@ -147,6 +136,7 @@ func bot(st stream.Stream) error {
 						posts.Lock()
 						posts.data = append(posts.data, Post{Nick: sender, User: user, Msg: e.Body})
 						IncStat(user)
+						IncStatLen(user, e.Body)
 						posts.Unlock()
 					}
 					if sender != ME {
@@ -244,7 +234,7 @@ func main() {
 	go func() {
 		time.Sleep(time.Duration(time.Millisecond * 200))
 		//open.Start("http://localhost:3000")
-		//open.Start("http://localhost:3000/stat")
+		open.Start("http://localhost:3000/stat")
 	}()
 	wg.Wait()
 }

+ 41 - 12
neo.go

@@ -9,6 +9,24 @@ import (
 	"sync"
 )
 
+type (
+	TplData struct {
+		Count *StatData
+		Total *StatData
+	}
+
+	StatData struct {
+		Total int
+		Stat  []Stat
+	}
+
+	Stat struct {
+		User  string
+		Count int64
+		Perc  float64
+	}
+)
+
 func neo_server(wg *sync.WaitGroup) {
 	app := neo.App()
 	app.Use(logger.Log)
@@ -35,23 +53,34 @@ func neo_server(wg *sync.WaitGroup) {
 		}
 	})
 	app.Get("/stat", func(ctx *neo.Ctx) (int, error) {
-		var s *CStatDoc
-		var err error
-		if s, err = GetStat(); err == nil {
-			mm := s.Data
-			total := s.Total
-			data := &StatData{Total: total}
+
+		conv := func(t *CStatDoc) (td *StatData) {
+			mm := t.Data
+			total := t.Total
+			td = &StatData{Total: total}
 			for u, c := range mm {
 				s := Stat{User: u}
 				s.Count = int64(c)
 				s.Perc = float64(c) / float64(total) * 100
-				data.Stat = append(data.Stat, s)
+				td.Stat = append(td.Stat, s)
 			}
-			sort.Stable(data)
-			var t *template.Template
-			if t, err = loadTpl("stat"); t != nil {
-				t.Execute(ctx.Res, data)
-				return 200, nil
+			sort.Stable(td)
+			return
+		}
+
+		var t, c *CStatDoc
+		var err error
+		if t, err = GetStat(totalId); err == nil {
+			if c, err = GetStat(countId); err == nil {
+
+				data := &TplData{}
+				data.Count = conv(c)
+				data.Total = conv(t)
+				var tpl *template.Template
+				if tpl, err = loadTpl("stat"); tpl != nil {
+					tpl.Execute(ctx.Res, data)
+					return 200, nil
+				}
 			}
 		}
 		return 500, err

+ 21 - 6
stat.go

@@ -8,7 +8,6 @@ import (
 
 const dbUrl = "http://127.0.0.1:5984"
 const dbName = "stats"
-const docId = "total"
 
 type CStatDoc struct {
 	Total int
@@ -17,7 +16,7 @@ type CStatDoc struct {
 
 var db *couchdb.DB
 
-func GetStat() (ret *CStatDoc, err error) {
+func GetStat(docId string) (ret *CStatDoc, err error) {
 	ret = &CStatDoc{}
 	if err = db.Get(docId, ret, nil); err == nil {
 		if ret.Data == nil {
@@ -25,13 +24,13 @@ func GetStat() (ret *CStatDoc, err error) {
 		}
 	} else if couchdb.NotFound(err) {
 		if _, err = db.Put(docId, ret, ""); err == nil {
-			ret, err = GetStat()
+			ret, err = GetStat(docId)
 		}
 	}
 	return
 }
 
-func SetStat(old *CStatDoc) {
+func SetStat(docId string, old *CStatDoc) {
 	if rev, err := db.Rev(docId); err == nil {
 		if _, err = db.Put(docId, old, rev); err != nil {
 			log.Println(err)
@@ -39,15 +38,31 @@ func SetStat(old *CStatDoc) {
 	}
 }
 
+const countId = "count"
+const totalId = "total"
+
 func IncStat(user string) {
-	if s, err := GetStat(); err == nil {
+	if s, err := GetStat(totalId); err == nil {
 		if _, ok := s.Data[user]; ok {
 			s.Data[user] = s.Data[user] + 1
 		} else {
 			s.Data[user] = 1
 		}
 		s.Total++
-		SetStat(s)
+		SetStat(totalId, s)
+	}
+}
+
+func IncStatLen(user, msg string) {
+	count := len([]rune(msg))
+	if s, err := GetStat(countId); err == nil {
+		if _, ok := s.Data[user]; ok {
+			s.Data[user] = s.Data[user] + count
+		} else {
+			s.Data[user] = count
+		}
+		s.Total += count
+		SetStat(countId, s)
 	}
 }
 

+ 18 - 4
tpl/stat.tpl

@@ -14,15 +14,29 @@
 		<div class="container">
 			<div class="col" id="col-userlist">
 				<h1>стата</h1>
-				<p><em>всего сообщений</em>: {{.Total}}</p>
+				<p><strong>Всего</strong> (сообщений/символов): {{.Total.Total}}/{{.Count.Total}}</p>
 				<table>
-					{{range .Stat}}
+					<tr>
+						<td><strong>Сообщения</strong></td>
+					</tr>
+					{{range .Total.Stat}}
 					<tr>
 						<td><em>{{.User}}</em></td>
 						<td>{{.Count}}</td>
 						<td>{{printf "%.2f" .Perc}}%</td>
 					</tr>
 					{{else}}<trd><tr>ничего ._.</tr></td>{{end}}
+					<tr><td/></tr>
+					<tr>
+						<td><strong>Символы</strong></td>
+					</tr>
+					{{range .Count.Stat}}
+					<tr>
+						<td><em>{{.User}}</em></td>
+						<td>{{.Count}}</td>
+						<td>{{printf "%.2f" .Perc}}%</td>
+					</tr>
+					{{end}}
 				</table>
 			</div>
 			<div id="chart-container" class="col">
@@ -31,7 +45,7 @@
 	</body>
 	<script type="text/javascript">
 		var data = [];
-		{{range .Stat}}
+		{{range .Total.Stat}}
 			data.push({
 				name: "{{.User}}",
 				y: parseFloat({{printf "%.2f" .Perc}})
@@ -45,7 +59,7 @@
 				type: 'pie'
 			},
 			title: {
-				text: "Стата"
+				text: "Сообщения"
 			},
 			series: [{
 				name: "Пиздливость",