From 1e49d6098c88c86285d0971f18e00844cc0bf8d5 Mon Sep 17 00:00:00 2001 From: filifa Date: Tue, 19 Mar 2024 20:31:32 -0500 Subject: [PATCH] add basic go program --- .gitignore | 1 + go.mod | 5 +++++ go.sum | 2 ++ main.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/.gitignore b/.gitignore index 98e6ef6..2f6e25f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.db +xbit diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..8c16f71 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module dairydemon.net/xbit + +go 1.19 + +require github.com/mattn/go-sqlite3 v1.14.22 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e8d092a --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= diff --git a/main.go b/main.go new file mode 100644 index 0000000..e0268d6 --- /dev/null +++ b/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "database/sql" + "flag" + "fmt" + _ "github.com/mattn/go-sqlite3" + "log" + "math" + "time" +) + +type Event struct { + description string + timestamp int64 +} + +func formula(p float64) int64 { + yearsAgo := math.Exp(20.3444*math.Pow(p, 3)+3) - math.Exp(3) + return int64(yearsAgo * 31556926) +} + +func closestEvent(t int64, db *sql.DB) (Event, error) { + var event Event + query := ` + select description, timestamp + from events + where timestamp is not null + order by abs(? - timestamp) asc + limit 1 + ` + + stmt, err := db.Prepare(query) + if err != nil { + return event, err + } + defer stmt.Close() + + err = stmt.QueryRow(t).Scan(&event.description, &event.timestamp) + return event, err +} + +func main() { + percent := flag.Float64("p", -1, "percentage") + flag.Parse() + + if *percent < 0 || *percent > 1 { + log.Fatal("invalid percentage") + } + + t := time.Now().Unix() - formula(*percent) + + db, err := sql.Open("sqlite3", "./timeline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + event, err := closestEvent(t, db) + if err != nil { + log.Fatal(err) + } + + date := time.Unix(event.timestamp, 0) + fmt.Printf("%v\t%v\t%v\n", event.timestamp, date, event.description) +}