mirror of
https://github.com/diamondburned/arikawa.git
synced 2025-03-25 03:19:20 +00:00
Bot: changed to a better command parser
This commit is contained in:
parent
9d3528190f
commit
0751f45bdb
|
@ -5,6 +5,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/mattn/go-shellwords"
|
||||||
)
|
)
|
||||||
|
|
||||||
type argumentValueFn func(string) (reflect.Value, error)
|
type argumentValueFn func(string) (reflect.Value, error)
|
||||||
|
@ -97,6 +99,10 @@ type Argument struct {
|
||||||
custom *reflect.Method
|
custom *reflect.Method
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ParseArgs = func(args string) ([]string, error) {
|
||||||
|
return shellwords.Parse(args)
|
||||||
|
}
|
||||||
|
|
||||||
// nilV, only used to return an error
|
// nilV, only used to return an error
|
||||||
var nilV = reflect.Value{}
|
var nilV = reflect.Value{}
|
||||||
|
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
package bot
|
|
||||||
|
|
||||||
/*
|
|
||||||
// UserPermissions but userID is after channelID.
|
|
||||||
func (ctx *Context) UserPermissions(channelID, userID string,
|
|
||||||
) (apermissions int, err error) {
|
|
||||||
|
|
||||||
// Try to just get permissions from state.
|
|
||||||
apermissions, err = ctx.Session.State.UserChannelPermissions(
|
|
||||||
userID, channelID)
|
|
||||||
if err == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise try get as much data from state as possible, falling back to the network.
|
|
||||||
channel, err := ctx.Channel(channelID)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
guild, err := ctx.Guild(channel.GuildID)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if userID == guild.OwnerID {
|
|
||||||
apermissions = discordgo.PermissionAll
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
member, err := ctx.Member(guild.ID, userID)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
return MemberPermissions(guild, channel, member), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Why this isn't exported, I have no idea.
|
|
||||||
func MemberPermissions(guild *discordgo.Guild, channel *discordgo.Channel,
|
|
||||||
member *discordgo.Member) (apermissions int) {
|
|
||||||
|
|
||||||
userID := member.User.ID
|
|
||||||
|
|
||||||
if userID == guild.OwnerID {
|
|
||||||
apermissions = discordgo.PermissionAll
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, role := range guild.Roles {
|
|
||||||
if role.ID == guild.ID {
|
|
||||||
apermissions |= role.Permissions
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, role := range guild.Roles {
|
|
||||||
for _, roleID := range member.Roles {
|
|
||||||
if role.ID == roleID {
|
|
||||||
apermissions |= role.Permissions
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apermissions&discordgo.PermissionAdministrator ==
|
|
||||||
discordgo.PermissionAdministrator {
|
|
||||||
|
|
||||||
apermissions |= discordgo.PermissionAll
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply @everyone overrides from the channel.
|
|
||||||
for _, overwrite := range channel.PermissionOverwrites {
|
|
||||||
if guild.ID == overwrite.ID {
|
|
||||||
apermissions &= ^overwrite.Deny
|
|
||||||
apermissions |= overwrite.Allow
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
denies := 0
|
|
||||||
allows := 0
|
|
||||||
|
|
||||||
// Member overwrites can override role overrides, so do two passes
|
|
||||||
for _, overwrite := range channel.PermissionOverwrites {
|
|
||||||
for _, roleID := range member.Roles {
|
|
||||||
if overwrite.Type == "role" && roleID == overwrite.ID {
|
|
||||||
denies |= overwrite.Deny
|
|
||||||
allows |= overwrite.Allow
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
apermissions &= ^denies
|
|
||||||
apermissions |= allows
|
|
||||||
|
|
||||||
for _, overwrite := range channel.PermissionOverwrites {
|
|
||||||
if overwrite.Type == "member" && overwrite.ID == userID {
|
|
||||||
apermissions &= ^overwrite.Deny
|
|
||||||
apermissions |= overwrite.Allow
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apermissions&discordgo.PermissionAdministrator ==
|
|
||||||
discordgo.PermissionAdministrator {
|
|
||||||
|
|
||||||
apermissions |= discordgo.PermissionAllChannel
|
|
||||||
}
|
|
||||||
|
|
||||||
return apermissions
|
|
||||||
}
|
|
||||||
*/
|
|
|
@ -1,7 +1,6 @@
|
||||||
package bot
|
package bot
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -376,15 +375,6 @@ func callWith(caller reflect.Value, ev interface{}, values ...reflect.Value) err
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
var ParseArgs = func(args string) ([]string, error) {
|
|
||||||
// TODO: make modular
|
|
||||||
// TODO: actual tokenizer+parser
|
|
||||||
r := csv.NewReader(strings.NewReader(args))
|
|
||||||
r.Comma = ' '
|
|
||||||
|
|
||||||
return r.Read()
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorReturns(returns []reflect.Value) error {
|
func errorReturns(returns []reflect.Value) error {
|
||||||
// assume first is always error, since we checked for this in parseCommands
|
// assume first is always error, since we checked for this in parseCommands
|
||||||
v := returns[0].Interface()
|
v := returns[0].Interface()
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -5,8 +5,10 @@ go 1.13
|
||||||
require (
|
require (
|
||||||
github.com/davecgh/go-spew v1.1.1
|
github.com/davecgh/go-spew v1.1.1
|
||||||
github.com/gorilla/schema v1.1.0
|
github.com/gorilla/schema v1.1.0
|
||||||
|
github.com/mattn/go-shellwords v1.0.9
|
||||||
github.com/pkg/errors v0.8.1
|
github.com/pkg/errors v0.8.1
|
||||||
github.com/sasha-s/go-csync v0.0.0-20160729053059-3bc6c8bdb3fa
|
github.com/sasha-s/go-csync v0.0.0-20160729053059-3bc6c8bdb3fa
|
||||||
|
github.com/zyedidia/micro v1.4.1
|
||||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa // indirect
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa // indirect
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0
|
||||||
nhooyr.io/websocket v1.7.4
|
nhooyr.io/websocket v1.7.4
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -20,6 +20,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/mattn/go-shellwords v1.0.9 h1:eaB5JspOwiKKcHdqcjbfe5lA9cNn/4NRRtddXJCimqk=
|
||||||
|
github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
@ -29,6 +31,8 @@ github.com/sasha-s/go-csync v0.0.0-20160729053059-3bc6c8bdb3fa/go.mod h1:KKzWrLi
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/zyedidia/micro v1.4.1 h1:OuszISyaEPK/8xxkklkh7dp2ragvKDEnr4RyHfJcQdo=
|
||||||
|
github.com/zyedidia/micro v1.4.1/go.mod h1:/wcvhlXPvvvb6v176yUQE4gNzr+Erwz4pWfx7PU/cuE=
|
||||||
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
|
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
|
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
|
||||||
|
|
Loading…
Reference in a new issue