@@ -59,6 +59,40 @@ telegram_ids = "40xxxxxx,42xxxxx"
5959binding = "AI"
6060*/
6161
62+ func getRandomWord () (string , string , error ) {
63+ now := time .Now ()
64+
65+ db , err := sql .Open ("d1" , "DB" )
66+ if err != nil {
67+ return "" , "" , fmt .Errorf ("open db failed: %w" , err )
68+ }
69+ defer db .Close ()
70+
71+ result , err := db .Query ("SELECT word, explain FROM words WHERE reminder_time <= ? ORDER BY RANDOM() LIMIT 1" , now .Add (- 12 * time .Hour ).Unix ())
72+ if err != nil {
73+ result , err = db .Query ("SELECT word, explain FROM words ORDER BY RANDOM() LIMIT 1" )
74+ if err != nil {
75+ return "" , "" , fmt .Errorf ("get random word failed: %w" , err )
76+ }
77+ }
78+
79+ result .Next ()
80+
81+ var word , explain string
82+ err = result .Scan (& word , & explain )
83+ if err != nil {
84+ return "" , "" , fmt .Errorf ("scan word failed: %w" , err )
85+ }
86+ defer result .Close ()
87+
88+ _ , err = db .Exec ("UPDATE words SET reminder_time = ? WHERE word = ?" , now .Unix (), word )
89+ if err != nil {
90+ log .Println ("update word failed" , "err" , err )
91+ }
92+
93+ return word , explain , nil
94+ }
95+
6296func main () {
6397 cron .ScheduleTaskNonBlock (func (ctx context.Context ) error {
6498 ankiIdstr := cloudflare .Getenv ("anki_telegram_id" )
@@ -73,25 +107,11 @@ func main() {
73107 return nil
74108 }
75109
76- db , err := sql .Open ("d1" , "DB" )
77- if err != nil {
78- return err
79- }
80- defer db .Close ()
81-
82- result , err := db .Query ("SELECT word, explain FROM words ORDER BY RANDOM() LIMIT 1" )
83- if err != nil {
84- return err
85- }
86-
87- result .Next ()
88-
89- var word , explain string
90- err = result .Scan (& word , & explain )
110+ word , explain , err := getRandomWord ()
91111 if err != nil {
112+ log .Println ("get random word failed" , "err" , err )
92113 return err
93114 }
94- defer result .Close ()
95115
96116 msg := tgbotapi .NewMessage (ankiId , fmt .Sprintf (`<b>%s</b>
97117 <tg-spoiler><blockquote expandable>%s</blockquote></tg-spoiler>
@@ -337,29 +357,12 @@ func bot(w http.ResponseWriter, r *http.Request) {
337357 deleteMessage (umsg , false )
338358 return
339359 case "random" :
340- db , err := sql .Open ("d1" , "DB" )
341- if err != nil {
342- log .Println ("open db failed" , "err" , err )
343- return
344- }
345- defer db .Close ()
346-
347- result , err := db .Query ("SELECT word, explain FROM words ORDER BY RANDOM() LIMIT 1" )
360+ word , explain , err := getRandomWord ()
348361 if err != nil {
349362 log .Println ("get random word failed" , "err" , err )
350363 return
351364 }
352365
353- result .Next ()
354-
355- var word , explain string
356- err = result .Scan (& word , & explain )
357- if err != nil {
358- log .Println ("scan word failed" , "err" , err )
359- return
360- }
361- defer result .Close ()
362-
363366 msg := tgbotapi .NewMessage (umsg .Chat .ID , fmt .Sprintf (`<b>%s</b>
364367<tg-spoiler><blockquote expandable>%s</blockquote></tg-spoiler>
365368` , tgbotapi .EscapeText (tgbotapi .ModeHTML , word ),
0 commit comments