ss13_se/bin/update_graphs.go
2015-05-18 19:42:14 +02:00

94 lines
2.0 KiB
Go

package main
import (
"crypto/sha256"
"database/sql"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"time"
_ "github.com/mattn/go-sqlite3"
)
// TODO: change these to be cmd args instead!
const db_file = "/home/lmas/projects/ss13_se/src/db.sqlite3"
// Dir to save new graphs in
const save_dir = "/home/lmas/projects/ss13_se/src/static/graphs"
// How far back in time the graphs will go
var last_week = time.Now().AddDate(0, 0, -7)
func checkerror(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
// open a db connection
db, err := sql.Open("sqlite3", db_file)
checkerror(err)
defer db.Close()
// loop over each server in db
rows, err := db.Query("select id, title from gameservers_server")
checkerror(err)
defer rows.Close()
var (
id int
title string
)
for rows.Next() {
err := rows.Scan(&id, &title)
checkerror(err)
creategraphs(db, id, title)
}
err = rows.Err()
checkerror(err)
}
func creategraphs(db *sql.DB, id int, title string) {
// create a tmp file
ifile, err := ioutil.TempFile("", "graph")
checkerror(err)
defer ifile.Close()
ifilename := ifile.Name()
// Make sure we have somewhere to save the stored graphs in
err = os.MkdirAll(save_dir, 0777)
checkerror(err)
hash := fmt.Sprintf("%x", sha256.Sum256([]byte(title)))
ofilename := filepath.Join(save_dir, hash)
// get the server's data and write it to the file
rows, err := db.Query("select created,players from gameservers_serverhistory where server_id = ? and created >= ? order by created asc", id, last_week)
checkerror(err)
var (
created time.Time
players int
)
for rows.Next() {
err := rows.Scan(&created, &players)
checkerror(err)
_, err = ifile.WriteString(fmt.Sprintf("%d, %d\n", created.Unix(), players))
checkerror(err)
}
err = rows.Err()
checkerror(err)
// run the plotter against the data file
err = exec.Command("./plotter.sh", ifilename, ofilename).Run()
checkerror(err)
// close and remove the tmp file
ifile.Close()
os.Remove(ifilename)
}