From 50e0defc2874bffad8c537817703e4a52151ed4c Mon Sep 17 00:00:00 2001 From: daru Date: Sat, 14 May 2022 13:55:22 +0200 Subject: [PATCH] Implement appointment reading --- go.mod | 2 +- go.sum | 6 ++---- huso.go | 4 +++- klotz.go | 13 ++++++++++--- nuss.go | 39 +++++++++++++++++++++++++++++++++++++++ rechner.go | 19 +++++++++++++++++++ 6 files changed, 74 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 4a66ae4..cbe05de 100644 --- a/go.mod +++ b/go.mod @@ -21,5 +21,5 @@ require ( github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/xujiajun/mmap-go v1.0.1 // indirect github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b // indirect - golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect + golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a // indirect ) diff --git a/go.sum b/go.sum index b5f0065..468f9ba 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,6 @@ github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.3 h1:wmfu2iqj9q22SyMINp1uQ8C2/V4M1phJdmH9fG4nba0= -github.com/klauspost/compress v1.15.3/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -60,8 +58,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a h1:N2T1jUrTQE9Re6TFF5PhvEHXHCguynGhKjWVsIUt5cY= +golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/huso.go b/huso.go index a384a9b..d78119c 100644 --- a/huso.go +++ b/huso.go @@ -32,6 +32,8 @@ const ( bucketUsers = "users" bucketAnime = "anime" bucketMedia = "media" + bucketAppoint = "appoint" + AppointSplit = "ยง" ) var ( @@ -57,7 +59,7 @@ func main() { sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) - logOut = NewRingBuf(1000) + logOut = NewRingBuf(10101) color.Notice.Printf("huso %s %s\n", husoVersion, runtime.Version()) logOut.WriteLine(fmt.Sprintf("huso %s %s", husoVersion, runtime.Version())) diff --git a/klotz.go b/klotz.go index 5a8e8f6..15d0f56 100644 --- a/klotz.go +++ b/klotz.go @@ -8,9 +8,10 @@ type AnimeUser struct { } type AnimeUserExtended struct { - Anime int64 `json:"anime"` - Users []WatchUser `json:"users"` - Data Anime `json:"data"` + Anime int64 `json:"anime"` + Users []WatchUser `json:"users"` + Data Anime `json:"data"` + Appointments []Appointment `json:"appointments"` } type Anime struct { @@ -52,6 +53,12 @@ type AnimeStudio struct { Name string `json:"name"` } +type Appointment struct { + Anime int64 `json:"anime"` + Time time.Time `json:"date"` + Users []string `json:"users"` +} + type WatchUser struct { Username string `json:"username"` MalID int64 `json:"malId"` diff --git a/nuss.go b/nuss.go index 77304d7..6301a30 100644 --- a/nuss.go +++ b/nuss.go @@ -253,6 +253,39 @@ func ReadAnimeUsers() ([]AnimeUser, error) { return animes, err } +func ReadAppointments() ([]Appointment, error) { + var appoints []Appointment + err := db.View( + func(tx *nutsdb.Tx) error { + entries, err := tx.GetAll(bucketAppoint) + if err != nil { + return err + } + appoints = make([]Appointment, 0) + // iterate entries + for _, e := range entries { + // decode appointment list + animeId, date, err := BytesToInt64AndDate(e.Key) + if err != nil { + return err + } + // parse user list + appointmentUsers, err := parseAppointmentUserList(e.Value) + if err != nil { + return err + } + appointment := Appointment{ + Anime: animeId, + Time: date, + Users: appointmentUsers, + } + appoints = append(appoints, appointment) + } + return nil + }) + return appoints, err +} + func DbClean() error { return db.Update( func(tx *nutsdb.Tx) error { @@ -297,3 +330,9 @@ func parseWatchUserList(data []byte) ([]WatchUser, error) { err := json.Unmarshal(data, &users) return users, err } + +func parseAppointmentUserList(data []byte) ([]string, error) { + var users []string + err := json.Unmarshal(data, &users) + return users, err +} diff --git a/rechner.go b/rechner.go index c2c79a2..ee2a7bb 100644 --- a/rechner.go +++ b/rechner.go @@ -5,6 +5,8 @@ import ( "encoding/binary" "fmt" "strconv" + "strings" + "time" ) func Sauce(malid int64, username string) string { @@ -24,3 +26,20 @@ func Int64ToByte(yes int64) []byte { n := binary.PutVarint(buf, yes) return buf[:n] } + +func BytesToInt64AndDate(bytes []byte) (int64, time.Time, error) { + split := strings.Split(string(bytes), AppointSplit) + if len(split) != 2 { + return 0, time.Time{}, fmt.Errorf("invalid appointment split %s", string(bytes)) + } + num, err := strconv.ParseInt(split[0], 10, 64) + if err != nil { + return num, time.Time{}, err + } + appoint, err := time.Parse(time.RFC3339, split[1]) + return num, appoint, err +} + +func Int64AndDateToBytes(num int64, appoint time.Time) []byte { + return []byte(fmt.Sprintf("%d%s%s", num, AppointSplit, appoint.Format(time.RFC3339))) +}