From e19f987c4edf8dd8844d70bd5b0d459e5c866cdf Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Sun, 24 Jan 2021 22:57:55 -0900 Subject: [PATCH] add request command --- channel.go | 1 + go.mod | 1 + guild.go | 1 + internal/database/channel.go | 18 +++++++++ internal/database/guild.go | 12 ++++++ internal/database/user.go | 13 ++++++ internal/exts/requests/requests.go | 63 ++++++++++++++++++++++++++++++ message.go | 7 +++- user.go | 1 + 9 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 internal/exts/requests/requests.go diff --git a/channel.go b/channel.go index 827d20d..68dacb9 100644 --- a/channel.go +++ b/channel.go @@ -14,4 +14,5 @@ type ChannelService interface { DeleteChannel(c Channel) error GuildChannels(g Guild) ([]Channel, error) UpdateChannel(c Channel) (Channel, error) + GetOrCreateChannel(id string, guild_id string) (Channel, error) } diff --git a/go.mod b/go.mod index e136f85..53b6c69 100644 --- a/go.mod +++ b/go.mod @@ -9,4 +9,5 @@ require ( github.com/golang-migrate/migrate v3.5.4+incompatible // indirect github.com/golang-migrate/migrate/v4 v4.14.1 github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/lib/pq v1.8.0 ) diff --git a/guild.go b/guild.go index faf1195..5d4d98e 100644 --- a/guild.go +++ b/guild.go @@ -24,4 +24,5 @@ type GuildService interface { Role(id string) (Role, error) UpdateRole(r Role) (Role, error) DeleteRole(r Role) error + GetOrCreateGuild(id string) (Guild, error) } diff --git a/internal/database/channel.go b/internal/database/channel.go index 196898d..72da340 100644 --- a/internal/database/channel.go +++ b/internal/database/channel.go @@ -66,3 +66,21 @@ func (s channelService) GuildChannels(g geeksbot.Guild) ([]geeksbot.Channel, err } return channels, nil } + +func (s channelService) GetOrCreateChannel(id string, guild_id string) (geeksbot.Channel, error) { + channel, err := s.Channel(id) + if err == sql.ErrNoRows { + guild, err := GuildService.GetOrCreateGuild(guild_id) + if err != nil { + return geeksbot.Channel{}, err + } + channel, err = s.CreateChannel(geeksbot.Channel{ + ID: id, + Guild: guild, + Admin: false, + Default: false, + NewPatron: false, + }) + } + return channel, err +} diff --git a/internal/database/guild.go b/internal/database/guild.go index 8337893..91b80a7 100644 --- a/internal/database/guild.go +++ b/internal/database/guild.go @@ -99,3 +99,15 @@ func (s guildService) DeleteRole(r geeksbot.Role) error { _, err := s.db.Exec(queryString, r.ID) return err } + +func (s guildService) GetOrCreateGuild(id string) (geeksbot.Guild, error) { + guild, err := s.Guild(id) + if err == sql.ErrNoRows { + guild = geeksbot.Guild{ + ID: id, + Prefixes: []string{}, + } + guild, err = s.CreateGuild(guild) + } + return guild, err +} diff --git a/internal/database/user.go b/internal/database/user.go index 2925b6f..d9b0884 100644 --- a/internal/database/user.go +++ b/internal/database/user.go @@ -36,3 +36,16 @@ func (s userService) UpdateUser(u geeksbot.User) (geeksbot.User, error) { _, err := s.db.Exec(queryString, u.ID, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin) return u, err } + +func (s userService) GetOrCreateUser(id string) (geeksbot.User, error) { + user, err := s.User(id) + if err == sql.ErrNoRows { + user, err = s.CreateUser(geeksbot.User{ + ID: id, + IsActive: true, + IsAdmin: false, + IsStaff: false, + }) + } + return user, err +} diff --git a/internal/exts/requests/requests.go b/internal/exts/requests/requests.go new file mode 100644 index 0000000..646a5b2 --- /dev/null +++ b/internal/exts/requests/requests.go @@ -0,0 +1,63 @@ +package requests + +import ( + "strconv" + "strings" + + "github.com/dustinpianalto/disgoman" + "github.com/dustinpianalto/geeksbot" + "github.com/dustinpianalto/geeksbot/internal/discord_utils" + "github.com/dustinpianalto/geeksbot/internal/services" +) + +var RequestCommand = &disgoman.Command{ + Name: "request", + Aliases: nil, + Description: "Submit a request for the guild staff", + OwnerOnly: false, + Hidden: false, + RequiredPermissions: 0, + Invoke: requestCommandFunc, +} + +func requestCommandFunc(ctx disgoman.Context, args []string) { + guild, err := services.GuildService.GetOrCreateGuild(ctx.Guild.ID) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Error getting Guild from the database", err) + return + } + requestMsg := strings.Join(args, " ") + author, err := services.UserService.GetOrCreateUser(ctx.Message.Author.ID) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Error creating the request", err) + return + } + channel, err := services.ChannelService.GetOrCreateChannel(ctx.Message.ChannelID, ctx.Guild.ID) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Error creating the request", err) + return + } + int64ID, _ := strconv.ParseInt(ctx.Message.ID, 10, 64) + s := discord_utils.ParseSnowflake(int64ID) + message, err := services.MessageService.CreateMessage(geeksbot.Message{ + ID: ctx.Message.ID, + CreatedAt: s.CreationTime, + Content: ctx.Message.Content, + Channel: channel, + Author: author, + }) + request := geeksbot.Request{ + Author: author, + Channel: channel, + Guild: guild, + Content: requestMsg, + RequestedAt: s.CreationTime, + Completed: false, + Message: message, + } + request, err = services.RequestService.CreateRequest(request) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Error creating the request", err) + return + } +} diff --git a/message.go b/message.go index 8445bac..8ebe4a9 100644 --- a/message.go +++ b/message.go @@ -1,10 +1,13 @@ package geeksbot -import "database/sql" +import ( + "database/sql" + "time" +) type Message struct { ID string - CreatedAt int64 + CreatedAt time.Time ModifiedAt sql.NullTime Content string PreviousContent []string diff --git a/user.go b/user.go index dcba7c9..896ec01 100644 --- a/user.go +++ b/user.go @@ -15,4 +15,5 @@ type UserService interface { CreateUser(u User) (User, error) DeleteUser(u User) error UpdateUser(u User) (User, error) + GetOrCreateUser(id string) (User, error) }