From a17e1de4d0e6ca346821c0033ff7273507b831d3 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 30 Apr 2020 21:09:30 -0800 Subject: [PATCH] Fix bugs --- djpianalto.com/goff/exts/guild.go | 2 +- djpianalto.com/goff/exts/init.go | 24 ++- djpianalto.com/goff/exts/user_management.go | 180 +++++++++++++++++++- djpianalto.com/goff/goff.go | 1 + go.mod | 2 +- go.sum | 6 + 6 files changed, 206 insertions(+), 9 deletions(-) diff --git a/djpianalto.com/goff/exts/guild.go b/djpianalto.com/goff/exts/guild.go index 1b43481..cd1556f 100644 --- a/djpianalto.com/goff/exts/guild.go +++ b/djpianalto.com/goff/exts/guild.go @@ -177,7 +177,7 @@ func getWelcomeChannel(ctx disgoman.Context, _ []string) { _, _ = ctx.Send(fmt.Sprintf("The welcome channel is currently %s", channel.Mention())) } -func addGuild(ctx disgoman.Context, args []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) err := row.Scan(&guildID) diff --git a/djpianalto.com/goff/exts/init.go b/djpianalto.com/goff/exts/init.go index 6f34cfd..cd49783 100644 --- a/djpianalto.com/goff/exts/init.go +++ b/djpianalto.com/goff/exts/init.go @@ -128,15 +128,33 @@ func AddCommandHandlers(h *disgoman.CommandManager) { OwnerOnly: false, Hidden: false, RequiredPermissions: disgoman.PermissionKickMembers, - Invoke: kickUser, + Invoke: kickUserCommand, }) _ = h.AddCommand(&disgoman.Command{ - Name: "addGuild", + Name: "addGuildCommand", Aliases: nil, Description: "Adds the current guild to the database", OwnerOnly: true, Hidden: false, RequiredPermissions: disgoman.PermissionManageServer, - Invoke: addGuild, + Invoke: addGuildCommand, + }) + _ = h.AddCommand(&disgoman.Command{ + Name: "ban", + Aliases: []string{"ban-no-delete"}, + Description: "Bans the given user with the given reason", + OwnerOnly: false, + Hidden: false, + RequiredPermissions: disgoman.PermissionBanMembers, + Invoke: banUserCommand, + }) + _ = h.AddCommand(&disgoman.Command{ + Name: "unban", + Aliases: nil, + Description: "Unbans the given user", + OwnerOnly: false, + Hidden: false, + RequiredPermissions: disgoman.PermissionBanMembers, + Invoke: unbanUserCommand, }) } diff --git a/djpianalto.com/goff/exts/user_management.go b/djpianalto.com/goff/exts/user_management.go index c07f685..f5a5594 100644 --- a/djpianalto.com/goff/exts/user_management.go +++ b/djpianalto.com/goff/exts/user_management.go @@ -10,13 +10,19 @@ import ( "time" ) -func kickUser(ctx disgoman.Context, args []string) { +func kickUserCommand(ctx disgoman.Context, args []string) { var member *discordgo.Member var err error if len(ctx.Message.Mentions) > 0 { member, err = ctx.Session.GuildMember(ctx.Guild.ID, ctx.Message.Mentions[0].ID) + } else if len(args) >= 1 { + idString := args[0] + if strings.HasPrefix(idString, "<@!") && strings.HasSuffix(idString, ">") { + idString = idString[3 : len(idString)-1] + } + member, err = ctx.Session.GuildMember(ctx.Guild.ID, idString) } else { - member, err = ctx.Session.GuildMember(ctx.Guild.ID, args[0]) + err = errors.New("that is not a valid id") } if err != nil { ctx.ErrorChannel <- disgoman.CommandError{ @@ -27,7 +33,7 @@ func kickUser(ctx disgoman.Context, args []string) { return } - if !disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, member.User.ID) { + if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, member.User.ID); !higher { ctx.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "You must have a higher role than the person you are trying to kick", @@ -36,7 +42,7 @@ func kickUser(ctx disgoman.Context, args []string) { return } - if !disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, member.User.ID) { + if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, member.User.ID); !higher { ctx.ErrorChannel <- disgoman.CommandError{ Context: ctx, Message: "I don't have a high enough role to kick that person", @@ -81,3 +87,169 @@ func kickUser(ctx disgoman.Context, args []string) { utils.LoggingChannel <- event _, _ = ctx.Send(fmt.Sprintf("User %v#%v has been kicked.", member.User.Username, member.User.Discriminator)) } + +func banUserCommand(ctx disgoman.Context, args []string) { + var user *discordgo.User + var err error + if len(ctx.Message.Mentions) > 0 { + user, err = ctx.Session.User(ctx.Message.Mentions[0].ID) + } else if len(args) >= 1 { + idString := args[0] + if strings.HasPrefix(idString, "<@!") && strings.HasSuffix(idString, ">") { + idString = idString[3 : len(idString)-1] + } + user, err = ctx.Session.User(idString) + } else { + err = errors.New("that is not a valid id") + } + if err != nil { + ctx.ErrorChannel <- disgoman.CommandError{ + Context: ctx, + Message: "Couldn't get that user", + Error: err, + } + return + } + + 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{ + Context: ctx, + Message: "Who are you?", + Error: err, + } + return + } + } else if !higher { + ctx.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"), + } + return + } + + 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{ + Context: ctx, + Message: "Who am I?", + Error: err, + } + return + } + } else if !higher { + ctx.ErrorChannel <- disgoman.CommandError{ + Context: ctx, + Message: "I don't have a high enough role to ban that person", + Error: errors.New("need higher role"), + } + return + } + + var reason string + if len(args) > 1 { + reason = strings.Join(args[1:], " ") + } else { + reason = "No Reason Given" + } + auditReason := fmt.Sprintf("%v#%v: %v", ctx.User.Username, ctx.User.Discriminator, reason) + days := 7 + if ctx.Invoked == "ban-no-delete" { + days = 0 + } + err = ctx.Session.GuildBanCreateWithReason(ctx.Guild.ID, user.ID, auditReason, days) + + if err != nil { + ctx.ErrorChannel <- disgoman.CommandError{ + Context: ctx, + Message: fmt.Sprintf("Something went wrong banning %v", user.Username), + Error: err, + } + return + } + + event := &utils.LogEvent{ + Embed: discordgo.MessageEmbed{ + Title: "User Banned", + Description: fmt.Sprintf( + "User %v#%v was banned by %v.\nReason: %v", + user.Username, + user.Discriminator, + ctx.Message.Author.Username, + reason), + Timestamp: time.Now().Format("2006-01-02 15:04:05"), + Color: 0xff0000, + }, + GuildID: ctx.Guild.ID, + Session: ctx.Session, + } + utils.LoggingChannel <- event + _, _ = ctx.Send(fmt.Sprintf("User %v#%v has been banned.", user.Username, user.Discriminator)) +} + +func unbanUserCommand(ctx disgoman.Context, args []string) { + var user *discordgo.User + var err error + if len(ctx.Message.Mentions) > 0 { + user, err = ctx.Session.User(ctx.Message.Mentions[0].ID) + } else if len(args) >= 1 { + idString := args[0] + if strings.HasPrefix(idString, "<@!") && strings.HasSuffix(idString, ">") { + idString = idString[3 : len(idString)-1] + } + user, err = ctx.Session.User(idString) + } else { + err = errors.New("that is not a valid id") + } + if err != nil { + ctx.ErrorChannel <- disgoman.CommandError{ + Context: ctx, + Message: "Couldn't get that user", + Error: err, + } + return + } + + bans, err := ctx.Session.GuildBans(ctx.Guild.ID) + if err != nil { + ctx.ErrorChannel <- disgoman.CommandError{ + Context: ctx, + Message: "Error processing current bans", + Error: err, + } + return + } + for _, ban := range bans { + if ban.User.ID == user.ID { + err = ctx.Session.GuildBanDelete(ctx.Guild.ID, user.ID) + if err != nil { + ctx.ErrorChannel <- disgoman.CommandError{ + Context: ctx, + Message: fmt.Sprintf("Something went wrong unbanning %v", user.Username), + Error: err, + } + return + } + event := &utils.LogEvent{ + Embed: discordgo.MessageEmbed{ + Title: "User Banned", + Description: fmt.Sprintf( + "User %v#%v was unbanned by %v.\nOrignal Ban Reason: %v", + user.Username, + user.Discriminator, + ctx.Message.Author.Username, + ban.Reason), + Timestamp: time.Now().Format("2006-01-02 15:04:05"), + Color: 0x00ff00, + }, + GuildID: ctx.Guild.ID, + Session: ctx.Session, + } + utils.LoggingChannel <- event + _, _ = ctx.Send(fmt.Sprintf("User %v#%v has been unbanned.", user.Username, user.Discriminator)) + return + } + } + _, _ = ctx.Send(fmt.Sprintf("%v#%v is not banned in this guild.", user.Username, user.Discriminator)) +} diff --git a/djpianalto.com/goff/goff.go b/djpianalto.com/goff/goff.go index 24ca131..7f13845 100644 --- a/djpianalto.com/goff/goff.go +++ b/djpianalto.com/goff/goff.go @@ -101,5 +101,6 @@ func ErrorHandler(ErrorChan chan disgoman.CommandError) { msg = ce.Error.Error() } _, _ = ce.Context.Send(msg) + fmt.Println(ce.Error) } } diff --git a/go.mod b/go.mod index aa35930..1422f41 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/bwmarrin/discordgo v0.20.2 - github.com/dustinpianalto/disgoman v0.0.0-20200420041406-a10b5cdbec0d + github.com/dustinpianalto/disgoman v0.0.0-20200420065246-662acb500b0c github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/lib/pq v1.3.0 ) diff --git a/go.sum b/go.sum index 9775cd6..e76a2df 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,12 @@ github.com/dustinpianalto/disgoman v0.0.0-20200420022152-4729d2c5ee3e h1:EeLjjVH github.com/dustinpianalto/disgoman v0.0.0-20200420022152-4729d2c5ee3e/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= github.com/dustinpianalto/disgoman v0.0.0-20200420041406-a10b5cdbec0d h1:nVmxBFiOB/okyXp31ka5DSP+OnwpZF2CJDopRsM8c9E= github.com/dustinpianalto/disgoman v0.0.0-20200420041406-a10b5cdbec0d/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= +github.com/dustinpianalto/disgoman v0.0.0-20200420064112-dd8cd312d4d2 h1:hSAwrJi3E2SVbWXnb45JjdbAoN6d08OcsgU6nRwbLXk= +github.com/dustinpianalto/disgoman v0.0.0-20200420064112-dd8cd312d4d2/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= +github.com/dustinpianalto/disgoman v0.0.0-20200420064814-3537b1e12501 h1:vnk1KQySNbsLTfKuUNiYFlgtNQm3EgPVta1pBYueFCc= +github.com/dustinpianalto/disgoman v0.0.0-20200420064814-3537b1e12501/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= +github.com/dustinpianalto/disgoman v0.0.0-20200420065246-662acb500b0c h1:o2XsDNNwRPosS26VNcuNgVczGzQARWiW9J3nf1Kmzjk= +github.com/dustinpianalto/disgoman v0.0.0-20200420065246-662acb500b0c/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=