Skip to content

Commit b57331a

Browse files
authored
Reminders update (#5)
Owners can list all reminders created by them across all chats from their personal chat. Listing reminders lists the group name where the reminder was created.
1 parent 0a3cfa3 commit b57331a

File tree

2 files changed

+548
-8
lines changed

2 files changed

+548
-8
lines changed

cmd/sup/handlers/reminders.go

Lines changed: 138 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ type Reminder struct {
2828
CreatedAt time.Time `json:"created_at"`
2929
Triggered bool `json:"triggered"`
3030
ChatID string `json:"chat_id"`
31+
CreatedBy string `json:"created_by"`
32+
GroupName string `json:"group_name,omitempty"`
3133
}
3234

3335
type RemindersHandler struct {
@@ -144,13 +146,20 @@ func (h *RemindersHandler) createReminder(c *client.Client, msg *events.Message,
144146
return nil
145147
}
146148

149+
var groupName string
150+
if isGroup {
151+
groupName = h.getGroupName(c, msg.Info.Chat)
152+
}
153+
147154
reminder := Reminder{
148155
ID: fmt.Sprintf("%d", time.Now().UnixNano()),
149156
Description: description,
150157
RemindAt: result.Time,
151158
CreatedAt: time.Now(),
152159
Triggered: false,
153160
ChatID: chatID,
161+
CreatedBy: sender,
162+
GroupName: groupName,
154163
}
155164

156165
log.Debug("Creating reminder", "user", sender, "chatID", chatID, "description", description, "remindAt", result.Time)
@@ -174,18 +183,48 @@ func (h *RemindersHandler) createReminder(c *client.Client, msg *events.Message,
174183
}
175184

176185
func (h *RemindersHandler) listReminders(c *client.Client, msg *events.Message, sender, chatID string, isGroup bool) error {
177-
reminderKey := h.getReminderKey(sender, chatID, isGroup)
178-
h.garbageCollect(reminderKey)
186+
// Extract phone number from sender (remove device ID part)
187+
senderPhone := h.extractPhoneNumber(sender)
188+
chatPhone := h.extractPhoneNumber(chatID)
189+
isOwnChat := senderPhone == chatPhone && !isGroup
179190

180-
reminders, err := h.getReminders(reminderKey)
181-
if err != nil {
182-
c.SendText(msg.Info.Chat, "❌ Failed to get reminders: "+err.Error())
183-
return nil
191+
log.Debug("listReminders called", "sender", sender, "chatID", chatID, "isGroup", isGroup, "senderPhone", senderPhone, "chatPhone", chatPhone, "isOwnChat", isOwnChat)
192+
193+
var reminders []Reminder
194+
var err error
195+
196+
if isGroup {
197+
reminderKey := h.getReminderKey(sender, chatID, isGroup)
198+
reminders, err = h.getReminders(reminderKey)
199+
if err != nil {
200+
c.SendText(msg.Info.Chat, "❌ Failed to get reminders: "+err.Error())
201+
return nil
202+
}
203+
} else {
204+
// For non-group (private) chats, check if sender and chatID match
205+
if isOwnChat {
206+
// User's own chat - list all reminders from all chats for this user
207+
reminders, err = h.getAllUserReminders(sender)
208+
if err != nil {
209+
c.SendText(msg.Info.Chat, "❌ Failed to get reminders: "+err.Error())
210+
return nil
211+
}
212+
} else {
213+
// Different chat - list only reminders for this specific chat
214+
reminderKey := h.getReminderKey(sender, chatID, isGroup)
215+
reminders, err = h.getReminders(reminderKey)
216+
if err != nil {
217+
c.SendText(msg.Info.Chat, "❌ Failed to get reminders: "+err.Error())
218+
return nil
219+
}
220+
}
184221
}
185222

186223
if len(reminders) == 0 {
187224
if isGroup {
188225
c.SendText(msg.Info.Chat, "📝 No active reminders for this group")
226+
} else if isOwnChat {
227+
c.SendText(msg.Info.Chat, "📝 No active reminders across all chats")
189228
} else {
190229
c.SendText(msg.Info.Chat, "📝 No active reminders")
191230
}
@@ -199,16 +238,29 @@ func (h *RemindersHandler) listReminders(c *client.Client, msg *events.Message,
199238
var result strings.Builder
200239
if isGroup {
201240
result.WriteString(fmt.Sprintf("📝 Group reminders (%d):\n", len(reminders)))
241+
} else if isOwnChat {
242+
result.WriteString(fmt.Sprintf("📝 All your reminders (%d):\n", len(reminders)))
202243
} else {
203244
result.WriteString(fmt.Sprintf("📝 Active reminders (%d):\n", len(reminders)))
204245
}
205246

206247
for _, reminder := range reminders {
207248
timeStr := reminder.RemindAt.Format("Mon Jan 2, 3:04 PM")
208249
if reminder.Description != "" {
209-
result.WriteString(fmt.Sprintf("• %s [%s]: %s\n", timeStr, reminder.ID[:8], reminder.Description))
250+
if isOwnChat {
251+
// Show chat context for user's own chat listing all reminders
252+
chatInfo := h.getChatInfo(reminder.ChatID, reminder.GroupName)
253+
result.WriteString(fmt.Sprintf("• %s [%s]: %s %s\n", timeStr, reminder.ID[:8], reminder.Description, chatInfo))
254+
} else {
255+
result.WriteString(fmt.Sprintf("• %s [%s]: %s\n", timeStr, reminder.ID[:8], reminder.Description))
256+
}
210257
} else {
211-
result.WriteString(fmt.Sprintf("• %s [%s]\n", timeStr, reminder.ID[:8]))
258+
if isOwnChat {
259+
chatInfo := h.getChatInfo(reminder.ChatID, reminder.GroupName)
260+
result.WriteString(fmt.Sprintf("• %s [%s] %s\n", timeStr, reminder.ID[:8], chatInfo))
261+
} else {
262+
result.WriteString(fmt.Sprintf("• %s [%s]\n", timeStr, reminder.ID[:8]))
263+
}
212264
}
213265
}
214266

@@ -537,6 +589,84 @@ func (h *RemindersHandler) removeKeyFromIndex(reminderKey string) error {
537589
return h.store.Put([]byte("reminder_keys_index"), data)
538590
}
539591

592+
func (h *RemindersHandler) getAllUserReminders(userID string) ([]Reminder, error) {
593+
log.Debug("Getting all user reminders", "userID", userID)
594+
595+
allKeys, err := h.getAllReminderKeys()
596+
if err != nil {
597+
log.Error("Failed to get all reminder keys", "error", err)
598+
return nil, err
599+
}
600+
601+
log.Debug("Found reminder keys", "keys", allKeys, "count", len(allKeys))
602+
603+
var allReminders []Reminder
604+
605+
for _, key := range allKeys {
606+
log.Debug("Processing key", "key", key, "userID", userID)
607+
608+
h.garbageCollect(key)
609+
reminders, err := h.getReminders(key)
610+
if err != nil {
611+
log.Error("Failed to get reminders for key", "key", key, "error", err)
612+
continue
613+
}
614+
615+
log.Debug("Found reminders for key", "key", key, "count", len(reminders))
616+
617+
// Filter reminders created by this user
618+
for _, reminder := range reminders {
619+
if reminder.CreatedBy == userID {
620+
allReminders = append(allReminders, reminder)
621+
log.Debug("Added user reminder", "key", key, "reminderID", reminder.ID[:8])
622+
}
623+
}
624+
}
625+
626+
log.Debug("Total reminders collected", "count", len(allReminders))
627+
return allReminders, nil
628+
}
629+
630+
func (h *RemindersHandler) extractPhoneNumber(jid string) string {
631+
// Extract phone number from JID, handling device ID
632+
// Format: phone:device@server or phone@server
633+
if strings.Contains(jid, "@") {
634+
userPart := strings.Split(jid, "@")[0]
635+
if strings.Contains(userPart, ":") {
636+
return strings.Split(userPart, ":")[0]
637+
}
638+
return userPart
639+
}
640+
return jid
641+
}
642+
643+
func (h *RemindersHandler) getChatInfo(chatID string, groupName string) string {
644+
if strings.Contains(chatID, "@g.us") {
645+
if groupName != "" {
646+
return fmt.Sprintf("(group: %s)", groupName)
647+
}
648+
return "(group)"
649+
}
650+
return "(private)"
651+
}
652+
653+
func (h *RemindersHandler) getGroupName(c *client.Client, chatJID types.JID) string {
654+
joinedGroups, err := c.GetJoinedGroups()
655+
if err != nil {
656+
log.Debug("Failed to get joined groups", "chatJID", chatJID, "error", err)
657+
return ""
658+
}
659+
660+
for _, group := range joinedGroups {
661+
if group.JID.String() == chatJID.String() {
662+
return group.Name
663+
}
664+
}
665+
666+
log.Debug("Group not found in joined groups", "chatJID", chatJID)
667+
return ""
668+
}
669+
540670
func (h *RemindersHandler) GetHelp() handlers.HandlerHelp {
541671
return handlers.HandlerHelp{
542672
Name: "reminders",

0 commit comments

Comments
 (0)