@@ -24,10 +24,10 @@ var (
2424 CommandDef = "([a-zA-Z0-9\\ -_]+)( +(.*))?"
2525 CommandRegexp = regexp .MustCompile ("^ *(" + CommandPrefix + ") *" + CommandDef + "$" )
2626 CommandNoPrefixRegexp = regexp .MustCompile ("^ *" + CommandDef + "$" )
27- ReminderDurationRegexpStr = `(\d+)(s|m|h|d|y)`
28- ReminderArgsRegexpStr = `^((\d+(s|m|h|d|y) )+) +(.+)$`
29- ReminderDurationRegexp = regexp .MustCompile (ReminderDurationRegexpStr )
30- ReminderArgsRegexp = regexp .MustCompile (ReminderArgsRegexpStr )
27+ ReminderDurationDef = `(\d+)(s|m|h|d|y)`
28+ ReminderArgsDef = `^((` + ReminderDurationDef + ` )+) +(.+)$`
29+ ReminderDurationRegexp = regexp .MustCompile (ReminderDurationDef )
30+ ReminderArgsRegexp = regexp .MustCompile (ReminderArgsDef )
3131 Commit = func () string {
3232 if info , ok := debug .ReadBuildInfo (); ok {
3333 for _ , setting := range info .Settings {
@@ -756,43 +756,100 @@ func EvalBuiltinCommand(db *sql.DB, command Command, env CommandEnvironment, con
756756 }
757757 // TODO: report "added" instead of "updated" when the command didn't exist but was newly created
758758 env .SendMessage (fmt .Sprintf ("%s command %s is updated" , env .AtAuthor (), name ))
759- case "addreminder" :
759+ case "remind" :
760+ discordEnv := env .AsDiscord ()
761+ if discordEnv == nil {
762+ env .SendMessage (env .AtAuthor () + " This command only works in Discord, sorry" )
763+ return
764+ }
765+
760766 args := ReminderArgsRegexp .FindStringSubmatch (command .Args )
761767 if (args == nil ) {
762- env .SendMessage (env .AtAuthor () + " Coudn't parse the reminder arguments, expected `" + ReminderArgsRegexpStr + "`" )
768+ env .SendMessage (env .AtAuthor () + " Coudn't parse the reminder arguments, expected `" + ReminderArgsDef + "`" )
763769 return
764770 }
765771
766772 durationStr := args [1 ]
767- message := args [4 ]
773+ message := args [5 ]
768774
769- delay := time .Duration (0 )
770- for _ , match := range ReminderDurationRegexp .FindAllStringSubmatch (durationStr , - 1 ) {
771- ammount , err := strconv .ParseInt (match [1 ], 10 , 64 )
772- if err != nil {
773- log .Println ("Reminder duration parsing: " , err )
774- env .SendMessage (env .AtAuthor () + " Delay ammount overflows." + "\n " )
775- return
776- }
777- unit := match [2 ]
775+ delay , err := ParseDurationStr (durationStr )
776+ if err != nil {
777+ env .SendMessage (env .AtAuthor () + " Delay ammount overflows." + "\n " )
778+ return
779+ }
778780
779- d , ok := MulDurationSafe (ammount , UnitDurations [unit ])
780- if ! ok {
781- env .SendMessage (env .AtAuthor () + "Duration specified caused an overflow." )
782- return
783- }
781+ err = SetReminder (db , Reminder {
782+ UserId : env .AuthorUserId (),
783+ Message : message ,
784+ RemindAt : time .Now ().Add (delay ),
785+ })
786+ if err != nil {
787+ env .SendMessage (env .AtAuthor () + " " + err .Error ())
788+ return
789+ }
784790
785- delay , ok = AddDurationSafe (delay , d )
786- if ! ok {
787- env .SendMessage (env .AtAuthor () + "Duration specified caused an overflow." )
788- return
789- }
791+ env .SendMessage (env .AtAuthor () + " Reminder has been successfully set to fire in " + DurationToString (delay ) + "." )
792+ case "reminders" :
793+ discordEnv := env .AsDiscord ()
794+ if discordEnv == nil {
795+ env .SendMessage (env .AtAuthor () + " This command only works in Discord, sorry" )
796+ return
790797 }
791798
792- SetReminder (env , Reminder {
793- Delay : delay ,
794- Message : message ,
795- })
799+ reminders , err := QueryUserReminders (env .AuthorUserId (), db )
800+ if err != nil {
801+ env .SendMessage (env .AtAuthor () + " Something went wrong. Please ask " + env .AtAdmin () + " to check the logs" )
802+ log .Printf ("Error while querying user reminders: %s\n " , err .Error ());
803+ return
804+ }
805+
806+ if len (reminders ) == 0 {
807+ env .SendMessage (env .AtAuthor () + " You have no reminders" )
808+ return
809+ }
810+
811+ sb := strings.Builder {}
812+ for i , r := range reminders {
813+ remaining := DurationToString (r .RemindAt .Sub (time .Now ()))
814+ sb .WriteString (fmt .Sprintf ("%d. In %s: %s\n " , i , remaining , r .Message ))
815+ }
816+
817+ env .SendMessage (env .AtAuthor () + " Your reminders:\n " + sb .String ())
818+ case "delreminder" :
819+ discordEnv := env .AsDiscord ()
820+ if discordEnv == nil {
821+ env .SendMessage (env .AtAuthor () + " This command only works in Discord, sorry" )
822+ return
823+ }
824+
825+ i , err := strconv .Atoi (command .Args )
826+ if err != nil || i < 0 {
827+ env .SendMessage (env .AtAuthor () + " Command needs a valid positive number index" )
828+ return
829+ }
830+
831+ reminders , err := QueryUserReminders (env .AuthorUserId (), db )
832+ if err != nil {
833+ env .SendMessage (env .AtAuthor () + " Something went wrong. Please ask " + env .AtAdmin () + " to check the logs" )
834+ log .Printf ("Error while querying user reminders: %s\n " , err .Error ());
835+ return
836+ }
837+
838+ if len (reminders ) == 0 {
839+ env .SendMessage (env .AtAuthor () + " You have no reminders" )
840+ return
841+ }
842+
843+ if len (reminders ) <= i {
844+ env .SendMessage (env .AtAuthor () + fmt .Sprintf (" Index '%v' is out of bounds" , i ))
845+ return
846+ }
847+
848+ err = DelReminder (db , reminders [i ].Id )
849+ if err != nil {
850+ env .SendMessage (env .AtAuthor () + " " + err .Error ())
851+ return
852+ }
796853 case "delcmd" :
797854 if ! env .IsAuthorAdmin () {
798855 env .SendMessage (env .AtAuthor () + " only for " + env .AtAdmin ())
0 commit comments