Skip to content

Commit

Permalink
Merge pull request tucnak#255 from p3nt3st3rPrise/v2
Browse files Browse the repository at this point in the history
API errors can now be differentiated via a set of static errors.
  • Loading branch information
tucnak committed Mar 28, 2020
2 parents 9852df3 + d821e6b commit dd123e9
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 0 deletions.
76 changes: 76 additions & 0 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package telebot
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
Expand Down Expand Up @@ -32,11 +33,86 @@ func (b *Bot) Raw(method string, payload interface{}) ([]byte, error) {
defer resp.Body.Close()

json, err := ioutil.ReadAll(resp.Body)
data := apiErrorRx.FindStringSubmatch(string(json))
if err != nil {
return []byte{}, wrapSystem(err)
}

if data == nil {
return json, nil
}

description := data[2]
code, _ := strconv.Atoi(data[0])
switch description {
case ErrUnauthorized.ʔ():
err = ErrUnauthorized
case ErrToForwardNotFound.ʔ():
err = ErrToForwardNotFound
case ErrToReplyNotFound.ʔ():
err = ErrToReplyNotFound
case ErrMessageTooLong.ʔ():
err = ErrMessageTooLong
case ErrBlockedByUsr.ʔ():
err = ErrBlockedByUsr
case ErrToDeleteNotFound.ʔ():
err = ErrToDeleteNotFound
case ErrEmptyMessage.ʔ():
err = ErrEmptyMessage
case ErrEmptyText.ʔ():
err = ErrEmptyText
case ErrEmptyChatID.ʔ():
err = ErrEmptyChatID
case ErrNotFoundChat.ʔ():
err = ErrNotFoundChat
case ErrMessageNotModified.ʔ():
err = ErrMessageNotModified
case ErrNoRightsToRestrict.ʔ():
err = ErrNoRightsToRestrict
case ErrNoRightsToSendMsg.ʔ():
err = ErrNoRightsToSendMsg
case ErrNoRightsToSendPhoto.ʔ():
err = ErrNoRightsToSendPhoto
case ErrNoRightsToSendStickers.ʔ():
err = ErrNoRightsToSendStickers
case ErrNoRightsToSendGifs.ʔ():
err = ErrNoRightsToSendGifs
case ErrNoRightsToDelete.ʔ():
err = ErrNoRightsToDelete
case ErrKickingChatOwner.ʔ():
err = ErrKickingChatOwner
case ErrInteractKickedG.ʔ():
err = ErrKickingChatOwner
case ErrInteractKickedSprG.ʔ():
err = ErrInteractKickedSprG
case ErrWrongTypeOfContent.ʔ():
err = ErrWrongTypeOfContent
case ErrCantGetHTTPurlContent.ʔ():
err = ErrCantGetHTTPurlContent
case ErrWrongRemoteFileID.ʔ():
err = ErrWrongRemoteFileID
case ErrFileIdTooShort.ʔ():
err = ErrFileIdTooShort
case ErrWrongRemoteFileIDsymbol.ʔ():
err = ErrWrongRemoteFileIDsymbol
case ErrWrongFileIdentifier.ʔ():
err = ErrWrongFileIdentifier
case ErrTooLarge.ʔ():
err = ErrTooLarge
case ErrWrongPadding.ʔ():
err = ErrWrongPadding
case ErrImageProcess.ʔ():
err = ErrImageProcess
case ErrWrongStickerpack.ʔ():
err = ErrWrongStickerpack
default:
err = fmt.Errorf("unknown api error: %s (%d)", description, code)
}
if err != nil {
return []byte{}, err
}
return json, nil

}

func addFileToWriter(writer *multipart.Writer,
Expand Down
87 changes: 87 additions & 0 deletions errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package telebot

import (
"fmt"
"regexp"
"strings"
)

type ApiError struct {
Code int
Description string

message string
}

func (err *ApiError) ʔ() string {
return err.Description
}

func badRequest(description ...string) *ApiError {
if len(description) == 1 {
return &ApiError{400, description[0], ""}
}

return &ApiError{400, description[0], description[1]}
}

func (err *ApiError) Error() string {
canonical := err.message
if canonical == "" {
butchered := strings.Split(err.Description, ": ")
if len(butchered) == 2 {
canonical = butchered[1]
} else {
canonical = err.Description
}
}
return fmt.Sprintf("api error: %s (%d)", canonical, err.Code)
}

var (
//RegExp
apiErrorRx = regexp.MustCompile(`{.+"error_code":(\d+),"description":"(.+)"}`)

//bot creation errors
ErrUnauthorized = &ApiError{401, "Unauthorized", ""}

// not found etc
ErrToForwardNotFound = badRequest("Bad Request: message to forward not found")
ErrToReplyNotFound = badRequest("Bad Request: reply message not found")
ErrMessageTooLong = badRequest("Bad Request: message is too long")
ErrBlockedByUsr = &ApiError{401, "Forbidden: bot was blocked by the user", ""}
ErrToDeleteNotFound = badRequest("Bad Request: message to delete not found")
ErrEmptyMessage = badRequest("Bad Request: message must be non-empty")
//checking
ErrEmptyText = badRequest("Bad Request: text is empty")
ErrEmptyChatID = badRequest("Bad Request: chat_id is empty")
ErrNotFoundChat = badRequest("Bad Request: chat not found")
ErrMessageNotModified = badRequest("Bad Request: message is not modified")

// Rigts Errors
ErrNoRightsToRestrict = badRequest("Bad Request: not enough rights to restrict/unrestrict chat member")
ErrNoRightsToSendMsg = badRequest("Bad Request: have no rights to send a message")
ErrNoRightsToSendPhoto = badRequest("Bad Request: not enough rights to send photos to the chat")
ErrNoRightsToSendStickers = badRequest("Bad Request: not enough rights to send stickers to the chat")
ErrNoRightsToSendGifs = badRequest("Bad Request: CHAT_SEND_GIFS_FORBIDDEN", "sending GIFS is not allowed in this chat")
ErrNoRightsToDelete = badRequest("Bad Request: message can't be deleted")
ErrKickingChatOwner = badRequest("Bad Request: can't remove chat owner")

// Interacting with group/supergroup after being kicked
ErrInteractKickedG = &ApiError{403, "Forbidden: bot was kicked from the group chat", ""}
ErrInteractKickedSprG = &ApiError{403, "Forbidden: bot was kicked from the supergroup chat", ""}

// file errors etc
ErrWrongTypeOfContent = badRequest("Bad Request: wrong type of the web page content")
ErrCantGetHTTPurlContent = badRequest("Bad Request: failed to get HTTP URL content")
ErrWrongRemoteFileID = badRequest("Bad Request: wrong remote file id specified: can't unserialize it. Wrong last symbol")
ErrFileIdTooShort = badRequest("Bad Request: wrong remote file id specified: Wrong string length")
ErrWrongRemoteFileIDsymbol = badRequest("Bad Request: wrong remote file id specified: Wrong character in the string")
ErrWrongFileIdentifier = badRequest("Bad Request: wrong file identifier/HTTP URL specified")
ErrTooLarge = badRequest("Request Entity Too Large")
ErrWrongPadding = badRequest("Bad Request: wrong remote file id specified: Wrong padding in the string") // not my
ErrImageProcess = badRequest("Bad Request: IMAGE_PROCESS_FAILED", "Image process failed")

// sticker errors
ErrWrongStickerpack = badRequest("Bad Request: STICKERSET_INVALID", "Stickerset is invalid")
)

0 comments on commit dd123e9

Please sign in to comment.