You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
6.9 KiB
257 lines
6.9 KiB
package exts
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
"github.com/dustinpianalto/disgoman"
|
|
"github.com/dustinpianalto/goff/utils"
|
|
)
|
|
|
|
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 {
|
|
err = errors.New("that is not a valid id")
|
|
}
|
|
if err != nil {
|
|
ctx.ErrorChannel <- disgoman.CommandError{
|
|
Context: ctx,
|
|
Message: "Couldn't get that member",
|
|
Error: err,
|
|
}
|
|
return
|
|
}
|
|
|
|
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",
|
|
Error: errors.New("need higher role"),
|
|
}
|
|
return
|
|
}
|
|
|
|
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",
|
|
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)
|
|
err = ctx.Session.GuildMemberDeleteWithReason(ctx.Guild.ID, member.User.ID, auditReason)
|
|
|
|
if err != nil {
|
|
ctx.ErrorChannel <- disgoman.CommandError{
|
|
Context: ctx,
|
|
Message: fmt.Sprintf("Something went wrong kicking %v", member.User.Username),
|
|
Error: err,
|
|
}
|
|
return
|
|
}
|
|
|
|
event := &utils.LogEvent{
|
|
Embed: discordgo.MessageEmbed{
|
|
Title: "User Kicked",
|
|
Description: fmt.Sprintf(
|
|
"User %v#%v was kicked by %v.\nReason: %v",
|
|
member.User.Username,
|
|
member.User.Discriminator,
|
|
ctx.Message.Author.Username,
|
|
reason),
|
|
Timestamp: time.Now().Format("2006-01-02 15:04:05"),
|
|
Color: 0xff8c00,
|
|
},
|
|
GuildID: ctx.Guild.ID,
|
|
Session: ctx.Session,
|
|
}
|
|
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))
|
|
}
|