From fe0d13faf49f47a223de64ded4cb2a697ff36c0c Mon Sep 17 00:00:00 2001 From: silverweed Date: Tue, 14 Jun 2022 12:58:43 +0200 Subject: [PATCH] Add 'flush-reminders' command to remind module --- .gitignore | 4 ++- modules/remind/mod.go | 77 ++++++++++++++++++++++++++++++++----------- run.sh | 4 ++- 3 files changed, 64 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index c419d97..1c386ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -_data \ No newline at end of file +_data +*.swp +runlocal.sh diff --git a/modules/remind/mod.go b/modules/remind/mod.go index 10a0e87..1f490b0 100644 --- a/modules/remind/mod.go +++ b/modules/remind/mod.go @@ -18,11 +18,15 @@ import ( jsoniter "github.com/json-iterator/go" ) +// For now receiving anything in this channel means 'cancel' +type ReminderChannel chan interface{} + type Reminder struct { TargetID int64 When int64 Text string Reference *ReminderReference + Channel ReminderChannel`json:"-"` } type ReminderReference struct { @@ -65,7 +69,7 @@ func (m *Module) Initialize(options modules.ModuleOptions) error { } for id, reminder := range reminders { pending.SetKey(id, reminder) - go m.schedule(id) + go m.schedule(id, reminder.Channel) } log.Printf("[remind] Loaded %d pending reminders\n", len(reminders)) @@ -128,6 +132,7 @@ func (m *Module) OnUpdate(update tg.APIUpdate) { TargetID: message.User.UserID, When: timestamp.Unix(), Text: remindText, + Channel: make(ReminderChannel), } if message.ReplyTo != nil { reminder.Reference = &ReminderReference{ @@ -137,7 +142,7 @@ func (m *Module) OnUpdate(update tg.APIUpdate) { } pending.SetKey(id, reminder) m.save() - go m.schedule(id) + go m.schedule(id, reminder.Channel) whenday := "piĆ¹ tardi" _, todaym, todayd := time.Now().Date() @@ -186,30 +191,65 @@ func (m *Module) OnUpdate(update tg.APIUpdate) { ReplyID: &message.MessageID, }) } + return + } + + if utils.IsCommand(message, m.name, "flush-reminders") { + deleted := 0 + for key, reminder := range pending.Copy() { + if reminder.TargetID == message.User.UserID { + reminder.Channel <- struct{}{} + pending.DeleteKey(key) + deleted++ + } + } + if deleted > 0 { + var txt string + if deleted == 1 { + txt = "Ho cancellato l'unico reminder che avevi in coda." + } else { + txt = fmt.Sprintf("Ho cancellato tutti i %d reminder dalla tua coda.", deleted) + } + m.client.SendTextMessage(tg.ClientTextMessageData{ + ChatID: message.Chat.ChatID, + Text: txt, + ReplyID: &message.MessageID, + }) + } else { + m.client.SendTextMessage(tg.ClientTextMessageData{ + ChatID: message.Chat.ChatID, + Text: "Non ho trovato nessun reminder da cancellare!", + ReplyID: &message.MessageID, + }) + } + return } } -func (m *Module) schedule(id string) { +func (m *Module) schedule(id string, channel ReminderChannel) { // Get reminder r := pending.GetKey(id) remaining := r.When - time.Now().Unix() - if remaining > 0 { - // Wait remaining time - time.Sleep(time.Second * time.Duration(remaining)) - } - // Remind! - m.client.SendTextMessage(tg.ClientTextMessageData{ - ChatID: r.TargetID, - Text: "Heyla! Mi avevi chiesto di ricordarti questo:\n" + r.Text, - ReplyID: nil, - }) - if r.Reference != nil { - m.client.ForwardMessage(tg.ClientForwardMessageData{ - ChatID: r.TargetID, - FromChatID: r.Reference.Chat, - MessageID: r.Reference.Message, + + select { + case <-channel: + // Interrupted + case <-time.After(time.Second * time.Duration(remaining)): + // Remind! + m.client.SendTextMessage(tg.ClientTextMessageData{ + ChatID: r.TargetID, + Text: "Heyla! Mi avevi chiesto di ricordarti questo:\n" + r.Text, + ReplyID: nil, }) + if r.Reference != nil { + m.client.ForwardMessage(tg.ClientForwardMessageData{ + ChatID: r.TargetID, + FromChatID: r.Reference.Chat, + MessageID: r.Reference.Message, + }) + } } + // Delete reminder from pending list and save list to disk pending.DeleteKey(id) m.save() @@ -258,7 +298,6 @@ func scanMixedDelay(str string) (bool, time.Time, error) { nextIndex := strings.IndexRune(remaining, sep) remaining = remaining[nextIndex+1:] } - fmt.Printf("tot: %s", now.Sub(time.Now())) return true, now, nil } diff --git a/run.sh b/run.sh index f61beac..7c58e74 100644 --- a/run.sh +++ b/run.sh @@ -6,5 +6,7 @@ export CLESSY_EMOJI_PATH=_data export CLESSY_UNSPLASH_FONT=_data/gill.ttf export CLESSY_MEME_FONT=_data/impact.ttf export CLESSY_SNAPCHAT_FONT=_data/source.ttf +shift +shift mkdir -p _data/pics -go run . \ No newline at end of file +go run . $@ -- 2.40.1