diff options
| author | 2025-09-06 20:17:22 +0700 | |
|---|---|---|
| committer | 2025-09-06 20:17:22 +0700 | |
| commit | 4161e051f4437a4ab68430a4e542b76b1f335c3a (patch) | |
| tree | 5c63fabb02fa9c55c9e7cf2c26c2a35a90806f35 /internal/factgiver | |
| parent | d695dc09f44236be33fecc7a5ab9a326823170d9 (diff) | |
| parent | 13a66428533c5f870901343dd505bcb835015430 (diff) | |
| download | web-0.8.0.tar.gz web-0.8.0.zip | |
v0.8.0 (#7)v0.8.0
- feat: seamless single page application (not including map & index page
for now)
- feat: add pages cache
- feat: home page
- feat: change to mobile view on 1.1/1 aspect ratio (instead of 0.8/1)
- feat: always have page body in square aspect ratio
- feat: remove label in like button
- feat: stricter cors policy
- refactor: move lightlibrary css onto my bucket
- fix: use filename (not the whole path) for getting date in
lightgallery
- fix: don't put question mark in url if no params
Diffstat (limited to 'internal/factgiver')
| -rw-r--r-- | internal/factgiver/factgiver.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/internal/factgiver/factgiver.go b/internal/factgiver/factgiver.go new file mode 100644 index 0000000..6f77403 --- /dev/null +++ b/internal/factgiver/factgiver.go @@ -0,0 +1,67 @@ +package factgiver + +import ( + "fmt" + "math/rand" + "regexp" + "strings" + "time" + + "github.com/SayaAndy/saya-today-web/config" + "github.com/SayaAndy/saya-today-web/internal/b2" +) + +type FactGiver struct { + b2Client *b2.B2Client + cache map[string][]string + langs []string + factsFileName string + nlRe *regexp.Regexp + randGen *rand.Rand +} + +func NewFactGiver(cfg *config.FactGiverConfig, langs []string) (*FactGiver, error) { + b2Client, err := b2.NewB2Client(&cfg.Storage.Config) + if err != nil { + return nil, fmt.Errorf("fail to init b2 client for a new fact giver: %s", err.Error()) + } + + factGiver := &FactGiver{ + b2Client: b2Client, + cache: make(map[string][]string, len(langs)), + langs: langs, + factsFileName: cfg.FactsFileName, + nlRe: regexp.MustCompile(`\r?\n`), + randGen: rand.New(rand.NewSource(time.Now().UnixNano())), + } + if err = factGiver.initCache(); err != nil { + return nil, fmt.Errorf("fail to init cache for a new fact giver: %s", err.Error()) + } + + return factGiver, nil +} + +func (g *FactGiver) Give(lang string) [3]string { + factSlice := make([]string, len(g.cache[lang])) + copy(factSlice, g.cache[lang]) + g.randGen.Shuffle(len(factSlice), func(i, j int) { + factSlice[i], factSlice[j] = factSlice[j], factSlice[i] + }) + return [3]string{factSlice[0], factSlice[1], factSlice[2]} +} + +func (g *FactGiver) initCache() error { + for _, lang := range g.langs { + localFacts := strings.Replace(g.factsFileName, "*", lang, 1) + factsContentBytes, err := g.b2Client.ReadAll(localFacts) + if err != nil { + return fmt.Errorf("fail to read '%s' facts file: %s", lang, err.Error()) + } + factsContent := string(factsContentBytes) + g.cache[lang] = g.nlRe.Split(factsContent, -1) + if g.cache[lang][len(g.cache[lang])-1] == "" { + g.cache[lang] = g.cache[lang][:len(g.cache[lang])-1] + } + } + return nil +} |