clessy-ng/modules/remind/cmd.reminders.go

124 lines
3.3 KiB
Go

package remind
import (
"fmt"
"git.fromouter.space/hamcha/tg"
"log"
"sort"
"time"
)
func (m *Module) cmdReminder(message *tg.APIMessage) {
// Should only work in private chats
if message.Chat.Type != tg.ChatTypePrivate {
m.client.SendTextMessage(tg.ClientTextMessageData{
ChatID: message.Chat.ChatID,
Text: "Per favore chiedimi in privato dei reminder",
ReplyID: &message.MessageID,
})
return
}
reminders := remindersOfUser(message.User.UserID)
if len(reminders) == 0 {
m.client.SendTextMessage(tg.ClientTextMessageData{
ChatID: message.Chat.ChatID,
Text: "Non ci sono reminder in coda per te",
ReplyID: &message.MessageID,
})
} else {
m.client.SendTextMessage(tg.ClientTextMessageData{
ChatID: message.Chat.ChatID,
Text: renderReminderEntry(0, reminders, defaultLocation),
ReplyID: &message.MessageID,
ReplyMarkup: &tg.APIInlineKeyboardMarkup{
InlineKeyboard: [][]tg.APIInlineKeyboardButton{makeReminderInlineKeyboard(0, reminders)},
},
})
}
}
func (m *Module) handleCallback(callback *tg.APICallbackQuery) {
if callback.Data == nil {
return
}
var command, reminderID string
_, err := fmt.Sscan(*callback.Data, &command, &reminderID)
if err != nil {
log.Println("[remind] WARN: weird callback received: " + err.Error())
return
}
reminders := remindersOfUser(callback.User.UserID)
switch command {
case "GET":
current := 0
for index, reminder := range reminders {
if reminder.ReminderID == reminderID {
current = index
break
}
}
// Modify message with requested reminder
m.client.EditText(tg.ClientEditTextData{
ChatID: callback.Message.Chat.ChatID,
MessageID: callback.Message.MessageID,
Text: renderReminderEntry(current, reminders, defaultLocation),
ReplyMarkup: &tg.APIInlineKeyboardMarkup{
InlineKeyboard: [][]tg.APIInlineKeyboardButton{makeReminderInlineKeyboard(current, reminders)},
},
})
}
}
func remindersOfUser(userID int64) (reminders []Reminder) {
for _, reminder := range pending.Copy() {
if reminder.TargetID == userID {
reminders = append(reminders, reminder)
}
}
if len(reminders) > 0 {
sort.Slice(reminders, func(a, b int) bool { return reminders[a].When < reminders[b].When })
}
return
}
func renderReminderEntry(current int, reminders []Reminder, loc *time.Location) string {
reminder := reminders[current]
when := time.Unix(reminder.When, 0)
message := reminder.Text
if reminder.Reference != nil {
if message != "" {
message += ", "
}
message += fmt.Sprintf("https://t.me/c/%d/%d", reminder.Reference.Chat, reminder.Reference.Message)
}
return fmt.Sprintf("<b>Reminder %d</b> (/%d):\n%s\n<b>Quando:</b> %s", current+1, len(reminders), message, formatWhen(when, loc))
}
func makeReminderInlineKeyboard(current int, reminders []Reminder) (buttons []tg.APIInlineKeyboardButton) {
if current > 0 {
buttons = append(buttons, tg.APIInlineKeyboardButton{
Text: "⬅",
CallbackData: fmt.Sprintf("GET %s", reminders[current-1].ReminderID),
})
}
buttons = append(buttons, tg.APIInlineKeyboardButton{
Text: "❌",
CallbackData: fmt.Sprintf("DELETE %s", reminders[current].ReminderID),
})
if current < len(reminders)-1 {
buttons = append(buttons, tg.APIInlineKeyboardButton{
Text: "➡",
CallbackData: fmt.Sprintf("GET %s", reminders[current+1].ReminderID),
})
}
return
}