@@ -28,6 +28,8 @@ type Reminder struct {
28
28
CreatedAt time.Time `json:"created_at"`
29
29
Triggered bool `json:"triggered"`
30
30
ChatID string `json:"chat_id"`
31
+ CreatedBy string `json:"created_by"`
32
+ GroupName string `json:"group_name,omitempty"`
31
33
}
32
34
33
35
type RemindersHandler struct {
@@ -144,13 +146,20 @@ func (h *RemindersHandler) createReminder(c *client.Client, msg *events.Message,
144
146
return nil
145
147
}
146
148
149
+ var groupName string
150
+ if isGroup {
151
+ groupName = h .getGroupName (c , msg .Info .Chat )
152
+ }
153
+
147
154
reminder := Reminder {
148
155
ID : fmt .Sprintf ("%d" , time .Now ().UnixNano ()),
149
156
Description : description ,
150
157
RemindAt : result .Time ,
151
158
CreatedAt : time .Now (),
152
159
Triggered : false ,
153
160
ChatID : chatID ,
161
+ CreatedBy : sender ,
162
+ GroupName : groupName ,
154
163
}
155
164
156
165
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,
174
183
}
175
184
176
185
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
179
190
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
+ }
184
221
}
185
222
186
223
if len (reminders ) == 0 {
187
224
if isGroup {
188
225
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" )
189
228
} else {
190
229
c .SendText (msg .Info .Chat , "📝 No active reminders" )
191
230
}
@@ -199,16 +238,29 @@ func (h *RemindersHandler) listReminders(c *client.Client, msg *events.Message,
199
238
var result strings.Builder
200
239
if isGroup {
201
240
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 )))
202
243
} else {
203
244
result .WriteString (fmt .Sprintf ("📝 Active reminders (%d):\n " , len (reminders )))
204
245
}
205
246
206
247
for _ , reminder := range reminders {
207
248
timeStr := reminder .RemindAt .Format ("Mon Jan 2, 3:04 PM" )
208
249
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
+ }
210
257
} 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
+ }
212
264
}
213
265
}
214
266
@@ -537,6 +589,84 @@ func (h *RemindersHandler) removeKeyFromIndex(reminderKey string) error {
537
589
return h .store .Put ([]byte ("reminder_keys_index" ), data )
538
590
}
539
591
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
+
540
670
func (h * RemindersHandler ) GetHelp () handlers.HandlerHelp {
541
671
return handlers.HandlerHelp {
542
672
Name : "reminders" ,
0 commit comments