This repository has been archived by the owner on Feb 5, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
commandManager.go
87 lines (80 loc) · 2.2 KB
/
commandManager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package commandframework_discordgo
import (
"github.com/bwmarrin/discordgo"
"strings"
)
type CommandManager struct {
Prefix string
Commands []Command
Behaviour BehaviourSettings
}
func CreateManager() CommandManager {
return CommandManager{
Prefix: "!",
Commands: []Command{},
Behaviour: BehaviourSettings{
DeleteMessageSuccess: false,
DeleteMessageUnknown: false,
ReactMessageUnknown: "",
HandleTts: false,
},
}
}
func (manager *CommandManager) AddCommand(commands ... Command) {
for _, command := range commands {
manager.Commands = append(manager.Commands, command)
}
}
func (manager *CommandManager) ChatListener(session *discordgo.Session, event *discordgo.MessageCreate) {
if event.Author.ID == session.State.User.ID {
return // Is the bot itself
}
if event.Content[0:len(manager.Prefix)] != manager.Prefix {
return // Doesn't start with prefix
}
if event.Tts && !manager.Behaviour.HandleTts {
return // Don't handle TTS
}
lowerInput := strings.ToLower(strings.SplitN(event.Content[len(manager.Prefix):], " ", 2)[0])
var commandImpl Command
foundCommand := false
for _, command := range manager.Commands {
matches := false
for _, name := range command.Names {
if strings.ToLower(name) == lowerInput {
matches = true
break
}
}
if !matches {
continue
}
foundCommand = true
commandImpl = command
break
}
if !foundCommand {
if manager.Behaviour.DeleteMessageUnknown {
// ignore error if no permission as we don't care.
session.ChannelMessageDelete(event.ChannelID, event.ID)
} else if manager.Behaviour.ReactMessageUnknown != "" {
// ignore error if no permission or incorrect emote as we don't care.
session.MessageReactionAdd(event.ChannelID, event.ID, manager.Behaviour.ReactMessageUnknown)
}
return
}
if manager.Behaviour.DeleteMessageSuccess {
// ignore error if no permission as we don't care.
session.ChannelMessageDelete(event.ChannelID, event.ID)
}
context := CommandContext{
Implementation: &commandImpl,
Event: event,
Label: lowerInput,
Session: session,
}
for _, predicate := range commandImpl.Predicates {
predicate(&context)
}
commandImpl.Handler(&context)
}