TerraOceanPlugin/GoBot/command_messageutil.go

131 lines
3.3 KiB
Go

package main
import (
"errors"
"fmt"
"strings"
"github.com/bwmarrin/discordgo"
)
const guildID = "626424729234046987"
const memberRoleID = "626434632614805526"
const auditChannel = "631789849929711627"
var errMemberNotFound = errors.New("messageutil: the requested member was not found")
func enforceDM(s *discordgo.Session, m *discordgo.MessageCreate) bool {
if m.GuildID != "" {
//This command can only be used in DM to protect the invite creator.
s.ChannelMessageDelete(m.ChannelID, m.ID)
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",这个指令只能在私信中使用。\n"+m.Author.Mention()+", this command can only be used in DM.",
)
return false
}
return true
}
func membersOnly(s *discordgo.Session, m *discordgo.MessageCreate) bool {
member, err := s.GuildMember(guildID, m.Author.ID)
if err != nil {
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",请在成为会员后才使用这个指令。\n"+m.Author.Mention()+", please use this command after you become a member.",
)
return false
}
for _, v := range member.Roles {
if v == memberRoleID {
return true
}
}
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",请在成为会员后才使用这个指令。\n"+m.Author.Mention()+", please use this command after you become a member.",
)
return false
}
func sendPrivateMessage(s *discordgo.Session, recipient, message string) error {
channel, err := s.UserChannelCreate(recipient)
if err != nil {
return err
}
_, err = s.ChannelMessageSend(channel.ID, message)
return err
}
func auditLog(s *discordgo.Session, message string) {
_, err := s.ChannelMessageSend(auditChannel, message)
if err != nil {
fmt.Println("==Audit Log==")
fmt.Println(message)
fmt.Println(err)
}
}
func getMemberFromUserFriendlyName(s *discordgo.Session, user string) (*discordgo.Member, error) {
allMembers, err := getAllMembers(s)
if err != nil {
return nil, err
}
if strings.HasPrefix(user, "@") {
user = strings.TrimPrefix(user, "@")
} else if strings.HasSuffix(user, ">") {
if strings.HasPrefix(user, "<@!") {
user = strings.TrimSuffix(strings.TrimPrefix(user, "<@!"), ">")
} else if strings.HasPrefix(user, "<@") {
user = strings.TrimSuffix(strings.TrimPrefix(user, "<@"), ">")
}
}
if strings.ContainsRune(user, '#') {
list := strings.Split(user, "#")
username := strings.Join(list[:len(list)-1], "#")
discriminator := list[len(list)-1]
for _, v := range allMembers {
if v.User.Username == username && v.User.Discriminator == discriminator {
return v, nil
}
}
}
for _, v := range allMembers {
if v.User.ID == user {
return v, nil
}
}
for _, v := range allMembers {
if v.Nick == user {
return v, nil
}
}
for _, v := range allMembers {
if v.User.Username == user {
return v, nil
}
}
return nil, errMemberNotFound
}
func getAllMembers(s *discordgo.Session) ([]*discordgo.Member, error) {
initial, err := s.GuildMembers(guildID, "", 1000)
if err != nil {
return nil, err
}
next := initial[len(initial)-1].User.ID
for next != "" {
nextArray, err := s.GuildMembers(guildID, next, 1000)
if err != nil {
return nil, err
}
if len(nextArray) == 0 {
next = ""
} else {
next = nextArray[len(nextArray)-1].User.ID
initial = append(initial, nextArray...)
}
}
return initial, nil
}