diff --git a/anki.d b/anki.d index 99a40e4..4714fe2 100755 Binary files a/anki.d and b/anki.d differ diff --git a/main.go b/main.go index 4634b17..284b1a6 100644 --- a/main.go +++ b/main.go @@ -50,13 +50,17 @@ func Main() error { return err } user := os.Getenv("USER") - for q, history := range db.HistoryOf(user) { - log.Printf("%s/%s/%+v", user, q, history) + for q, _ := range db.HistoryOf(user) { if time.Until(db.Next(user, q)) > 0 { continue } question := db.Question(q) - fmt.Printf("> Q: %s\n", question.Q) + fmt.Printf("> Q: ") + if strings.HasPrefix(question.Q, "img:") { + } else { + fmt.Printf("%s", question.Q) + } + fmt.Printf("\n") fmt.Printf("> %+v\n", question.Tags) var response string for i := range question.Clues { @@ -108,11 +112,14 @@ func readline() string { } func NewDB() (DB, error) { - var db yamlDB - if b, err := os.ReadFile(os.Getenv("DB")); err != nil { - return nil, err - } else if err := yaml.Unmarshal(b, &db); err != nil { - return nil, err - } - return db, nil + return newYamlDB(os.Getenv("DB")) +} + +func (q Question) Tagged(tag string) bool { + for i := range q.Tags { + if q.Tags[i] == tag { + return true + } + } + return false } diff --git a/testdata/tofugu.yaml b/testdata/tofugu.yaml index 4b09120..a949d05 100644 --- a/testdata/tofugu.yaml +++ b/testdata/tofugu.yaml @@ -1,14 +1,15 @@ knowledge: questions: - a: - q: whats a fieldset + a-hiragana: + q: img:testdata/a-hiragana-0.jpg clues: - - clue1 of 2 - tags: - - hiragana - - vowel + - img:testdata/a-hiragana-1.jpg + tags: [hiragana, vowel] users: breel: + tags: + - hiragana + - katakana history: {} cadence: - 1h diff --git a/yamldb.go b/yamldb.go index bc2af20..f248202 100644 --- a/yamldb.go +++ b/yamldb.go @@ -1,9 +1,11 @@ package main import ( + "os" "time" "github.com/google/uuid" + "gopkg.in/yaml.v2" ) type ( @@ -17,12 +19,41 @@ type ( Answers map[string]Answer } user struct { + Tags []string History map[string][]History } ) +func newYamlDB(p string) (yamlDB, error) { + db := yamlDB{ + Knowledge: knowledge{ + Questions: map[string]Question{}, + Answers: map[string]Answer{}, + }, + Users: map[string]user{}, + Cadence: []duration{}, + } + if b, err := os.ReadFile(p); err != nil { + return yamlDB{}, err + } else if err := yaml.Unmarshal(b, &db); err != nil { + return yamlDB{}, err + } + return db, nil +} + func (db yamlDB) HistoryOf(user string) map[string][]History { - return db.Users[user].History + result := map[string][]History{} + for k, v := range db.Users[user].History { + result[k] = append([]History{}, v...) + } + for _, tag := range db.Users[user].Tags { + for qid, q := range db.Knowledge.Questions { + if _, ok := result[qid]; !ok && q.Tagged(tag) { + result[qid] = []History{} + } + } + } + return result } func (db yamlDB) Next(user, q string) time.Time {