diff --git a/djpianalto.com/goff/utils/tasks.go b/djpianalto.com/goff/utils/tasks.go index 22d9677..0a6865b 100644 --- a/djpianalto.com/goff/utils/tasks.go +++ b/djpianalto.com/goff/utils/tasks.go @@ -20,7 +20,9 @@ type Task struct { func processTask(task *Task, s *discordgo.Session) { closeQuery := "Update tasks set completed = true where id = $1" + processQuery := "UPDATE tasks SET processing = true WHERE id = $1" defer Database.Exec(closeQuery, task.ID) + Database.Exec(processQuery, task.ID) log.Println(fmt.Sprintf("Processing task %v", task.ID)) guild, err := s.Guild(task.GuildID) if err != nil { @@ -65,7 +67,7 @@ func processTask(task *Task, s *discordgo.Session) { func getTasksToRun() []Task { query := "SELECT id, type, content, guild_id, channel_id, user_id, creation_time, trigger_time " + - "from tasks where completed is false and trigger_time < $1" + "from tasks where completed is false and processing is false and trigger_time < $1" res, err := Database.Query(query, time.Now()) if err != nil { log.Println(err) @@ -80,6 +82,22 @@ func getTasksToRun() []Task { tasks = append(tasks, t) } + // get tasks that have been processing for more than 10 seconds + query = "SELECT id, type, content, guild_id, channel_id, user_id, creation_time, trigger_time " + + "from tasks where completed is false and processing is true and trigger_time < $1" + res, err = Database.Query(query, time.Now().Add(-time.Second*10)) + if err != nil { + log.Println(err) + } + for res.Next() { + var t Task + err = res.Scan(&t.ID, &t.Type, &t.Content, &t.GuildID, &t.ChannelID, &t.UserID, &t.CreationTime, &t.TriggerTime) + if err != nil { + log.Println(err) + } + tasks = append(tasks, t) + } + return tasks }