From 0751f45bdbac8aeb352153c7a9e8dd58d242af46 Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Sat, 25 Jan 2020 21:58:06 -0800 Subject: [PATCH] Bot: changed to a better command parser --- bot/arguments.go | 6 +++ bot/copied_from_d.go | 114 ------------------------------------------- bot/ctx_call.go | 10 ---- go.mod | 2 + go.sum | 4 ++ 5 files changed, 12 insertions(+), 124 deletions(-) delete mode 100644 bot/copied_from_d.go diff --git a/bot/arguments.go b/bot/arguments.go index 2900ea6..ef4d7b5 100644 --- a/bot/arguments.go +++ b/bot/arguments.go @@ -5,6 +5,8 @@ import ( "reflect" "strconv" "strings" + + "github.com/mattn/go-shellwords" ) type argumentValueFn func(string) (reflect.Value, error) @@ -97,6 +99,10 @@ type Argument struct { custom *reflect.Method } +var ParseArgs = func(args string) ([]string, error) { + return shellwords.Parse(args) +} + // nilV, only used to return an error var nilV = reflect.Value{} diff --git a/bot/copied_from_d.go b/bot/copied_from_d.go deleted file mode 100644 index 5191940..0000000 --- a/bot/copied_from_d.go +++ /dev/null @@ -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 -} -*/ diff --git a/bot/ctx_call.go b/bot/ctx_call.go index 21ca8dd..b124bb6 100644 --- a/bot/ctx_call.go +++ b/bot/ctx_call.go @@ -1,7 +1,6 @@ package bot import ( - "encoding/csv" "reflect" "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 { // assume first is always error, since we checked for this in parseCommands v := returns[0].Interface() diff --git a/go.mod b/go.mod index b613640..93b2ac5 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,10 @@ go 1.13 require ( github.com/davecgh/go-spew v1.1.1 github.com/gorilla/schema v1.1.0 + github.com/mattn/go-shellwords v1.0.9 github.com/pkg/errors v0.8.1 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/time v0.0.0-20191024005414-555d28b269f0 nhooyr.io/websocket v1.7.4 diff --git a/go.sum b/go.sum index d5af972..dcc60f7 100644 --- a/go.sum +++ b/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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 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/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=