Reorg and add services

This commit is contained in:
Dustin Pianalto
2020-10-09 21:34:47 -08:00
parent 5cd626a5a4
commit 6a33cceebb
19 changed files with 658 additions and 432 deletions
+134
View File
@@ -0,0 +1,134 @@
package tasks
import (
"fmt"
"log"
"time"
"github.com/bwmarrin/discordgo"
"github.com/dustinpianalto/goff/internal/postgres"
)
type Task struct {
ID int64
Type string
Content string
GuildID string
ChannelID string
UserID string
CreationTime time.Time
TriggerTime time.Time
}
func processTask(task *Task, s *discordgo.Session) {
query := "SELECT completed, processing from tasks where id = $1"
res, err := postgres.DB.Query(query, task.ID)
if err != nil {
log.Println(err)
return
}
var completed bool
var processing bool
res.Next()
err = res.Scan(&completed, &processing)
if err != nil {
log.Println(err)
return
}
if completed || processing {
return
}
closeQuery := "Update tasks set completed = true where id = $1"
processQuery := "UPDATE tasks SET processing = true WHERE id = $1"
defer postgres.DB.Exec(closeQuery, task.ID)
_, err = postgres.DB.Exec(processQuery, task.ID)
if err != nil {
log.Println(err)
return
}
log.Println(fmt.Sprintf("Processing task %v", task.ID))
guild, err := s.Guild(task.GuildID)
if err != nil {
log.Print(fmt.Sprintf("Can't find guild with ID %v. Canceling task %v.", task.GuildID, task.ID))
return
}
channel, err := s.Channel(task.ChannelID)
if err != nil {
log.Print(fmt.Sprintf("Can't find channel with ID %v. Canceling task %v.", task.ChannelID, task.ID))
return
}
if channel.GuildID != guild.ID {
log.Print(fmt.Sprintf("The channel %v is not in guild %v. Canceling task %v.", channel.Name, guild.Name, task.ID))
return
}
member, err := s.GuildMember(guild.ID, task.UserID)
if err != nil {
log.Print(fmt.Sprintf("Can't find user with ID %v in guild %v. Canceling task %v.", task.UserID, guild.Name, task.ID))
return
}
if task.Type == "Reminder" {
color := s.State.UserColor(member.User.ID, channel.ID)
e := discordgo.MessageEmbed{
Title: "REMINDER",
Description: task.Content,
Timestamp: task.CreationTime.Format(time.RFC3339),
Color: color,
Footer: &discordgo.MessageEmbedFooter{
Text: "Created: ",
},
}
msg := discordgo.MessageSend{
Content: member.Mention(),
Embed: &e,
}
_, err = s.ChannelMessageSendComplex(channel.ID, &msg)
if err != nil {
log.Println(err)
}
}
processQuery = "UPDATE tasks SET processing = false WHERE id = $1"
_, err = postgres.DB.Exec(processQuery, task.ID)
if err != nil {
log.Println(err)
}
}
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 processing is false and trigger_time < $1"
res, err := postgres.DB.Query(query, time.Now())
if err != nil {
log.Println(err)
}
var tasks []Task
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)
}
for _, task := range tasks {
if task.ID == t.ID {
continue
}
}
tasks = append(tasks, t)
}
return tasks
}
func ProcessTasks(s *discordgo.Session, interval int) {
for {
time.Sleep(time.Duration(interval * 1e9))
tasks := getTasksToRun()
if len(tasks) > 0 {
for _, t := range tasks {
go processTask(&t, s)
}
}
}
}
+66
View File
@@ -0,0 +1,66 @@
package tasks
import (
"errors"
"fmt"
"strings"
"time"
"github.com/dustinpianalto/disgoman"
"github.com/dustinpianalto/goff/internal/postgres"
"github.com/olebedev/when"
"github.com/olebedev/when/rules/common"
"github.com/olebedev/when/rules/en"
)
var AddReminderCommand = &disgoman.Command{
Name: "remind",
Aliases: nil,
Description: "Remind me at a later time",
OwnerOnly: false,
Hidden: false,
RequiredPermissions: 0,
Invoke: addReminderFunc,
}
func addReminderFunc(ctx disgoman.Context, args []string) {
w := when.New(nil)
w.Add(en.All...)
w.Add(common.All...)
text := strings.Join(args, " ")
r, err := w.Parse(text, time.Now())
if err != nil {
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
Context: ctx,
Message: "Error parsing time",
Error: err,
}
return
}
if r == nil {
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
Context: ctx,
Message: "You need to include a valid time",
Error: errors.New("no time found"),
}
return
}
content := strings.Replace(text, r.Text+" ", "", 1)
query := "INSERT INTO tasks (type, content, guild_id, channel_id, user_id, trigger_time) " +
"VALUES ('Reminder', $1, $2, $3, $4, $5)"
_, err = postgres.DB.Exec(query, content, ctx.Guild.ID, ctx.Channel.ID, ctx.User.ID, r.Time)
if err != nil {
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
Context: ctx,
Message: "Error adding task to database",
Error: err,
}
return
}
_ = ctx.Session.MessageReactionAdd(ctx.Channel.ID, ctx.Message.ID, "✅")
_, _ = ctx.Session.ChannelMessageSend(
ctx.Channel.ID,
fmt.Sprintf("I will remind you at %v, with `%v`", r.Time.Format(time.RFC1123), content),
)
}