Implemented reminder
This commit is contained in:
parent
d89d63803f
commit
c352176417
@ -44,6 +44,8 @@ func (ntfy NTFY) Send(uuid string, msg []byte) (err error) {
|
||||
|
||||
ackURL := fmt.Sprintf("http, OK, %s/notification/ack?uuid=%s", ntfy.AcknowledgeURL, uuid)
|
||||
req.Header.Add("X-Actions", ackURL)
|
||||
req.Header.Add("X-Priority", "5")
|
||||
req.Header.Add("X-Tags", "calendar")
|
||||
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
|
56
schedule.go
56
schedule.go
@ -8,6 +8,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
@ -22,14 +23,15 @@ type Schedule struct {
|
||||
Node Node
|
||||
ScheduleUUID string `db:"schedule_uuid"`
|
||||
Time time.Time
|
||||
RemindMinutes int `db:"remind_minutes"`
|
||||
Description string
|
||||
Acknowledged bool
|
||||
}
|
||||
|
||||
func ScanForSchedules(timeOffset int, content string) (schedules []Schedule) {// {{{
|
||||
func ScanForSchedules(timeOffset int, content string) (schedules []Schedule) { // {{{
|
||||
schedules = []Schedule{}
|
||||
|
||||
rxp := regexp.MustCompile(`\{\s*([0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}(?::[0-9]{2})?)\s*\,\s*([^\]]+?)\s*\}`)
|
||||
rxp := regexp.MustCompile(`\{\s*([0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}(?::[0-9]{2})?)\s*\,\s*(?:(\d+)\s*(h|min)\s*,)?\s*([^\]]+?)\s*\}`)
|
||||
foundSchedules := rxp.FindAllStringSubmatch(content, -1)
|
||||
|
||||
for _, data := range foundSchedules {
|
||||
@ -38,6 +40,7 @@ func ScanForSchedules(timeOffset int, content string) (schedules []Schedule) {//
|
||||
data[1] = data[1] + ":00"
|
||||
}
|
||||
|
||||
// Timezone calculations
|
||||
var timeTZ string
|
||||
if timeOffset < 0 {
|
||||
hours := (-timeOffset) / 60
|
||||
@ -54,16 +57,30 @@ func ScanForSchedules(timeOffset int, content string) (schedules []Schedule) {//
|
||||
continue
|
||||
}
|
||||
|
||||
// Reminder
|
||||
var remindMinutes int
|
||||
if data[2] != "" && data[3] != "" {
|
||||
value, _ := strconv.Atoi(data[2])
|
||||
unit := strings.ToLower(data[3])
|
||||
switch unit {
|
||||
case "min":
|
||||
remindMinutes = value
|
||||
case "h":
|
||||
remindMinutes = value * 60
|
||||
}
|
||||
}
|
||||
|
||||
schedule := Schedule{
|
||||
Time: timestamp,
|
||||
Description: data[2],
|
||||
RemindMinutes: remindMinutes,
|
||||
Description: data[4],
|
||||
}
|
||||
schedules = append(schedules, schedule)
|
||||
}
|
||||
|
||||
return
|
||||
}// }}}
|
||||
func RetrieveSchedules(userID int, nodeID int) (schedules []Schedule, err error) {// {{{
|
||||
} // }}}
|
||||
func RetrieveSchedules(userID int, nodeID int) (schedules []Schedule, err error) { // {{{
|
||||
schedules = []Schedule{}
|
||||
|
||||
res := service.Db.Conn.QueryRow(`
|
||||
@ -73,7 +90,7 @@ func RetrieveSchedules(userID int, nodeID int) (schedules []Schedule, err error)
|
||||
user_id,
|
||||
json_build_object('id', node_id) AS node,
|
||||
schedule_uuid,
|
||||
time,
|
||||
time - MAKE_INTERVAL(mins => remind_minutes) AS time,
|
||||
description,
|
||||
acknowledged
|
||||
FROM schedule
|
||||
@ -100,29 +117,30 @@ func RetrieveSchedules(userID int, nodeID int) (schedules []Schedule, err error)
|
||||
|
||||
err = json.Unmarshal(data, &schedules)
|
||||
return
|
||||
}// }}}
|
||||
} // }}}
|
||||
|
||||
func (a Schedule) IsEqual(b Schedule) bool {// {{{
|
||||
func (a Schedule) IsEqual(b Schedule) bool { // {{{
|
||||
return a.UserID == b.UserID &&
|
||||
a.Node.ID == b.Node.ID &&
|
||||
a.Time.Equal(b.Time) &&
|
||||
a.Description == b.Description
|
||||
}// }}}
|
||||
func (s *Schedule) Insert(queryable Queryable) error {// {{{
|
||||
} // }}}
|
||||
func (s *Schedule) Insert(queryable Queryable) error { // {{{
|
||||
res := queryable.QueryRow(`
|
||||
INSERT INTO schedule(user_id, node_id, time, description)
|
||||
VALUES($1, $2, $3, $4)
|
||||
INSERT INTO schedule(user_id, node_id, time, remind_minutes, description)
|
||||
VALUES($1, $2, $3, $4, $5)
|
||||
RETURNING id
|
||||
`,
|
||||
s.UserID,
|
||||
s.Node.ID,
|
||||
s.Time,
|
||||
s.RemindMinutes,
|
||||
s.Description,
|
||||
)
|
||||
|
||||
return res.Scan(&s.ID)
|
||||
}// }}}
|
||||
func (s *Schedule) Delete(queryable Queryable) error {// {{{
|
||||
} // }}}
|
||||
func (s *Schedule) Delete(queryable Queryable) error { // {{{
|
||||
_, err := queryable.Exec(`
|
||||
DELETE FROM schedule
|
||||
WHERE
|
||||
@ -133,9 +151,9 @@ func (s *Schedule) Delete(queryable Queryable) error {// {{{
|
||||
s.ID,
|
||||
)
|
||||
return err
|
||||
}// }}}
|
||||
} // }}}
|
||||
|
||||
func ExpiredSchedules() (schedules []Schedule) {// {{{
|
||||
func ExpiredSchedules() (schedules []Schedule) { // {{{
|
||||
schedules = []Schedule{}
|
||||
|
||||
res, err := service.Db.Conn.Queryx(`
|
||||
@ -144,11 +162,11 @@ func ExpiredSchedules() (schedules []Schedule) {// {{{
|
||||
user_id,
|
||||
node_id,
|
||||
schedule_uuid,
|
||||
time,
|
||||
time - MAKE_INTERVAL(mins => remind_minutes) AS time,
|
||||
description
|
||||
FROM schedule
|
||||
WHERE
|
||||
time < NOW() AND
|
||||
(time - MAKE_INTERVAL(mins => remind_minutes)) < NOW() AND
|
||||
NOT acknowledged
|
||||
ORDER BY
|
||||
time ASC
|
||||
@ -168,4 +186,4 @@ func ExpiredSchedules() (schedules []Schedule) {// {{{
|
||||
schedules = append(schedules, s)
|
||||
}
|
||||
return
|
||||
}// }}}
|
||||
} // }}}
|
||||
|
1
sql/00019.sql
Normal file
1
sql/00019.sql
Normal file
@ -0,0 +1 @@
|
||||
ALTER TABLE public.schedule ADD COLUMN remind_minutes int NOT NULL DEFAULT 0;
|
Loading…
Reference in New Issue
Block a user