forked from Minecraft/canopeas
70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
|
package discord
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const clearMax = 20
|
||
|
|
||
|
func init() {
|
||
|
commands["clear"] = command{
|
||
|
validate: func(cmd commandInit) bool {
|
||
|
return isStaff(cmd.message.Member.Roles, cmd.config.StaffRoles)
|
||
|
},
|
||
|
run: func(cmd commandInit) error {
|
||
|
args := strings.Fields(cmd.message.Content)
|
||
|
|
||
|
var userID string
|
||
|
if len(cmd.message.Mentions) > 0 {
|
||
|
userID = cmd.message.Mentions[0].ID
|
||
|
}
|
||
|
|
||
|
limitArg := 1
|
||
|
if userID != "" {
|
||
|
limitArg = 2
|
||
|
if len(args) < 2 {
|
||
|
return errors.New("this command takes needs two arguments with a mention")
|
||
|
}
|
||
|
} else if len(args) < 1 {
|
||
|
return errors.New("this command takes one argument without a mention")
|
||
|
}
|
||
|
|
||
|
limit, err := strconv.Atoi(args[limitArg])
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if limit < 0 {
|
||
|
limit = 0
|
||
|
} else if limit > clearMax {
|
||
|
limit = 20
|
||
|
}
|
||
|
|
||
|
batch := []string{cmd.message.ID}
|
||
|
|
||
|
var deleted int
|
||
|
messages, err := cmd.session.ChannelMessages(cmd.message.ChannelID, 100, cmd.message.ID, "", "")
|
||
|
for _, msg := range messages {
|
||
|
if deleted == limit {
|
||
|
break
|
||
|
}
|
||
|
|
||
|
deleteMessage := true
|
||
|
if userID != "" {
|
||
|
deleteMessage = msg.Author.ID == userID
|
||
|
}
|
||
|
|
||
|
if deleteMessage {
|
||
|
batch = append(batch, msg.ID)
|
||
|
deleted++
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return cmd.session.ChannelMessagesBulkDelete(cmd.message.ChannelID, batch)
|
||
|
},
|
||
|
help: "Clear messages",
|
||
|
}
|
||
|
}
|