diff --git a/Dockerfile b/Dockerfile index e5c5618..37eec23 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,9 +7,9 @@ COPY ./go.sum . RUN go mod download COPY . . -RUN go install github.com/dustinpianalto/goff +RUN go install github.com/dustinpianalto/goff/... -CMD [ "go", "run", "goff.go"] +CMD [ "go", "run", "cmd/goff/main.go"] from alpine diff --git a/cmd/goff/main b/cmd/goff/main new file mode 100755 index 0000000..cad5eac Binary files /dev/null and b/cmd/goff/main differ diff --git a/cmd/goff/main.go b/cmd/goff/main.go new file mode 100644 index 0000000..06d1d68 --- /dev/null +++ b/cmd/goff/main.go @@ -0,0 +1,147 @@ +package main + +import ( + "fmt" + "log" + + "github.com/dustinpianalto/disgoman" + "github.com/dustinpianalto/goff" + "github.com/dustinpianalto/goff/internal/events" + "github.com/dustinpianalto/goff/internal/exts" + "github.com/dustinpianalto/goff/internal/postgres" + "github.com/dustinpianalto/goff/pkg/email" + + //"github.com/MikeModder/anpan" + "os" + "os/signal" + "syscall" + + "github.com/bwmarrin/discordgo" +) + +var ( + Token string +) + +//func init() { +// flag.StringVar(&Token, "t", "", "Bot Token") +// flag.Parse() +//} + +func main() { + Token = os.Getenv("DISCORDGO_TOKEN") + dg, err := discordgo.New("Bot " + Token) + if err != nil { + fmt.Println("There was an error when creating the Discord Session, ", err) + return + } + dg.State.MaxMessageCount = 100 + dg.StateEnabled = true + + dg.Identify = discordgo.Identify{ + Intents: discordgo.MakeIntent(discordgo.IntentsAll), + } + + postgres.ConnectDatabase(os.Getenv("DATABASE_URL")) + postgres.InitializeDatabase() + //utils.LoadTestData() + + us := &postgres.UserService{DB: postgres.DB} + gs := &postgres.GuildService{DB: postgres.DB} + + //prefixes := []string{ + // "Go.", + //} + owners := []string{ + "351794468870946827", + } + + manager := disgoman.CommandManager{ + Prefixes: getPrefixes, + Owners: owners, + StatusManager: disgoman.GetDefaultStatusManager(), + ErrorChannel: make(chan disgoman.CommandError, 10), + Commands: make(map[string]*disgoman.Command), + IgnoreBots: true, + CheckPermissions: false, + } + + goffManager := goff.CommandManager{ + UserService: us, + GuildService: gs, + CommandManager: manager, + } + + // Add Command Handlers + exts.AddCommandHandlers(&goffManager) + + //if _, ok := handler.Commands["help"]; !ok { + // handler.AddDefaultHelpCommand() + //} + + dg.AddHandler(goffManager.OnMessage) + dg.AddHandler(goffManager.StatusManager.OnReady) + dg.AddHandler(events.OnMessageUpdate) + dg.AddHandler(events.OnMessageDelete) + dg.AddHandler(events.OnGuildMemberAddLogging) + dg.AddHandler(events.OnGuildMemberRemoveLogging) + + err = dg.Open() + if err != nil { + fmt.Println("There was an error opening the connection, ", err) + return + } + + // Start the Error handler in a goroutine + go ErrorHandler(goffManager.ErrorChannel) + + // Start the Logging handler in a goroutine + go events.LoggingHandler(events.LoggingChannel) + + // Start the task handler in a goroutine + go events.ProcessTasks(dg, 1) + + go email.RecieveEmail(dg) + + fmt.Println("The Bot is now running.") + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) + <-sc + + fmt.Println("Shutting Down...") + err = dg.Close() + if err != nil { + fmt.Println(err) + } +} + +func getPrefixes(guildID string) []string { + queryString := "Select prefix from prefixes p, x_guilds_prefixes xgp where xgp.guild_id = $1 and xgp.prefix_id = p.id" + rows, err := postgres.DB.Query(queryString, guildID) + if err != nil { + log.Println(err) + return []string{"Go.", "go."} + } + var prefixes []string + for rows.Next() { + var prefix string + err = rows.Scan(&prefix) + if err != nil { + log.Println(err) + return []string{"Go.", "go."} + } + prefixes = append(prefixes, prefix) + } + return prefixes +} + +func ErrorHandler(ErrorChan chan disgoman.CommandError) { + for ce := range ErrorChan { + msg := ce.Message + if msg == "" { + msg = ce.Error.Error() + } + _, _ = ce.Context.Send(msg) + fmt.Println(ce.Error) + } +} diff --git a/go.mod b/go.mod index 6d9586c..f4ae69b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/bwmarrin/discordgo v0.22.0 - github.com/dustinpianalto/disgoman v0.0.12 + github.com/dustinpianalto/disgoman v0.0.15 github.com/dustinpianalto/rpnparse v1.0.1 github.com/emersion/go-imap v1.0.5 github.com/emersion/go-message v0.12.0 diff --git a/go.sum b/go.sum index cf05f55..f7ae336 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,10 @@ github.com/dustinpianalto/disgoman v0.0.10 h1:UzmvMpOi4peF59tXGaNfVU+ePHs1hILa6g github.com/dustinpianalto/disgoman v0.0.10/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= github.com/dustinpianalto/disgoman v0.0.12 h1:dLptU2ZTUZJaLBOKeE6qjuL8gqdAr6ehHSOtfHmUpL8= github.com/dustinpianalto/disgoman v0.0.12/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= +github.com/dustinpianalto/disgoman v0.0.14 h1:hsk56JATBE5eH5GPCDGeiTdYxok4m+edSYiYz5Uj8uo= +github.com/dustinpianalto/disgoman v0.0.14/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= +github.com/dustinpianalto/disgoman v0.0.15 h1:kdIw6jhC82WBut7+4BarqxBw06dozU+Hu47LQzkkoGM= +github.com/dustinpianalto/disgoman v0.0.15/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= github.com/dustinpianalto/rpnparse v1.0.1 h1:ZvH1/RIe5hh3RGSAXOgtngEDHNPTF+DMh88XFWpQjzY= github.com/dustinpianalto/rpnparse v1.0.1/go.mod h1:SzFbQb+Eed5gYCtDu/SYEXXwdPtWkDg9oaL1xQtN1BY= github.com/emersion/go-imap v1.0.5 h1:8xg/d2wo2BBP3AEP5AOaM/6i8887RGyVW2st/IVHWUw= diff --git a/goff.go b/goff.go index fc2a384..bf84c15 100644 --- a/goff.go +++ b/goff.go @@ -1,141 +1,9 @@ -package main +package goff -import ( - "fmt" - "log" +import "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/events" - "github.com/dustinpianalto/goff/exts" - "github.com/dustinpianalto/goff/utils" - - //"github.com/MikeModder/anpan" - "os" - "os/signal" - "syscall" - - "github.com/bwmarrin/discordgo" -) - -var ( - Token string -) - -//func init() { -// flag.StringVar(&Token, "t", "", "Bot Token") -// flag.Parse() -//} - -func main() { - Token = os.Getenv("DISCORDGO_TOKEN") - dg, err := discordgo.New("Bot " + Token) - if err != nil { - fmt.Println("There was an error when creating the Discord Session, ", err) - return - } - dg.State.MaxMessageCount = 100 - dg.StateEnabled = true - - dg.Identify = discordgo.Identify{ - Intents: discordgo.MakeIntent(discordgo.IntentsAll), - } - - utils.ConnectDatabase(os.Getenv("DATABASE_URL")) - utils.InitializeDatabase() - //utils.LoadTestData() - - //prefixes := []string{ - // "Go.", - //} - owners := []string{ - "351794468870946827", - } - - // Arguments are: - // prefixes - []string - // owner ids - []string - // ignore bots - bool - // check perms - bool - handler := disgoman.CommandManager{ - Prefixes: getPrefixes, - Owners: owners, - StatusManager: disgoman.GetDefaultStatusManager(), - ErrorChannel: make(chan disgoman.CommandError, 10), - Commands: make(map[string]*disgoman.Command), - IgnoreBots: true, - CheckPermissions: false, - } - - // Add Command Handlers - exts.AddCommandHandlers(&handler) - - //if _, ok := handler.Commands["help"]; !ok { - // handler.AddDefaultHelpCommand() - //} - - dg.AddHandler(handler.OnMessage) - dg.AddHandler(handler.StatusManager.OnReady) - dg.AddHandler(events.OnMessageUpdate) - dg.AddHandler(events.OnMessageDelete) - dg.AddHandler(events.OnGuildMemberAddLogging) - dg.AddHandler(events.OnGuildMemberRemoveLogging) - - err = dg.Open() - if err != nil { - fmt.Println("There was an error opening the connection, ", err) - return - } - - // Start the Error handler in a goroutine - go ErrorHandler(handler.ErrorChannel) - - // Start the Logging handler in a goroutine - go utils.LoggingHandler(utils.LoggingChannel) - - // Start the task handler in a goroutine - go utils.ProcessTasks(dg, 1) - - go utils.RecieveEmail(dg) - - fmt.Println("The Bot is now running.") - sc := make(chan os.Signal, 1) - signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) - <-sc - - fmt.Println("Shutting Down...") - err = dg.Close() - if err != nil { - fmt.Println(err) - } -} - -func getPrefixes(guildID string) []string { - queryString := "Select prefix from prefixes p, x_guilds_prefixes xgp where xgp.guild_id = $1 and xgp.prefix_id = p.id" - rows, err := utils.Database.Query(queryString, guildID) - if err != nil { - log.Println(err) - return []string{"Go.", "go."} - } - var prefixes []string - for rows.Next() { - var prefix string - err = rows.Scan(&prefix) - if err != nil { - log.Println(err) - return []string{"Go.", "go."} - } - prefixes = append(prefixes, prefix) - } - return prefixes -} - -func ErrorHandler(ErrorChan chan disgoman.CommandError) { - for ce := range ErrorChan { - msg := ce.Message - if msg == "" { - msg = ce.Error.Error() - } - _, _ = ce.Context.Send(msg) - fmt.Println(ce.Error) - } +type CommandManager struct { + UserService UserService + GuildService GuildService + disgoman.CommandManager } diff --git a/guild.go b/guild.go index b58e704..f99eaaf 100644 --- a/guild.go +++ b/guild.go @@ -1,4 +1,4 @@ -package main +package goff import "database/sql" @@ -10,11 +10,11 @@ type Guild struct { WelcomeChannel string PuzzleChannel string PuzzleRole sql.NullString + Prefixes []string } type GuildService interface { Guild(id string) (*Guild, error) - Guilds() ([]*Guild, error) CreateGuild(g *Guild) error DeleteGuild(g *Guild) error GuildUsers(g *Guild) ([]*User, error) diff --git a/utils/date_strings.go b/internal/discord_utils/date_strings.go similarity index 98% rename from utils/date_strings.go rename to internal/discord_utils/date_strings.go index 510288d..f55d808 100644 --- a/utils/date_strings.go +++ b/internal/discord_utils/date_strings.go @@ -1,4 +1,4 @@ -package utils +package discord_utils import ( "fmt" diff --git a/utils/snowflake.go b/internal/discord_utils/snowflake.go similarity index 97% rename from utils/snowflake.go rename to internal/discord_utils/snowflake.go index f26978c..d521086 100644 --- a/utils/snowflake.go +++ b/internal/discord_utils/snowflake.go @@ -1,4 +1,4 @@ -package utils +package discord_utils import "time" diff --git a/utils/logging.go b/internal/events/logging.go similarity index 78% rename from utils/logging.go rename to internal/events/logging.go index c3415c4..ba33afa 100644 --- a/utils/logging.go +++ b/internal/events/logging.go @@ -1,8 +1,10 @@ -package utils +package events import ( "fmt" + "github.com/bwmarrin/discordgo" + "github.com/dustinpianalto/goff/internal/postgres" ) var LoggingChannel = make(chan *LogEvent, 10) @@ -19,7 +21,7 @@ type LogEvent struct { func LoggingHandler(lc chan *LogEvent) { for event := range lc { var channelID string - row := Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", event.GuildID) + row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", event.GuildID) err := row.Scan(&channelID) if err != nil { fmt.Println(err) diff --git a/events/member_events.go b/internal/events/member_events.go similarity index 87% rename from events/member_events.go rename to internal/events/member_events.go index b56e7b9..1e8b926 100644 --- a/events/member_events.go +++ b/internal/events/member_events.go @@ -7,7 +7,8 @@ import ( "time" "github.com/bwmarrin/discordgo" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/discord_utils" + "github.com/dustinpianalto/goff/internal/postgres" ) func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMemberAdd) { @@ -17,7 +18,7 @@ func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMember } }() var channelID string - row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID) + row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID) err := row.Scan(&channelID) if err != nil || channelID == "" { return @@ -40,11 +41,11 @@ func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMember } int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64) - snow := utils.ParseSnowflake(int64ID) + snow := discord_utils.ParseSnowflake(int64ID) field := &discordgo.MessageEmbedField{ Name: "User was created:", - Value: utils.ParseDateString(snow.CreationTime), + Value: discord_utils.ParseDateString(snow.CreationTime), Inline: false, } @@ -73,7 +74,7 @@ func OnGuildMemberRemoveLogging(s *discordgo.Session, member *discordgo.GuildMem }() timeNow := time.Now() var channelID string - row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID) + row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID) err := row.Scan(&channelID) if err != nil || channelID == "" { return @@ -103,7 +104,7 @@ func OnGuildMemberRemoveLogging(s *discordgo.Session, member *discordgo.GuildMem for _, log := range al.AuditLogEntries { if log.TargetID == member.User.ID { int64ID, _ := strconv.ParseInt(log.ID, 10, 64) - logSnow := utils.ParseSnowflake(int64ID) + logSnow := discord_utils.ParseSnowflake(int64ID) if timeNow.Sub(logSnow.CreationTime).Seconds() <= 10 { user, err := s.User(log.UserID) if err == nil { @@ -142,7 +143,7 @@ func AddMemberToDatabase(s *discordgo.Session, m *discordgo.GuildMemberAdd) { }() queryString := `INSERT INTO users (id, banned, logging, is_active, is_staff, is_admin) VALUES ($1, false, false, true, false, false)` - _, err := utils.Database.Exec(queryString, m.User.ID) + _, err := postgres.DB.Exec(queryString, m.User.ID) if err != nil { log.Println(fmt.Errorf("error inserting %s into database: %w", m.User.ID, err)) return @@ -157,7 +158,7 @@ func MarkMemberInactive(s *discordgo.Session, m *discordgo.GuildMemberRemove) { } }() queryString := `UPDATE users SET is_active = false WHERE id = $1` - _, err := utils.Database.Exec(queryString, m.User.ID) + _, err := postgres.DB.Exec(queryString, m.User.ID) if err != nil { log.Println(fmt.Errorf("error marking %s as inactive: %w", m.User.ID, err)) return diff --git a/events/message_events.go b/internal/events/message_events.go similarity index 91% rename from events/message_events.go rename to internal/events/message_events.go index 5167a82..dd16996 100644 --- a/events/message_events.go +++ b/internal/events/message_events.go @@ -5,7 +5,7 @@ import ( "log" "github.com/bwmarrin/discordgo" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/postgres" ) func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) { @@ -19,7 +19,7 @@ func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) { return } var channelID string - row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID) + row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID) err := row.Scan(&channelID) if err != nil || channelID == "" { return @@ -56,7 +56,7 @@ func OnMessageDelete(session *discordgo.Session, m *discordgo.MessageDelete) { return } var channelID string - row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID) + row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID) err := row.Scan(&channelID) if err != nil || channelID == "" { return diff --git a/utils/tasks.go b/internal/events/tasks.go similarity index 90% rename from utils/tasks.go rename to internal/events/tasks.go index 3af8494..328ca34 100644 --- a/utils/tasks.go +++ b/internal/events/tasks.go @@ -1,10 +1,12 @@ -package utils +package events import ( "fmt" - "github.com/bwmarrin/discordgo" "log" "time" + + "github.com/bwmarrin/discordgo" + "github.com/dustinpianalto/goff/internal/postgres" ) type Task struct { @@ -20,7 +22,7 @@ type Task struct { func processTask(task *Task, s *discordgo.Session) { query := "SELECT completed, processing from tasks where id = $1" - res, err := Database.Query(query, task.ID) + res, err := postgres.DB.Query(query, task.ID) if err != nil { log.Println(err) return @@ -38,8 +40,8 @@ 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) - _, err = Database.Exec(processQuery, task.ID) + defer postgres.DB.Exec(closeQuery, task.ID) + _, err = postgres.DB.Exec(processQuery, task.ID) if err != nil { log.Println(err) return @@ -85,7 +87,7 @@ func processTask(task *Task, s *discordgo.Session) { } } processQuery = "UPDATE tasks SET processing = false WHERE id = $1" - _, err = Database.Exec(processQuery, task.ID) + _, err = postgres.DB.Exec(processQuery, task.ID) if err != nil { log.Println(err) } @@ -95,7 +97,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 processing is false and trigger_time < $1" - res, err := Database.Query(query, time.Now()) + res, err := postgres.DB.Query(query, time.Now()) if err != nil { log.Println(err) } diff --git a/exts/P_interpreter.go b/internal/exts/P_interpreter.go similarity index 91% rename from exts/P_interpreter.go rename to internal/exts/P_interpreter.go index 57f4b77..7a20dc3 100644 --- a/exts/P_interpreter.go +++ b/internal/exts/P_interpreter.go @@ -3,8 +3,9 @@ package exts import ( "errors" "fmt" - "github.com/dustinpianalto/disgoman" "strings" + + "github.com/dustinpianalto/disgoman" ) func pCommand(ctx disgoman.Context, args []string) { @@ -57,7 +58,7 @@ func pCommand(ctx disgoman.Context, args []string) { } } } else { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: fmt.Sprintf("Invalid Character: %v", input[i]), Error: errors.New("invalid character"), @@ -73,7 +74,7 @@ func pCommand(ctx disgoman.Context, args []string) { } _, err := ctx.Send(string(out)) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't send results", Error: err, diff --git a/exts/fun.go b/internal/exts/fun.go similarity index 100% rename from exts/fun.go rename to internal/exts/fun.go diff --git a/exts/guild.go b/internal/exts/guild.go similarity index 69% rename from exts/guild.go rename to internal/exts/guild.go index a75990c..9be10ba 100644 --- a/exts/guild.go +++ b/internal/exts/guild.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/postgres" ) // Guild management commands @@ -23,9 +23,9 @@ func loggingChannel(ctx disgoman.Context, args []string) { } fmt.Println(idString) if idString == "" { - _, err := utils.Database.Exec("UPDATE guilds SET logging_channel='' WHERE id=$1;", ctx.Guild.ID) + _, err := postgres.DB.Exec("UPDATE guilds SET logging_channel='' WHERE id=$1;", ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -37,7 +37,7 @@ func loggingChannel(ctx disgoman.Context, args []string) { } channel, err := ctx.Session.State.Channel(idString) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that channel.", Error: err, @@ -45,16 +45,16 @@ func loggingChannel(ctx disgoman.Context, args []string) { return } if channel.GuildID != ctx.Guild.ID { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "The channel passed is not in this guild.", Error: err, } return } - _, err = utils.Database.Exec("UPDATE guilds SET logging_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID) + _, err = postgres.DB.Exec("UPDATE guilds SET logging_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -66,11 +66,11 @@ func loggingChannel(ctx disgoman.Context, args []string) { func getLoggingChannel(ctx disgoman.Context, _ []string) { var channelID string - row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", ctx.Guild.ID) + row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", ctx.Guild.ID) err := row.Scan(&channelID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error getting data from the database.", Error: err, @@ -84,7 +84,7 @@ func getLoggingChannel(ctx disgoman.Context, _ []string) { channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I got the channel ID but it does not appear to be a valid channel in this guild.", Error: err, @@ -107,9 +107,9 @@ func welcomeChannel(ctx disgoman.Context, args []string) { } fmt.Println(idString) if idString == "" { - _, err := utils.Database.Exec("UPDATE guilds SET welcome_channel='' WHERE id=$1;", ctx.Guild.ID) + _, err := postgres.DB.Exec("UPDATE guilds SET welcome_channel='' WHERE id=$1;", ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -121,7 +121,7 @@ func welcomeChannel(ctx disgoman.Context, args []string) { } channel, err := ctx.Session.State.Channel(idString) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that channel.", Error: err, @@ -129,16 +129,16 @@ func welcomeChannel(ctx disgoman.Context, args []string) { return } if channel.GuildID != ctx.Guild.ID { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "The channel passed is not in this guild.", Error: err, } return } - _, err = utils.Database.Exec("UPDATE guilds SET welcome_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID) + _, err = postgres.DB.Exec("UPDATE guilds SET welcome_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -151,11 +151,11 @@ func welcomeChannel(ctx disgoman.Context, args []string) { func getWelcomeChannel(ctx disgoman.Context, _ []string) { var channelID string - row := utils.Database.QueryRow("SELECT welcome_channel FROM guilds where id=$1", ctx.Guild.ID) + row := postgres.DB.QueryRow("SELECT welcome_channel FROM guilds where id=$1", ctx.Guild.ID) err := row.Scan(&channelID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error getting data from the database.", Error: err, @@ -169,7 +169,7 @@ func getWelcomeChannel(ctx disgoman.Context, _ []string) { channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I got the channel ID but it does not appear to be a valid channel in this guild.", Error: err, @@ -181,10 +181,10 @@ func getWelcomeChannel(ctx disgoman.Context, _ []string) { func addGuildCommand(ctx disgoman.Context, args []string) { var guildID string - row := utils.Database.QueryRow("SELECT id FROM guilds where id=$1", ctx.Guild.ID) + row := postgres.DB.QueryRow("SELECT id FROM guilds where id=$1", ctx.Guild.ID) err := row.Scan(&guildID) if err == nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "This guild is already in my database", Error: err, @@ -192,10 +192,10 @@ func addGuildCommand(ctx disgoman.Context, args []string) { return } - _, err = utils.Database.Query("INSERT INTO guilds (id) VALUES ($1)", ctx.Guild.ID) + _, err = postgres.DB.Query("INSERT INTO guilds (id) VALUES ($1)", ctx.Guild.ID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "There was a problem inserting this guild into the database", Error: err, @@ -218,9 +218,9 @@ func puzzleChannel(ctx disgoman.Context, args []string) { } fmt.Println(idString) if idString == "" { - _, err := utils.Database.Exec("UPDATE guilds SET puzzle_channel='' WHERE id=$1;", ctx.Guild.ID) + _, err := postgres.DB.Exec("UPDATE guilds SET puzzle_channel='' WHERE id=$1;", ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -232,7 +232,7 @@ func puzzleChannel(ctx disgoman.Context, args []string) { } channel, err := ctx.Session.State.Channel(idString) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that channel.", Error: err, @@ -240,16 +240,16 @@ func puzzleChannel(ctx disgoman.Context, args []string) { return } if channel.GuildID != ctx.Guild.ID { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "The channel passed is not in this guild.", Error: err, } return } - _, err = utils.Database.Exec("UPDATE guilds SET puzzle_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID) + _, err = postgres.DB.Exec("UPDATE guilds SET puzzle_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -261,11 +261,11 @@ func puzzleChannel(ctx disgoman.Context, args []string) { func getPuzzleChannel(ctx disgoman.Context, _ []string) { var channelID string - row := utils.Database.QueryRow("SELECT puzzle_channel FROM guilds where id=$1", ctx.Guild.ID) + row := postgres.DB.QueryRow("SELECT puzzle_channel FROM guilds where id=$1", ctx.Guild.ID) err := row.Scan(&channelID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error getting data from the database.", Error: err, @@ -279,7 +279,7 @@ func getPuzzleChannel(ctx disgoman.Context, _ []string) { channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I got the channel ID but it does not appear to be a valid channel in this guild.", Error: err, @@ -302,9 +302,9 @@ func puzzleRole(ctx disgoman.Context, args []string) { } fmt.Println(idString) if idString == "" { - _, err := utils.Database.Exec("UPDATE guilds SET puzzle_role=NULL WHERE id=$1;", ctx.Guild.ID) + _, err := postgres.DB.Exec("UPDATE guilds SET puzzle_role=NULL WHERE id=$1;", ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -316,25 +316,25 @@ func puzzleRole(ctx disgoman.Context, args []string) { } role, err := ctx.Session.State.Role(ctx.Guild.ID, idString) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that Role.", Error: err, } return } - _, err = utils.Database.Exec("INSERT INTO roles (id, guild_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", role.ID, ctx.Guild.ID) + _, err = postgres.DB.Exec("INSERT INTO roles (id, guild_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", role.ID, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, } return } - _, err = utils.Database.Exec("UPDATE guilds SET puzzle_role=$1 WHERE id=$2;", role.ID, ctx.Guild.ID) + _, err = postgres.DB.Exec("UPDATE guilds SET puzzle_role=$1 WHERE id=$2;", role.ID, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -346,11 +346,11 @@ func puzzleRole(ctx disgoman.Context, args []string) { func getPuzzleRole(ctx disgoman.Context, _ []string) { var roleID sql.NullString - row := utils.Database.QueryRow("SELECT puzzle_role FROM guilds where id=$1", ctx.Guild.ID) + row := postgres.DB.QueryRow("SELECT puzzle_role FROM guilds where id=$1", ctx.Guild.ID) err := row.Scan(&roleID) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error getting data from the database.", Error: err, @@ -364,7 +364,7 @@ func getPuzzleRole(ctx disgoman.Context, _ []string) { role, err := ctx.Session.State.Role(ctx.Guild.ID, roleID.String) if err != nil { fmt.Println(err) - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I got the role ID but it does not appear to be a valid role in this guild.", Error: err, diff --git a/exts/init.go b/internal/exts/init.go similarity index 99% rename from exts/init.go rename to internal/exts/init.go index 30e3317..e9f932b 100644 --- a/exts/init.go +++ b/internal/exts/init.go @@ -2,9 +2,10 @@ package exts import ( "github.com/dustinpianalto/disgoman" + "github.com/dustinpianalto/goff" ) -func AddCommandHandlers(h *disgoman.CommandManager) { +func AddCommandHandlers(h *goff.CommandManager) { // Arguments: // name - command name - string // desc - command description - string diff --git a/exts/roles.go b/internal/exts/roles.go similarity index 80% rename from exts/roles.go rename to internal/exts/roles.go index 35237e1..e3992ce 100644 --- a/exts/roles.go +++ b/internal/exts/roles.go @@ -7,7 +7,7 @@ import ( "github.com/bwmarrin/discordgo" "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/postgres" ) func makeRoleSelfAssignable(ctx disgoman.Context, args []string) { @@ -31,16 +31,16 @@ func makeRoleSelfAssignable(ctx disgoman.Context, args []string) { var role *discordgo.Role var err error if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that Role.", Error: err, } return } - _, err = utils.Database.Exec("INSERT INTO roles (id, guild_id, self_assignable) VALUES ($1, $2, true) ON CONFLICT (id) DO UPDATE SET self_assignable=true", role.ID, ctx.Guild.ID) + _, err = postgres.DB.Exec("INSERT INTO roles (id, guild_id, self_assignable) VALUES ($1, $2, true) ON CONFLICT (id) DO UPDATE SET self_assignable=true", role.ID, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -71,16 +71,16 @@ func removeSelfAssignableRole(ctx disgoman.Context, args []string) { var err error var role *discordgo.Role if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that Role.", Error: err, } return } - _, err = utils.Database.Exec("INSERT INTO roles (id, guild_id, self_assignable) VALUES ($1, $2, false) ON CONFLICT (id) DO UPDATE SET self_assignable=false", role.ID, ctx.Guild.ID) + _, err = postgres.DB.Exec("INSERT INTO roles (id, guild_id, self_assignable) VALUES ($1, $2, false) ON CONFLICT (id) DO UPDATE SET self_assignable=false", role.ID, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -111,7 +111,7 @@ func selfAssignRole(ctx disgoman.Context, args []string) { var role *discordgo.Role var err error if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that Role.", Error: err, @@ -123,9 +123,9 @@ func selfAssignRole(ctx disgoman.Context, args []string) { return } var selfAssignable bool - err = utils.Database.QueryRow("SELECT self_assignable FROM roles where id=$1", role.ID).Scan(&selfAssignable) + err = postgres.DB.QueryRow("SELECT self_assignable FROM roles where id=$1", role.ID).Scan(&selfAssignable) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -138,7 +138,7 @@ func selfAssignRole(ctx disgoman.Context, args []string) { } err = ctx.Session.GuildMemberRoleAdd(ctx.Guild.ID, ctx.User.ID, role.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "There was a problem adding that role to you.", Error: err, @@ -169,7 +169,7 @@ func unAssignRole(ctx disgoman.Context, args []string) { var role *discordgo.Role var err error if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Can't find that Role.", Error: err, @@ -181,9 +181,9 @@ func unAssignRole(ctx disgoman.Context, args []string) { return } var selfAssignable bool - err = utils.Database.QueryRow("SELECT self_assignable FROM roles where id=$1", role.ID).Scan(&selfAssignable) + err = postgres.DB.QueryRow("SELECT self_assignable FROM roles where id=$1", role.ID).Scan(&selfAssignable) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error Updating Database", Error: err, @@ -196,7 +196,7 @@ func unAssignRole(ctx disgoman.Context, args []string) { } err = ctx.Session.GuildMemberRoleRemove(ctx.Guild.ID, ctx.User.ID, role.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "There was a problem removing that role from you.", Error: err, diff --git a/exts/tags.go b/internal/exts/tags.go similarity index 72% rename from exts/tags.go rename to internal/exts/tags.go index 0d0ef91..7017a69 100644 --- a/exts/tags.go +++ b/internal/exts/tags.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/postgres" ) func addTagCommand(ctx disgoman.Context, input []string) { @@ -15,12 +15,12 @@ func addTagCommand(ctx disgoman.Context, input []string) { queryString := `SELECT tags.id, tags.tag, tags.content from tags WHERE tags.guild_id = $1 AND tags.tag = $2;` - row := utils.Database.QueryRow(queryString, ctx.Guild.ID, input[0]) + row := postgres.DB.QueryRow(queryString, ctx.Guild.ID, input[0]) var dest string if err := row.Scan(&dest); err != nil { tag := input[0] if tag == "" { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "That is not a valid tag name", Error: err, @@ -28,7 +28,7 @@ func addTagCommand(ctx disgoman.Context, input []string) { return } if len(input) <= 1 { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I got a name but no value", Error: err, @@ -37,7 +37,7 @@ func addTagCommand(ctx disgoman.Context, input []string) { } value := strings.Join(input[1:], " ") if value == "" { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "You have to include a content for the tag", Error: err, @@ -45,9 +45,9 @@ func addTagCommand(ctx disgoman.Context, input []string) { return } queryString = `INSERT INTO tags (tag, content, creator, guild_id) VALUES ($1, $2, $3, $4);` - _, err := utils.Database.Exec(queryString, tag, value, ctx.Message.Author.ID, ctx.Guild.ID) + _, err := postgres.DB.Exec(queryString, tag, value, ctx.Message.Author.ID, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "", Error: err, @@ -57,7 +57,7 @@ func addTagCommand(ctx disgoman.Context, input []string) { ctx.Send(fmt.Sprintf("Tag %v added successfully.", tag)) return } else { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "That tag already exists", Error: err, @@ -66,7 +66,7 @@ func addTagCommand(ctx disgoman.Context, input []string) { } } else { ctx.Send("You need to tell me what tag you want to add...") - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "You need to tell me what tag you want to add...", Error: errors.New("nothing to do"), @@ -80,9 +80,9 @@ func tagCommand(ctx disgoman.Context, args []string) { tagString := strings.Join(args, " ") queryString := `SELECT tags.id, tags.tag, tags.content from tags WHERE tags.guild_id = $1;` - rows, err := utils.Database.Query(queryString, ctx.Guild.ID) + rows, err := postgres.DB.Query(queryString, ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "", Error: err, @@ -96,14 +96,14 @@ func tagCommand(ctx disgoman.Context, args []string) { content string ) if err := rows.Scan(&id, &tag, &content); err != nil { - log.Fatal(err) + log.Println(err) } if tagString == tag { ctx.Send(content) return } } - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: fmt.Sprintf("Tag %v not found", args[0]), Error: err, @@ -112,7 +112,7 @@ func tagCommand(ctx disgoman.Context, args []string) { } } else { ctx.Send("I need a tag to fetch...") - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I need a tag to fetch...", Error: errors.New("nothing to do"), diff --git a/exts/tasks.go b/internal/exts/tasks.go similarity index 78% rename from exts/tasks.go rename to internal/exts/tasks.go index fa54327..c21ee79 100644 --- a/exts/tasks.go +++ b/internal/exts/tasks.go @@ -7,7 +7,7 @@ import ( "time" "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/postgres" "github.com/olebedev/when" "github.com/olebedev/when/rules/common" "github.com/olebedev/when/rules/en" @@ -21,7 +21,7 @@ func addReminderCommand(ctx disgoman.Context, args []string) { text := strings.Join(args, " ") r, err := w.Parse(text, time.Now()) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error parsing time", Error: err, @@ -29,7 +29,7 @@ func addReminderCommand(ctx disgoman.Context, args []string) { return } if r == nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "You need to include a valid time", Error: errors.New("no time found"), @@ -39,9 +39,9 @@ func addReminderCommand(ctx disgoman.Context, args []string) { 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 = utils.Database.Exec(query, content, ctx.Guild.ID, ctx.Channel.ID, ctx.User.ID, r.Time) + _, err = postgres.DB.Exec(query, content, ctx.Guild.ID, ctx.Channel.ID, ctx.User.ID, r.Time) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error adding task to database", Error: err, diff --git a/exts/user_management.go b/internal/exts/user_management.go similarity index 86% rename from exts/user_management.go rename to internal/exts/user_management.go index 08c5bc3..655a617 100644 --- a/exts/user_management.go +++ b/internal/exts/user_management.go @@ -8,7 +8,7 @@ import ( "github.com/bwmarrin/discordgo" "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/events" ) func kickUserCommand(ctx disgoman.Context, args []string) { @@ -26,7 +26,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) { err = errors.New("that is not a valid id") } if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't get that member", Error: err, @@ -35,7 +35,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) { } if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, member.User.ID); !higher { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "You must have a higher role than the person you are trying to kick", Error: errors.New("need higher role"), @@ -44,7 +44,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) { } if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, member.User.ID); !higher { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I don't have a high enough role to kick that person", Error: errors.New("need higher role"), @@ -62,7 +62,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) { err = ctx.Session.GuildMemberDeleteWithReason(ctx.Guild.ID, member.User.ID, auditReason) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: fmt.Sprintf("Something went wrong kicking %v", member.User.Username), Error: err, @@ -70,7 +70,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) { return } - event := &utils.LogEvent{ + event := &events.LogEvent{ Embed: discordgo.MessageEmbed{ Title: "User Kicked", Description: fmt.Sprintf( @@ -85,7 +85,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) { GuildID: ctx.Guild.ID, Session: ctx.Session, } - utils.LoggingChannel <- event + events.LoggingChannel <- event _, _ = ctx.Send(fmt.Sprintf("User %v#%v has been kicked.", member.User.Username, member.User.Discriminator)) } @@ -104,7 +104,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { err = errors.New("that is not a valid id") } if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't get that user", Error: err, @@ -114,7 +114,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { if higher, err := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, user.ID); err != nil { if err.Error() == "can't find caller member" { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Who are you?", Error: err, @@ -122,7 +122,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { return } } else if !higher { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "You must have a higher role than the person you are trying to ban", Error: errors.New("need higher role"), @@ -132,7 +132,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { if higher, err := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, user.ID); err != nil { if err.Error() == "can't find caller member" { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Who am I?", Error: err, @@ -140,7 +140,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { return } } else if !higher { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I don't have a high enough role to ban that person", Error: errors.New("need higher role"), @@ -162,7 +162,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { err = ctx.Session.GuildBanCreateWithReason(ctx.Guild.ID, user.ID, auditReason, days) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: fmt.Sprintf("Something went wrong banning %v", user.Username), Error: err, @@ -170,7 +170,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { return } - event := &utils.LogEvent{ + event := &events.LogEvent{ Embed: discordgo.MessageEmbed{ Title: "User Banned", Description: fmt.Sprintf( @@ -185,7 +185,7 @@ func banUserCommand(ctx disgoman.Context, args []string) { GuildID: ctx.Guild.ID, Session: ctx.Session, } - utils.LoggingChannel <- event + events.LoggingChannel <- event _, _ = ctx.Send(fmt.Sprintf("User %v#%v has been banned.", user.Username, user.Discriminator)) } @@ -204,7 +204,7 @@ func unbanUserCommand(ctx disgoman.Context, args []string) { err = errors.New("that is not a valid id") } if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't get that user", Error: err, @@ -214,7 +214,7 @@ func unbanUserCommand(ctx disgoman.Context, args []string) { bans, err := ctx.Session.GuildBans(ctx.Guild.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Error processing current bans", Error: err, @@ -225,14 +225,14 @@ func unbanUserCommand(ctx disgoman.Context, args []string) { if ban.User.ID == user.ID { err = ctx.Session.GuildBanDelete(ctx.Guild.ID, user.ID) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: fmt.Sprintf("Something went wrong unbanning %v", user.Username), Error: err, } return } - event := &utils.LogEvent{ + event := &events.LogEvent{ Embed: discordgo.MessageEmbed{ Title: "User Banned", Description: fmt.Sprintf( @@ -247,7 +247,7 @@ func unbanUserCommand(ctx disgoman.Context, args []string) { GuildID: ctx.Guild.ID, Session: ctx.Session, } - utils.LoggingChannel <- event + events.LoggingChannel <- event _, _ = ctx.Send(fmt.Sprintf("User %v#%v has been unbanned.", user.Username, user.Discriminator)) return } diff --git a/exts/utils.go b/internal/exts/utils.go similarity index 87% rename from exts/utils.go rename to internal/exts/utils.go index 4a0e3f6..924a6e0 100644 --- a/exts/utils.go +++ b/internal/exts/utils.go @@ -9,7 +9,7 @@ import ( "github.com/bwmarrin/discordgo" "github.com/dustinpianalto/disgoman" - "github.com/dustinpianalto/goff/utils" + "github.com/dustinpianalto/goff/internal/discord_utils" ) func pingCommand(ctx disgoman.Context, _ []string) { @@ -18,7 +18,7 @@ func pingCommand(ctx disgoman.Context, _ []string) { took := time.Now().Sub(timeBefore) _, err := ctx.Session.ChannelMessageEdit(ctx.Message.ChannelID, msg.ID, fmt.Sprintf("Pong!\nPing Took **%s**", took.String())) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Ping Failed", Error: err, @@ -39,7 +39,7 @@ func inviteCommand(ctx disgoman.Context, args []string) { url := fmt.Sprintf("", id) _, err := ctx.Send(url) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't send the invite link.", Error: err, @@ -56,7 +56,7 @@ func gitCommand(ctx disgoman.Context, _ []string) { } _, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Git failed", Error: err, @@ -70,7 +70,7 @@ func sayCommand(ctx disgoman.Context, args []string) { resp = strings.ReplaceAll(resp, "@here", "@\ufff0here") _, err := ctx.Session.ChannelMessageSend(ctx.Message.ChannelID, resp) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Say Failed", Error: err, @@ -90,7 +90,7 @@ func userCommand(ctx disgoman.Context, args []string) { member, err = ctx.Session.GuildMember(ctx.Guild.ID, args[0]) } if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't get that member", Error: err, @@ -135,15 +135,15 @@ func userCommand(ctx disgoman.Context, args []string) { guildJoinTime, _ := member.JoinedAt.Parse() guildJoinedField := &discordgo.MessageEmbedField{ Name: "Joined Guild:", - Value: utils.ParseDateString(guildJoinTime), + Value: discord_utils.ParseDateString(guildJoinTime), Inline: false, } int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64) - s := utils.ParseSnowflake(int64ID) + s := discord_utils.ParseSnowflake(int64ID) discordJoinedField := &discordgo.MessageEmbedField{ Name: "Joined Discord:", - Value: utils.ParseDateString(s.CreationTime), + Value: discord_utils.ParseDateString(s.CreationTime), Inline: false, } @@ -160,7 +160,7 @@ func userCommand(ctx disgoman.Context, args []string) { } _, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed) if err != nil { - ctx.ErrorChannel <- disgoman.CommandError{ + ctx.CommandManager.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "Couldn't send the user embed", Error: err, diff --git a/postgres/database.go b/internal/postgres/database.go similarity index 100% rename from postgres/database.go rename to internal/postgres/database.go diff --git a/internal/postgres/guild.go b/internal/postgres/guild.go new file mode 100644 index 0000000..389f9ca --- /dev/null +++ b/internal/postgres/guild.go @@ -0,0 +1,65 @@ +package postgres + +import ( + "database/sql" + + "github.com/dustinpianalto/goff" +) + +type GuildService struct { + DB *sql.DB +} + +func (s *GuildService) Guild(id string) (*goff.Guild, error) { + var g goff.Guild + queryString := `SELECT id, welcome_message, goodbye_message, + logging_channel, welcome_channel, puzzle_channel, puzzle_role + FROM guilds + WHERE id = $1` + row := s.DB.QueryRow(queryString, id) + err := row.Scan( + &g.ID, + &g.WelcomeMessage, + &g.GoodbyeMessage, + &g.LoggingChannel, + &g.WelcomeChannel, + &g.PuzzleChannel, + &g.PuzzleRole, + ) + if err != nil { + return nil, err + } + var prefixes []string + queryString = `SELECT p.prefix + FROM prefixes p, x_guilds_prefixes xgp + WHERE p.id = xgp.prefix_id AND xgp.guild_id = $1` + rows, err := s.DB.Query(queryString, id) + if err == nil { + for rows.Next() { + var prefix string + err = rows.Scan(&prefix) + if err != nil { + continue + } + prefixes = append(prefixes, prefix) + } + } + g.Prefixes = prefixes + return &g, nil +} + +func (s *GuildService) CreateGuild(g *goff.Guild) error { + return nil +} + +func (s *GuildService) DeleteGuild(g *goff.Guild) error { + return nil +} + +func (s *GuildService) GuildUsers(g *goff.Guild) ([]*goff.User, error) { + return []*goff.User{}, nil +} + +func (s *GuildService) UpdateGuild(g *goff.Guild) error { + return nil +} diff --git a/postgres/postfixes.go b/internal/postgres/postfixes.go similarity index 77% rename from postgres/postfixes.go rename to internal/postgres/postfixes.go index ad0a62e..07224d9 100644 --- a/postgres/postfixes.go +++ b/internal/postgres/postfixes.go @@ -28,12 +28,16 @@ var postfixes = []postfix{ Name: "3_Update_Guild_Add_Puzzle_Role", Invoke: updateGuildsAddPuzzleRole, }, + postfix{ + Name: "4_Add_Multi_Column_Unique_XUsersGuilds", + Invoke: addMultiColumnUniqueXUsersGuilds, + }, } func RunPostfixes() { for _, postfix := range postfixes { queryString := "SELECT * from postfixes where name = $1" - rows, err := Database.Query(queryString, postfix.Name) + rows, err := DB.Query(queryString, postfix.Name) if err != nil { log.Println(err) continue @@ -45,7 +49,7 @@ func RunPostfixes() { if err != nil { continue } - _, err = Database.Exec("INSERT INTO postfixes (name) VALUES ($1)", postfix.Name) + _, err = DB.Exec("INSERT INTO postfixes (name) VALUES ($1)", postfix.Name) if err != nil { log.Println(err) continue @@ -63,7 +67,7 @@ func updateGuildForPuzzle(revert bool) error { queryString = `ALTER TABLE guilds DROP COLUMN puzzleChat` } - _, err := Database.Exec(queryString) + _, err := DB.Exec(queryString) if err != nil { log.Println(err) return err @@ -80,7 +84,7 @@ func updateXGuildPrefixesToAddID(revert bool) error { queryString = `ALTER TABLE x_guilds_prefixes DROP COLUMN id` } - _, err := Database.Exec(queryString) + _, err := DB.Exec(queryString) if err != nil { log.Println(err) return err @@ -97,7 +101,7 @@ func updateTagsContentLength(revert bool) error { queryString = `ALTER TABLE tags ALTER COLUMN content TYPE varchar(1000)` } - _, err := Database.Exec(queryString) + _, err := DB.Exec(queryString) if err != nil { log.Println(err) return err @@ -118,7 +122,7 @@ func addTableRoles(revert bool) error { } else { queryString = `DROP TABLE roles` } - _, err := Database.Exec(queryString) + _, err := DB.Exec(queryString) if err != nil { log.Println(err) return err @@ -135,7 +139,23 @@ func updateGuildsAddPuzzleRole(revert bool) error { queryString = `ALTER TABLE guilds DROP COLUMN puzzle_role` } - _, err := Database.Exec(queryString) + _, err := DB.Exec(queryString) + if err != nil { + log.Println(err) + return err + } + return nil +} + +func addMultiColumnUniqueXUsersGuilds(revert bool) error { + var queryString string + if !revert { + queryString = `ALTER TABLE x_users_guilds + ADD CONSTRAINT u_user_guild UNIQUE(user_id, guild_id)` + } else { + queryString = `ALTER TABLE DROP CONSTRAINT u_user_guild IF EXISTS` + } + _, err := DB.Exec(queryString) if err != nil { log.Println(err) return err diff --git a/internal/postgres/user.go b/internal/postgres/user.go new file mode 100644 index 0000000..63fa424 --- /dev/null +++ b/internal/postgres/user.go @@ -0,0 +1,84 @@ +package postgres + +import ( + "database/sql" + + "github.com/dustinpianalto/goff" +) + +type UserService struct { + DB *sql.DB +} + +func (s *UserService) User(id string) (*goff.User, error) { + var u goff.User + queryString := `SELECT id, banned, logging, steam_id, is_active, is_staff, is_admin + FROM users WHERE id=$1` + row := s.DB.QueryRow(queryString, id) + if err := row.Scan(&u.ID, &u.Banned, &u.Logging, &u.SteamID, &u.IsActive, &u.IsStaff, &u.IsAdmin); err != nil { + return nil, err + } + var guilds []string + queryString = `SELECT guild_id from x_users_guilds WHERE user_id=$1` + rows, err := s.DB.Query(queryString, id) + if err != nil { + return nil, err + } + for rows.Next() { + var guildID string + err = rows.Scan(&guildID) + if err != nil { + return nil, err + } + guilds = append(guilds, guildID) + } + u.Guilds = guilds + return &u, nil +} + +func (s *UserService) CreateUser(u *goff.User) error { + queryString := `INSERT INTO users (id, banned, logging, steam_id, is_active, is_staff, is_admin) + VALUES ($1, $2, $3, $4, $5, $6, $7)` + _, err := s.DB.Exec(queryString, u.ID, u.Banned, u.Logging, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin) + return err +} + +func (s *UserService) DeleteUser(u *goff.User) error { + queryString := `DELETE FROM x_users_guilds WHERE user_id = $1; DELETE FROM users WHERE id = $1` + _, err := s.DB.Exec(queryString, u.ID) + return err +} + +func (s *UserService) MarkUserInactive(u *goff.User) error { + queryString := `UPDATE users SET is_active = false WHERE id = $1` + _, err := s.DB.Exec(queryString, u.ID) + if err == nil { + u.IsActive = false + } + return err +} + +func (s *UserService) AddUserToGuild(u *goff.User, g *goff.Guild) error { + queryString := `INSERT INTO x_users_guilds (user_id, guild_id) VALUES ($1, $2)` + _, err := s.DB.Exec(queryString, u.ID, g.ID) + return err +} + +func (s *UserService) RemoveUserFromGuild(u *goff.User, g *goff.Guild) error { + queryString := `DELETE FROM x_users_guilds WHERE user_id = $1 AND guild_id = $2` + _, err := s.DB.Exec(queryString, u.ID, g.ID) + return err +} + +func (s *UserService) UpdateUser(u *goff.User) error { + queryString := `UPDATE users SET + banned = $1 + logging = $2 + steam_id = $3 + is_active = $4 + is_staff = $5 + is_admin = $6 + WHERE id = $7` + _, err := s.DB.Exec(queryString, u.Banned, u.Logging, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin) + return err +} diff --git a/utils/email.go b/pkg/email/email.go similarity index 96% rename from utils/email.go rename to pkg/email/email.go index 305ff6a..6b0cd8b 100644 --- a/utils/email.go +++ b/pkg/email/email.go @@ -1,4 +1,4 @@ -package utils +package email import ( "io" @@ -9,6 +9,7 @@ import ( "time" "github.com/bwmarrin/discordgo" + "github.com/dustinpianalto/goff/pkg/puzzles" imap "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" "github.com/emersion/go-message/mail" @@ -117,7 +118,7 @@ func processEmail(r io.Reader, dg *discordgo.Session, wg *sync.WaitGroup) { if addressIn(from, puzzleAddress) && strings.Contains(subject, "Daily Coding Problem:") { log.Println("Processing Puzzle") - ProcessPuzzleEmail(mr, dg) + puzzles.ProcessPuzzleEmail(mr, dg) } } diff --git a/utils/puzzles.go b/pkg/puzzles/puzzles.go similarity index 86% rename from utils/puzzles.go rename to pkg/puzzles/puzzles.go index e27ba5b..f4afedf 100644 --- a/utils/puzzles.go +++ b/pkg/puzzles/puzzles.go @@ -1,4 +1,4 @@ -package utils +package puzzles import ( "io" @@ -8,6 +8,8 @@ import ( "time" "github.com/bwmarrin/discordgo" + "github.com/dustinpianalto/goff" + "github.com/dustinpianalto/goff/internal/postgres" "github.com/emersion/go-message/mail" ) @@ -48,14 +50,14 @@ func ProcessPuzzleEmail(mr *mail.Reader, dg *discordgo.Session) { Text: "Daily Coding Problem", }, } - var guilds []Guild + var guilds []goff.Guild queryString := `SELECT id, puzzle_channel, puzzle_role from guilds` - rows, err := Database.Query(queryString) + rows, err := postgres.DB.Query(queryString) if err != nil { log.Println(err) } for rows.Next() { - var guild Guild + var guild goff.Guild err := rows.Scan(&guild.ID, &guild.PuzzleChannel, &guild.PuzzleRole) if err != nil { log.Println(err) @@ -65,7 +67,7 @@ func ProcessPuzzleEmail(mr *mail.Reader, dg *discordgo.Session) { } var puzzleID int64 queryString = "INSERT INTO puzzles (text, time) VALUES ($1, $2) RETURNING id" - err = Database.QueryRow(queryString, puzzle, date).Scan(&puzzleID) + err = postgres.DB.QueryRow(queryString, puzzle, date).Scan(&puzzleID) if err != nil { log.Println(err) return @@ -91,7 +93,7 @@ func ProcessPuzzleEmail(mr *mail.Reader, dg *discordgo.Session) { log.Println(err) } queryString = "INSERT INTO x_guilds_puzzles (guild_id, puzzle_id, message_id) VALUES ($1, $2, $3)" - _, err = Database.Exec(queryString, g.ID, puzzleID, m.ID) + _, err = postgres.DB.Exec(queryString, g.ID, puzzleID, m.ID) if err != nil { log.Println(err) continue diff --git a/utils/rpn.go b/pkg/rpn/rpn.go similarity index 100% rename from utils/rpn.go rename to pkg/rpn/rpn.go diff --git a/utils/rpnParser.go b/pkg/rpn/rpnParser.go similarity index 100% rename from utils/rpnParser.go rename to pkg/rpn/rpnParser.go diff --git a/postgres/user.go b/postgres/user.go deleted file mode 100644 index a35f48b..0000000 --- a/postgres/user.go +++ /dev/null @@ -1,37 +0,0 @@ -package postgres - -import ( - "database/sql" - - "github.com/dustinpianalto/goff" -) - -type UserService struct { - DB *sql.DB -} - -func (s *UserService) User(id string) (*goff.User, error) { - var u goff.User - queryString := `SELECT id, banned, logging, steam_id, is_active, is_staff, is_admin - FROM users WHERE id=$1` - row := s.DB.QueryRow(queryString, id) - if err := row.Scan(&u.ID, &u.Banned, &u.Logging, &u.SteamID, &u.IsActive, &u.IsStaff, &u.IsAdmin); err != nil { - return nil, err - } - var guilds []string - queryString = `SELECT guild_id from x_users_guilds WHERE user_id=$1` - rows, err := s.DB.Query(queryString, id) - if err != nil { - return nil, err - } - for rows.Next() { - var guildID string - err = rows.Scan(&guildID) - if err != nil { - return nil, err - } - guilds = append(guilds, guildID) - } - u.Guilds = guilds - return &u, nil -} diff --git a/user.go b/user.go index 04b860e..0724236 100644 --- a/user.go +++ b/user.go @@ -1,4 +1,4 @@ -package main +package goff type User struct { ID string diff --git a/utils/types.go b/utils/types.go deleted file mode 100644 index d121cc2..0000000 --- a/utils/types.go +++ /dev/null @@ -1,24 +0,0 @@ -package utils - -import "database/sql" - -type Guild struct { - ID string - WelcomeMessage string - GoodbyeMessage string - LoggingChannel string - WelcomeChannel string - PuzzleChannel string - PuzzleRole sql.NullString -} - -type User struct { - ID string - Banned bool - Logging bool - SteamID string - IsActive bool - IsStaff bool - IsAdmin bool - Guilds []string -}