1
0
mirror of https://github.com/thebaer/tildes.git synced 2018-07-20 07:15:21 +00:00

Tilde score stats

Last amount collected
Number of times asked
Average amount per ask
This commit is contained in:
Matt Baer 2015-01-31 20:10:23 -05:00
parent d81f6a1c13
commit 391ad2e275

View File

@ -12,7 +12,11 @@ import (
"text/template" "text/template"
) )
const scores = "/home/krowbar/Code/irc/tildescores.txt" const (
scores = "/home/krowbar/Code/irc/tildescores.txt"
scoreDeltasPath = "/home/bear/scoredeltas.txt"
deltaDelimiter = "+++"
)
func main() { func main() {
fmt.Println("Starting...") fmt.Println("Starting...")
@ -21,8 +25,15 @@ func main() {
outPtr := flag.String("o", "tildescores", "Output file name") outPtr := flag.String("o", "tildescores", "Output file name")
flag.Parse() flag.Parse()
headers := []string{ "User", "Tildes", "Last Collection" } headers := []string{ "User", "Tildes", "Last Collected", "Last Amt.", "# Asks", "Avg." }
generate("tilde collectors", sortScore(readData(scores, "&^%", headers)), *outPtr)
scoresData := readData(scores, "&^%")
updatesData := readData(scoreDeltasPath, deltaDelimiter)
scoresData = checkScoreDelta(scoresData, updatesData)
scoresTable := buildScoresTable(scoresData, headers)
generate("tilde collectors", sortScore(scoresTable), *outPtr)
} }
type Table struct { type Table struct {
@ -78,27 +89,136 @@ func parseTimestamp(ts string) time.Time {
return time.Unix(t, 0) return time.Unix(t, 0)
} }
func readData(path string, delimiter string, headers []string) *Table { type LastScore struct {
LastUpdate int
LastScore int
LastIncrement int
Times int
ScoreOffset int
TimesOffset int
}
func checkScoreDelta(scoreRows *[]Row, deltaRows *[]Row) *[]Row {
users := make(map[string]LastScore)
// Read score delta data
for i := range *deltaRows {
r := (*deltaRows)[i]
if len(r.Data) < 4 {
break
}
score, _ := strconv.Atoi(r.Data[1])
update, _ := strconv.Atoi(r.Data[2])
inc, _ := strconv.Atoi(r.Data[3])
times, _ := strconv.Atoi(r.Data[4])
so, _ := strconv.Atoi(r.Data[5])
to, _ := strconv.Atoi(r.Data[6])
users[r.Data[0]] = LastScore{ LastScore: score, LastUpdate: update, LastIncrement: inc, Times: times, ScoreOffset: so, TimesOffset: to }
}
for i := range *scoreRows {
r := (*scoreRows)[i]
u, exists := users[r.Data[0]]
score, _ := strconv.Atoi(r.Data[1])
update, _ := strconv.Atoi(r.Data[2])
// Fill in any missing users
if !exists {
u = LastScore{ LastScore: score, LastIncrement: -1, LastUpdate: update, Times: 0, ScoreOffset: score, TimesOffset: 0 }
users[r.Data[0]] = u
}
// Match up "last collection" with rest of table data
if update > u.LastUpdate {
u.LastIncrement = score - u.LastScore
u.LastUpdate = update
u.LastScore = score
u.Times++
}
var lastIncStr string
if u.LastIncrement > -1 {
lastIncStr = strconv.Itoa(u.LastIncrement)
} else {
lastIncStr = "-"
}
r.Data = append(r.Data, lastIncStr)
var asksStr string
if u.Times > 0 {
asksStr = strconv.Itoa(u.Times)
} else {
asksStr = "-"
}
r.Data = append(r.Data, asksStr)
var avgStr string
if u.Times > 0 {
var avg float64 = float64(u.LastScore - u.ScoreOffset) / float64(u.Times)
avgStr = strconv.FormatFloat(avg, 'f', -1, 32)
} else {
avgStr = "-"
}
r.Data = append(r.Data, avgStr)
users[r.Data[0]] = u
(*scoreRows)[i] = r
}
// Write deltas
f, err := os.OpenFile(scoreDeltasPath, os.O_CREATE | os.O_RDWR, 0644)
if err != nil {
fmt.Println(err)
}
defer f.Close()
for k, v := range users {
userData := fmt.Sprintf("%d%s%d%s%d%s%d%s%d%s%d", v.LastScore, deltaDelimiter, v.LastUpdate, deltaDelimiter, v.LastIncrement, deltaDelimiter, v.Times, deltaDelimiter, v.ScoreOffset, deltaDelimiter, v.TimesOffset)
_, err = f.WriteString(fmt.Sprintf("%s%s%s\n", k, deltaDelimiter, userData))
if err != nil {
fmt.Println(err)
}
}
return scoreRows
}
func buildScoresTable(rows *[]Row, headers []string) *Table {
table := &Table{Headers: headers, Rows: nil}
const layout = "Jan 2, 2006 3:04pm MST"
for i, r := range *rows {
data := r.Data
t := parseTimestamp(r.Data[2])
r.Data[2] = t.UTC().Format(layout)
row := &Row{Data: data}
(*rows)[i] = *row
}
table.Rows = *rows
return table
}
func readData(path string, delimiter string) *[]Row {
f, _ := os.Open(path) f, _ := os.Open(path)
defer f.Close() defer f.Close()
rows := []Row{} rows := []Row{}
table := &Table{Headers: headers, Rows: nil}
s := bufio.NewScanner(f) s := bufio.NewScanner(f)
s.Split(bufio.ScanLines) s.Split(bufio.ScanLines)
const layout = "Jan 2, 2006 3:04pm MST"
for s.Scan() { for s.Scan() {
data := strings.Split(s.Text(), delimiter) data := strings.Split(s.Text(), delimiter)
t := parseTimestamp(data[2])
data[2] = t.UTC().Format(layout)
row := &Row{Data: data} row := &Row{Data: data}
rows = append(rows, *row) rows = append(rows, *row)
} }
table.Rows = rows
return table return &rows
} }
type Page struct { type Page struct {