diff --git a/stats-import/main.go b/stats-import/main.go index ae2d484..2758fe7 100644 --- a/stats-import/main.go +++ b/stats-import/main.go @@ -7,7 +7,9 @@ import ( "flag" "log" "os" + "strconv" "strings" + "time" "github.com/boltdb/bolt" ) @@ -87,37 +89,36 @@ func main() { } func processMessage(msg Message, data *Stats) { - /* - data.Total++ + data.Total++ - if msg.ReplyID != nil { - data.Replies++ - } + if msg.ReplyID != nil { + data.Replies++ + } - if msg.FwdUser != nil { - data.Forward++ - } + if msg.FwdUser != nil { + data.Forward++ + } - date := time.Unix(int64(msg.Date), 0) + date := time.Unix(int64(msg.Date), 0) - data.ByHour[date.Hour()]++ - data.ByWeekday[date.Weekday()]++ + data.ByHour[date.Hour()]++ + data.ByWeekday[date.Weekday()]++ - val, exists := data.ByUser[msg.From.Username] - if !exists { - val = 0 - } - data.ByUser[msg.From.Username] = val + 1 + val, exists := data.ByUser[msg.From.Username] + if !exists { + val = 0 + } + data.ByUser[msg.From.Username] = val + 1 - datekey := date.Format("2006-1-2") - val, exists = data.ByDate[datekey] - if !exists { - val = 0 - } - data.ByDate[datekey] = val + 1 + datekey := date.Format("2006-1-2") + val, exists = data.ByDate[datekey] + if !exists { + val = 0 + } + data.ByDate[datekey] = val + 1 + + data.Username[msg.From.Username] = msg.From.FirstName - data.Username[msg.From.Username] = msg.From.FirstName - */ if len(msg.Text) > 2 { wordList := strings.Split(msg.Text, " ") for _, word := range wordList { @@ -169,119 +170,118 @@ func PutUint(value uint64) []byte { func update(db *bolt.DB, data Stats) error { return db.Update(func(tx *bolt.Tx) error { - /* - b, err := tx.CreateBucketIfNotExists([]byte("global")) + b, err := tx.CreateBucketIfNotExists([]byte("global")) + if err != nil { + return err + } + + // Update total + total := MakeUint(b.Get([]byte("count")), "global", "count") + total += data.Total + err = b.Put([]byte("count"), PutUint(total)) + if err != nil { + return err + } + + // Update replies + replies := MakeUint(b.Get([]byte("replies")), "global", "replies") + replies += data.Replies + err = b.Put([]byte("replies"), PutUint(total)) + if err != nil { + return err + } + + // Update forward + forward := MakeUint(b.Get([]byte("forward")), "global", "forward") + forward += data.Forward + err = b.Put([]byte("forward"), PutUint(total)) + if err != nil { + return err + } + + // Update hour counters + b, err = tx.CreateBucketIfNotExists([]byte("hour")) + if err != nil { + return err + } + + for i := 0; i < 24; i++ { + curhour := MakeUint(b.Get([]byte{byte(i)}), "hour", strconv.Itoa(i)) + curhour += data.ByHour[i] + err = b.Put([]byte{byte(i)}, PutUint(curhour)) if err != nil { return err } + } - // Update total - total := MakeUint(b.Get([]byte("count")), "global", "count") - total += data.Total - err = b.Put([]byte("count"), PutUint(total)) + // Update weekday counters + b, err = tx.CreateBucketIfNotExists([]byte("weekday")) + if err != nil { + return err + } + + for i := 0; i < 7; i++ { + curwday := MakeUint(b.Get([]byte{byte(i)}), "weekday", strconv.Itoa(i)) + curwday += data.ByWeekday[i] + err = b.Put([]byte{byte(i)}, PutUint(curwday)) if err != nil { return err } + } - // Update replies - replies := MakeUint(b.Get([]byte("replies")), "global", "replies") - replies += data.Replies - err = b.Put([]byte("replies"), PutUint(total)) + // Update date counters + b, err = tx.CreateBucketIfNotExists([]byte("date")) + if err != nil { + return err + } + + for day, count := range data.ByDate { + count += MakeUint(b.Get([]byte(day)), "date", day) + err = b.Put([]byte(day), PutUint(count)) if err != nil { return err } + } - // Update forward - forward := MakeUint(b.Get([]byte("forward")), "global", "forward") - forward += data.Forward - err = b.Put([]byte("forward"), PutUint(total)) + // Update user counters + b, err = tx.CreateBucketIfNotExists([]byte("users-count")) + if err != nil { + return err + } + + for user, count := range data.ByUser { + // Why do I even need this? + if len(user) < 1 { + continue + } + count += MakeUint(b.Get([]byte(user)), "users-count", user) + err = b.Put([]byte(user), PutUint(count)) if err != nil { return err } + } - // Update hour counters - b, err = tx.CreateBucketIfNotExists([]byte("hour")) - if err != nil { - return err + // Add to username table exclusively if not already present + b, err = tx.CreateBucketIfNotExists([]byte("usernames")) + if err != nil { + return err + } + for user, first := range data.Username { + // Why do I even need this? (2) + if len(user) < 1 { + continue } - - for i := 0; i < 24; i++ { - curhour := MakeUint(b.Get([]byte{byte(i)}), "hour", strconv.Itoa(i)) - curhour += data.ByHour[i] - err = b.Put([]byte{byte(i)}, PutUint(curhour)) + val := b.Get([]byte(user)) + if val == nil { + err = b.Put([]byte(user), []byte(first)) if err != nil { return err } } + } - // Update weekday counters - b, err = tx.CreateBucketIfNotExists([]byte("weekday")) - if err != nil { - return err - } - - for i := 0; i < 7; i++ { - curwday := MakeUint(b.Get([]byte{byte(i)}), "weekday", strconv.Itoa(i)) - curwday += data.ByWeekday[i] - err = b.Put([]byte{byte(i)}, PutUint(curwday)) - if err != nil { - return err - } - } - - // Update date counters - b, err = tx.CreateBucketIfNotExists([]byte("date")) - if err != nil { - return err - } - - for day, count := range data.ByDate { - count += MakeUint(b.Get([]byte(day)), "date", day) - err = b.Put([]byte(day), PutUint(count)) - if err != nil { - return err - } - } - - // Update user counters - b, err = tx.CreateBucketIfNotExists([]byte("users-count")) - if err != nil { - return err - } - - for user, count := range data.ByUser { - // Why do I even need this? - if len(user) < 1 { - continue - } - count += MakeUint(b.Get([]byte(user)), "users-count", user) - err = b.Put([]byte(user), PutUint(count)) - if err != nil { - return err - } - } - - // Add to username table exclusively if not already present - b, err = tx.CreateBucketIfNotExists([]byte("usernames")) - if err != nil { - return err - } - for user, first := range data.Username { - // Why do I even need this? (2) - if len(user) < 1 { - continue - } - val := b.Get([]byte(user)) - if val == nil { - err = b.Put([]byte(user), []byte(first)) - if err != nil { - return err - } - } - } - */ // Add word frequency - b, err := tx.CreateBucketIfNotExists([]byte("words")) + b, err = tx.CreateBucketIfNotExists([]byte("words")) if err != nil { return err }