From 2afbe5c83de009202da61a0002500ab75c1a4a6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 17 Oct 2023 22:43:01 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96API=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E6=B6=88=E6=81=AF=20&=20onlyprivate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openapi.go | 44 ++++++++++++++++++++++++++++++++------------ rules.go | 18 ++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/openapi.go b/openapi.go index e56857b..1322114 100644 --- a/openapi.go +++ b/openapi.go @@ -6,6 +6,7 @@ import ( "net/http" "reflect" "strconv" + "strings" "unsafe" "github.com/pkg/errors" @@ -28,14 +29,6 @@ type CodeMessageBase struct { M string `json:"message"` } -func checkrespbaseunsafe(ptr any) error { - respbase := (*CodeMessageBase)(*(*unsafe.Pointer)(unsafe.Add(unsafe.Pointer(&ptr), unsafe.Sizeof(uintptr(0))))) - if respbase.C != 0 { - return errors.Wrap(errors.New("code: "+strconv.Itoa(respbase.C)+", msg: "+respbase.M), getCallerFuncName()) - } - return nil -} - func (bot *Bot) dohttprequest(constructer HTTPRequsetConstructer, ep, contenttype string, ptr any, body io.Reader) error { req, err := constructer(ep, contenttype, bot.Authorization(), body) if err != nil { @@ -49,20 +42,47 @@ func (bot *Bot) dohttprequest(constructer HTTPRequsetConstructer, ep, contenttyp if resp.StatusCode == http.StatusNoContent { return nil } + errsb := strings.Builder{} + var respbase *CodeMessageBase if resp.StatusCode >= http.StatusBadRequest { - return errors.Wrap(errors.New("code: "+strconv.Itoa(resp.StatusCode)+", msg: "+resp.Status), getCallerFuncName()) + errsb.WriteString("code: ") + errsb.WriteString(resp.Status) } if ptr == nil { - return nil + goto RET } err = json.NewDecoder(resp.Body).Decode(ptr) if err != nil { - return errors.Wrap(err, getCallerFuncName()) + if errsb.Len() > 0 { + errsb.WriteString(", ") + } + errsb.WriteString("json: ") + errsb.WriteString(err.Error()) + goto RET } if reflect.ValueOf(ptr).Elem().Kind() == reflect.Slice { return nil } - return checkrespbaseunsafe(ptr) + respbase = (*CodeMessageBase)(*(*unsafe.Pointer)(unsafe.Add(unsafe.Pointer(&ptr), unsafe.Sizeof(uintptr(0))))) + if respbase.C != 0 { + if errsb.Len() > 0 { + errsb.WriteString(", ") + } + errsb.WriteString("err: [") + errsb.WriteString(strconv.Itoa(respbase.C)) + errsb.WriteString("] ") + if len([]rune(respbase.M)) > 256 { + errsb.WriteString(string([]rune(respbase.M)[:256])) + errsb.WriteString("...") + } else { + errsb.WriteString(respbase.M) + } + } +RET: + if errsb.Len() > 0 { + return errors.Wrap(errors.New(errsb.String()), getCallerFuncName()) + } + return nil } //go:generate go run codegen/getopenapiof/main.go ShardWSSGateway User Guild Channel Member RoleMembers GuildRoleList ChannelPermissions Message MessageSetting PinsMessage Schedule MessageReactionUsers diff --git a/rules.go b/rules.go index 09bf0df..d13353b 100644 --- a/rules.go +++ b/rules.go @@ -289,18 +289,24 @@ func CheckGuild(guildID ...string) Rule { // OnlyPrivate requires that the ctx.Event is direct message func OnlyPrivate(ctx *Ctx) bool { - if ctx.Type == "" { // 确保无空 - return false + if ctx.Message != nil { + return ctx.Message.SrcGuildID != "" } - return strings.HasPrefix(ctx.Type, "Direct") + if ctx.Type != "" { + return strings.HasPrefix(ctx.Type, "Direct") + } + return false } // OnlyPublic requires that the ctx.Event is channel message func OnlyPublic(ctx *Ctx) bool { - if ctx.Type == "" { // 确保无空 - return false + if ctx.Message != nil { + return ctx.Message.SrcGuildID == "" } - return !strings.HasPrefix(ctx.Type, "Direct") + if ctx.Type != "" { + return !strings.HasPrefix(ctx.Type, "Direct") + } + return false } // OnlyChannel requires that the ctx.Event is channel message