explicit types to wrap strings over lotsa strings
parent
37699b7b8d
commit
eb35f1428b
41
main.go
41
main.go
|
|
@ -13,30 +13,35 @@ import (
|
||||||
|
|
||||||
type (
|
type (
|
||||||
DB interface {
|
DB interface {
|
||||||
HistoryOf(string) map[string][]History
|
HistoryOf(IDU) map[IDQ][]History
|
||||||
Next(string, string) time.Time
|
Next(IDU, IDQ) time.Time
|
||||||
Question(string) Question
|
Question(IDQ) Question
|
||||||
LastAnswer(string, string) (string, Answer)
|
LastAnswer(IDU, IDQ) (IDA, Answer)
|
||||||
Answer(string) Answer
|
Answer(IDA) Answer
|
||||||
PushAnswer(string, string, string, bool) error
|
PushAnswer(IDU, IDQ, Renderable, bool) error
|
||||||
Close()
|
Close()
|
||||||
}
|
}
|
||||||
Question struct {
|
Question struct {
|
||||||
Q string
|
Q Renderable
|
||||||
Clues []string
|
Clues []Renderable
|
||||||
Tags []string
|
Tags []IDT
|
||||||
}
|
}
|
||||||
Answer struct {
|
Answer struct {
|
||||||
Q string
|
Q IDQ
|
||||||
A string
|
A Renderable
|
||||||
TS int64
|
TS int64
|
||||||
Author string
|
Author IDU
|
||||||
}
|
}
|
||||||
History struct {
|
History struct {
|
||||||
A string
|
A IDA
|
||||||
TS int64
|
TS int64
|
||||||
Pass bool
|
Pass bool
|
||||||
}
|
}
|
||||||
|
IDA string
|
||||||
|
IDQ string
|
||||||
|
IDU string
|
||||||
|
IDT string
|
||||||
|
Renderable string
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -51,14 +56,14 @@ func Main() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
user := os.Getenv("USER")
|
user := IDU(os.Getenv("USER"))
|
||||||
for q, _ := range db.HistoryOf(user) {
|
for q, _ := range db.HistoryOf(user) {
|
||||||
if time.Until(db.Next(user, q)) > 0 {
|
if time.Until(db.Next(user, q)) > 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
question := db.Question(q)
|
question := db.Question(q)
|
||||||
fmt.Printf("> Q: ")
|
fmt.Printf("> Q: ")
|
||||||
if strings.HasPrefix(question.Q, "img:") {
|
if strings.HasPrefix(string(question.Q), "img:") {
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("%s", question.Q)
|
fmt.Printf("%s", question.Q)
|
||||||
}
|
}
|
||||||
|
|
@ -90,11 +95,11 @@ func Main() error {
|
||||||
switch readline() {
|
switch readline() {
|
||||||
case "s":
|
case "s":
|
||||||
case "n":
|
case "n":
|
||||||
if err := db.PushAnswer(user, q, response, false); err != nil {
|
if err := db.PushAnswer(user, q, Renderable(response), false); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if err := db.PushAnswer(user, q, response, true); err != nil {
|
if err := db.PushAnswer(user, q, Renderable(response), true); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -117,7 +122,7 @@ func NewDB() (DB, error) {
|
||||||
return newYamlDB(os.Getenv("DB"))
|
return newYamlDB(os.Getenv("DB"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q Question) Tagged(tag string) bool {
|
func (q Question) Tagged(tag IDT) bool {
|
||||||
for i := range q.Tags {
|
for i := range q.Tags {
|
||||||
if q.Tags[i] == tag {
|
if q.Tags[i] == tag {
|
||||||
return true
|
return true
|
||||||
|
|
|
||||||
36
yamldb.go
36
yamldb.go
|
|
@ -12,19 +12,19 @@ type (
|
||||||
yamlDB struct {
|
yamlDB struct {
|
||||||
addr string
|
addr string
|
||||||
Knowledge knowledge
|
Knowledge knowledge
|
||||||
Users map[string]user
|
Users map[IDU]user
|
||||||
Cadence []duration
|
Cadence []duration
|
||||||
}
|
}
|
||||||
knowledge struct {
|
knowledge struct {
|
||||||
Questions map[string]Question
|
Questions map[IDQ]Question
|
||||||
Answers map[string]Answer
|
Answers map[IDA]Answer
|
||||||
}
|
}
|
||||||
user struct {
|
user struct {
|
||||||
Tags tags
|
Tags tags
|
||||||
History map[string][]History
|
History map[IDQ][]History
|
||||||
}
|
}
|
||||||
tags struct {
|
tags struct {
|
||||||
Assignments []string
|
Assignments []IDT
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -32,10 +32,10 @@ func newYamlDB(p string) (yamlDB, error) {
|
||||||
db := yamlDB{
|
db := yamlDB{
|
||||||
addr: p,
|
addr: p,
|
||||||
Knowledge: knowledge{
|
Knowledge: knowledge{
|
||||||
Questions: map[string]Question{},
|
Questions: map[IDQ]Question{},
|
||||||
Answers: map[string]Answer{},
|
Answers: map[IDA]Answer{},
|
||||||
},
|
},
|
||||||
Users: map[string]user{},
|
Users: map[IDU]user{},
|
||||||
Cadence: []duration{},
|
Cadence: []duration{},
|
||||||
}
|
}
|
||||||
if b, err := os.ReadFile(p); err != nil {
|
if b, err := os.ReadFile(p); err != nil {
|
||||||
|
|
@ -62,8 +62,8 @@ func (db yamlDB) Close() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) HistoryOf(user string) map[string][]History {
|
func (db yamlDB) HistoryOf(user IDU) map[IDQ][]History {
|
||||||
result := map[string][]History{}
|
result := map[IDQ][]History{}
|
||||||
for k, v := range db.Users[user].History {
|
for k, v := range db.Users[user].History {
|
||||||
result[k] = append([]History{}, v...)
|
result[k] = append([]History{}, v...)
|
||||||
}
|
}
|
||||||
|
|
@ -77,7 +77,7 @@ func (db yamlDB) HistoryOf(user string) map[string][]History {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) Next(user, q string) time.Time {
|
func (db yamlDB) Next(user IDU, q IDQ) time.Time {
|
||||||
history := db.Users[user].History[q]
|
history := db.Users[user].History[q]
|
||||||
progress := 0
|
progress := 0
|
||||||
for i := range history {
|
for i := range history {
|
||||||
|
|
@ -95,12 +95,12 @@ func (db yamlDB) Next(user, q string) time.Time {
|
||||||
return db.lastTS(user, q).Add(time.Duration(db.Cadence[progress]))
|
return db.lastTS(user, q).Add(time.Duration(db.Cadence[progress]))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) Question(q string) Question {
|
func (db yamlDB) Question(q IDQ) Question {
|
||||||
return db.Knowledge.Questions[q]
|
return db.Knowledge.Questions[q]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) LastAnswer(user, q string) (string, Answer) {
|
func (db yamlDB) LastAnswer(user IDU, q IDQ) (IDA, Answer) {
|
||||||
maxk := ""
|
var maxk IDA
|
||||||
var maxv Answer
|
var maxv Answer
|
||||||
for k, v := range db.Knowledge.Answers {
|
for k, v := range db.Knowledge.Answers {
|
||||||
if v.Q == q && v.Author == user {
|
if v.Q == q && v.Author == user {
|
||||||
|
|
@ -113,12 +113,12 @@ func (db yamlDB) LastAnswer(user, q string) (string, Answer) {
|
||||||
return maxk, maxv
|
return maxk, maxv
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) Answer(a string) Answer {
|
func (db yamlDB) Answer(a IDA) Answer {
|
||||||
return db.Knowledge.Answers[a]
|
return db.Knowledge.Answers[a]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) PushAnswer(user, q, a string, pass bool) error {
|
func (db yamlDB) PushAnswer(user IDU, q IDQ, a Renderable, pass bool) error {
|
||||||
uuid := uuid.New().String()
|
uuid := IDA(uuid.New().String())
|
||||||
db.Knowledge.Answers[uuid] = Answer{
|
db.Knowledge.Answers[uuid] = Answer{
|
||||||
Q: q,
|
Q: q,
|
||||||
A: a,
|
A: a,
|
||||||
|
|
@ -133,7 +133,7 @@ func (db yamlDB) PushAnswer(user, q, a string, pass bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db yamlDB) lastTS(user, q string) time.Time {
|
func (db yamlDB) lastTS(user IDU, q IDQ) time.Time {
|
||||||
max := int64(0)
|
max := int64(0)
|
||||||
for _, v := range db.Users[user].History[q] {
|
for _, v := range db.Users[user].History[q] {
|
||||||
if v.TS > max {
|
if v.TS > max {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue