diff --git a/doc.go b/doc.go index b53e3c6..1f6b3f8 100644 --- a/doc.go +++ b/doc.go @@ -71,19 +71,32 @@ func (b *botState) handleDocs(e *gateway.InteractionCreateEvent) { query := args["query"].String() embed := b.onDocs(e, query, false) - var components *[]discord.Component - if !strings.HasPrefix(embed.Title, "Error") { - mu.Lock() - interactionMap[e.ID.String()] = &interactionData{ - id: e.ID.String(), - created: time.Now(), - user: e.User, - query: query, + if strings.HasPrefix(embed.Title, "Error") { + err := b.state.DeleteInteractionResponse(e.AppID, e.Token) + if err != nil { + log.Println("failed to delete message:", err) + return } - mu.Unlock() + _, _ = b.state.CreateInteractionFollowup(e.AppID, e.Token, api.InteractionResponseData{ + Flags: api.EphemeralResponse, + Embeds: &[]discord.Embed{embed}, + }) + return + } - components = &[]discord.Component{ + mu.Lock() + interactionMap[e.ID.String()] = &interactionData{ + id: e.ID.String(), + created: time.Now(), + user: e.User, + query: query, + } + mu.Unlock() + + if _, err := b.state.EditInteractionResponse(e.AppID, e.Token, api.EditInteractionResponseData{ + Embeds: &[]discord.Embed{embed}, + Components: &[]discord.Component{ discord.ActionRowComponent{ Components: []discord.Component{ discord.SelectComponent{ @@ -93,15 +106,8 @@ func (b *botState) handleDocs(e *gateway.InteractionCreateEvent) { }, }, }, - } - } - - edit := api.EditInteractionResponseData{ - Embeds: &[]discord.Embed{embed}, - Components: components, - } - - if _, err := b.state.EditInteractionResponse(e.AppID, e.Token, edit); err != nil { + }, + }); err != nil { log.Println("failed to send interaction callback:", err) return } @@ -111,15 +117,22 @@ func (b *botState) onDocsComponent(e *gateway.InteractionCreateEvent, data *inte var embed discord.Embed var components *[]discord.Component - var hasRole bool - for _, role := range e.Member.RoleIDs { - if _, ok := privilegedRoles[role]; ok { - hasRole = true - break + // if e.Member is nil, all operations should be allowed + hasRole := e.Member == nil + if !hasRole { + for _, role := range e.Member.RoleIDs { + if _, ok := privilegedRoles[role]; ok { + hasRole = true + break + } } } isAdmin := func() bool { + if e.Member == nil { + return true + } + perms, err := b.state.Permissions(e.ChannelID, e.User.ID) if err != nil { return false @@ -342,6 +355,9 @@ func parseQuery(module string) (string, []string) { dir, base := path.Split(strings.ToLower(module)) split := strings.Split(base, ".") full := dir + split[0] + if strings.HasPrefix(full, "x/") { + full = "golang.org/" + full + } if complete, ok := stdlibPackages[full]; ok { full = complete diff --git a/go.mod b/go.mod index caae91a..7a97996 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/diamondburned/arikawa/v3 v3.0.0-rc.1 - github.com/hhhapz/doc v0.3.1 + github.com/hhhapz/doc v0.3.2 github.com/k0kubun/pp v3.0.1+incompatible github.com/pkg/errors v0.9.1 ) diff --git a/go.sum b/go.sum index c2be601..de94918 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/hhhapz/doc v0.3.0 h1:SuUTYmZu83tTXTQ0wyOWYCcVeSSxfzvnSXEsE6jr4VI= github.com/hhhapz/doc v0.3.0/go.mod h1:RzUhRa6guPMbXtNfNm4jW6aYCu+JBapioQEgrzoHSMo= github.com/hhhapz/doc v0.3.1 h1:TKlytW6nDcJydOIDffYF7OINF6z3x6AUhEvlnfXk9FU= github.com/hhhapz/doc v0.3.1/go.mod h1:RzUhRa6guPMbXtNfNm4jW6aYCu+JBapioQEgrzoHSMo= +github.com/hhhapz/doc v0.3.2 h1:/FLWokA4uJRVuCX5Q+MPpX1gRP/sZiBPlmTrwtJf/Ws= +github.com/hhhapz/doc v0.3.2/go.mod h1:RzUhRa6guPMbXtNfNm4jW6aYCu+JBapioQEgrzoHSMo= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= diff --git a/main.go b/main.go index 3956ff2..861969d 100644 --- a/main.go +++ b/main.go @@ -22,7 +22,7 @@ type botState struct { } func (b *botState) OnCommand(e *gateway.InteractionCreateEvent) { - if e.GuildID != discord.NullGuildID { + if e.GuildID != 0 { e.User = &e.Member.User }