Skip to content

Commit 09b6cf7

Browse files
Implement remind, reminders and delreminder commands
1 parent dab29a8 commit 09b6cf7

File tree

4 files changed

+292
-70
lines changed

4 files changed

+292
-70
lines changed

cmd/gatekeeper/command.go

Lines changed: 87 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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())

cmd/gatekeeper/gatekeeper.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ func main() {
2929
defer dg.Close();
3030
}
3131

32+
PollOverdueReminders(db, dg)
33+
3234
// MPV //////////////////////////////
3335
mpvMsgs, ok := startMpvControl();
3436
if !ok {

0 commit comments

Comments
 (0)