forked from kageru/discord-selphybot
refactor: moved role distribution to new logic
This commit is contained in:
parent
39ce67d4a6
commit
a30c1b5d65
31
command.go
31
command.go
|
@ -2,9 +2,9 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
"log"
|
"log"
|
||||||
"regexp"
|
"regexp"
|
||||||
)
|
)
|
||||||
|
@ -109,8 +109,10 @@ func evaluateMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
Sets command cooldowns if necessary and also clears them again.
|
Sets command cooldowns if necessary and also clears them again.
|
||||||
*/
|
*/
|
||||||
func executeCommand(session *discordgo.Session, message *discordgo.MessageCreate, command Command, commandIndex int) {
|
func executeCommand(session *discordgo.Session, message *discordgo.MessageCreate, command Command, commandIndex int) {
|
||||||
if (!command.DMOnly || (getChannel(session.State, message.ChannelID).Type == discordgo.ChannelTypeDM)) &&
|
if (message.Author.ID == config.AdminID) || // no restrictions for admins
|
||||||
(!command.AdminOnly || (message.Author.ID == config.AdminID)) && !command.IsOnCooldown {
|
(!command.AdminOnly && !command.IsOnCooldown &&
|
||||||
|
(!command.DMOnly || (getChannel(session.State, message.ChannelID).Type == discordgo.ChannelTypeDM))) {
|
||||||
|
|
||||||
log.Printf("Executed command %s triggered by user %s", command.Trigger, userToString(message.Author))
|
log.Printf("Executed command %s triggered by user %s", command.Trigger, userToString(message.Author))
|
||||||
fmt.Printf("Executed command %s triggered by user %s", command.Trigger, userToString(message.Author))
|
fmt.Printf("Executed command %s triggered by user %s", command.Trigger, userToString(message.Author))
|
||||||
if command.Cooldown > 0 {
|
if command.Cooldown > 0 {
|
||||||
|
@ -167,3 +169,26 @@ func echoMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
s.ChannelMessageSend(m.ChannelID, m.Content)
|
s.ChannelMessageSend(m.ChannelID, m.Content)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func giveAgeRole(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
|
Member, _ := s.GuildMember(config.ServerID, m.Author.ID)
|
||||||
|
dm, _ := s.UserChannelCreate(Member.User.ID)
|
||||||
|
for command, role := range config.RoleCommands {
|
||||||
|
if m.Content == command {
|
||||||
|
// Found the command that was triggered
|
||||||
|
// Now check if the user already has one of the roles
|
||||||
|
for _, newRole := range config.RoleCommands {
|
||||||
|
for _, curRole := range Member.Roles {
|
||||||
|
// If the user already has one of the available roles, tell him and exit
|
||||||
|
if newRole == curRole {
|
||||||
|
s.ChannelMessageSend(dm.ID, "Baka, du kannst nur eine der Rollen haben.")
|
||||||
|
log.Printf("Denied Role %s to %s. User already has %s", roleName(s.State, curRole), userToString(m.Author), roleName(s.State, curRole))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Printf("Giving Role %s to %s", roleName(s.State, role), userToString(m.Author))
|
||||||
|
s.ChannelMessageSend(dm.ID, "Haaai, Ryoukai desu~")
|
||||||
|
s.GuildMemberRoleAdd(config.ServerID, m.Author.ID, role)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
116
events.go
116
events.go
|
@ -3,9 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
"strings"
|
|
||||||
"log"
|
"log"
|
||||||
"regexp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func onJoin(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
func onJoin(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
||||||
|
@ -37,15 +35,6 @@ func onDM(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
fmt.Sprintf("Received DM from %s with content: “%s”", userToString(m.Author), m.Content)
|
fmt.Sprintf("Received DM from %s with content: “%s”", userToString(m.Author), m.Content)
|
||||||
Member, _ := s.GuildMember(config.ServerID, m.Author.ID)
|
Member, _ := s.GuildMember(config.ServerID, m.Author.ID)
|
||||||
dm, _ := s.UserChannelCreate(Member.User.ID)
|
dm, _ := s.UserChannelCreate(Member.User.ID)
|
||||||
if m.Content == "!welcome" {
|
|
||||||
s.ChannelMessageSendEmbed(dm.ID, getWelcomeEmbed())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(m.Content, "!complain") {
|
|
||||||
redirectComplaint(s, m)
|
|
||||||
s.ChannelMessageSend(dm.ID, config.ComplaintReceivedMessage)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for comm, role := range config.RoleCommands {
|
for comm, role := range config.RoleCommands {
|
||||||
if m.Content == comm {
|
if m.Content == comm {
|
||||||
for _, irole := range config.RoleCommands {
|
for _, irole := range config.RoleCommands {
|
||||||
|
@ -64,108 +53,3 @@ func onDM(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func onMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
|
|
||||||
if m.Author.ID == s.State.User.ID {
|
|
||||||
log.Printf("<Self> %s", m.Content)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if getChannel(s.State, m.ChannelID).Type == discordgo.ChannelTypeDM {
|
|
||||||
onDM(s, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.Author.ID == config.AdminID {
|
|
||||||
//replyGodmode(s, m)
|
|
||||||
} else if m.ChannelID == config.WelcomeChannel {
|
|
||||||
s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
||||||
if m.Content == "!accept" {
|
|
||||||
unlockUser(s, m.Author.ID)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// In case this doesn’t work with your font: the last character is a winking emoji.
|
|
||||||
winks, _ := regexp.MatchString("([()|DoO];|;[()|DoOpP]|:wink:|😉)", m.Content)
|
|
||||||
if winks {
|
|
||||||
s.ChannelMessageSend(m.ChannelID, fmt.Sprintf("<@%s> Oboe!", m.Author.ID))
|
|
||||||
s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
||||||
channel := getChannel(s.State, m.ChannelID)
|
|
||||||
log.Printf("Deleted message by %s in %s. Content: “%s”", userToString(m.Author), channelToString(channel), m.Content)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// As per our majesty’s command:
|
|
||||||
if m.Content == "\\o" {
|
|
||||||
s.ChannelMessageSend(m.ChannelID, "o/")
|
|
||||||
log.Printf("o/ at %s", userToString(m.Author))
|
|
||||||
} else if m.Content == "o/" {
|
|
||||||
s.ChannelMessageSend(m.ChannelID, "\\o")
|
|
||||||
log.Printf("\\o at %s", userToString(m.Author))
|
|
||||||
} else if m.Content == "ayy" {
|
|
||||||
s.ChannelMessageSend(m.ChannelID, "lmao")
|
|
||||||
log.Printf("ayy lmao at %s", userToString(m.Author))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Admin stuff down here. This is very server-specific
|
|
||||||
|
|
||||||
func adminshit (s *discordgo.Session, m *discordgo.MessageCreate) {
|
|
||||||
if m.Content == fmt.Sprintf("<@%s> <3", s.State.User.ID) {
|
|
||||||
s.ChannelMessageSend(m.ChannelID, fmt.Sprintf("<@%s> <3", config.AdminID))
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if m.Content == "print_rules()" {
|
|
||||||
channel := getChannel(s.State, m.ChannelID)
|
|
||||||
log.Printf("print_rules() triggered by %s in %s.", userToString(m.Author), channelToString(channel))
|
|
||||||
embedColor := 0xffb90f // kageru gold
|
|
||||||
embed := &discordgo.MessageEmbed{
|
|
||||||
Author: &discordgo.MessageEmbedAuthor{},
|
|
||||||
Color: embedColor,
|
|
||||||
Description: config.WelcomeEmbed.Message,
|
|
||||||
Fields: []*discordgo.MessageEmbedField{
|
|
||||||
&discordgo.MessageEmbedField{
|
|
||||||
Name: config.WelcomeEmbed.QuestionsTitle,
|
|
||||||
Value: config.WelcomeEmbed.QuestionsText,
|
|
||||||
Inline: true,
|
|
||||||
},
|
|
||||||
&discordgo.MessageEmbedField{
|
|
||||||
Name: config.WelcomeEmbed.BugsTitle,
|
|
||||||
Value: fmt.Sprintf(config.WelcomeEmbed.BugsText, config.AdminID),
|
|
||||||
Inline: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Thumbnail: &discordgo.MessageEmbedThumbnail{
|
|
||||||
URL: config.WelcomeEmbed.Image,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
s.ChannelMessageSendEmbed(m.ChannelID, embed)
|
|
||||||
embed = &discordgo.MessageEmbed{
|
|
||||||
Author: &discordgo.MessageEmbedAuthor{},
|
|
||||||
Color: embedColor,
|
|
||||||
Fields: []*discordgo.MessageEmbedField{
|
|
||||||
&discordgo.MessageEmbedField{
|
|
||||||
Name: config.WelcomeEmbed.RulesTitle,
|
|
||||||
Value: config.WelcomeEmbed.RulesText,
|
|
||||||
Inline: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
s.ChannelMessageSendEmbed(m.ChannelID, embed)
|
|
||||||
embed = &discordgo.MessageEmbed{
|
|
||||||
Author: &discordgo.MessageEmbedAuthor{},
|
|
||||||
Color: embedColor,
|
|
||||||
Fields: []*discordgo.MessageEmbedField{
|
|
||||||
&discordgo.MessageEmbedField{
|
|
||||||
Name: config.WelcomeEmbed.RulesTitle,
|
|
||||||
Value: config.WelcomeEmbed.RulesText2,
|
|
||||||
Inline: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
s.ChannelMessageSendEmbed(m.ChannelID, embed)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
50
main.go
50
main.go
|
@ -34,26 +34,7 @@ func main() {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
log.SetOutput(f)
|
log.SetOutput(f)
|
||||||
|
|
||||||
// Moderation
|
addCommands()
|
||||||
registerCommand(Command{Trigger: "^[^`]*([()|DoO];|;[()|DoOpP]|:wink:|😉)[^`]*$", Output: "<@%s> Oboe!", DeleteInput: true, OutputIsReply: true, Type: CommandTypeRegex})
|
|
||||||
|
|
||||||
// Misc commands
|
|
||||||
registerCommand(Command{Trigger: "o/", Output: "\\o", Type: CommandTypeFullMatch, Cooldown: 5})
|
|
||||||
registerCommand(Command{Trigger: "\\o", Output: "o/", Type: CommandTypeFullMatch})
|
|
||||||
registerCommand(Command{Trigger: "\\o/", Output: "/o\\", Type: CommandTypeFullMatch})
|
|
||||||
registerCommand(Command{Trigger: "<:selphyDango:441001954542616576>", Output: ":notes: Dango, Dango, Dango, Dango, Dango Daikazoku :notes:", Type: CommandTypeFullMatch})
|
|
||||||
registerCommand(Command{Trigger: "praise the sun", Output: "If only I could be so grossly incandescent \\\\[T]/", Type: CommandTypeContains, IgnoreCase: true})
|
|
||||||
|
|
||||||
registerCommand(Command{Trigger: "echo", Type: CommandTypePrefix, Function: echoMessage})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
registerCommand(Command{Trigger: "!welcome", OutputEmbed: getWelcomeEmbed(), Type: CommandTypeFullMatch, DMOnly: true})
|
|
||||||
registerCommand(Command{Trigger: "<@%s> <3", Output: "<@%s> <3", Type: CommandTypeFullMatch, AdminOnly: true, OutputIsReply: true, RequiresMention: true})
|
|
||||||
registerCommand(Command{Trigger: "!complain", Type: CommandTypePrefix, DMOnly: true, Function: redirectComplaint})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fmt.Println("bot running. selphyWoo")
|
fmt.Println("bot running. selphyWoo")
|
||||||
sc := make(chan os.Signal, 1)
|
sc := make(chan os.Signal, 1)
|
||||||
|
@ -63,6 +44,35 @@ func main() {
|
||||||
dg.Close()
|
dg.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// I’ll just put all of the commands here for now.
|
||||||
|
func addCommands() {
|
||||||
|
// Moderation
|
||||||
|
registerCommand(Command{Trigger: "^[^`]*([()|DoO];|;[()|DoOpP]|:wink:|😉)[^`]*$", Output: "<@%s> Oboe!", DeleteInput: true, OutputIsReply: true, Type: CommandTypeRegex})
|
||||||
|
registerCommand(Command{Trigger: "!complain", Type: CommandTypePrefix, DMOnly: true, Function: redirectComplaint})
|
||||||
|
registerCommand(Command{Trigger: "!beschwerde", Type: CommandTypePrefix, DMOnly: true, Function: redirectComplaint})
|
||||||
|
|
||||||
|
for comm, _ := range config.RoleCommands {
|
||||||
|
registerCommand(Command{Trigger: comm, Type: CommandTypeFullMatch, DMOnly: true, Function: giveAgeRole})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Misc commands
|
||||||
|
registerCommand(Command{Trigger: "o/", Output: "\\o", Type: CommandTypeFullMatch, Cooldown: 10})
|
||||||
|
registerCommand(Command{Trigger: "\\o", Output: "o/", Type: CommandTypeFullMatch, Cooldown: 10})
|
||||||
|
registerCommand(Command{Trigger: "\\o/", Output: "/o\\", Type: CommandTypeFullMatch, Cooldown: 10})
|
||||||
|
registerCommand(Command{Trigger: "<:selphyDango:441001954542616576>", Output: ":notes: Dango, Dango, Dango, Dango, Dango Daikazoku :notes:", Type: CommandTypeFullMatch, Cooldown: 1200})
|
||||||
|
registerCommand(Command{Trigger: "praise the sun", Output: "If only I could be so grossly incandescent \\\\[T]/", Type: CommandTypeContains, IgnoreCase: true, Cooldown: 30})
|
||||||
|
|
||||||
|
// Information
|
||||||
|
registerCommand(Command{Trigger: "!welcome", OutputEmbed: getWelcomeEmbed(), Type: CommandTypeFullMatch, DMOnly: true})
|
||||||
|
|
||||||
|
// Admin
|
||||||
|
registerCommand(Command{Trigger: "<@%s> <3", Output: "<@%s> <3", Type: CommandTypeFullMatch, AdminOnly: true, OutputIsReply: true, RequiresMention: true})
|
||||||
|
|
||||||
|
// Debug
|
||||||
|
registerCommand(Command{Trigger: "echo", Type: CommandTypePrefix, Function: echoMessage})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*func undelete(s *discordgo.Session, m *discordgo.MessageDelete) {
|
/*func undelete(s *discordgo.Session, m *discordgo.MessageDelete) {
|
||||||
channel, _ := s.State.Channel(m.ChannelID)
|
channel, _ := s.State.Channel(m.ChannelID)
|
||||||
message, _ := s.State.Message(m.ChannelID, m.ID)
|
message, _ := s.State.Message(m.ChannelID, m.ID)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user