-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommand.go
More file actions
87 lines (73 loc) · 1.53 KB
/
command.go
File metadata and controls
87 lines (73 loc) · 1.53 KB
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 gumi
import (
"github.com/VTGare/gumi/utils"
)
type Command struct {
Name string
Group string
Aliases []string
Description string
Usage string
Example string
Flags map[string]string
GuildOnly bool
NSFW bool
AuthorOnly bool
Permissions int64
RateLimiter *RateLimiter
Exec ExecutionHandler
}
func (c *Command) execute(ctx *Ctx) error {
if callback := ctx.Router.OnExecuteCallback; callback != nil {
err := callback(ctx)
if err != nil {
return err
}
}
if c.AuthorOnly {
if ctx.Router.AuthorID != ctx.Event.Author.ID {
return nil
}
}
//check permissions to execute a command
if c.Permissions != 0 {
hasPerms, err := utils.MemberHasPermission(ctx.Session, ctx.Event.GuildID, ctx.Event.Author.ID, c.Permissions)
if err != nil {
return err
}
if !hasPerms {
if callback := ctx.Router.OnNoPermissionsCallback; callback != nil {
err := callback(ctx)
if err != nil {
return err
}
}
return nil
}
}
if c.GuildOnly && ctx.Event.GuildID == "" {
return nil
}
if c.NSFW {
ch, err := ctx.Session.Channel(ctx.Event.ChannelID)
if err != nil {
return err
}
if !ch.NSFW {
if callback := ctx.Router.OnNSFWCallback; callback != nil {
err := callback(ctx)
if err != nil {
return err
}
}
return nil
}
}
if c.RateLimiter != nil {
if c.RateLimiter.Contains(ctx.Event.Author.ID) {
return ctx.Router.OnRateLimitCallback(ctx)
}
c.RateLimiter.Set(ctx.Event.Author.ID)
}
return c.Exec(ctx)
}